| Index: ios/chrome/browser/ui/stack_view/card_stack_layout_manager.h
|
| diff --git a/ios/chrome/browser/ui/stack_view/card_stack_layout_manager.h b/ios/chrome/browser/ui/stack_view/card_stack_layout_manager.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..54d942833a1f085e45e736bf4c1b37adb5d3b9d0
|
| --- /dev/null
|
| +++ b/ios/chrome/browser/ui/stack_view/card_stack_layout_manager.h
|
| @@ -0,0 +1,172 @@
|
| +// Copyright 2012 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef IOS_CHROME_BROWSER_UI_STACK_VIEW_CARD_STACK_LAYOUT_MANAGER_H_
|
| +#define IOS_CHROME_BROWSER_UI_STACK_VIEW_CARD_STACK_LAYOUT_MANAGER_H_
|
| +
|
| +#import <CoreGraphics/CoreGraphics.h>
|
| +#import <Foundation/Foundation.h>
|
| +
|
| +#include "base/mac/scoped_nsobject.h"
|
| +
|
| +@class StackCard;
|
| +
|
| +// Encapsulates a stack of cards and their layout behavior, supporting
|
| +// fanning the cards out along an axis and gathering them to fit in a given
|
| +// area.
|
| +@interface CardStackLayoutManager : NSObject {
|
| + @private
|
| + base::scoped_nsobject<NSMutableArray> cards_;
|
| + // YES if the previous call to one of {|scrollCardAtIndex|,
|
| + // |handleMultitouchWithFirstDelta|} was to the former method; NO otherwise.
|
| + BOOL treatOverExtensionAsScroll_;
|
| + NSUInteger previousFirstPinchCardIndex_;
|
| + NSUInteger previousSecondPinchCardIndex_;
|
| +}
|
| +
|
| +// The size of a card. Setting this property preserves card origins with the
|
| +// exception that cards are moved as necessary to satisfy placement constraints
|
| +// (e.g., that a card is not placed too far away from its preceding neighbor).
|
| +@property(nonatomic, assign) CGSize cardSize;
|
| +// The center of a card along the axis that is not the layout axis.
|
| +@property(nonatomic, assign) CGFloat layoutAxisPosition;
|
| +// The amount cards should be staggered at full expansion.
|
| +@property(nonatomic, assign) CGFloat maxStagger;
|
| +// The maximum amount that the first card is allowed to overextend toward the
|
| +// start or the end.
|
| +@property(nonatomic, assign) CGFloat maximumOverextensionAmount;
|
| +// The offset denoting the start of the visible stack.
|
| +@property(nonatomic, assign) CGFloat startLimit;
|
| +// The offset denoting the end of the visible stack. Setting this property
|
| +// causes the end stack to be recomputed.
|
| +@property(nonatomic, assign) CGFloat endLimit;
|
| +// YES if the cards should be laid out vertically. Default is YES. A change in
|
| +// this property also sets the cards' positions along the new layout axis to
|
| +// their positions along the previous layout axis.
|
| +@property(nonatomic, assign) BOOL layoutIsVertical;
|
| +// TODO(blundell): The below two vars should be changed to NSUIntegers so that
|
| +// the implementation can uniformly use NSUIntegers. b/5956653
|
| +// The index of the last card that is in the initial stack.
|
| +@property(nonatomic, readonly, assign) NSInteger lastStartStackCardIndex;
|
| +// The index of the first card that is in the ending stack.
|
| +@property(nonatomic, readonly, assign) NSInteger firstEndStackCardIndex;
|
| +
|
| +// Adds a |card| to the top (z-index) of the stack.
|
| +- (void)addCard:(StackCard*)card;
|
| +
|
| +// Adds a |card| to the stack at the given index.
|
| +- (void)insertCard:(StackCard*)card atIndex:(NSUInteger)index;
|
| +
|
| +// Removes |card| from the stack.
|
| +- (void)removeCard:(StackCard*)card;
|
| +
|
| +// Removes all cards from the stack.
|
| +- (void)removeAllCards;
|
| +
|
| +// Returns an array of cards, ordered from bottom to top of the stack (in
|
| +// z-order terms).
|
| +- (NSArray*)cards;
|
| +
|
| +// Based on the cards' current positions and the value of |startLimit|, caps
|
| +// cards that should be in the start stack.
|
| +- (void)layOutStartStack;
|
| +
|
| +// Fans out the cards and then gathers them in such that the first card not
|
| +// collapsed into the start stack is the card at |startIndex|.
|
| +- (void)fanOutCardsWithStartIndex:(NSUInteger)startIndex;
|
| +
|
| +// Scrolls the card at |index| by |delta| (and trailing cards by a maximum of
|
| +// |delta| depending on whether evening out after pinching needs to occur).
|
| +// Scrolls leading cards by delta if |scrollLeadingCards| is |YES|; otherwise,
|
| +// does not scroll leading cards. Allows a certain amount of overscrolling
|
| +// toward the start and end. If |decayOnOverscroll| is |YES|, the impact of the
|
| +// scroll decays once the stack is overscrolled. If |allowEarlyOverscroll|
|
| +// is |YES|, overscrolling is allowed to occur naturally on the scrolled card;
|
| +// otherwise, overscrolling is not allowed to occur until the stack is fully
|
| +// collapsed/fanned out.
|
| +- (void)scrollCardAtIndex:(NSUInteger)index
|
| + byDelta:(CGFloat)delta
|
| + allowEarlyOverscroll:(BOOL)allowEarlyOverscroll
|
| + decayOnOverscroll:(BOOL)decayOnOverscroll
|
| + scrollLeadingCards:(BOOL)scrollLeadingCards;
|
| +
|
| +// Returns whether the card at |index| is overextended toward the start.
|
| +- (BOOL)overextensionTowardStartOnCardAtIndex:(NSUInteger)index;
|
| +// Returns whether the first card is overextended toward the end. Note that
|
| +// overextension is not a meaningful concept for other cards, as a pinch is
|
| +// allowed to leave cards other than the first card resting in arbitrary
|
| +// positions.
|
| +- (BOOL)overextensionTowardEndOnFirstCard;
|
| +// Moves the cards so that any overextension is eliminated, with the nature of
|
| +// the movement being dependent on whether a scroll or a pinch occurred last.
|
| +- (void)eliminateOverextension;
|
| +
|
| +// Scrolls the card at |index| to be at the maximum separation from the
|
| +// neighboring card, followed by handling start and end capping. If |preceding|,
|
| +// the card at |index| is scrolled away from the previous card toward the end
|
| +// stack, otherwise it is scrolled away from the next card toward the start
|
| +// stack. Also scrolls the cards that the card at |index| is scrolled toward,
|
| +// but does not alter the positions of the cards it is being scrolled away from.
|
| +- (void)scrollCardAtIndex:(NSUInteger)index awayFromNeighbor:(BOOL)preceding;
|
| +
|
| +// Updates the card positions based on the passed-in multitouch event, in which
|
| +// |firstCardIndex| represents the card closer to the start stack,
|
| +// |secondCardIndex > firstCardIndex| represents the card closer to the end
|
| +// stack, and |firstDelta| and |secondDelta| represent the two cards'
|
| +// respective movements. Caps card positions when cards get too close to each
|
| +// other. Allows overpinch toward the start stack, and allows the first card to
|
| +// overpinch toward the end stack when it is being pinched. If
|
| +// |decayOnOverpinch| is |YES|, the impact of each side of the pinch is
|
| +// decayed once the card being pinched is overpinched.
|
| +- (void)handleMultitouchWithFirstDelta:(CGFloat)firstDelta
|
| + secondDelta:(CGFloat)secondDelta
|
| + firstCardIndex:(NSInteger)firstCardIndex
|
| + secondCardIndex:(NSInteger)secondCardIndex
|
| + decayOnOverpinch:(BOOL)decayOnOverpinch;
|
| +
|
| +// The length required to display a fully fanned-out stack.
|
| +- (CGFloat)fannedStackLength;
|
| +
|
| +// The maximum length that the stack could possibly grow to accounting for the
|
| +// fact that the user can pinch to pull cards apart further than the fanned-out
|
| +// separation.
|
| +- (CGFloat)maximumStackLength;
|
| +
|
| +// The length required to display a fully collapsed stack. Note that this does
|
| +// not depend on the number of cards in the stack; it will always return the
|
| +// amount needed to show an arbitrarily large stack, so that it has a
|
| +// consistent result that can be used to compute card sizes/margins.
|
| +- (CGFloat)fullyCollapsedStackLength;
|
| +
|
| +// Returns YES if |card| is completely covered by other cards.
|
| +- (BOOL)cardIsCovered:(StackCard*)card;
|
| +
|
| +// Returns whether |card| is collapsed behind its succeeding neighbor, defined
|
| +// as being separated by <= the separation distance between visible cards in the
|
| +// edge stacks.
|
| +- (BOOL)cardIsCollapsed:(StackCard*)card;
|
| +
|
| +// Returns whether the title label for |card| is covered by its succeeding
|
| +// neighbor or the edge of the screen.
|
| +- (BOOL)cardLabelCovered:(StackCard*)card;
|
| +
|
| +// Returns |YES| if all cards are scrolled into the start stack.
|
| +- (BOOL)stackIsFullyCollapsed;
|
| +
|
| +// Returns |YES| if the stack is fully fanned out.
|
| +- (BOOL)stackIsFullyFannedOut;
|
| +
|
| +// Returns |YES| if the stack is fully overextended toward the start or the
|
| +// end.
|
| +- (BOOL)stackIsFullyOverextended;
|
| +
|
| +// The amount that the first card is currently overextended.
|
| +- (CGFloat)overextensionAmount;
|
| +
|
| +// The number of cards visible when stack is fanned out.
|
| +- (NSUInteger)fannedStackCount;
|
| +
|
| +@end
|
| +
|
| +#endif // IOS_CHROME_BROWSER_UI_STACK_VIEW_CARD_STACK_LAYOUT_MANAGER_H_
|
|
|