Index: ios/chrome/browser/ui/collection_view/collection_view_model.h |
diff --git a/ios/chrome/browser/ui/collection_view/collection_view_model.h b/ios/chrome/browser/ui/collection_view/collection_view_model.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fa78d9f5410e859e1918669bcb761e34bb9d619a |
--- /dev/null |
+++ b/ios/chrome/browser/ui/collection_view/collection_view_model.h |
@@ -0,0 +1,185 @@ |
+// Copyright 2016 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_COLLECTION_VIEW_COLLECTION_VIEW_MODEL_H_ |
+#define IOS_CHROME_BROWSER_UI_COLLECTION_VIEW_COLLECTION_VIEW_MODEL_H_ |
+ |
+#include <UIKit/UIKit.h> |
+ |
+@class CollectionViewItem; |
+ |
+// Use these as the starting value for section identifier and item type enums. |
+// These are provided to help not mix between indexPath's section/item and the |
+// model section identifier / item type. |
+// |
+// For example: |
+// typedef NS_ENUM(NSInteger, SectionIdentifier) { |
+// SectionIdentifierFoo = kSectionIdentifierEnumZero, |
+// SectionIdentifierBar, |
+// }; |
+// |
+// typedef NS_ENUM(NSInteger, ItemType) { |
+// ItemTypeBaz = kItemTypeEnumZero, |
+// ItemTypeQux, |
+// }; |
+// |
+// These values are chosen to try to prevent overlapping. |
+const NSInteger kSectionIdentifierEnumZero = 10; |
+const NSInteger kItemTypeEnumZero = 100; |
+ |
+// CollectionViewModel acts as a model class for collection view controllers. |
+// It provides methods to map from collection view index paths (aka collection |
+// view section and collection view item) to model coordinates. These are |
+// useful when the contents of a collection view are dynamic (for example, based |
+// on experimental flags), so that there is not a static mapping between index |
+// paths and section items. |
+// Model coordinates have 3 dimensions: section identifier, item type and index |
+// in item type. |
+// Disclaimer: CollectionViewModel doesn't support a batch update logic. All |
+// changes are immediately processed (contrary to the reload/delete/add order of |
+// UICollectionView's |performBatchUpdates:completion:|). |
+ |
+@interface CollectionViewModel : NSObject |
+ |
+#pragma mark Modification methods |
+ |
+// Adds a new section tagged with the given identifier. This method must not be |
+// called multiple times with the same identifier. |
+- (void)addSectionWithIdentifier:(NSInteger)sectionIdentifier; |
+ |
+// Inserts a new section tagged with the given identifier at the given index. |
+// This method must not be called multiple times with the same identifier. |
+- (void)insertSectionWithIdentifier:(NSInteger)sectionIdentifier |
+ atIndex:(NSUInteger)index; |
+ |
+// Adds an item to the section with the given identifier. Adding several times |
+// the same item is undefined behavior. |
+- (void)addItem:(CollectionViewItem*)item |
+ toSectionWithIdentifier:(NSInteger)sectionIdentifier; |
+ |
+// Inserts an item to the section with the given identifier at the given index. |
+// |index| must not be greater than the count of elements in the section. |
+- (void)insertItem:(CollectionViewItem*)item |
+ inSectionWithIdentifier:(NSInteger)sectionIdentifier |
+ atIndex:(NSUInteger)index; |
+ |
+// Removes the item for |itemType| from the section for |sectionIdentifier|. |
+// If there are multiple entries with the same item type, this will remove the |
+// first occurrence, but to selectively delete an item for a given index, use |
+// -removeItemWithType:fromSectionWithIdentifier:atIndex:. |
+- (void)removeItemWithType:(NSInteger)itemType |
+ fromSectionWithIdentifier:(NSInteger)sectionIdentifier; |
+ |
+// Removes the item for |itemType| from the section for |sectionIdentifier| at |
+// |index|. |
+- (void)removeItemWithType:(NSInteger)itemType |
+ fromSectionWithIdentifier:(NSInteger)sectionIdentifier |
+ atIndex:(NSUInteger)index; |
+ |
+// Removes the section for |sectionIdentifier|. If there are still items left in |
+// the section, they are removed. |
+- (void)removeSectionWithIdentifier:(NSInteger)sectionIdentifier; |
+ |
+// Sets the header item for the section with the given |sectionIdentifier|. |
+- (void)setHeader:(CollectionViewItem*)header |
+ forSectionWithIdentifier:(NSInteger)sectionIdentifier; |
+ |
+// Sets the footer item for the section with the given |sectionIdentifier|. |
+- (void)setFooter:(CollectionViewItem*)footer |
+ forSectionWithIdentifier:(NSInteger)sectionIdentifier; |
+ |
+#pragma mark Query model coordinates from index paths |
+ |
+// Returns the section identifier for the given section. |
+- (NSInteger)sectionIdentifierForSection:(NSInteger)section; |
+ |
+// Returns the item type for the given index path. |
+- (NSInteger)itemTypeForIndexPath:(NSIndexPath*)indexPath; |
+ |
+// Returns the index in item type for the given index path. |
+// It corresponds to the index of the item at index path, among all the items if |
+// the same type in the given section. |
+// For example, let [A, B, B, B] a section, where A and B are item identifiers. |
+// -indexInItemTypeForIndexPath:{0, 0} would return 0. |
+// -indexInItemTypeForIndexPath:{0, 1} would return 0. |
+// -indexInItemTypeForIndexPath:{0, 3} would return 2. |
+- (NSUInteger)indexInItemTypeForIndexPath:(NSIndexPath*)indexPath; |
+ |
+#pragma mark Query items from index paths |
+ |
+// Returns whether there is an item at the given index path. |
+- (BOOL)hasItemAtIndexPath:(NSIndexPath*)indexPath; |
+ |
+// Returns the item at the given index path. |
+- (CollectionViewItem*)itemAtIndexPath:(NSIndexPath*)indexPath; |
+ |
+// Returns the header for the given |section|. |
+- (CollectionViewItem*)headerForSection:(NSInteger)section; |
+ |
+// Returns the footer for the given |section|. |
+- (CollectionViewItem*)footerForSection:(NSInteger)section; |
+ |
+// Returns an array of items in the section with the given identifier. |
+- (NSArray*)itemsInSectionWithIdentifier:(NSInteger)sectionIdentifier; |
+ |
+// Returns the header for the section with the given |sectionIdentifier|. |
+- (CollectionViewItem*)headerForSectionWithIdentifier: |
+ (NSInteger)sectionIdentifier; |
+ |
+// Returns the footer for the section with the given |sectionIdentifier|. |
+- (CollectionViewItem*)footerForSectionWithIdentifier: |
+ (NSInteger)sectionIdentifier; |
+ |
+#pragma mark Query index paths from model coordinates |
+ |
+// Returns whether there is a section at the given section identifier. |
+- (BOOL)hasSectionForSectionIdentifier:(NSInteger)sectionIdentifier; |
+ |
+// Returns the index path's section for the given section identifier. |
+- (NSInteger)sectionForSectionIdentifier:(NSInteger)sectionIdentifier; |
+ |
+// Returns whether there is an item of type |itemType| at the given |
+// |sectionIdentifier|. |
+- (BOOL)hasItemForItemType:(NSInteger)itemType |
+ sectionIdentifier:(NSInteger)sectionIdentifier; |
+ |
+// Returns the index path for |itemType| in the section for |sectionIdentifier|. |
+// If there are multiple entries with the same item type, use |
+// -indexPathForItemType:sectionIdentifier:atIndex:. |
+- (NSIndexPath*)indexPathForItemType:(NSInteger)itemType |
+ sectionIdentifier:(NSInteger)sectionIdentifier; |
+ |
+// Returns whether there is an item of type |itemType| at the given |
+// |sectionIdentifier| and |index|. |
+- (BOOL)hasItemForItemType:(NSInteger)itemType |
+ sectionIdentifier:(NSInteger)sectionIdentifier |
+ atIndex:(NSUInteger)index; |
+ |
+// Returns the index path for |itemType| in the section for |sectionIdentifier| |
+// at |index|. |
+- (NSIndexPath*)indexPathForItemType:(NSInteger)itemType |
+ sectionIdentifier:(NSInteger)sectionIdentifier |
+ atIndex:(NSUInteger)index; |
+ |
+#pragma mark Query index paths from items |
+ |
+// Returns whether |item| exists in section for |sectionIdentifier|. |
+- (BOOL)hasItem:(CollectionViewItem*)item |
+ inSectionWithIdentifier:(NSInteger)sectionIdentifier; |
+ |
+// Returns the index path corresponding to the given |item|. |
+- (NSIndexPath*)indexPathForItem:(CollectionViewItem*)itemType |
+ inSectionWithIdentifier:(NSInteger)sectionIdentifier; |
+ |
+#pragma mark UICollectionView data sourcing |
+ |
+// Returns the number of collection view sections. |
+- (NSInteger)numberOfSections; |
+ |
+// Returns the number of collection view items in the given section. |
+- (NSInteger)numberOfItemsInSection:(NSInteger)section; |
+ |
+@end |
+ |
+#endif // IOS_CHROME_BROWSER_UI_COLLECTION_VIEW_COLLECTION_VIEW_MODEL_H_ |