Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(74)

Side by Side Diff: ui/app_list/cocoa/apps_grid_controller.mm

Issue 14999013: Allow pages on the OSX app launcher to be turned while dragging. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: respond to comments Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 #import "ui/app_list/cocoa/apps_grid_controller.h" 5 #import "ui/app_list/cocoa/apps_grid_controller.h"
6 6
7 #include "base/mac/foundation_util.h" 7 #include "base/mac/foundation_util.h"
8 #include "ui/app_list/app_list_model.h" 8 #include "ui/app_list/app_list_model.h"
9 #include "ui/app_list/app_list_model_observer.h" 9 #include "ui/app_list/app_list_model_observer.h"
10 #include "ui/app_list/app_list_view_delegate.h" 10 #include "ui/app_list/app_list_view_delegate.h"
(...skipping 15 matching lines...) Expand all
26 26
27 // Preferred tile size when showing in fixed layout. These should be even 27 // Preferred tile size when showing in fixed layout. These should be even
28 // numbers to ensure that if they are grown 50% they remain integers. 28 // numbers to ensure that if they are grown 50% they remain integers.
29 const CGFloat kPreferredTileWidth = 88; 29 const CGFloat kPreferredTileWidth = 88;
30 const CGFloat kPreferredTileHeight = 98; 30 const CGFloat kPreferredTileHeight = 98;
31 31
32 const CGFloat kViewWidth = 32 const CGFloat kViewWidth =
33 kFixedColumns * kPreferredTileWidth + 2 * kLeftRightPadding; 33 kFixedColumns * kPreferredTileWidth + 2 * kLeftRightPadding;
34 const CGFloat kViewHeight = kFixedRows * kPreferredTileHeight; 34 const CGFloat kViewHeight = kFixedRows * kPreferredTileHeight;
35 35
36 const NSTimeInterval kScrollWhileDraggingDelay = 1.0;
36 NSTimeInterval g_scroll_duration = 0.18; 37 NSTimeInterval g_scroll_duration = 0.18;
37 38
38 } // namespace 39 } // namespace
39 40
40 @interface AppsGridController () 41 @interface AppsGridController ()
41 42
43 - (void)scrollToPageWithTimer:(size_t)targetPage;
44 - (void)onTimer:(NSTimer*)theTimer;
45
42 // Cancel a currently running scroll animation. 46 // Cancel a currently running scroll animation.
43 - (void)cancelScrollAnimation; 47 - (void)cancelScrollAnimation;
44 48
45 // Index of the page with the most content currently visible. 49 // Index of the page with the most content currently visible.
46 - (size_t)nearestPageIndex; 50 - (size_t)nearestPageIndex;
47 51
48 // Bootstrap the views this class controls. 52 // Bootstrap the views this class controls.
49 - (void)loadAndSetView; 53 - (void)loadAndSetView;
50 54
51 - (void)boundsDidChange:(NSNotification*)notification; 55 - (void)boundsDidChange:(NSNotification*)notification;
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 [[self collectionViewAtPageIndex:visiblePage_] 242 [[self collectionViewAtPageIndex:visiblePage_]
239 setSelectionIndexes:[NSIndexSet indexSet]]; 243 setSelectionIndexes:[NSIndexSet indexSet]];
240 } 244 }
241 245
242 newOrigin.x = pageIndex * kViewWidth; 246 newOrigin.x = pageIndex * kViewWidth;
243 [NSAnimationContext beginGrouping]; 247 [NSAnimationContext beginGrouping];
244 [[NSAnimationContext currentContext] setDuration:g_scroll_duration]; 248 [[NSAnimationContext currentContext] setDuration:g_scroll_duration];
245 [[clipView animator] setBoundsOrigin:newOrigin]; 249 [[clipView animator] setBoundsOrigin:newOrigin];
246 [NSAnimationContext endGrouping]; 250 [NSAnimationContext endGrouping];
247 animatingScroll_ = YES; 251 animatingScroll_ = YES;
252 targetScrollPage_ = pageIndex;
253 [self cancelScrollTimer];
254 }
255
256 - (void)maybeChangePageForPoint:(NSPoint)locationInWindow {
257 NSPoint pointInView = [[self view] convertPoint:locationInWindow
258 fromView:nil];
259 // Check if the point is outside the view on the left or right.
260 if (pointInView.x <= 0 || pointInView.x >= NSWidth([[self view] bounds])) {
261 size_t targetPage = visiblePage_;
262 if (pointInView.x <= 0)
263 targetPage -= targetPage != 0 ? 1 : 0;
264 else
265 targetPage += targetPage < [pages_ count] - 1 ? 1 : 0;
266 [self scrollToPageWithTimer:targetPage];
267 return;
268 }
269
270 if (paginationObserver_) {
271 NSInteger segment =
272 [paginationObserver_ pagerSegmentAtLocation:locationInWindow];
273 if (segment >= 0 && static_cast<size_t>(segment) != targetScrollPage_) {
274 [self scrollToPageWithTimer:segment];
275 return;
276 }
277 }
278
279 // Otherwise the point may have moved back into the view.
280 [self cancelScrollTimer];
281 }
282
283 - (void)cancelScrollTimer {
284 scheduledScrollPage_ = targetScrollPage_;
285 [scrollWhileDraggingTimer_ invalidate];
286 }
287
288 - (void)scrollToPageWithTimer:(size_t)targetPage {
289 if (targetPage == targetScrollPage_) {
290 [self cancelScrollTimer];
291 return;
292 }
293
294 if (targetPage == scheduledScrollPage_)
295 return;
296
297 scheduledScrollPage_ = targetPage;
298 [scrollWhileDraggingTimer_ invalidate];
299 scrollWhileDraggingTimer_.reset(
300 [[NSTimer scheduledTimerWithTimeInterval:kScrollWhileDraggingDelay
301 target:self
302 selector:@selector(onTimer:)
303 userInfo:nil
304 repeats:NO] retain]);
305 }
306
307 - (void)onTimer:(NSTimer*)theTimer {
308 if (scheduledScrollPage_ == targetScrollPage_)
309 return; // Already animating scroll.
310
311 [self scrollToPage:scheduledScrollPage_];
248 } 312 }
249 313
250 - (void)cancelScrollAnimation { 314 - (void)cancelScrollAnimation {
251 NSClipView* clipView = [[self gridScrollView] contentView]; 315 NSClipView* clipView = [[self gridScrollView] contentView];
252 [NSAnimationContext beginGrouping]; 316 [NSAnimationContext beginGrouping];
253 [[NSAnimationContext currentContext] setDuration:0]; 317 [[NSAnimationContext currentContext] setDuration:0];
254 [[clipView animator] setBoundsOrigin:[clipView bounds].origin]; 318 [[clipView animator] setBoundsOrigin:[clipView bounds].origin];
255 [NSAnimationContext endGrouping]; 319 [NSAnimationContext endGrouping];
256 animatingScroll_ = NO; 320 animatingScroll_ = NO;
257 } 321 }
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 525
462 model_->apps()->RemoveObserver(bridge_.get()); 526 model_->apps()->RemoveObserver(bridge_.get());
463 model_->apps()->Move(itemIndex, modelIndex); 527 model_->apps()->Move(itemIndex, modelIndex);
464 model_->apps()->AddObserver(bridge_.get()); 528 model_->apps()->AddObserver(bridge_.get());
465 } 529 }
466 530
467 - (AppsCollectionViewDragManager*)dragManager { 531 - (AppsCollectionViewDragManager*)dragManager {
468 return dragManager_; 532 return dragManager_;
469 } 533 }
470 534
535 - (size_t)scheduledScrollPage {
536 return scheduledScrollPage_;
537 }
538
471 - (void)listItemsAdded:(size_t)start 539 - (void)listItemsAdded:(size_t)start
472 count:(size_t)count { 540 count:(size_t)count {
473 // Cancel any drag, to ensure the model stays consistent. 541 // Cancel any drag, to ensure the model stays consistent.
474 [dragManager_ cancelDrag]; 542 [dragManager_ cancelDrag];
475 543
476 for (size_t i = start; i < start + count; ++i) { 544 for (size_t i = start; i < start + count; ++i) {
477 app_list::AppListItemModel* itemModel = model_->apps()->GetItemAt(i); 545 app_list::AppListItemModel* itemModel = model_->apps()->GetItemAt(i);
478 [items_ insertObject:[NSValue valueWithPointer:itemModel] 546 [items_ insertObject:[NSValue valueWithPointer:itemModel]
479 atIndex:i]; 547 atIndex:i];
480 } 548 }
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 return [self moveSelectionByDelta:-kItemsPerPage]; 646 return [self moveSelectionByDelta:-kItemsPerPage];
579 647
580 if (command == @selector(pageDown:) || 648 if (command == @selector(pageDown:) ||
581 command == @selector(scrollPageDown:)) 649 command == @selector(scrollPageDown:))
582 return [self moveSelectionByDelta:kItemsPerPage]; 650 return [self moveSelectionByDelta:kItemsPerPage];
583 651
584 return NO; 652 return NO;
585 } 653 }
586 654
587 @end 655 @end
OLDNEW
« no previous file with comments | « ui/app_list/cocoa/apps_grid_controller.h ('k') | ui/app_list/cocoa/apps_grid_controller_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698