Index: ui/views/controls/button/menu_button.cc |
diff --git a/ui/views/controls/button/menu_button.cc b/ui/views/controls/button/menu_button.cc |
index aee3930a900574f7e5198a3222d86e82c5cf612d..072e1671c4ef2c5dd946a62d54883e86aefe2f3f 100644 |
--- a/ui/views/controls/button/menu_button.cc |
+++ b/ui/views/controls/button/menu_button.cc |
@@ -72,6 +72,7 @@ MenuButton::MenuButton(ButtonListener* listener, |
IDR_MENU_DROPARROW).ToImageSkia()), |
destroyed_flag_(NULL), |
pressed_lock_count_(0), |
+ should_disable_after_press_(false), |
weak_factory_(this) { |
SetHorizontalAlignment(gfx::ALIGN_LEFT); |
} |
@@ -308,8 +309,22 @@ bool MenuButton::ShouldEnterPushedState(const ui::Event& event) { |
return event.type() == ui::ET_GESTURE_TAP; |
} |
+void MenuButton::StateChanged() { |
+ if (pressed_lock_count_ != 0) { |
+ // The button's state was changed while it was supposed to be locked in a |
+ // pressed state. This shouldn't happen, but conceivably could if a caller |
+ // tries to switch from enabled to disabled or vice versa while the button |
+ // is pressed. |
+ if (state() == STATE_NORMAL) |
+ should_disable_after_press_ = false; |
+ else if (state() == STATE_DISABLED) |
+ should_disable_after_press_ = true; |
+ } |
+} |
+ |
void MenuButton::IncrementPressedLocked() { |
++pressed_lock_count_; |
+ should_disable_after_press_ = state() == STATE_DISABLED; |
SetState(STATE_PRESSED); |
} |
@@ -317,13 +332,17 @@ void MenuButton::DecrementPressedLocked() { |
--pressed_lock_count_; |
DCHECK_GE(pressed_lock_count_, 0); |
- // If this was the last lock, manually reset state to "normal". We set |
- // "normal" and not "hot" because the likelihood is that the mouse is now |
- // somewhere else (user clicked elsewhere on screen to close the menu or |
- // selected an item) and we will inevitably refresh the hot state in the event |
- // the mouse _is_ over the view. |
- if (pressed_lock_count_ == 0) |
- SetState(STATE_NORMAL); |
+ // If this was the last lock, manually reset state to the desired state. |
+ if (pressed_lock_count_ == 0) { |
+ ButtonState desired_state = STATE_NORMAL; |
+ if (should_disable_after_press_) { |
+ desired_state = STATE_DISABLED; |
+ should_disable_after_press_ = false; |
+ } else if (IsMouseHovered()) { |
+ desired_state = STATE_HOVERED; |
+ } |
+ SetState(desired_state); |
+ } |
} |
int MenuButton::GetMaximumScreenXCoordinate() { |