| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // ====== New Architecture ===== | 5 // ====== New Architecture ===== |
| 6 // = This code is only used in the new iOS Chrome architecture. = | 6 // = This code is only used in the new iOS Chrome architecture. = |
| 7 // ============================================================================ | 7 // ============================================================================ |
| 8 | 8 |
| 9 #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_view_controller.h" | 9 #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_view_controller.h" |
| 10 | 10 |
| 11 #include "base/mac/foundation_util.h" | 11 #include "base/mac/foundation_util.h" |
| 12 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_cell.h" | |
| 13 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_collection_view_l
ayout.h" | 12 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_collection_view_l
ayout.h" |
| 14 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_overlay_view.h" | 13 #import "ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_overlay_view.h" |
| 15 #import "ios/clean/chrome/browser/ui/actions/settings_actions.h" | 14 #import "ios/clean/chrome/browser/ui/actions/settings_actions.h" |
| 16 #import "ios/clean/chrome/browser/ui/actions/tab_grid_actions.h" | 15 #import "ios/clean/chrome/browser/ui/actions/tab_grid_actions.h" |
| 17 #import "ios/clean/chrome/browser/ui/commands/settings_commands.h" | 16 #import "ios/clean/chrome/browser/ui/commands/settings_commands.h" |
| 18 #import "ios/clean/chrome/browser/ui/commands/tab_commands.h" | 17 #import "ios/clean/chrome/browser/ui/commands/tab_commands.h" |
| 19 #import "ios/clean/chrome/browser/ui/commands/tab_grid_commands.h" | 18 #import "ios/clean/chrome/browser/ui/commands/tab_grid_commands.h" |
| 20 #import "ios/clean/chrome/browser/ui/tab_grid/mdc_floating_button+cr_tab_grid.h" | 19 #import "ios/clean/chrome/browser/ui/tab_grid/mdc_floating_button+cr_tab_grid.h" |
| 21 #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_collection_view_layout.h" | 20 #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_collection_view_layout.h" |
| 21 #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_tab_cell.h" |
| 22 #import "ios/clean/chrome/browser/ui/tab_grid/ui_stack_view+cr_tab_grid.h" | 22 #import "ios/clean/chrome/browser/ui/tab_grid/ui_stack_view+cr_tab_grid.h" |
| 23 | 23 |
| 24 #if !defined(__has_feature) || !__has_feature(objc_arc) | 24 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 25 #error "This file requires ARC support." | 25 #error "This file requires ARC support." |
| 26 #endif | 26 #endif |
| 27 | 27 |
| 28 namespace { | 28 namespace { |
| 29 // Height of toolbar in tab grid. | 29 // Height of toolbar in tab grid. |
| 30 const CGFloat kToolbarHeight = 64.0f; | 30 const CGFloat kToolbarHeight = 64.0f; |
| 31 } | 31 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 [[TabGridCollectionViewLayout alloc] init]; | 66 [[TabGridCollectionViewLayout alloc] init]; |
| 67 UICollectionView* grid = [[UICollectionView alloc] initWithFrame:CGRectZero | 67 UICollectionView* grid = [[UICollectionView alloc] initWithFrame:CGRectZero |
| 68 collectionViewLayout:layout]; | 68 collectionViewLayout:layout]; |
| 69 grid.translatesAutoresizingMaskIntoConstraints = NO; | 69 grid.translatesAutoresizingMaskIntoConstraints = NO; |
| 70 grid.backgroundColor = [UIColor blackColor]; | 70 grid.backgroundColor = [UIColor blackColor]; |
| 71 | 71 |
| 72 [self.view addSubview:grid]; | 72 [self.view addSubview:grid]; |
| 73 self.grid = grid; | 73 self.grid = grid; |
| 74 self.grid.dataSource = self; | 74 self.grid.dataSource = self; |
| 75 self.grid.delegate = self; | 75 self.grid.delegate = self; |
| 76 [self.grid registerClass:[TabSwitcherLocalSessionCell class] | 76 [self.grid registerClass:[TabGridTabCell class] |
| 77 forCellWithReuseIdentifier:[TabSwitcherLocalSessionCell identifier]]; | 77 forCellWithReuseIdentifier:[TabGridTabCell identifier]]; |
| 78 | 78 |
| 79 [NSLayoutConstraint activateConstraints:@[ | 79 [NSLayoutConstraint activateConstraints:@[ |
| 80 [self.grid.topAnchor constraintEqualToAnchor:toolbar.bottomAnchor], | 80 [self.grid.topAnchor constraintEqualToAnchor:toolbar.bottomAnchor], |
| 81 [self.grid.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor], | 81 [self.grid.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor], |
| 82 [self.grid.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], | 82 [self.grid.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], |
| 83 [self.grid.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor], | 83 [self.grid.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor], |
| 84 ]]; | 84 ]]; |
| 85 } | 85 } |
| 86 | 86 |
| 87 - (void)viewWillAppear:(BOOL)animated { | 87 - (void)viewWillAppear:(BOOL)animated { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 112 if (items) { | 112 if (items) { |
| 113 [self removeNoTabsOverlay]; | 113 [self removeNoTabsOverlay]; |
| 114 } else { | 114 } else { |
| 115 [self showNoTabsOverlay]; | 115 [self showNoTabsOverlay]; |
| 116 } | 116 } |
| 117 return items; | 117 return items; |
| 118 } | 118 } |
| 119 | 119 |
| 120 - (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView | 120 - (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView |
| 121 cellForItemAtIndexPath:(nonnull NSIndexPath*)indexPath { | 121 cellForItemAtIndexPath:(nonnull NSIndexPath*)indexPath { |
| 122 TabSwitcherLocalSessionCell* cell = | 122 TabGridTabCell* cell = |
| 123 base::mac::ObjCCastStrict<TabSwitcherLocalSessionCell>([collectionView | 123 base::mac::ObjCCastStrict<TabGridTabCell>([collectionView |
| 124 dequeueReusableCellWithReuseIdentifier: | 124 dequeueReusableCellWithReuseIdentifier:[TabGridTabCell identifier] |
| 125 [TabSwitcherLocalSessionCell identifier] | |
| 126 forIndexPath:indexPath]); | 125 forIndexPath:indexPath]); |
| 127 cell.delegate = self; | 126 cell.delegate = self; |
| 128 [cell setSessionType:TabSwitcherSessionType::REGULAR_SESSION]; | 127 [cell setSessionType:TabSwitcherSessionType::REGULAR_SESSION]; |
| 129 [cell setAppearanceForTabTitle:[self.dataSource titleAtIndex:indexPath.item] | 128 [cell setAppearanceForTabTitle:[self.dataSource titleAtIndex:indexPath.item] |
| 130 favicon:nil | 129 favicon:nil |
| 131 cellSize:CGSizeZero]; | 130 cellSize:CGSizeZero]; |
| 131 [cell setSelected:(indexPath.item == [self.dataSource indexOfActiveTab])]; |
| 132 return cell; | 132 return cell; |
| 133 } | 133 } |
| 134 | 134 |
| 135 #pragma mark - UICollectionViewDelegate methods |
| 136 |
| 137 - (BOOL)collectionView:(UICollectionView*)collectionView |
| 138 shouldSelectItemAtIndexPath:(NSIndexPath*)indexPath { |
| 139 // Prevent user selection of items. |
| 140 return NO; |
| 141 } |
| 142 |
| 135 #pragma mark - ZoomTransitionDelegate methods | 143 #pragma mark - ZoomTransitionDelegate methods |
| 136 | 144 |
| 137 - (CGRect)rectForZoomWithKey:(NSObject*)key inView:(UIView*)view { | 145 - (CGRect)rectForZoomWithKey:(NSObject*)key inView:(UIView*)view { |
| 138 NSIndexPath* cellPath = base::mac::ObjCCastStrict<NSIndexPath>(key); | 146 NSIndexPath* cellPath = base::mac::ObjCCastStrict<NSIndexPath>(key); |
| 139 if (!key) | 147 if (!key) |
| 140 return CGRectNull; | 148 return CGRectNull; |
| 141 UICollectionViewCell* cell = [self.grid cellForItemAtIndexPath:cellPath]; | 149 UICollectionViewCell* cell = [self.grid cellForItemAtIndexPath:cellPath]; |
| 142 return [view convertRect:cell.bounds fromView:cell]; | 150 return [view convertRect:cell.bounds fromView:cell]; |
| 143 } | 151 } |
| 144 | 152 |
| 145 #pragma mark - SettingsActions | 153 #pragma mark - SettingsActions |
| 146 | 154 |
| 147 - (void)showSettings:(id)sender { | 155 - (void)showSettings:(id)sender { |
| 148 [self.settingsCommandHandler showSettings]; | 156 [self.settingsCommandHandler showSettings]; |
| 149 } | 157 } |
| 150 | 158 |
| 151 #pragma mark - TabGridActions | 159 #pragma mark - TabGridActions |
| 152 | 160 |
| 153 - (void)showTabGrid:(id)sender { | 161 - (void)showTabGrid:(id)sender { |
| 154 [self.tabGridCommandHandler showTabGrid]; | 162 [self.tabGridCommandHandler showTabGrid]; |
| 155 } | 163 } |
| 156 | 164 |
| 157 - (void)createNewTab:(id)sender { | 165 - (void)createNewTab:(id)sender { |
| 158 // PLACEHOLDER: The new WebStateList data structure will have implications | 166 // PLACEHOLDER: The new WebStateList data structure will have implications |
| 159 // on how new tabs are created. | 167 // on how new tabs are created. |
| 160 NSInteger index = [self.grid numberOfItemsInSection:0]; | 168 NSInteger index = [self.grid numberOfItemsInSection:0]; |
| 161 NSIndexPath* indexPath = [NSIndexPath indexPathForItem:index inSection:0]; | 169 NSIndexPath* indexPath = [NSIndexPath indexPathForItem:index inSection:0]; |
| 162 auto updateBlock = ^{ | 170 auto updateBlock = ^{ |
| 171 // Unselect current selected item. |
| 172 NSInteger selectedIndex = [self.dataSource indexOfActiveTab]; |
| 173 NSIndexPath* selectedIndexPath = |
| 174 [NSIndexPath indexPathForItem:selectedIndex inSection:0]; |
| 175 [self.grid reloadItemsAtIndexPaths:@[ selectedIndexPath ]]; |
| 176 |
| 177 // Create and show new tab. |
| 163 [self.tabCommandHandler createNewTabAtIndexPath:indexPath]; | 178 [self.tabCommandHandler createNewTabAtIndexPath:indexPath]; |
| 164 [self.tabCommandHandler showTabAtIndexPath:indexPath]; | 179 [self.tabCommandHandler showTabAtIndexPath:indexPath]; |
| 165 [self.grid insertItemsAtIndexPaths:@[ indexPath ]]; | 180 [self.grid insertItemsAtIndexPaths:@[ indexPath ]]; |
| 166 }; | 181 }; |
| 167 [self.grid performBatchUpdates:updateBlock completion:nil]; | 182 [self.grid performBatchUpdates:updateBlock completion:nil]; |
| 168 } | 183 } |
| 169 | 184 |
| 170 #pragma mark - SessionCellDelegate | 185 #pragma mark - SessionCellDelegate |
| 171 | 186 |
| 172 - (TabSwitcherCache*)tabSwitcherCache { | 187 - (TabSwitcherCache*)tabSwitcherCache { |
| 173 // PLACEHOLDER: return image cache. | 188 // PLACEHOLDER: return image cache. |
| 174 return nil; | 189 return nil; |
| 175 } | 190 } |
| 176 | 191 |
| 177 - (void)cellPressed:(UICollectionViewCell*)cell { | 192 - (void)cellPressed:(UICollectionViewCell*)cell { |
| 178 [self.tabCommandHandler showTabAtIndexPath:[self.grid indexPathForCell:cell]]; | 193 NSInteger selectedIndex = [self.dataSource indexOfActiveTab]; |
| 194 NSIndexPath* selectedIndexPath = |
| 195 [NSIndexPath indexPathForItem:selectedIndex inSection:0]; |
| 196 |
| 197 NSIndexPath* newSelectedIndexPath = [self.grid indexPathForCell:cell]; |
| 198 [self.tabCommandHandler showTabAtIndexPath:newSelectedIndexPath]; |
| 199 [self.grid |
| 200 reloadItemsAtIndexPaths:@[ selectedIndexPath, newSelectedIndexPath ]]; |
| 179 } | 201 } |
| 180 | 202 |
| 181 - (void)deleteButtonPressedForCell:(UICollectionViewCell*)cell { | 203 - (void)deleteButtonPressedForCell:(UICollectionViewCell*)cell { |
| 182 auto updateBlock = ^{ | 204 auto updateBlock = ^{ |
| 183 NSIndexPath* indexPath = [self.grid indexPathForCell:cell]; | 205 NSIndexPath* indexPath = [self.grid indexPathForCell:cell]; |
| 184 [self.tabCommandHandler closeTabAtIndexPath:indexPath]; | 206 [self.tabCommandHandler closeTabAtIndexPath:indexPath]; |
| 185 [self.grid deleteItemsAtIndexPaths:@[ indexPath ]]; | 207 [self.grid deleteItemsAtIndexPaths:@[ indexPath ]]; |
| 186 }; | 208 }; |
| 187 [self.grid performBatchUpdates:updateBlock completion:nil]; | 209 [self.grid performBatchUpdates:updateBlock completion:nil]; |
| 188 } | 210 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 205 [self.grid addSubview:overlayView]; | 227 [self.grid addSubview:overlayView]; |
| 206 self.noTabsOverlay = overlayView; | 228 self.noTabsOverlay = overlayView; |
| 207 } | 229 } |
| 208 | 230 |
| 209 // Removes the noTabsOverlay covering the entire tab grid. | 231 // Removes the noTabsOverlay covering the entire tab grid. |
| 210 - (void)removeNoTabsOverlay { | 232 - (void)removeNoTabsOverlay { |
| 211 [self.noTabsOverlay removeFromSuperview]; | 233 [self.noTabsOverlay removeFromSuperview]; |
| 212 } | 234 } |
| 213 | 235 |
| 214 @end | 236 @end |
| OLD | NEW |