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

Unified Diff: chrome/browser/ui/panels/panel_browser_frame_view.cc

Issue 7055001: Make info button appear only when mouse is over the panel or the panel has focus. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/panels/panel_browser_frame_view.cc
===================================================================
--- chrome/browser/ui/panels/panel_browser_frame_view.cc (revision 86006)
+++ chrome/browser/ui/panels/panel_browser_frame_view.cc (working copy)
@@ -21,6 +21,7 @@
#include "views/controls/button/image_button.h"
#include "views/controls/label.h"
#include "views/painter.h"
+#include "views/screen.h"
#include "views/window/window.h"
#include "views/window/window_shape.h"
@@ -129,6 +130,60 @@
} // namespace
+// PanelBrowserFrameView::MouseWatcher -----------------------------------------
+
+PanelBrowserFrameView::MouseWatcher::MouseWatcher(PanelBrowserFrameView* view)
+ : view_(view),
+ in_view_(false) {
+ MessageLoopForUI::current()->AddObserver(this);
+}
+
+PanelBrowserFrameView::MouseWatcher::~MouseWatcher() {
+ MessageLoopForUI::current()->RemoveObserver(this);
+}
+
+bool PanelBrowserFrameView::MouseWatcher::IsCursorInViewBounds() const {
+ gfx::Point cursor_point = views::Screen::GetCursorScreenPoint();
+ return view_->browser_view_->GetBounds().Contains(cursor_point.x(),
+ cursor_point.y());
+}
+
+#if defined(OS_WIN)
+void PanelBrowserFrameView::MouseWatcher::DidProcessMessage(const MSG& msg) {
+ switch (msg.message) {
+ case WM_MOUSEMOVE:
+ case WM_NCMOUSEMOVE:
+ case WM_MOUSELEAVE:
+ case WM_NCMOUSELEAVE:
+ HandleGlobalMouseMoveEvent();
+ break;
+ default:
+ break;
+ }
+}
+#else
+void PanelBrowserFrameView::MouseWatcher::DidProcessEvent(GdkEvent* event) {
+ switch (event->type) {
+ case GDK_MOTION_NOTIFY:
+ case GDK_LEAVE_NOTIFY:
+ HandleGlobalMouseMoveEvent();
+ break;
+ default:
+ break;
+ }
+}
+#endif
+
+void PanelBrowserFrameView::MouseWatcher::HandleGlobalMouseMoveEvent() {
+ bool in_view = IsCursorInViewBounds();
+ if (in_view == in_view_)
+ return;
+ in_view_ = in_view;
+ view_->OnMouseEnterOrLeaveWindow(in_view_);
+}
+
+// PanelBrowserFrameView -------------------------------------------------------
+
PanelBrowserFrameView::PanelBrowserFrameView(BrowserFrame* frame,
PanelBrowserView* browser_view)
: BrowserNonClientFrameView(),
@@ -153,9 +208,7 @@
UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_ABOUT_PANEL)));
info_button_->SetAccessibleName(
l10n_util::GetStringUTF16(IDS_ACCNAME_ABOUT_PANEL));
- // TODO(jianli): Hide info button by default and show it when mouse is over
- // panel.
- // info_button_->SetVisible(false);
+ info_button_->SetVisible(false);
AddChildView(info_button_);
close_button_ = new views::ImageButton(this);
@@ -178,6 +231,8 @@
title_label_ = new views::Label(std::wstring());
title_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
AddChildView(title_label_);
+
+ mouse_watcher_.reset(new MouseWatcher(this));
}
PanelBrowserFrameView::~PanelBrowserFrameView() {
@@ -479,5 +534,16 @@
}
void PanelBrowserFrameView::OnActivationChanged(bool active) {
+ UpdateInfoButtonVisibility(active, mouse_watcher_->IsCursorInViewBounds());
SchedulePaint();
}
+
+void PanelBrowserFrameView::OnMouseEnterOrLeaveWindow(bool mouse_entered) {
+ UpdateInfoButtonVisibility(browser_view_->panel()->IsActive(),
+ mouse_entered);
+}
+
+void PanelBrowserFrameView::UpdateInfoButtonVisibility(bool active,
+ bool cursor_in_view) {
+ info_button_->SetVisible(active || cursor_in_view);
+}

Powered by Google App Engine
This is Rietveld 408576698