| 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/frame/caption_buttons/frame_caption_button_container_view.h" | 5 #include "ash/frame/caption_buttons/frame_caption_button_container_view.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <map> | 8 #include <map> |
| 9 | 9 |
| 10 #include "ash/common/ash_switches.h" | 10 #include "ash/common/ash_switches.h" |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 // Duration of |maximize_mode_animation_| showing. | 56 // Duration of |maximize_mode_animation_| showing. |
| 57 // Slide minimize button 500 | 57 // Slide minimize button 500 |
| 58 // |-------------------------------------------------| | 58 // |-------------------------------------------------| |
| 59 // Delay 100 Show size button 250 | 59 // Delay 100 Show size button 250 |
| 60 // |---------|-----------------------| | 60 // |---------|-----------------------| |
| 61 const int kShowAnimationDurationMs = kPositionAnimationDurationMs; | 61 const int kShowAnimationDurationMs = kPositionAnimationDurationMs; |
| 62 | 62 |
| 63 // Value of |maximize_mode_animation_| showing to begin animating alpha of | 63 // Value of |maximize_mode_animation_| showing to begin animating alpha of |
| 64 // |size_button_|. | 64 // |size_button_|. |
| 65 float SizeButtonShowStartValue() { | 65 float SizeButtonShowStartValue() { |
| 66 return static_cast<float>(kShowAnimationAlphaDelayMs) | 66 return static_cast<float>(kShowAnimationAlphaDelayMs) / |
| 67 / kShowAnimationDurationMs; | 67 kShowAnimationDurationMs; |
| 68 } | 68 } |
| 69 | 69 |
| 70 // Amount of |maximize_mode_animation_| showing to animate the alpha of | 70 // Amount of |maximize_mode_animation_| showing to animate the alpha of |
| 71 // |size_button_|. | 71 // |size_button_|. |
| 72 float SizeButtonShowDuration() { | 72 float SizeButtonShowDuration() { |
| 73 return static_cast<float>(kAlphaAnimationDurationMs) | 73 return static_cast<float>(kAlphaAnimationDurationMs) / |
| 74 / kShowAnimationDurationMs; | 74 kShowAnimationDurationMs; |
| 75 } | 75 } |
| 76 | 76 |
| 77 // Amount of |maximize_mode_animation_| hiding to animate the alpha of | 77 // Amount of |maximize_mode_animation_| hiding to animate the alpha of |
| 78 // |size_button_|. | 78 // |size_button_|. |
| 79 float SizeButtonHideDuration() { | 79 float SizeButtonHideDuration() { |
| 80 return static_cast<float>(kAlphaAnimationDurationMs) | 80 return static_cast<float>(kAlphaAnimationDurationMs) / |
| 81 / kHideAnimationDurationMs; | 81 kHideAnimationDurationMs; |
| 82 } | 82 } |
| 83 | 83 |
| 84 // Value of |maximize_mode_animation_| hiding to begin animating the position of | 84 // Value of |maximize_mode_animation_| hiding to begin animating the position of |
| 85 // |minimize_button_|. | 85 // |minimize_button_|. |
| 86 float HidePositionStartValue() { | 86 float HidePositionStartValue() { |
| 87 return 1.0f - static_cast<float>(kHidePositionDelayMs) | 87 return 1.0f - |
| 88 / kHideAnimationDurationMs; | 88 static_cast<float>(kHidePositionDelayMs) / kHideAnimationDurationMs; |
| 89 } | 89 } |
| 90 | 90 |
| 91 // Converts |point| from |src| to |dst| and hittests against |dst|. | 91 // Converts |point| from |src| to |dst| and hittests against |dst|. |
| 92 bool ConvertPointToViewAndHitTest(const views::View* src, | 92 bool ConvertPointToViewAndHitTest(const views::View* src, |
| 93 const views::View* dst, | 93 const views::View* dst, |
| 94 const gfx::Point& point) { | 94 const gfx::Point& point) { |
| 95 gfx::Point converted(point); | 95 gfx::Point converted(point); |
| 96 views::View::ConvertPointToTarget(src, dst, &converted); | 96 views::View::ConvertPointToTarget(src, dst, &converted); |
| 97 return dst->HitTestPoint(converted); | 97 return dst->HitTestPoint(converted); |
| 98 } | 98 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 l10n_util::GetStringUTF16(IDS_APP_ACCNAME_MAXIMIZE)); | 136 l10n_util::GetStringUTF16(IDS_APP_ACCNAME_MAXIMIZE)); |
| 137 size_button_->SetVisible(size_button_visibility); | 137 size_button_->SetVisible(size_button_visibility); |
| 138 AddChildView(size_button_); | 138 AddChildView(size_button_); |
| 139 | 139 |
| 140 close_button_ = new FrameCaptionButton(this, CAPTION_BUTTON_ICON_CLOSE); | 140 close_button_ = new FrameCaptionButton(this, CAPTION_BUTTON_ICON_CLOSE); |
| 141 close_button_->SetAccessibleName( | 141 close_button_->SetAccessibleName( |
| 142 l10n_util::GetStringUTF16(IDS_APP_ACCNAME_CLOSE)); | 142 l10n_util::GetStringUTF16(IDS_APP_ACCNAME_CLOSE)); |
| 143 AddChildView(close_button_); | 143 AddChildView(close_button_); |
| 144 } | 144 } |
| 145 | 145 |
| 146 FrameCaptionButtonContainerView::~FrameCaptionButtonContainerView() { | 146 FrameCaptionButtonContainerView::~FrameCaptionButtonContainerView() {} |
| 147 } | |
| 148 | 147 |
| 149 void FrameCaptionButtonContainerView::TestApi::EndAnimations() { | 148 void FrameCaptionButtonContainerView::TestApi::EndAnimations() { |
| 150 container_view_->maximize_mode_animation_->End(); | 149 container_view_->maximize_mode_animation_->End(); |
| 151 } | 150 } |
| 152 | 151 |
| 153 void FrameCaptionButtonContainerView::SetButtonImage( | 152 void FrameCaptionButtonContainerView::SetButtonImage( |
| 154 CaptionButtonIcon icon, | 153 CaptionButtonIcon icon, |
| 155 gfx::VectorIconId icon_image_id) { | 154 gfx::VectorIconId icon_image_id) { |
| 156 button_icon_id_map_[icon] = icon_image_id; | 155 button_icon_id_map_[icon] = icon_image_id; |
| 157 | 156 |
| 158 FrameCaptionButton* buttons[] = { | 157 FrameCaptionButton* buttons[] = {minimize_button_, size_button_, |
| 159 minimize_button_, size_button_, close_button_ | 158 close_button_}; |
| 160 }; | |
| 161 for (size_t i = 0; i < arraysize(buttons); ++i) { | 159 for (size_t i = 0; i < arraysize(buttons); ++i) { |
| 162 if (buttons[i]->icon() == icon) | 160 if (buttons[i]->icon() == icon) |
| 163 buttons[i]->SetImage(icon, FrameCaptionButton::ANIMATE_NO, icon_image_id); | 161 buttons[i]->SetImage(icon, FrameCaptionButton::ANIMATE_NO, icon_image_id); |
| 164 } | 162 } |
| 165 } | 163 } |
| 166 | 164 |
| 167 void FrameCaptionButtonContainerView::SetPaintAsActive(bool paint_as_active) { | 165 void FrameCaptionButtonContainerView::SetPaintAsActive(bool paint_as_active) { |
| 168 minimize_button_->set_paint_as_active(paint_as_active); | 166 minimize_button_->set_paint_as_active(paint_as_active); |
| 169 size_button_->set_paint_as_active(paint_as_active); | 167 size_button_->set_paint_as_active(paint_as_active); |
| 170 close_button_->set_paint_as_active(paint_as_active); | 168 close_button_->set_paint_as_active(paint_as_active); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 PreferredSizeChanged(); | 252 PreferredSizeChanged(); |
| 255 } | 253 } |
| 256 } | 254 } |
| 257 | 255 |
| 258 void FrameCaptionButtonContainerView::AnimationProgressed( | 256 void FrameCaptionButtonContainerView::AnimationProgressed( |
| 259 const gfx::Animation* animation) { | 257 const gfx::Animation* animation) { |
| 260 double current_value = animation->GetCurrentValue(); | 258 double current_value = animation->GetCurrentValue(); |
| 261 int size_alpha = 0; | 259 int size_alpha = 0; |
| 262 int minimize_x = 0; | 260 int minimize_x = 0; |
| 263 if (maximize_mode_animation_->IsShowing()) { | 261 if (maximize_mode_animation_->IsShowing()) { |
| 264 double scaled_value = CapAnimationValue( | 262 double scaled_value = |
| 265 (current_value - SizeButtonShowStartValue()) | 263 CapAnimationValue((current_value - SizeButtonShowStartValue()) / |
| 266 / SizeButtonShowDuration()); | 264 SizeButtonShowDuration()); |
| 267 double tweened_value_alpha = | 265 double tweened_value_alpha = |
| 268 gfx::Tween::CalculateValue(gfx::Tween::EASE_OUT,scaled_value); | 266 gfx::Tween::CalculateValue(gfx::Tween::EASE_OUT, scaled_value); |
| 269 size_alpha = gfx::Tween::LinearIntValueBetween(tweened_value_alpha, 0, 255); | 267 size_alpha = gfx::Tween::LinearIntValueBetween(tweened_value_alpha, 0, 255); |
| 270 | 268 |
| 271 double tweened_value_slide = | 269 double tweened_value_slide = |
| 272 gfx::Tween::CalculateValue(gfx::Tween::EASE_OUT, current_value); | 270 gfx::Tween::CalculateValue(gfx::Tween::EASE_OUT, current_value); |
| 273 minimize_x = gfx::Tween::LinearIntValueBetween(tweened_value_slide, | 271 minimize_x = gfx::Tween::LinearIntValueBetween(tweened_value_slide, |
| 274 size_button_->x(), 0); | 272 size_button_->x(), 0); |
| 275 } else { | 273 } else { |
| 276 double scaled_value_alpha = CapAnimationValue( | 274 double scaled_value_alpha = |
| 277 (1.0f - current_value) / SizeButtonHideDuration()); | 275 CapAnimationValue((1.0f - current_value) / SizeButtonHideDuration()); |
| 278 double tweened_value_alpha = | 276 double tweened_value_alpha = |
| 279 gfx::Tween::CalculateValue(gfx::Tween::EASE_IN, scaled_value_alpha); | 277 gfx::Tween::CalculateValue(gfx::Tween::EASE_IN, scaled_value_alpha); |
| 280 size_alpha = gfx::Tween::LinearIntValueBetween(tweened_value_alpha, 255, 0); | 278 size_alpha = gfx::Tween::LinearIntValueBetween(tweened_value_alpha, 255, 0); |
| 281 | 279 |
| 282 double scaled_value_position = CapAnimationValue( | 280 double scaled_value_position = CapAnimationValue( |
| 283 (HidePositionStartValue() - current_value) | 281 (HidePositionStartValue() - current_value) / HidePositionStartValue()); |
| 284 / HidePositionStartValue()); | |
| 285 double tweened_value_position = | 282 double tweened_value_position = |
| 286 gfx::Tween::CalculateValue(gfx::Tween::EASE_OUT, scaled_value_position); | 283 gfx::Tween::CalculateValue(gfx::Tween::EASE_OUT, scaled_value_position); |
| 287 minimize_x = gfx::Tween::LinearIntValueBetween(tweened_value_position, 0, | 284 minimize_x = gfx::Tween::LinearIntValueBetween(tweened_value_position, 0, |
| 288 size_button_->x()); | 285 size_button_->x()); |
| 289 } | 286 } |
| 290 size_button_->SetAlpha(size_alpha); | 287 size_button_->SetAlpha(size_alpha); |
| 291 minimize_button_->SetX(minimize_x); | 288 minimize_button_->SetX(minimize_x); |
| 292 } | 289 } |
| 293 | 290 |
| 294 void FrameCaptionButtonContainerView::SetButtonIcon(FrameCaptionButton* button, | 291 void FrameCaptionButtonContainerView::SetButtonIcon(FrameCaptionButton* button, |
| 295 CaptionButtonIcon icon, | 292 CaptionButtonIcon icon, |
| 296 Animate animate) { | 293 Animate animate) { |
| 297 // The early return is dependant on |animate| because callers use | 294 // The early return is dependant on |animate| because callers use |
| 298 // SetButtonIcon() with ANIMATE_NO to progress |button|'s crossfade animation | 295 // SetButtonIcon() with ANIMATE_NO to progress |button|'s crossfade animation |
| 299 // to the end. | 296 // to the end. |
| 300 if (button->icon() == icon && | 297 if (button->icon() == icon && |
| 301 (animate == ANIMATE_YES || !button->IsAnimatingImageSwap())) { | 298 (animate == ANIMATE_YES || !button->IsAnimatingImageSwap())) { |
| 302 return; | 299 return; |
| 303 } | 300 } |
| 304 | 301 |
| 305 FrameCaptionButton::Animate fcb_animate = (animate == ANIMATE_YES) ? | 302 FrameCaptionButton::Animate fcb_animate = |
| 306 FrameCaptionButton::ANIMATE_YES : FrameCaptionButton::ANIMATE_NO; | 303 (animate == ANIMATE_YES) ? FrameCaptionButton::ANIMATE_YES |
| 304 : FrameCaptionButton::ANIMATE_NO; |
| 307 auto it = button_icon_id_map_.find(icon); | 305 auto it = button_icon_id_map_.find(icon); |
| 308 if (it != button_icon_id_map_.end()) | 306 if (it != button_icon_id_map_.end()) |
| 309 button->SetImage(icon, fcb_animate, it->second); | 307 button->SetImage(icon, fcb_animate, it->second); |
| 310 } | 308 } |
| 311 | 309 |
| 312 bool FrameCaptionButtonContainerView::ShouldSizeButtonBeVisible() const { | 310 bool FrameCaptionButtonContainerView::ShouldSizeButtonBeVisible() const { |
| 313 return !Shell::GetInstance()->maximize_mode_controller()-> | 311 return !Shell::GetInstance() |
| 314 IsMaximizeModeWindowManagerEnabled() && | 312 ->maximize_mode_controller() |
| 315 frame_->widget_delegate()->CanMaximize(); | 313 ->IsMaximizeModeWindowManagerEnabled() && |
| 314 frame_->widget_delegate()->CanMaximize(); |
| 316 } | 315 } |
| 317 | 316 |
| 318 void FrameCaptionButtonContainerView::ButtonPressed(views::Button* sender, | 317 void FrameCaptionButtonContainerView::ButtonPressed(views::Button* sender, |
| 319 const ui::Event& event) { | 318 const ui::Event& event) { |
| 320 // Abort any animations of the button icons. | 319 // Abort any animations of the button icons. |
| 321 SetButtonsToNormal(ANIMATE_NO); | 320 SetButtonsToNormal(ANIMATE_NO); |
| 322 | 321 |
| 323 UserMetricsAction action = UMA_WINDOW_MAXIMIZE_BUTTON_CLICK_MINIMIZE; | 322 UserMetricsAction action = UMA_WINDOW_MAXIMIZE_BUTTON_CLICK_MINIMIZE; |
| 324 if (sender == minimize_button_) { | 323 if (sender == minimize_button_) { |
| 325 frame_->Minimize(); | 324 frame_->Minimize(); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 347 } | 346 } |
| 348 WmShell::Get()->RecordUserMetricsAction(action); | 347 WmShell::Get()->RecordUserMetricsAction(action); |
| 349 } | 348 } |
| 350 | 349 |
| 351 bool FrameCaptionButtonContainerView::IsMinimizeButtonVisible() const { | 350 bool FrameCaptionButtonContainerView::IsMinimizeButtonVisible() const { |
| 352 return minimize_button_->visible(); | 351 return minimize_button_->visible(); |
| 353 } | 352 } |
| 354 | 353 |
| 355 void FrameCaptionButtonContainerView::SetButtonsToNormal(Animate animate) { | 354 void FrameCaptionButtonContainerView::SetButtonsToNormal(Animate animate) { |
| 356 SetButtonIcons(CAPTION_BUTTON_ICON_MINIMIZE, CAPTION_BUTTON_ICON_CLOSE, | 355 SetButtonIcons(CAPTION_BUTTON_ICON_MINIMIZE, CAPTION_BUTTON_ICON_CLOSE, |
| 357 animate); | 356 animate); |
| 358 minimize_button_->SetState(views::Button::STATE_NORMAL); | 357 minimize_button_->SetState(views::Button::STATE_NORMAL); |
| 359 size_button_->SetState(views::Button::STATE_NORMAL); | 358 size_button_->SetState(views::Button::STATE_NORMAL); |
| 360 close_button_->SetState(views::Button::STATE_NORMAL); | 359 close_button_->SetState(views::Button::STATE_NORMAL); |
| 361 } | 360 } |
| 362 | 361 |
| 363 void FrameCaptionButtonContainerView::SetButtonIcons( | 362 void FrameCaptionButtonContainerView::SetButtonIcons( |
| 364 CaptionButtonIcon minimize_button_icon, | 363 CaptionButtonIcon minimize_button_icon, |
| 365 CaptionButtonIcon close_button_icon, | 364 CaptionButtonIcon close_button_icon, |
| 366 Animate animate) { | 365 Animate animate) { |
| 367 SetButtonIcon(minimize_button_, minimize_button_icon, animate); | 366 SetButtonIcon(minimize_button_, minimize_button_icon, animate); |
| 368 SetButtonIcon(close_button_, close_button_icon, animate); | 367 SetButtonIcon(close_button_, close_button_icon, animate); |
| 369 } | 368 } |
| 370 | 369 |
| 371 const FrameCaptionButton* FrameCaptionButtonContainerView::GetButtonClosestTo( | 370 const FrameCaptionButton* FrameCaptionButtonContainerView::GetButtonClosestTo( |
| 372 const gfx::Point& position_in_screen) const { | 371 const gfx::Point& position_in_screen) const { |
| 373 // Since the buttons all have the same size, the closest button is the button | 372 // Since the buttons all have the same size, the closest button is the button |
| 374 // with the center point closest to |position_in_screen|. | 373 // with the center point closest to |position_in_screen|. |
| 375 // TODO(pkotwicz): Make the caption buttons not overlap. | 374 // TODO(pkotwicz): Make the caption buttons not overlap. |
| 376 gfx::Point position(position_in_screen); | 375 gfx::Point position(position_in_screen); |
| 377 views::View::ConvertPointFromScreen(this, &position); | 376 views::View::ConvertPointFromScreen(this, &position); |
| 378 | 377 |
| 379 FrameCaptionButton* buttons[] = { | 378 FrameCaptionButton* buttons[] = {minimize_button_, size_button_, |
| 380 minimize_button_, size_button_, close_button_ | 379 close_button_}; |
| 381 }; | |
| 382 int min_squared_distance = INT_MAX; | 380 int min_squared_distance = INT_MAX; |
| 383 FrameCaptionButton* closest_button = NULL; | 381 FrameCaptionButton* closest_button = NULL; |
| 384 for (size_t i = 0; i < arraysize(buttons); ++i) { | 382 for (size_t i = 0; i < arraysize(buttons); ++i) { |
| 385 FrameCaptionButton* button = buttons[i]; | 383 FrameCaptionButton* button = buttons[i]; |
| 386 if (!button->visible()) | 384 if (!button->visible()) |
| 387 continue; | 385 continue; |
| 388 | 386 |
| 389 gfx::Point center_point = button->GetLocalBounds().CenterPoint(); | 387 gfx::Point center_point = button->GetLocalBounds().CenterPoint(); |
| 390 views::View::ConvertPointToTarget(button, this, ¢er_point); | 388 views::View::ConvertPointToTarget(button, this, ¢er_point); |
| 391 int squared_distance = static_cast<int>( | 389 int squared_distance = static_cast<int>( |
| 392 pow(static_cast<double>(position.x() - center_point.x()), 2) + | 390 pow(static_cast<double>(position.x() - center_point.x()), 2) + |
| 393 pow(static_cast<double>(position.y() - center_point.y()), 2)); | 391 pow(static_cast<double>(position.y() - center_point.y()), 2)); |
| 394 if (squared_distance < min_squared_distance) { | 392 if (squared_distance < min_squared_distance) { |
| 395 min_squared_distance = squared_distance; | 393 min_squared_distance = squared_distance; |
| 396 closest_button = button; | 394 closest_button = button; |
| 397 } | 395 } |
| 398 } | 396 } |
| 399 return closest_button; | 397 return closest_button; |
| 400 } | 398 } |
| 401 | 399 |
| 402 void FrameCaptionButtonContainerView::SetHoveredAndPressedButtons( | 400 void FrameCaptionButtonContainerView::SetHoveredAndPressedButtons( |
| 403 const FrameCaptionButton* to_hover, | 401 const FrameCaptionButton* to_hover, |
| 404 const FrameCaptionButton* to_press) { | 402 const FrameCaptionButton* to_press) { |
| 405 FrameCaptionButton* buttons[] = { | 403 FrameCaptionButton* buttons[] = {minimize_button_, size_button_, |
| 406 minimize_button_, size_button_, close_button_ | 404 close_button_}; |
| 407 }; | |
| 408 for (size_t i = 0; i < arraysize(buttons); ++i) { | 405 for (size_t i = 0; i < arraysize(buttons); ++i) { |
| 409 FrameCaptionButton* button = buttons[i]; | 406 FrameCaptionButton* button = buttons[i]; |
| 410 views::Button::ButtonState new_state = views::Button::STATE_NORMAL; | 407 views::Button::ButtonState new_state = views::Button::STATE_NORMAL; |
| 411 if (button == to_hover) | 408 if (button == to_hover) |
| 412 new_state = views::Button::STATE_HOVERED; | 409 new_state = views::Button::STATE_HOVERED; |
| 413 else if (button == to_press) | 410 else if (button == to_press) |
| 414 new_state = views::Button::STATE_PRESSED; | 411 new_state = views::Button::STATE_PRESSED; |
| 415 button->SetState(new_state); | 412 button->SetState(new_state); |
| 416 } | 413 } |
| 417 } | 414 } |
| 418 | 415 |
| 419 } // namespace ash | 416 } // namespace ash |
| OLD | NEW |