Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/views/controls/button/custom_button.h" | 5 #include "ui/views/controls/button/custom_button.h" |
| 6 | 6 |
| 7 #include "ui/accessibility/ax_view_state.h" | 7 #include "ui/accessibility/ax_view_state.h" |
| 8 #include "ui/base/material_design/material_design_controller.h" | 8 #include "ui/base/material_design/material_design_controller.h" |
| 9 #include "ui/events/event.h" | 9 #include "ui/events/event.h" |
| 10 #include "ui/events/event_utils.h" | 10 #include "ui/events/event_utils.h" |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 141 const char* CustomButton::GetClassName() const { | 141 const char* CustomButton::GetClassName() const { |
| 142 return kViewClassName; | 142 return kViewClassName; |
| 143 } | 143 } |
| 144 | 144 |
| 145 bool CustomButton::OnMousePressed(const ui::MouseEvent& event) { | 145 bool CustomButton::OnMousePressed(const ui::MouseEvent& event) { |
| 146 if (state_ == STATE_DISABLED) | 146 if (state_ == STATE_DISABLED) |
| 147 return true; | 147 return true; |
| 148 if (state_ != STATE_PRESSED && ShouldEnterPushedState(event) && | 148 if (state_ != STATE_PRESSED && ShouldEnterPushedState(event) && |
| 149 HitTestPoint(event.location())) { | 149 HitTestPoint(event.location())) { |
| 150 SetState(STATE_PRESSED); | 150 SetState(STATE_PRESSED); |
| 151 AnimateInkDrop(views::InkDropState::ACTION_PENDING); | 151 AnimateInkDrop(views::InkDropState::ACTION_PENDING, &event); |
| 152 } | 152 } |
| 153 if (request_focus_on_press_) | 153 if (request_focus_on_press_) |
| 154 RequestFocus(); | 154 RequestFocus(); |
| 155 if (IsTriggerableEvent(event) && notify_action_ == NOTIFY_ON_PRESS) { | 155 if (IsTriggerableEvent(event) && notify_action_ == NOTIFY_ON_PRESS) { |
| 156 NotifyClick(event); | 156 NotifyClick(event); |
| 157 // NOTE: We may be deleted at this point (by the listener's notification | 157 // NOTE: We may be deleted at this point (by the listener's notification |
| 158 // handler). | 158 // handler). |
| 159 } | 159 } |
| 160 return true; | 160 return true; |
| 161 } | 161 } |
| 162 | 162 |
| 163 bool CustomButton::OnMouseDragged(const ui::MouseEvent& event) { | 163 bool CustomButton::OnMouseDragged(const ui::MouseEvent& event) { |
| 164 if (state_ != STATE_DISABLED) { | 164 if (state_ != STATE_DISABLED) { |
| 165 bool should_enter_pushed = ShouldEnterPushedState(event); | 165 bool should_enter_pushed = ShouldEnterPushedState(event); |
| 166 if (HitTestPoint(event.location())) { | 166 if (HitTestPoint(event.location())) { |
| 167 SetState(should_enter_pushed ? STATE_PRESSED : STATE_HOVERED); | 167 SetState(ShouldEnterPushedState(event) ? STATE_PRESSED : STATE_HOVERED); |
|
sky
2016/06/16 22:03:09
Why can't you use should_enter_pushed here?
bruthig
2016/06/17 13:39:58
Whoops, fixed.
| |
| 168 if (!InDrag() && should_enter_pushed && | 168 if (!InDrag() && should_enter_pushed && |
| 169 ink_drop()->GetTargetInkDropState() == views::InkDropState::HIDDEN) { | 169 ink_drop()->GetTargetInkDropState() == views::InkDropState::HIDDEN) { |
| 170 AnimateInkDrop(views::InkDropState::ACTION_PENDING); | 170 AnimateInkDrop(views::InkDropState::ACTION_PENDING, &event); |
| 171 } | 171 } |
| 172 } else { | 172 } else { |
| 173 SetState(STATE_NORMAL); | 173 SetState(STATE_NORMAL); |
| 174 if (!InDrag() && should_enter_pushed && | 174 if (!InDrag() && should_enter_pushed && |
| 175 ink_drop()->GetTargetInkDropState() == | 175 ink_drop()->GetTargetInkDropState() == |
| 176 views::InkDropState::ACTION_PENDING) { | 176 views::InkDropState::ACTION_PENDING) { |
| 177 AnimateInkDrop(views::InkDropState::HIDDEN); | 177 AnimateInkDrop(views::InkDropState::HIDDEN, &event); |
| 178 } | 178 } |
| 179 } | 179 } |
| 180 } | 180 } |
| 181 return true; | 181 return true; |
| 182 } | 182 } |
| 183 | 183 |
| 184 void CustomButton::OnMouseReleased(const ui::MouseEvent& event) { | 184 void CustomButton::OnMouseReleased(const ui::MouseEvent& event) { |
| 185 if (state_ != STATE_DISABLED) { | 185 if (state_ != STATE_DISABLED) { |
| 186 if (!HitTestPoint(event.location())) { | 186 if (!HitTestPoint(event.location())) { |
| 187 SetState(STATE_NORMAL); | 187 SetState(STATE_NORMAL); |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 200 } | 200 } |
| 201 | 201 |
| 202 void CustomButton::OnMouseCaptureLost() { | 202 void CustomButton::OnMouseCaptureLost() { |
| 203 // Starting a drag results in a MouseCaptureLost. Reset button state. | 203 // Starting a drag results in a MouseCaptureLost. Reset button state. |
| 204 // TODO(varkha) While in drag only reset the state with Material Design. | 204 // TODO(varkha) While in drag only reset the state with Material Design. |
| 205 // The same logic may applies everywhere so gather any feedback and update. | 205 // The same logic may applies everywhere so gather any feedback and update. |
| 206 bool reset_button_state = | 206 bool reset_button_state = |
| 207 !InDrag() || ui::MaterialDesignController::IsModeMaterial(); | 207 !InDrag() || ui::MaterialDesignController::IsModeMaterial(); |
| 208 if (state_ != STATE_DISABLED && reset_button_state) | 208 if (state_ != STATE_DISABLED && reset_button_state) |
| 209 SetState(STATE_NORMAL); | 209 SetState(STATE_NORMAL); |
| 210 AnimateInkDrop(views::InkDropState::HIDDEN); | 210 AnimateInkDrop(views::InkDropState::HIDDEN, nullptr /* event */); |
| 211 } | 211 } |
| 212 | 212 |
| 213 void CustomButton::OnMouseEntered(const ui::MouseEvent& event) { | 213 void CustomButton::OnMouseEntered(const ui::MouseEvent& event) { |
| 214 if (state_ != STATE_DISABLED) | 214 if (state_ != STATE_DISABLED) |
| 215 SetState(STATE_HOVERED); | 215 SetState(STATE_HOVERED); |
| 216 } | 216 } |
| 217 | 217 |
| 218 void CustomButton::OnMouseExited(const ui::MouseEvent& event) { | 218 void CustomButton::OnMouseExited(const ui::MouseEvent& event) { |
| 219 // Starting a drag results in a MouseExited, we need to ignore it. | 219 // Starting a drag results in a MouseExited, we need to ignore it. |
| 220 if (state_ != STATE_DISABLED && !InDrag()) | 220 if (state_ != STATE_DISABLED && !InDrag()) |
| 221 SetState(STATE_NORMAL); | 221 SetState(STATE_NORMAL); |
| 222 } | 222 } |
| 223 | 223 |
| 224 void CustomButton::OnMouseMoved(const ui::MouseEvent& event) { | 224 void CustomButton::OnMouseMoved(const ui::MouseEvent& event) { |
| 225 if (state_ != STATE_DISABLED) | 225 if (state_ != STATE_DISABLED) |
| 226 SetState(HitTestPoint(event.location()) ? STATE_HOVERED : STATE_NORMAL); | 226 SetState(HitTestPoint(event.location()) ? STATE_HOVERED : STATE_NORMAL); |
| 227 } | 227 } |
| 228 | 228 |
| 229 bool CustomButton::OnKeyPressed(const ui::KeyEvent& event) { | 229 bool CustomButton::OnKeyPressed(const ui::KeyEvent& event) { |
| 230 if (state_ == STATE_DISABLED) | 230 if (state_ == STATE_DISABLED) |
| 231 return false; | 231 return false; |
| 232 | 232 |
| 233 // Space sets button state to pushed. Enter clicks the button. This matches | 233 // Space sets button state to pushed. Enter clicks the button. This matches |
| 234 // the Windows native behavior of buttons, where Space clicks the button on | 234 // the Windows native behavior of buttons, where Space clicks the button on |
| 235 // KeyRelease and Enter clicks the button on KeyPressed. | 235 // KeyRelease and Enter clicks the button on KeyPressed. |
| 236 if (event.key_code() == ui::VKEY_SPACE) { | 236 if (event.key_code() == ui::VKEY_SPACE) { |
| 237 SetState(STATE_PRESSED); | 237 SetState(STATE_PRESSED); |
| 238 if (ink_drop()->GetTargetInkDropState() != | 238 if (ink_drop()->GetTargetInkDropState() != |
| 239 views::InkDropState::ACTION_PENDING) { | 239 views::InkDropState::ACTION_PENDING) { |
| 240 AnimateInkDrop(views::InkDropState::ACTION_PENDING); | 240 AnimateInkDrop(views::InkDropState::ACTION_PENDING, nullptr /* event */); |
| 241 } | 241 } |
| 242 } else if (event.key_code() == ui::VKEY_RETURN) { | 242 } else if (event.key_code() == ui::VKEY_RETURN) { |
| 243 SetState(STATE_NORMAL); | 243 SetState(STATE_NORMAL); |
| 244 NotifyClick(event); | 244 NotifyClick(event); |
| 245 } else { | 245 } else { |
| 246 return false; | 246 return false; |
| 247 } | 247 } |
| 248 return true; | 248 return true; |
| 249 } | 249 } |
| 250 | 250 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 307 ui::MenuSourceType source_type) { | 307 ui::MenuSourceType source_type) { |
| 308 if (!context_menu_controller()) | 308 if (!context_menu_controller()) |
| 309 return; | 309 return; |
| 310 | 310 |
| 311 // We're about to show the context menu. Showing the context menu likely means | 311 // We're about to show the context menu. Showing the context menu likely means |
| 312 // we won't get a mouse exited and reset state. Reset it now to be sure. | 312 // we won't get a mouse exited and reset state. Reset it now to be sure. |
| 313 if (state_ != STATE_DISABLED) | 313 if (state_ != STATE_DISABLED) |
| 314 SetState(STATE_NORMAL); | 314 SetState(STATE_NORMAL); |
| 315 if (hide_ink_drop_when_showing_context_menu_) { | 315 if (hide_ink_drop_when_showing_context_menu_) { |
| 316 ink_drop()->SetHovered(false); | 316 ink_drop()->SetHovered(false); |
| 317 AnimateInkDrop(InkDropState::HIDDEN); | 317 AnimateInkDrop(InkDropState::HIDDEN, nullptr /* event */); |
| 318 } | 318 } |
| 319 View::ShowContextMenu(p, source_type); | 319 View::ShowContextMenu(p, source_type); |
| 320 } | 320 } |
| 321 | 321 |
| 322 void CustomButton::OnDragDone() { | 322 void CustomButton::OnDragDone() { |
| 323 // Only reset the state to normal if the button isn't currently disabled | 323 // Only reset the state to normal if the button isn't currently disabled |
| 324 // (since disabled buttons may still be able to be dragged). | 324 // (since disabled buttons may still be able to be dragged). |
| 325 if (state_ != STATE_DISABLED) | 325 if (state_ != STATE_DISABLED) |
| 326 SetState(STATE_NORMAL); | 326 SetState(STATE_NORMAL); |
| 327 AnimateInkDrop(InkDropState::HIDDEN); | 327 AnimateInkDrop(InkDropState::HIDDEN, nullptr /* event */); |
| 328 } | 328 } |
| 329 | 329 |
| 330 void CustomButton::GetAccessibleState(ui::AXViewState* state) { | 330 void CustomButton::GetAccessibleState(ui::AXViewState* state) { |
| 331 Button::GetAccessibleState(state); | 331 Button::GetAccessibleState(state); |
| 332 switch (state_) { | 332 switch (state_) { |
| 333 case STATE_HOVERED: | 333 case STATE_HOVERED: |
| 334 state->AddStateFlag(ui::AX_STATE_HOVERED); | 334 state->AddStateFlag(ui::AX_STATE_HOVERED); |
| 335 break; | 335 break; |
| 336 case STATE_PRESSED: | 336 case STATE_PRESSED: |
| 337 state->AddStateFlag(ui::AX_STATE_PRESSED); | 337 state->AddStateFlag(ui::AX_STATE_PRESSED); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 376 const ViewHierarchyChangedDetails& details) { | 376 const ViewHierarchyChangedDetails& details) { |
| 377 if (!details.is_add && state_ != STATE_DISABLED) | 377 if (!details.is_add && state_ != STATE_DISABLED) |
| 378 SetState(STATE_NORMAL); | 378 SetState(STATE_NORMAL); |
| 379 } | 379 } |
| 380 | 380 |
| 381 void CustomButton::OnBlur() { | 381 void CustomButton::OnBlur() { |
| 382 Button::OnBlur(); | 382 Button::OnBlur(); |
| 383 if (IsHotTracked() || state_ == STATE_PRESSED) { | 383 if (IsHotTracked() || state_ == STATE_PRESSED) { |
| 384 SetState(STATE_NORMAL); | 384 SetState(STATE_NORMAL); |
| 385 if (ink_drop()->GetTargetInkDropState() != views::InkDropState::HIDDEN) | 385 if (ink_drop()->GetTargetInkDropState() != views::InkDropState::HIDDEN) |
| 386 AnimateInkDrop(views::InkDropState::HIDDEN); | 386 AnimateInkDrop(views::InkDropState::HIDDEN, nullptr /* event */); |
| 387 // TODO(bruthig) : Fix CustomButtons to work well when multiple input | 387 // TODO(bruthig) : Fix CustomButtons to work well when multiple input |
| 388 // methods are interacting with a button.e.g.By animating to HIDDEN here | 388 // methods are interacting with a button. e.g. By animating to HIDDEN here |
| 389 // it is possible for a Mouse Release to trigger an action however there | 389 // it is possible for a Mouse Release to trigger an action however there |
| 390 // would be no visual cue to the user that this will occur. | 390 // would be no visual cue to the user that this will occur. |
| 391 } | 391 } |
| 392 } | 392 } |
| 393 | 393 |
| 394 bool CustomButton::ShouldShowInkDropForFocus() const { | 394 bool CustomButton::ShouldShowInkDropForFocus() const { |
| 395 return true; | 395 return true; |
| 396 } | 396 } |
| 397 | 397 |
| 398 //////////////////////////////////////////////////////////////////////////////// | 398 //////////////////////////////////////////////////////////////////////////////// |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 454 } | 454 } |
| 455 #endif | 455 #endif |
| 456 | 456 |
| 457 return check_mouse_position && IsMouseHovered(); | 457 return check_mouse_position && IsMouseHovered(); |
| 458 } | 458 } |
| 459 | 459 |
| 460 //////////////////////////////////////////////////////////////////////////////// | 460 //////////////////////////////////////////////////////////////////////////////// |
| 461 // CustomButton, Button overrides (protected): | 461 // CustomButton, Button overrides (protected): |
| 462 | 462 |
| 463 void CustomButton::NotifyClick(const ui::Event& event) { | 463 void CustomButton::NotifyClick(const ui::Event& event) { |
| 464 if (has_ink_drop_action_on_click_) | 464 if (has_ink_drop_action_on_click_) { |
| 465 AnimateInkDrop(ink_drop_action_on_click_); | 465 AnimateInkDrop(ink_drop_action_on_click_, |
| 466 ui::LocatedEvent::AsLocatedEventIfLocatedEvent(&event)); | |
| 467 } | |
| 466 Button::NotifyClick(event); | 468 Button::NotifyClick(event); |
| 467 } | 469 } |
| 468 | 470 |
| 469 void CustomButton::OnClickCanceled(const ui::Event& event) { | 471 void CustomButton::OnClickCanceled(const ui::Event& event) { |
| 470 AnimateInkDrop(views::InkDropState::HIDDEN); | 472 AnimateInkDrop(views::InkDropState::HIDDEN, |
| 473 ui::LocatedEvent::AsLocatedEventIfLocatedEvent(&event)); | |
| 471 Button::OnClickCanceled(event); | 474 Button::OnClickCanceled(event); |
| 472 } | 475 } |
| 473 | 476 |
| 474 } // namespace views | 477 } // namespace views |
| OLD | NEW |