| Index: ios/chrome/browser/ui/stack_view/card_set.h
|
| diff --git a/ios/chrome/browser/ui/stack_view/card_set.h b/ios/chrome/browser/ui/stack_view/card_set.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..030e6e358b898e3a0970204507fa0b1ebea920f5
|
| --- /dev/null
|
| +++ b/ios/chrome/browser/ui/stack_view/card_set.h
|
| @@ -0,0 +1,231 @@
|
| +// 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_SET_H_
|
| +#define IOS_CHROME_BROWSER_UI_STACK_VIEW_CARD_SET_H_
|
| +
|
| +#import <UIKit/UIKit.h>
|
| +#include <vector>
|
| +
|
| +#import "ios/chrome/browser/tabs/tab_model_observer.h"
|
| +#import "ios/chrome/browser/ui/stack_view/card_view.h"
|
| +#import "ios/chrome/browser/ui/stack_view/stack_card.h"
|
| +
|
| +@class CardSet;
|
| +@class CardStackLayoutManager;
|
| +struct LayoutRect;
|
| +@class TabModel;
|
| +
|
| +// Observer delegate for clients interested in changes to cards in a CardSet.
|
| +@protocol CardSetObserver
|
| +
|
| +// |newCard| has been added to |cardSet|.
|
| +- (void)cardSet:(CardSet*)cardSet didAddCard:(StackCard*)newCard;
|
| +
|
| +// |cardBeingRemoved| will be removed from |cardSet|.
|
| +- (void)cardSet:(CardSet*)cardSet
|
| + willRemoveCard:(StackCard*)cardBeingRemoved
|
| + atIndex:(NSUInteger)index;
|
| +
|
| +// |removedCard| has been removed from |cardSet|.
|
| +- (void)cardSet:(CardSet*)cardSet
|
| + didRemoveCard:(StackCard*)removedCard
|
| + atIndex:(NSUInteger)index;
|
| +
|
| +// |card| has been made visible for the first time.
|
| +- (void)cardSet:(CardSet*)cardSet displayedCard:(StackCard*)card;
|
| +
|
| +// |cardSet| completely rebuilt the cards; any cached reference to cards should
|
| +// be cleared, and any card setup done again for the whole card set.
|
| +// This is also called on initial creation of the card set.
|
| +- (void)cardSetRecreatedCards:(CardSet*)cardSet;
|
| +
|
| +@end
|
| +
|
| +// Manager for constructing a set of StackCards and displaying them in a view.
|
| +@interface CardSet : NSObject
|
| +// The layout manager for the set.
|
| +// TODO(stuartmorgan): See if this can reasonably be internalized.
|
| +@property(nonatomic, readonly) CardStackLayoutManager* stackModel;
|
| +// An array of StackCards in the same order as the tabs in the tab model.
|
| +@property(nonatomic, readonly) NSArray* cards;
|
| +// The card corresponding to the currently selected tab in the tab model.
|
| +// Setting this property will change the selection in the tab model.
|
| +@property(nonatomic, assign, readwrite) StackCard* currentCard;
|
| +// Set to the card that is currently animating closed, if any.
|
| +@property(nonatomic, assign, readwrite) StackCard* closingCard;
|
| +// The view that cards should be displayed in. Changing the display view will
|
| +// remove cards from the previous view, but they will not be re-displayed in the
|
| +// new view without a call to updateCardVisibilities.
|
| +@property(nonatomic, retain, readwrite) UIView* displayView;
|
| +// The side on which the close button should be displayed.
|
| +@property(nonatomic, readonly) CardCloseButtonSide closeButtonSide;
|
| +// The object to be notified about addition and removal of cards.
|
| +@property(nonatomic, assign, readwrite) id<CardSetObserver> observer;
|
| +// While YES, changes to the tab model will not affect the card stack. When
|
| +// this is changed back to NO, the card stack will be completely rebuilt, so
|
| +// this should be used very carefully.
|
| +@property(nonatomic, assign, readwrite) BOOL ignoresTabModelChanges;
|
| +// While set to YES, |updateCardVisibilities| will elide setting the views
|
| +// of covered cards to hidden. Setting to NO will trigger a call to
|
| +// |updateCardVisibilities| to hide any covered views. Can be set to YES
|
| +// during animations to ensure that cards being animated to not-visible
|
| +// positions remain visible throughout the animation; should be set back to
|
| +// NO on the completion of such animations. Default value is NO.
|
| +@property(nonatomic, assign, readwrite) BOOL defersCardHiding;
|
| +// The maximum amount that the first card is allowed to overextend toward the
|
| +// start or the end.
|
| +@property(nonatomic, assign) CGFloat maximumOverextensionAmount;
|
| +// If set to YES, a card view is released once the corresponding card becomes
|
| +// covered (it will be transparently reloaded if the card is uncovered), saving
|
| +// memory at the cost of potentially introducing jankiness. Default value is
|
| +// NO. Setting this property to YES causes views of covered cards to be
|
| +// immediately released.
|
| +@property(nonatomic, assign) BOOL keepOnlyVisibleCardViewsAlive;
|
| +
|
| +// Initializes a card set backed by |model|. |model| is not retained, and must
|
| +// outlive the card set.
|
| +- (id)initWithModel:(TabModel*)model;
|
| +
|
| +// The tab model backing the card set.
|
| +// TODO(stuartmorgan): See if this can reasonably be internalized.
|
| +- (TabModel*)tabModel;
|
| +
|
| +// Sets the tab model backing the card set. This should only be called when the
|
| +// TabModel will be deleted and replaced by a new one. When called both the
|
| +// current tab model and the new tab model must be either nil, or contain no
|
| +// tabs.
|
| +- (void)setTabModel:(TabModel*)tabModel;
|
| +
|
| +// Configures the stack fan out behavior based on the current display view
|
| +// size, card size, and layout direction. Sets the margin in the layout
|
| +// direction to |margin|.
|
| +- (void)configureLayoutParametersWithMargin:(CGFloat)margin;
|
| +
|
| +// Updates the stack's visible size based on the current display view size,
|
| +// followed by recalculating the end stack. Should be called any time that the
|
| +// display view's size is changed.
|
| +- (void)displayViewSizeWasChanged;
|
| +
|
| +// Sets the size of the cards in the set. Updates existing cards, and sets
|
| +// the size that will be used to make new cards in the future. 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).
|
| +- (void)setCardSize:(CGSize)cardSize;
|
| +
|
| +// Sets the layout axis position (i.e., the center of the cards in the
|
| +// non-layout direction) and layout direction of the card model. Sets the
|
| +// cards' positions along the new layout axis to their positions along the
|
| +// previous layout axis.
|
| +- (void)setLayoutAxisPosition:(CGFloat)position
|
| + isVertical:(BOOL)layoutIsVertical;
|
| +
|
| +// Based on the cards' current positions, caps cards that should be in the
|
| +// start stack.
|
| +- (void)layOutStartStack;
|
| +
|
| +// Fans out the cards starting at the first card and then gathers them in to
|
| +// the end limit of the visible stack.
|
| +- (void)fanOutCards;
|
| +
|
| +// 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;
|
| +
|
| +// Returns the current LayoutRects of the cards.
|
| +- (std::vector<LayoutRect>)cardLayouts;
|
| +
|
| +// 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;
|
| +
|
| +// Whether the stack is overextended.
|
| +- (BOOL)stackIsOverextended;
|
| +// Returns whether the card at |index| is overextended, defined as being
|
| +// overextended toward the start or end for the first card and overextended
|
| +// toward the start for any other card.
|
| +- (BOOL)overextensionOnCardAtIndex:(NSUInteger)index;
|
| +// Returns whether the card at |index| is overextended toward the start.
|
| +- (BOOL)overextensionTowardStartOnCardAtIndex:(NSUInteger)index;
|
| +// 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 visibility of each card based on whether or not it is covered by
|
| +// other cards. Should be called any time the card layout changes.
|
| +- (void)updateCardVisibilities;
|
| +
|
| +// Preloads (constructs the view and adds it to the view hierarchy, hidden) the
|
| +// next card, if there is one that still needs to be preloaded. Returns YES if
|
| +// a card was preloaded, NO if all cards were already loaded.
|
| +- (BOOL)preloadNextCard;
|
| +
|
| +// Sets all of the cards' gesture recognizer targets/delegatesthat are equal to
|
| +// |object| to nil.
|
| +// TODO(stuartmorgan): This should probably move up out of CardSet.
|
| +- (void)clearGestureRecognizerTargetAndDelegateFromCards:(id)object;
|
| +
|
| +// Removes the card at |index|. Does not modify the underlying TabModel.
|
| +// TODO(blundell): This public method is a hack only present to work around a
|
| +// crash. Do not add calls to it. b/8321162
|
| +- (void)removeCardAtIndex:(NSUInteger)index;
|
| +
|
| +// The maximum length (without margins) that the stack could possibly grow to.
|
| +- (CGFloat)maximumStackLength;
|
| +
|
| +// 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 |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;
|
| +
|
| +// Returns whether |card| is collapsed into the start stagger region.
|
| +- (BOOL)isCardInStartStaggerRegion:(StackCard*)card;
|
| +
|
| +// Returns whether |card| is collapsed into the end stagger region.
|
| +- (BOOL)isCardInEndStaggerRegion:(StackCard*)card;
|
| +
|
| +// Updates the frame of the stack shadow to the card stack's current layout.
|
| +- (void)updateShadowLayout;
|
| +
|
| +@end
|
| +
|
| +@interface CardSet (Testing)
|
| +- (StackCard*)cardForTab:(Tab*)tab;
|
| +- (void)setStackModelForTesting:(CardStackLayoutManager*)stackModel;
|
| +@end
|
| +
|
| +#endif // IOS_CHROME_BROWSER_UI_STACK_VIEW_CARD_SET_H_
|
|
|