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

Unified Diff: ui/message_center/views/desktop_popup_alignment_delegate.cc

Issue 369573004: Separate the logic of popup alignment and workarea handling as delegate. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix Created 6 years, 5 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
Index: ui/message_center/views/desktop_popup_alignment_delegate.cc
diff --git a/ui/message_center/views/desktop_popup_alignment_delegate.cc b/ui/message_center/views/desktop_popup_alignment_delegate.cc
new file mode 100644
index 0000000000000000000000000000000000000000..ec01ded2832c9d4569d2009903178e689416c40a
--- /dev/null
+++ b/ui/message_center/views/desktop_popup_alignment_delegate.cc
@@ -0,0 +1,104 @@
+// Copyright 2014 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.
+
+#include "ui/message_center/views/desktop_popup_alignment_delegate.h"
+
+#include "ui/gfx/display.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/screen.h"
+#include "ui/message_center/message_center_style.h"
+#include "ui/message_center/views/message_popup_collection.h"
+
+namespace message_center {
+
+DesktopPopupAlignmentDelegate::DesktopPopupAlignmentDelegate()
+ : alignment_(POPUP_ALIGNMENT_BOTTOM | POPUP_ALIGNMENT_RIGHT),
+ display_id_(gfx::Display::kInvalidDisplayID),
+ screen_(NULL) {
+}
+
+DesktopPopupAlignmentDelegate::~DesktopPopupAlignmentDelegate() {
+ if (screen_)
+ screen_->RemoveObserver(this);
+}
+
+void DesktopPopupAlignmentDelegate::StartObserving(gfx::Screen* screen) {
+ if (screen_ || !screen)
+ return;
+
+ screen_ = screen;
+ screen_->AddObserver(this);
+ gfx::Display display = screen_->GetPrimaryDisplay();
+ display_id_ = display.id();
+ RecomputeAlignment(display);
+}
+
+int DesktopPopupAlignmentDelegate::GetToastOriginX(
+ const gfx::Rect& toast_bounds) const {
+ if (IsFromLeft())
+ return work_area_.x() + kMarginBetweenItems;
+ return work_area_.right() - kMarginBetweenItems - toast_bounds.width();
+}
+
+int DesktopPopupAlignmentDelegate::GetBaseLine() const {
+ return IsTopDown()
+ ? work_area_.y() + kMarginBetweenItems
+ : work_area_.bottom() - kMarginBetweenItems;
+}
+
+int DesktopPopupAlignmentDelegate::GetWorkAreaBottom() const {
+ return work_area_.bottom();
+}
+
+bool DesktopPopupAlignmentDelegate::IsTopDown() const {
+ return (alignment_ & POPUP_ALIGNMENT_TOP) != 0;
+}
+
+bool DesktopPopupAlignmentDelegate::IsFromLeft() const {
+ return (alignment_ & POPUP_ALIGNMENT_LEFT) != 0;
+}
+
+void DesktopPopupAlignmentDelegate::RecomputeAlignment(
+ const gfx::Display& display) {
+ if (work_area_ == display.work_area())
+ return;
+
+ work_area_ = display.work_area();
+
+ // If the taskbar is at the top, render notifications top down. Some platforms
+ // like Gnome can have taskbars at top and bottom. In this case it's more
+ // likely that the systray is on the top one.
+ alignment_ = work_area_.y() > display.bounds().y() ? POPUP_ALIGNMENT_TOP
+ : POPUP_ALIGNMENT_BOTTOM;
+
+ // If the taskbar is on the left show the notifications on the left. Otherwise
+ // show it on right since it's very likely that the systray is on the right if
+ // the taskbar is on the top or bottom.
+ // Since on some platforms like Ubuntu Unity there's also a launcher along
+ // with a taskbar (panel), we need to check that there is really nothing at
+ // the top before concluding that the taskbar is at the left.
+ alignment_ |= (work_area_.x() > display.bounds().x() &&
+ work_area_.y() == display.bounds().y())
+ ? POPUP_ALIGNMENT_LEFT
+ : POPUP_ALIGNMENT_RIGHT;
+}
+
+void DesktopPopupAlignmentDelegate::OnDisplayAdded(
+ const gfx::Display& new_display) {
+}
+
+void DesktopPopupAlignmentDelegate::OnDisplayRemoved(
+ const gfx::Display& old_display) {
+}
+
+void DesktopPopupAlignmentDelegate::OnDisplayMetricsChanged(
+ const gfx::Display& display,
+ uint32_t metrics) {
+ if (display.id() == display_id_) {
+ RecomputeAlignment(display);
+ DoUpdateIfPossible();
+ }
+}
+
+} // namespace message_center
« no previous file with comments | « ui/message_center/views/desktop_popup_alignment_delegate.h ('k') | ui/message_center/views/message_popup_collection.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698