Browse Source

views: Show menubar's accelerator when "Alt" is pressed.

Cheng Zhao 10 years ago
parent
commit
e9536508a5

+ 9 - 0
atom/browser/native_window_views.cc

@@ -572,6 +572,11 @@ void NativeWindowViews::HandleKeyboardEvent(
     const content::NativeWebKeyboardEvent& event) {
   keyboard_event_handler_->HandleKeyboardEvent(event, GetFocusManager());
 
+  if (menu_bar_ && menu_bar_visible_ && IsAltKey(event)) {
+    menu_bar_->SetAcceleratorVisibility(
+        event.type == blink::WebInputEvent::RawKeyDown);
+  }
+
   if (!menu_bar_autohide_)
     return;
 
@@ -627,6 +632,10 @@ void NativeWindowViews::SetMenuBarVisibility(bool visible) {
   if (!menu_bar_)
     return;
 
+  // Always show the accelerator when the auto-hide menu bar shows.
+  if (menu_bar_autohide_)
+    menu_bar_->SetAcceleratorVisibility(visible);
+
   menu_bar_visible_ = visible;
   if (visible) {
     DCHECK_EQ(child_count(), 1);

+ 5 - 0
atom/browser/ui/views/menu_bar.cc

@@ -85,6 +85,11 @@ void MenuBar::SetMenu(ui::MenuModel* model) {
   }
 }
 
+void MenuBar::SetAcceleratorVisibility(bool visible) {
+  for (int i = 0; i < child_count(); ++i)
+    static_cast<SubmenuButton*>(child_at(i))->SetAcceleratorVisibility(visible);
+}
+
 int MenuBar::GetItemCount() const {
   return menu_model_->GetItemCount();
 }

+ 3 - 0
atom/browser/ui/views/menu_bar.h

@@ -31,6 +31,9 @@ class MenuBar : public views::View,
   // Replaces current menu with a new one.
   void SetMenu(ui::MenuModel* menu_model);
 
+  // Shows underline under accelerators.
+  void SetAcceleratorVisibility(bool visible);
+
   // Returns there are how many items in the root menu.
   int GetItemCount() const;
 

+ 10 - 1
atom/browser/ui/views/submenu_button.cc

@@ -27,6 +27,7 @@ SubmenuButton::SubmenuButton(views::ButtonListener* listener,
                              views::MenuButtonListener* menu_button_listener)
     : views::MenuButton(listener, FilterAccecelator(title),
                         menu_button_listener, false),
+      show_underline_(false),
       underline_start_(-1),
       underline_end_(-1),
       text_width_(0),
@@ -40,6 +41,14 @@ SubmenuButton::SubmenuButton(views::ButtonListener* listener,
 SubmenuButton::~SubmenuButton() {
 }
 
+void SubmenuButton::SetAcceleratorVisibility(bool visible) {
+  if (visible == show_underline_)
+    return;
+
+  show_underline_ = visible;
+  SchedulePaint();
+}
+
 void SubmenuButton::SetUnderlineColor(SkColor color) {
   underline_color_ = color;
 }
@@ -47,7 +56,7 @@ void SubmenuButton::SetUnderlineColor(SkColor color) {
 void SubmenuButton::OnPaint(gfx::Canvas* canvas) {
   views::MenuButton::OnPaint(canvas);
 
-  if (underline_start_ != underline_end_) {
+  if (show_underline_ && (underline_start_ != underline_end_)) {
     int padding = (width() - text_width_) / 2;
     int underline_height = (height() + text_height_) / 2 - 2;
     canvas->DrawLine(gfx::Point(underline_start_ + padding, underline_height),

+ 3 - 0
atom/browser/ui/views/submenu_button.h

@@ -17,6 +17,7 @@ class SubmenuButton : public views::MenuButton {
                 views::MenuButtonListener* menu_button_listener);
   virtual ~SubmenuButton();
 
+  void SetAcceleratorVisibility(bool visible);
   void SetUnderlineColor(SkColor color);
 
   // views::MenuButton:
@@ -28,6 +29,8 @@ class SubmenuButton : public views::MenuButton {
   void GetCharacterPosition(
       const base::string16& text, int index, int* pos);
 
+  bool show_underline_;
+
   int underline_start_;
   int underline_end_;
   int text_width_;