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

Unified Diff: chrome/browser/ui/views/app_list/app_list_controller_win.cc

Issue 12334115: [win] Ensure the app launcher always comes up on screen. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Even better Created 7 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/views/app_list/app_list_controller_win.cc
diff --git a/chrome/browser/ui/views/app_list/app_list_controller_win.cc b/chrome/browser/ui/views/app_list/app_list_controller_win.cc
index c9d334dc1268905c01990cebccd1549c037e2df9..1ae7b4778092d4214165a140680b820729426507 100644
--- a/chrome/browser/ui/views/app_list/app_list_controller_win.cc
+++ b/chrome/browser/ui/views/app_list/app_list_controller_win.cc
@@ -195,9 +195,8 @@ class AppListController : public ProfileInfoCacheObserver {
void SaveProfilePathToLocalState(const base::FilePath& profile_file_path);
// Utility methods for showing the app list.
- void SnapArrowLocationToTaskbarEdge(
- const gfx::Display& display,
- gfx::Point* anchor);
+ gfx::Point FindAnchorPoint(const gfx::Display& display,
+ const gfx::Point& cursor);
void UpdateArrowPositionAndAnchorPoint(const gfx::Point& cursor);
string16 GetAppListIconPath();
@@ -540,131 +539,79 @@ bool GetTaskbarRect(gfx::Rect* rect) {
return true;
}
-// Used to position the view relative to a point, which requires |anchor| to be
-// in the center of the desired view location. This helper function updates
-// |anchor| thus, using the location of the point in |point|, the distance
-// to move the view from |point| in |offset|, and the direction to move
-// represented in |direction|.
-// To position relative to a screen corner, the absolute values of |direction|.x
-// and |direction.y| should both be 1. To position relative to some point on the
-// taskbar, one of the absolute values of |direction.x| and |direction.y| should
-// be 1 and the other 0.
-void FloatFromPoint(const gfx::Point& point,
- const gfx::Size& offset,
- const gfx::Point& direction,
- gfx::Point* anchor) {
- anchor->set_x(point.x() + direction.x() * offset.width());
- anchor->set_y(point.y() + direction.y() * offset.height());
-}
-
-void AppListController::SnapArrowLocationToTaskbarEdge(
- const gfx::Display& display,
- gfx::Point* anchor) {
+gfx::Point FindReferencePoint(const gfx::Display& display,
+ const gfx::Point& cursor) {
const int kSnapDistance = 50;
- const int kSnapOffset = 5;
-
- gfx::Rect taskbar_rect;
- gfx::Size float_offset = current_view_->GetPreferredSize();
- float_offset.set_width(float_offset.width() / 2);
- float_offset.set_height(float_offset.height() / 2);
- float_offset.Enlarge(kSnapOffset, kSnapOffset);
// If we can't find the taskbar, snap to the bottom left.
// If the display size is the same as the work area, and does not contain the
// taskbar, either the taskbar is hidden or on another monitor, so just snap
// to the bottom left.
+ gfx::Rect taskbar_rect;
if (!GetTaskbarRect(&taskbar_rect) ||
(display.work_area() == display.bounds() &&
!display.work_area().Contains(taskbar_rect))) {
- FloatFromPoint(display.work_area().bottom_left(),
- float_offset,
- gfx::Point(1, -1),
- anchor);
- return;
+ return display.work_area().bottom_left();
}
- const gfx::Rect& screen_rect = display.bounds();
-
// Snap to the taskbar edge. If the cursor is greater than kSnapDistance away,
// also move to the left (for horizontal taskbars) or top (for vertical).
-
+ const gfx::Rect& screen_rect = display.bounds();
// First handle taskbar on bottom.
if (taskbar_rect.width() == screen_rect.width()) {
if (taskbar_rect.bottom() == screen_rect.bottom()) {
- if (taskbar_rect.y() - anchor->y() > kSnapDistance) {
- FloatFromPoint(gfx::Point(screen_rect.x(), taskbar_rect.y()),
- float_offset,
- gfx::Point(1, -1),
- anchor);
- return;
- }
-
- FloatFromPoint(gfx::Point(anchor->x(), taskbar_rect.y()),
- float_offset,
- gfx::Point(0, -1),
- anchor);
- return;
+ if (taskbar_rect.y() - cursor.y() > kSnapDistance)
+ return gfx::Point(screen_rect.x(), taskbar_rect.y());
+
+ return gfx::Point(cursor.x(), taskbar_rect.y());
}
// Now try on the top.
- if (anchor->y() - taskbar_rect.bottom() > kSnapDistance) {
- FloatFromPoint(gfx::Point(screen_rect.x(), taskbar_rect.bottom()),
- float_offset,
- gfx::Point(1, 1),
- anchor);
- return;
- }
+ if (cursor.y() - taskbar_rect.bottom() > kSnapDistance)
+ return gfx::Point(screen_rect.x(), taskbar_rect.bottom());
- FloatFromPoint(gfx::Point(anchor->x(), taskbar_rect.bottom()),
- float_offset,
- gfx::Point(0, 1),
- anchor);
- return;
+ return gfx::Point(cursor.x(), taskbar_rect.bottom());
}
// Now try the left.
if (taskbar_rect.x() == screen_rect.x()) {
- if (anchor->x() - taskbar_rect.right() > kSnapDistance) {
- FloatFromPoint(gfx::Point(taskbar_rect.right(), screen_rect.y()),
- float_offset,
- gfx::Point(1, 1),
- anchor);
- return;
- }
+ if (cursor.x() - taskbar_rect.right() > kSnapDistance)
+ return gfx::Point(taskbar_rect.right(), screen_rect.y());
- FloatFromPoint(gfx::Point(taskbar_rect.right(), anchor->y()),
- float_offset,
- gfx::Point(1, 0),
- anchor);
- return;
+ return gfx::Point(taskbar_rect.right(), cursor.y());
}
// Finally, try the right.
- if (taskbar_rect.x() - anchor->x() > kSnapDistance) {
- FloatFromPoint(gfx::Point(taskbar_rect.x(), screen_rect.y()),
- float_offset,
- gfx::Point(-1, 1),
- anchor);
- return;
- }
+ if (taskbar_rect.x() - cursor.x() > kSnapDistance)
+ return gfx::Point(taskbar_rect.x(), screen_rect.y());
- FloatFromPoint(gfx::Point(taskbar_rect.x(), anchor->y()),
- float_offset,
- gfx::Point(-1, 0),
- anchor);
+ return gfx::Point(taskbar_rect.x(), cursor.y());
+}
+
+gfx::Point AppListController::FindAnchorPoint(
+ const gfx::Display& display,
+ const gfx::Point& cursor) {
+ const int kSnapOffset = 3;
+
+ gfx::Rect bounds_rect(display.work_area());
+ gfx::Size view_size(current_view_->GetPreferredSize());
+ bounds_rect.Inset(view_size.width() / 2 + kSnapOffset,
+ view_size.height() / 2 + kSnapOffset);
+
+ gfx::Point anchor = FindReferencePoint(display, cursor);
+ anchor.ClampToMin(bounds_rect.origin());
+ anchor.ClampToMax(bounds_rect.bottom_right());
+ return anchor;
}
void AppListController::UpdateArrowPositionAndAnchorPoint(
const gfx::Point& cursor) {
- gfx::Point anchor(cursor);
gfx::Screen* screen =
gfx::Screen::GetScreenFor(current_view_->GetWidget()->GetNativeView());
- gfx::Display display = screen->GetDisplayNearestPoint(anchor);
-
- SnapArrowLocationToTaskbarEdge(display, &anchor);
+ gfx::Display display = screen->GetDisplayNearestPoint(cursor);
current_view_->SetBubbleArrowLocation(views::BubbleBorder::FLOAT);
- current_view_->SetAnchorPoint(anchor);
+ current_view_->SetAnchorPoint(FindAnchorPoint(display, cursor));
}
string16 AppListController::GetAppListIconPath() {
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698