| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "ash/wm/caption_buttons/frame_caption_button_container_view.h" | 5 #include "ash/wm/caption_buttons/frame_caption_button_container_view.h" |
| 6 | 6 |
| 7 #include <cmath> |
| 8 |
| 7 #include "ash/ash_switches.h" | 9 #include "ash/ash_switches.h" |
| 8 #include "ash/metrics/user_metrics_recorder.h" | 10 #include "ash/metrics/user_metrics_recorder.h" |
| 9 #include "ash/shell.h" | 11 #include "ash/shell.h" |
| 10 #include "ash/wm/caption_buttons/alternate_frame_size_button.h" | 12 #include "ash/wm/caption_buttons/alternate_frame_size_button.h" |
| 11 #include "ash/wm/caption_buttons/frame_caption_button.h" | 13 #include "ash/wm/caption_buttons/frame_caption_button.h" |
| 12 #include "ash/wm/caption_buttons/frame_maximize_button.h" | 14 #include "ash/wm/caption_buttons/frame_maximize_button.h" |
| 13 #include "grit/ash_resources.h" | 15 #include "grit/ash_resources.h" |
| 14 #include "grit/ui_strings.h" // Accessibility names | 16 #include "grit/ui_strings.h" // Accessibility names |
| 15 #include "ui/base/hit_test.h" | 17 #include "ui/base/hit_test.h" |
| 16 #include "ui/base/l10n/l10n_util.h" | 18 #include "ui/base/l10n/l10n_util.h" |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 } | 257 } |
| 256 | 258 |
| 257 void FrameCaptionButtonContainerView::SetButtonIcons( | 259 void FrameCaptionButtonContainerView::SetButtonIcons( |
| 258 CaptionButtonIcon minimize_button_icon, | 260 CaptionButtonIcon minimize_button_icon, |
| 259 CaptionButtonIcon close_button_icon, | 261 CaptionButtonIcon close_button_icon, |
| 260 Animate animate) { | 262 Animate animate) { |
| 261 SetButtonIcon(minimize_button_, minimize_button_icon, animate); | 263 SetButtonIcon(minimize_button_, minimize_button_icon, animate); |
| 262 SetButtonIcon(close_button_, close_button_icon, animate); | 264 SetButtonIcon(close_button_, close_button_icon, animate); |
| 263 } | 265 } |
| 264 | 266 |
| 265 const FrameCaptionButton* | 267 const FrameCaptionButton* FrameCaptionButtonContainerView::GetButtonClosestTo( |
| 266 FrameCaptionButtonContainerView::PressButtonAt( | 268 const gfx::Point& position_in_screen) const { |
| 267 const gfx::Point& position_in_screen, | 269 // Since the buttons all have the same size, the closest button is the button |
| 268 const gfx::Insets& pressed_hittest_outer_insets) const { | 270 // with the center point closest to |position_in_screen|. |
| 269 DCHECK(switches::UseAlternateFrameCaptionButtonStyle()); | 271 // TODO(pkotwicz): Make the caption buttons not overlap. |
| 270 gfx::Point position(position_in_screen); | 272 gfx::Point position(position_in_screen); |
| 271 views::View::ConvertPointFromScreen(this, &position); | 273 views::View::ConvertPointFromScreen(this, &position); |
| 272 | 274 |
| 273 FrameCaptionButton* buttons[] = { | 275 FrameCaptionButton* buttons[] = { |
| 274 close_button_, size_button_, minimize_button_ | 276 minimize_button_, size_button_, close_button_ |
| 275 }; | 277 }; |
| 276 FrameCaptionButton* pressed_button = NULL; | 278 int min_squared_distance = INT_MAX; |
| 279 FrameCaptionButton* closest_button = NULL; |
| 277 for (size_t i = 0; i < arraysize(buttons); ++i) { | 280 for (size_t i = 0; i < arraysize(buttons); ++i) { |
| 278 FrameCaptionButton* button = buttons[i]; | 281 FrameCaptionButton* button = buttons[i]; |
| 279 if (!button->visible()) | 282 if (!button->visible()) |
| 280 continue; | 283 continue; |
| 281 | 284 |
| 282 if (button->state() == views::Button::STATE_PRESSED) { | 285 gfx::Point center_point = button->bounds().CenterPoint(); |
| 283 gfx::Rect expanded_bounds = button->bounds(); | 286 int squared_distance = static_cast<int>( |
| 284 expanded_bounds.Inset(pressed_hittest_outer_insets); | 287 pow(static_cast<double>(position.x() - center_point.x()), 2) + |
| 285 if (expanded_bounds.Contains(position)) { | 288 pow(static_cast<double>(position.y() - center_point.y()), 2)); |
| 286 pressed_button = button; | 289 if (squared_distance < min_squared_distance) { |
| 287 // Do not break in order to give preference to buttons which are | 290 min_squared_distance = squared_distance; |
| 288 // closer to |position_in_screen| than the currently pressed button. | 291 closest_button = button; |
| 289 // TODO(pkotwicz): Make the caption buttons not overlap. | |
| 290 } | |
| 291 } else if (ConvertPointToViewAndHitTest(this, button, position)) { | |
| 292 pressed_button = button; | |
| 293 break; | |
| 294 } | 292 } |
| 295 } | 293 } |
| 294 return closest_button; |
| 295 } |
| 296 | 296 |
| 297 void FrameCaptionButtonContainerView::SetHoveredAndPressedButtons( |
| 298 const FrameCaptionButton* to_hover, |
| 299 const FrameCaptionButton* to_press) { |
| 300 FrameCaptionButton* buttons[] = { |
| 301 minimize_button_, size_button_, close_button_ |
| 302 }; |
| 297 for (size_t i = 0; i < arraysize(buttons); ++i) { | 303 for (size_t i = 0; i < arraysize(buttons); ++i) { |
| 298 buttons[i]->SetState(buttons[i] == pressed_button ? | 304 FrameCaptionButton* button = buttons[i]; |
| 299 views::Button::STATE_PRESSED : views::Button::STATE_NORMAL); | 305 views::Button::ButtonState new_state = views::Button::STATE_NORMAL; |
| 306 if (button == to_hover) |
| 307 new_state = views::Button::STATE_HOVERED; |
| 308 else if (button == to_press) |
| 309 new_state = views::Button::STATE_PRESSED; |
| 310 button->SetState(new_state); |
| 300 } | 311 } |
| 301 return pressed_button; | |
| 302 } | 312 } |
| 303 | 313 |
| 304 FrameCaptionButtonContainerView::ButtonIconIds::ButtonIconIds() | 314 FrameCaptionButtonContainerView::ButtonIconIds::ButtonIconIds() |
| 305 : normal_image_id(-1), | 315 : normal_image_id(-1), |
| 306 hovered_image_id(-1), | 316 hovered_image_id(-1), |
| 307 pressed_image_id(-1) { | 317 pressed_image_id(-1) { |
| 308 } | 318 } |
| 309 | 319 |
| 310 FrameCaptionButtonContainerView::ButtonIconIds::ButtonIconIds(int normal_id, | 320 FrameCaptionButtonContainerView::ButtonIconIds::ButtonIconIds(int normal_id, |
| 311 int hovered_id, | 321 int hovered_id, |
| 312 int pressed_id) | 322 int pressed_id) |
| 313 : normal_image_id(normal_id), | 323 : normal_image_id(normal_id), |
| 314 hovered_image_id(hovered_id), | 324 hovered_image_id(hovered_id), |
| 315 pressed_image_id(pressed_id) { | 325 pressed_image_id(pressed_id) { |
| 316 } | 326 } |
| 317 | 327 |
| 318 FrameCaptionButtonContainerView::ButtonIconIds::~ButtonIconIds() { | 328 FrameCaptionButtonContainerView::ButtonIconIds::~ButtonIconIds() { |
| 319 } | 329 } |
| 320 | 330 |
| 321 } // namespace ash | 331 } // namespace ash |
| OLD | NEW |