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

Side by Side Diff: ash/wm/app_list_controller.cc

Issue 23622020: Fixing the dynamic positioning (move with anchor) for the app launcher (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed Created 7 years, 3 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
« no previous file with comments | « no previous file | chrome/browser/ui/views/app_list/app_list_controller_win.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 #include "ash/wm/app_list_controller.h" 5 #include "ash/wm/app_list_controller.h"
6 6
7 #include "ash/ash_switches.h" 7 #include "ash/ash_switches.h"
8 #include "ash/launcher/launcher.h" 8 #include "ash/launcher/launcher.h"
9 #include "ash/root_window_controller.h" 9 #include "ash/root_window_controller.h"
10 #include "ash/shelf/shelf_layout_manager.h" 10 #include "ash/shelf/shelf_layout_manager.h"
(...skipping 20 matching lines...) Expand all
31 31
32 // Duration for show/hide animation in milliseconds. 32 // Duration for show/hide animation in milliseconds.
33 const int kAnimationDurationMs = 200; 33 const int kAnimationDurationMs = 200;
34 34
35 // Offset in pixels to animation away/towards the launcher. 35 // Offset in pixels to animation away/towards the launcher.
36 const int kAnimationOffset = 8; 36 const int kAnimationOffset = 8;
37 37
38 // The maximum shift in pixels when over-scroll happens. 38 // The maximum shift in pixels when over-scroll happens.
39 const int kMaxOverScrollShift = 48; 39 const int kMaxOverScrollShift = 48;
40 40
41 // The alternate shelf style adjusts the bubble to be flush with the shelf
42 // when there is no bubble-tip. This is the tip height which needs to be
43 // offsetted.
44 const int kArrowTipHeight = 10;
45
46 // The minimal anchor position offset to make sure that the bubble is still on 41 // The minimal anchor position offset to make sure that the bubble is still on
47 // the screen with 8 pixels spacing on the left / right. This constant is a 42 // the screen with 8 pixels spacing on the left / right. This constant is a
48 // result of minimal bubble arrow sizes and offsets. 43 // result of minimal bubble arrow sizes and offsets.
49 const int kMinimalAnchorPositionOffset = 57; 44 const int kMinimalAnchorPositionOffset = 57;
50 45
51 ui::Layer* GetLayer(views::Widget* widget) { 46 ui::Layer* GetLayer(views::Widget* widget) {
52 return widget->GetNativeView()->layer(); 47 return widget->GetNativeView()->layer();
53 } 48 }
54 49
55 // Gets arrow location based on shelf alignment. 50 // Gets arrow location based on shelf alignment.
(...skipping 24 matching lines...) Expand all
80 offseted.Offset(kAnimationOffset, 0); 75 offseted.Offset(kAnimationOffset, 0);
81 break; 76 break;
82 case SHELF_ALIGNMENT_TOP: 77 case SHELF_ALIGNMENT_TOP:
83 offseted.Offset(0, -kAnimationOffset); 78 offseted.Offset(0, -kAnimationOffset);
84 break; 79 break;
85 } 80 }
86 81
87 return offseted; 82 return offseted;
88 } 83 }
89 84
90 // Using |button_bounds|, determine the anchor so that the bubble gets shown 85 // Using |button_bounds|, determine the anchor offset so that the bubble gets
91 // above the shelf (used for the alternate shelf theme). 86 // shown above the shelf (used for the alternate shelf theme).
92 gfx::Point GetAdjustAnchorPositionToShelf( 87 gfx::Vector2d GetAnchorPositionOffsetToShelf(
93 const gfx::Rect& button_bounds, views::Widget* widget) { 88 const gfx::Rect& button_bounds, views::Widget* widget) {
94 DCHECK(Shell::HasInstance()); 89 DCHECK(Shell::HasInstance());
95 ShelfAlignment shelf_alignment = Shell::GetInstance()->GetShelfAlignment( 90 ShelfAlignment shelf_alignment = Shell::GetInstance()->GetShelfAlignment(
96 widget->GetNativeView()->GetRootWindow()); 91 widget->GetNativeView()->GetRootWindow());
97 gfx::Point anchor(button_bounds.CenterPoint()); 92 gfx::Point anchor(button_bounds.CenterPoint());
98 switch (shelf_alignment) { 93 switch (shelf_alignment) {
99 case SHELF_ALIGNMENT_TOP: 94 case SHELF_ALIGNMENT_TOP:
100 case SHELF_ALIGNMENT_BOTTOM: 95 case SHELF_ALIGNMENT_BOTTOM:
101 { 96 if (base::i18n::IsRTL()) {
102 if (base::i18n::IsRTL()) { 97 int screen_width = widget->GetWorkAreaBoundsInScreen().width();
103 int screen_width = widget->GetWorkAreaBoundsInScreen().width(); 98 return gfx::Vector2d(
104 anchor.set_x(std::min(screen_width - kMinimalAnchorPositionOffset, 99 std::min(screen_width - kMinimalAnchorPositionOffset - anchor.x(),
105 anchor.x())); 100 0), 0);
106 } else {
107 anchor.set_x(std::max(kMinimalAnchorPositionOffset, anchor.x()));
108 }
109 int offset = button_bounds.height() / 2 - kArrowTipHeight;
110 if (shelf_alignment == SHELF_ALIGNMENT_TOP)
111 offset = -offset;
112 anchor.set_y(anchor.y() - offset);
113 } 101 }
114 break; 102 return gfx::Vector2d(
103 std::max(kMinimalAnchorPositionOffset - anchor.x(), 0), 0);
115 case SHELF_ALIGNMENT_LEFT: 104 case SHELF_ALIGNMENT_LEFT:
116 anchor.set_x(button_bounds.right() - kArrowTipHeight); 105 return gfx::Vector2d(
117 anchor.set_y(std::max(kMinimalAnchorPositionOffset, anchor.y())); 106 0, std::max(kMinimalAnchorPositionOffset - anchor.y(), 0));
118 break;
119 case SHELF_ALIGNMENT_RIGHT: 107 case SHELF_ALIGNMENT_RIGHT:
120 anchor.set_x(button_bounds.x() + kArrowTipHeight); 108 return gfx::Vector2d(
121 anchor.set_y(std::max(kMinimalAnchorPositionOffset, anchor.y())); 109 0, std::max(kMinimalAnchorPositionOffset - anchor.y(), 0));
122 break; 110 default:
111 NOTREACHED();
112 return gfx::Vector2d();
123 } 113 }
124
125 return anchor;
126 } 114 }
127 115
128 } // namespace 116 } // namespace
129 117
130 //////////////////////////////////////////////////////////////////////////////// 118 ////////////////////////////////////////////////////////////////////////////////
131 // AppListController, public: 119 // AppListController, public:
132 120
133 AppListController::AppListController() 121 AppListController::AppListController()
134 : pagination_model_(new app_list::PaginationModel), 122 : pagination_model_(new app_list::PaginationModel),
135 is_visible_(false), 123 is_visible_(false),
(...skipping 29 matching lines...) Expand all
165 } else if (is_visible_) { 153 } else if (is_visible_) {
166 // AppListModel and AppListViewDelegate are owned by AppListView. They 154 // AppListModel and AppListViewDelegate are owned by AppListView. They
167 // will be released with AppListView on close. 155 // will be released with AppListView on close.
168 app_list::AppListView* view = new app_list::AppListView( 156 app_list::AppListView* view = new app_list::AppListView(
169 Shell::GetInstance()->delegate()->CreateAppListViewDelegate()); 157 Shell::GetInstance()->delegate()->CreateAppListViewDelegate());
170 aura::Window* container = GetRootWindowController(window->GetRootWindow())-> 158 aura::Window* container = GetRootWindowController(window->GetRootWindow())->
171 GetContainer(kShellWindowId_AppListContainer); 159 GetContainer(kShellWindowId_AppListContainer);
172 if (ash::switches::UseAlternateShelfLayout()) { 160 if (ash::switches::UseAlternateShelfLayout()) {
173 gfx::Rect applist_button_bounds = Launcher::ForWindow(container)-> 161 gfx::Rect applist_button_bounds = Launcher::ForWindow(container)->
174 GetAppListButtonView()->GetBoundsInScreen(); 162 GetAppListButtonView()->GetBoundsInScreen();
175 view->InitAsBubble( 163 view->InitAsBubbleAttachedToAnchor(
176 container, 164 container,
177 pagination_model_.get(), 165 pagination_model_.get(),
178 NULL, 166 Launcher::ForWindow(container)->GetAppListButtonView(),
179 GetAdjustAnchorPositionToShelf(applist_button_bounds, 167 GetAnchorPositionOffsetToShelf(applist_button_bounds,
180 Launcher::ForWindow(container)->GetAppListButtonView()-> 168 Launcher::ForWindow(container)->GetAppListButtonView()->
181 GetWidget()), 169 GetWidget()),
182 GetBubbleArrow(container), 170 GetBubbleArrow(container),
183 true /* border_accepts_events */); 171 true /* border_accepts_events */);
184 view->SetArrowPaintType(views::BubbleBorder::PAINT_NONE); 172 view->SetArrowPaintType(views::BubbleBorder::PAINT_NONE);
185 } else { 173 } else {
186 view->InitAsBubble( 174 view->InitAsBubbleAttachedToAnchor(
187 container, 175 container,
188 pagination_model_.get(), 176 pagination_model_.get(),
189 Launcher::ForWindow(container)->GetAppListButtonView(), 177 Launcher::ForWindow(container)->GetAppListButtonView(),
190 gfx::Point(), 178 gfx::Vector2d(),
191 GetBubbleArrow(container), 179 GetBubbleArrow(container),
192 true /* border_accepts_events */); 180 true /* border_accepts_events */);
193 } 181 }
194 SetView(view); 182 SetView(view);
195 // By setting us as DnD recipient, the app list knows that we can 183 // By setting us as DnD recipient, the app list knows that we can
196 // handle items. 184 // handle items.
197 if (!CommandLine::ForCurrentProcess()->HasSwitch( 185 if (!CommandLine::ForCurrentProcess()->HasSwitch(
198 ash::switches::kAshDisableDragAndDropAppListToLauncher)) { 186 ash::switches::kAshDisableDragAndDropAppListToLauncher)) {
199 SetDragAndDropHostOfCurrentAppList( 187 SetDragAndDropHostOfCurrentAppList(
200 Launcher::ForWindow(window)->GetDragAndDropHostForAppList()); 188 Launcher::ForWindow(window)->GetDragAndDropHostForAppList());
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
421 should_snap_back_ = false; 409 should_snap_back_ = false;
422 ui::ScopedLayerAnimationSettings animation(widget_animator); 410 ui::ScopedLayerAnimationSettings animation(widget_animator);
423 animation.SetTransitionDuration(base::TimeDelta::FromMilliseconds( 411 animation.SetTransitionDuration(base::TimeDelta::FromMilliseconds(
424 app_list::kOverscrollPageTransitionDurationMs)); 412 app_list::kOverscrollPageTransitionDurationMs));
425 widget->SetBounds(view_bounds_); 413 widget->SetBounds(view_bounds_);
426 } 414 }
427 } 415 }
428 416
429 } // namespace internal 417 } // namespace internal
430 } // namespace ash 418 } // namespace ash
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/ui/views/app_list/app_list_controller_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698