| Index: views/controls/button/custom_button.cc
|
| ===================================================================
|
| --- views/controls/button/custom_button.cc (revision 56726)
|
| +++ views/controls/button/custom_button.cc (working copy)
|
| @@ -19,24 +19,25 @@
|
| }
|
|
|
| void CustomButton::SetState(ButtonState state) {
|
| - if (state != state_) {
|
| - if (animate_on_state_change_ || !hover_animation_->is_animating()) {
|
| - animate_on_state_change_ = true;
|
| - if (state_ == BS_NORMAL && state == BS_HOT) {
|
| - // Button is hovered from a normal state, start hover animation.
|
| - hover_animation_->Show();
|
| - } else if (state_ == BS_HOT && state == BS_NORMAL) {
|
| - // Button is returning to a normal state from hover, start hover
|
| - // fade animation.
|
| - hover_animation_->Hide();
|
| - } else {
|
| - hover_animation_->Stop();
|
| - }
|
| - }
|
| + if (state == state_)
|
| + return;
|
|
|
| - state_ = state;
|
| - SchedulePaint();
|
| + if (animate_on_state_change_ || !hover_animation_->is_animating()) {
|
| + animate_on_state_change_ = true;
|
| + if (state_ == BS_NORMAL && state == BS_HOT) {
|
| + // Button is hovered from a normal state, start hover animation.
|
| + hover_animation_->Show();
|
| + } else if (state_ == BS_HOT && state == BS_NORMAL) {
|
| + // Button is returning to a normal state from hover, start hover
|
| + // fade animation.
|
| + hover_animation_->Hide();
|
| + } else {
|
| + hover_animation_->Stop();
|
| + }
|
| }
|
| +
|
| + state_ = state;
|
| + SchedulePaint();
|
| }
|
|
|
| void CustomButton::StartThrobbing(int cycles_til_stop) {
|
| @@ -54,14 +55,13 @@
|
| bool CustomButton::GetAccessibleState(AccessibilityTypes::State* state) {
|
| *state = 0;
|
| switch (state_) {
|
| - case BS_NORMAL:
|
| - *state = 0;
|
| case BS_HOT:
|
| *state = AccessibilityTypes::STATE_HOTTRACKED;
|
| case BS_PUSHED:
|
| *state = AccessibilityTypes::STATE_PRESSED;
|
| case BS_DISABLED:
|
| *state = AccessibilityTypes::STATE_UNAVAILABLE;
|
| + case BS_NORMAL:
|
| case BS_COUNT:
|
| // No additional accessibility state set for this button state.
|
| break;
|
| @@ -71,11 +71,8 @@
|
| }
|
|
|
| void CustomButton::SetEnabled(bool enabled) {
|
| - if (enabled && state_ == BS_DISABLED) {
|
| - SetState(BS_NORMAL);
|
| - } else if (!enabled && state_ != BS_DISABLED) {
|
| - SetState(BS_DISABLED);
|
| - }
|
| + if (enabled ? (state_ == BS_DISABLED) : (state_ != BS_DISABLED))
|
| + SetState(enabled ? BS_NORMAL : BS_DISABLED);
|
| }
|
|
|
| bool CustomButton::IsEnabled() const {
|
| @@ -107,14 +104,14 @@
|
| // CustomButton, View overrides (protected):
|
|
|
| bool CustomButton::AcceleratorPressed(const Accelerator& accelerator) {
|
| - if (enabled_) {
|
| - SetState(BS_NORMAL);
|
| - KeyEvent key_event(Event::ET_KEY_RELEASED, accelerator.GetKeyCode(),
|
| - accelerator.modifiers(), 0, 0);
|
| - NotifyClick(key_event);
|
| - return true;
|
| - }
|
| - return false;
|
| + if (!enabled_)
|
| + return false;
|
| +
|
| + SetState(BS_NORMAL);
|
| + KeyEvent key_event(Event::ET_KEY_RELEASED, accelerator.GetKeyCode(),
|
| + accelerator.modifiers(), 0, 0);
|
| + NotifyClick(key_event);
|
| + return true;
|
| }
|
|
|
| bool CustomButton::OnMousePressed(const MouseEvent& e) {
|
| @@ -129,34 +126,29 @@
|
|
|
| bool CustomButton::OnMouseDragged(const MouseEvent& e) {
|
| if (state_ != BS_DISABLED) {
|
| - if (!HitTest(e.location()))
|
| - SetState(BS_NORMAL);
|
| - else if (ShouldEnterPushedState(e))
|
| - SetState(BS_PUSHED);
|
| + if (HitTest(e.location()))
|
| + SetState(ShouldEnterPushedState(e) ? BS_PUSHED : BS_HOT);
|
| else
|
| - SetState(BS_HOT);
|
| + SetState(BS_NORMAL);
|
| }
|
| return true;
|
| }
|
|
|
| void CustomButton::OnMouseReleased(const MouseEvent& e, bool canceled) {
|
| - if (InDrag()) {
|
| - // Starting a drag results in a MouseReleased, we need to ignore it.
|
| + // Starting a drag results in a MouseReleased, we need to ignore it.
|
| + if ((state_ == BS_DISABLED) || InDrag())
|
| return;
|
| +
|
| + if (!HitTest(e.location())) {
|
| + SetState(BS_NORMAL);
|
| + return;
|
| }
|
|
|
| - if (state_ != BS_DISABLED) {
|
| - if (canceled || !HitTest(e.location())) {
|
| - SetState(BS_NORMAL);
|
| - } else {
|
| - SetState(BS_HOT);
|
| - if (IsTriggerableEvent(e)) {
|
| - NotifyClick(e);
|
| - // We may be deleted at this point (by the listener's notification
|
| - // handler) so no more doing anything, just return.
|
| - return;
|
| - }
|
| - }
|
| + SetState(BS_HOT);
|
| + if (!canceled && IsTriggerableEvent(e)) {
|
| + NotifyClick(e);
|
| + // NOTE: We may be deleted at this point (by the listener's notification
|
| + // handler).
|
| }
|
| }
|
|
|
| @@ -166,13 +158,8 @@
|
| }
|
|
|
| void CustomButton::OnMouseMoved(const MouseEvent& e) {
|
| - if (state_ != BS_DISABLED) {
|
| - if (HitTest(e.location())) {
|
| - SetState(BS_HOT);
|
| - } else {
|
| - SetState(BS_NORMAL);
|
| - }
|
| - }
|
| + if (state_ != BS_DISABLED)
|
| + SetState(HitTest(e.location()) ? BS_HOT : BS_NORMAL);
|
| }
|
|
|
| void CustomButton::OnMouseExited(const MouseEvent& e) {
|
| @@ -182,31 +169,28 @@
|
| }
|
|
|
| bool CustomButton::OnKeyPressed(const KeyEvent& e) {
|
| - if (state_ != BS_DISABLED) {
|
| - // Space sets button state to pushed. Enter clicks the button. This matches
|
| - // the Windows native behavior of buttons, where Space clicks the button
|
| - // on KeyRelease and Enter clicks the button on KeyPressed.
|
| - if (e.GetKeyCode() == base::VKEY_SPACE) {
|
| - SetState(BS_PUSHED);
|
| - return true;
|
| - } else if (e.GetKeyCode() == base::VKEY_RETURN) {
|
| - SetState(BS_NORMAL);
|
| - NotifyClick(e);
|
| - return true;
|
| - }
|
| + if (state_ == BS_DISABLED)
|
| + return false;
|
| +
|
| + // Space sets button state to pushed. Enter clicks the button. This matches
|
| + // the Windows native behavior of buttons, where Space clicks the button on
|
| + // KeyRelease and Enter clicks the button on KeyPressed.
|
| + if (e.GetKeyCode() == base::VKEY_SPACE) {
|
| + SetState(BS_PUSHED);
|
| + } else if (e.GetKeyCode() == base::VKEY_RETURN) {
|
| + SetState(BS_NORMAL);
|
| + NotifyClick(e);
|
| }
|
| - return false;
|
| + return true;
|
| }
|
|
|
| bool CustomButton::OnKeyReleased(const KeyEvent& e) {
|
| - if (state_ != BS_DISABLED) {
|
| - if (e.GetKeyCode() == base::VKEY_SPACE) {
|
| - SetState(BS_NORMAL);
|
| - NotifyClick(e);
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| + if ((state_ == BS_DISABLED) || (e.GetKeyCode() != base::VKEY_SPACE))
|
| + return false;
|
| +
|
| + SetState(BS_NORMAL);
|
| + NotifyClick(e);
|
| + return true;
|
| }
|
|
|
| void CustomButton::OnDragDone() {
|
| @@ -214,14 +198,14 @@
|
| }
|
|
|
| void CustomButton::ShowContextMenu(const gfx::Point& p, bool is_mouse_gesture) {
|
| - if (GetContextMenuController()) {
|
| - // We're about to show the context menu. Showing the context menu likely
|
| - // means we won't get a mouse exited and reset state. Reset it now to be
|
| - // sure.
|
| - if (state_ != BS_DISABLED)
|
| - SetState(BS_NORMAL);
|
| - View::ShowContextMenu(p, is_mouse_gesture);
|
| - }
|
| + if (!GetContextMenuController())
|
| + return;
|
| +
|
| + // We're about to show the context menu. Showing the context menu likely means
|
| + // we won't get a mouse exited and reset state. Reset it now to be sure.
|
| + if (state_ != BS_DISABLED)
|
| + SetState(BS_NORMAL);
|
| + View::ShowContextMenu(p, is_mouse_gesture);
|
| }
|
|
|
| void CustomButton::ViewHierarchyChanged(bool is_add, View *parent,
|
| @@ -258,23 +242,4 @@
|
| return IsTriggerableEvent(e);
|
| }
|
|
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// CustomButton, private:
|
| -
|
| -void CustomButton::SetHighlighted(bool highlighted) {
|
| - if (highlighted && state_ != BS_DISABLED) {
|
| - SetState(BS_HOT);
|
| - } else if (!highlighted && state_ != BS_DISABLED) {
|
| - SetState(BS_NORMAL);
|
| - }
|
| -}
|
| -
|
| -bool CustomButton::IsHighlighted() const {
|
| - return state_ == BS_HOT;
|
| -}
|
| -
|
| -bool CustomButton::IsPushed() const {
|
| - return state_ == BS_PUSHED;
|
| -}
|
| -
|
| } // namespace views
|
|
|