Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(411)

Side by Side Diff: ash/wm/maximize_bubble_controller.cc

Issue 10829226: Fixing many problems around the maximize bubble (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Removed merge problem: Header file was removed Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | ash/wm/workspace/frame_maximize_button.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "ash/wm/maximize_bubble_controller.h" 5 #include "ash/wm/maximize_bubble_controller.h"
6 6
7 #include "ash/shell.h" 7 #include "ash/shell.h"
8 #include "ash/shell_window_ids.h" 8 #include "ash/shell_window_ids.h"
9 #include "ash/wm/window_animations.h" 9 #include "ash/wm/window_animations.h"
10 #include "ash/wm/workspace/frame_maximize_button.h" 10 #include "ash/wm/workspace/frame_maximize_button.h"
11 #include "base/timer.h" 11 #include "base/timer.h"
12 #include "grit/ash_strings.h" 12 #include "grit/ash_strings.h"
13 #include "grit/ui_resources.h" 13 #include "grit/ui_resources.h"
14 #include "third_party/skia/include/core/SkPath.h"
14 #include "ui/aura/focus_manager.h" 15 #include "ui/aura/focus_manager.h"
15 #include "ui/aura/window.h" 16 #include "ui/aura/window.h"
17 #include "ui/base/animation/animation.h"
16 #include "ui/base/l10n/l10n_util.h" 18 #include "ui/base/l10n/l10n_util.h"
17 #include "ui/base/resource/resource_bundle.h" 19 #include "ui/base/resource/resource_bundle.h"
18 #include "ui/gfx/canvas.h" 20 #include "ui/gfx/canvas.h"
21 #include "ui/gfx/path.h"
19 #include "ui/gfx/screen.h" 22 #include "ui/gfx/screen.h"
20 #include "ui/views/bubble/bubble_delegate.h" 23 #include "ui/views/bubble/bubble_delegate.h"
21 #include "ui/views/bubble/bubble_frame_view.h" 24 #include "ui/views/bubble/bubble_frame_view.h"
22 #include "ui/views/controls/button/button.h" 25 #include "ui/views/controls/button/button.h"
23 #include "ui/views/controls/button/image_button.h" 26 #include "ui/views/controls/button/image_button.h"
24 #include "ui/views/controls/label.h" 27 #include "ui/views/controls/label.h"
25 #include "ui/views/events/event.h" 28 #include "ui/views/events/event.h"
26 #include "ui/views/layout/box_layout.h" 29 #include "ui/views/layout/box_layout.h"
27 #include "ui/views/mouse_watcher.h" 30 #include "ui/views/mouse_watcher.h"
28 #include "ui/views/widget/widget.h" 31 #include "ui/views/widget/widget.h"
29 32
30 namespace { 33 namespace {
31 34
32 // The spacing between two buttons. 35 // The spacing between two buttons.
33 const int kLayoutSpacing = -1; 36 const int kLayoutSpacing = -1;
34 37
35 // The background color. 38 // The background color.
36 const SkColor kBubbleBackgroundColor = 0xc8141414; 39 const SkColor kBubbleBackgroundColor = 0xc8141414;
37 40
38 // The text color within the bubble. 41 // The text color within the bubble.
39 const SkColor kBubbleTextColor = SK_ColorWHITE; 42 const SkColor kBubbleTextColor = SK_ColorWHITE;
40 43
41 // The line width of the bubble. 44 // The line width of the bubble.
42 const int kLineWidth = 1; 45 const int kLineWidth = 1;
43 46
47 // The spacing for the top and bottom of the info label.
48 const int kLabelSpacing = 4;
49
44 // The pixel dimensions of the arrow. 50 // The pixel dimensions of the arrow.
45 const int kArrowHeight = 10; 51 const int kArrowHeight = 10;
46 const int kArrowWidth = 20; 52 const int kArrowWidth = 20;
47 53
48 // The delay of the bubble appearance. 54 // The delay of the bubble appearance.
49 const int kBubbleAppearanceDelayMS = 200; 55 const int kBubbleAppearanceDelayMS = 200;
50 const int kAnimationDurationForPopupMS = 200; 56
57 // The animation offset in y for the bubble when appearing.
58 const int kBubbleAnimationOffsetY = 5;
51 59
52 class MaximizeBubbleBorder : public views::BubbleBorder { 60 class MaximizeBubbleBorder : public views::BubbleBorder {
53 public: 61 public:
54 MaximizeBubbleBorder(views::View* content_view, views::View* anchor); 62 MaximizeBubbleBorder(views::View* content_view, views::View* anchor);
55 63
56 virtual ~MaximizeBubbleBorder() {} 64 virtual ~MaximizeBubbleBorder() {}
57 65
66 // Get the mouse active area of the window.
67 void GetMask(gfx::Path* mask);
68
58 // Overridden from views::BubbleBorder to match the design specs. 69 // Overridden from views::BubbleBorder to match the design specs.
59 virtual gfx::Rect GetBounds(const gfx::Rect& position_relative_to, 70 virtual gfx::Rect GetBounds(const gfx::Rect& position_relative_to,
60 const gfx::Size& contents_size) const OVERRIDE; 71 const gfx::Size& contents_size) const OVERRIDE;
61 72
62 // Overridden from views::Border. 73 // Overridden from views::Border.
63 virtual void Paint(const views::View& view, 74 virtual void Paint(const views::View& view,
64 gfx::Canvas* canvas) const OVERRIDE; 75 gfx::Canvas* canvas) const OVERRIDE;
76
65 private: 77 private:
66 views::View* anchor_; 78 // Note: Animations can continue after then main window frame was destroyed.
79 // To avoid this problem, the owning screen metrics get extracted upon
80 // creation.
81 gfx::Size anchor_size_;
82 gfx::Point anchor_screen_origin_;
67 views::View* content_view_; 83 views::View* content_view_;
68 84
69 DISALLOW_COPY_AND_ASSIGN(MaximizeBubbleBorder); 85 DISALLOW_COPY_AND_ASSIGN(MaximizeBubbleBorder);
70 }; 86 };
71 87
72 MaximizeBubbleBorder::MaximizeBubbleBorder(views::View* content_view, 88 MaximizeBubbleBorder::MaximizeBubbleBorder(views::View* content_view,
73 views::View* anchor) 89 views::View* anchor)
74 : views::BubbleBorder(views::BubbleBorder::TOP_RIGHT, 90 : views::BubbleBorder(views::BubbleBorder::TOP_RIGHT,
75 views::BubbleBorder::NO_SHADOW), 91 views::BubbleBorder::NO_SHADOW),
76 anchor_(anchor), 92 anchor_size_(anchor->size()),
93 anchor_screen_origin_(0,0),
77 content_view_(content_view) { 94 content_view_(content_view) {
95 views::View::ConvertPointToScreen(anchor, &anchor_screen_origin_);
78 set_alignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE); 96 set_alignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE);
79 } 97 }
80 98
99 void MaximizeBubbleBorder::GetMask(gfx::Path* mask) {
100 gfx::Insets inset;
101 GetInsets(&inset);
102 // Note: Even though the tip could be added as activatable, it is left out
103 // since it would not change the action behavior in any way plus it makes
104 // more sense to keep the focus on the underlying button for clicks.
105 int left = inset.left() - kLineWidth;
106 int right = inset.left() + content_view_->width() + kLineWidth;
107 int top = inset.top() - kLineWidth;
108 int bottom = inset.top() + content_view_->height() + kLineWidth;
109 mask->moveTo(left, top);
110 mask->lineTo(right, top);
111 mask->lineTo(right, bottom);
112 mask->lineTo(left, bottom);
113 mask->lineTo(left, top);
114 mask->close();
115 }
116
81 gfx::Rect MaximizeBubbleBorder::GetBounds( 117 gfx::Rect MaximizeBubbleBorder::GetBounds(
82 const gfx::Rect& position_relative_to, 118 const gfx::Rect& position_relative_to,
83 const gfx::Size& contents_size) const { 119 const gfx::Size& contents_size) const {
84 gfx::Size border_size(contents_size); 120 gfx::Size border_size(contents_size);
85 gfx::Insets insets; 121 gfx::Insets insets;
86 GetInsets(&insets); 122 GetInsets(&insets);
87 border_size.Enlarge(insets.width(), insets.height()); 123 border_size.Enlarge(insets.width(), insets.height());
88 124
89 // Position the bubble to center the box on the anchor. 125 // Position the bubble to center the box on the anchor.
90 int x = (-border_size.width() + anchor_->width()) / 2; 126 int x = (-border_size.width() + anchor_size_.width()) / 2;
91 // Position the bubble under the anchor, overlapping the arrow with it. 127 // Position the bubble under the anchor, overlapping the arrow with it.
92 int y = anchor_->height() - insets.top(); 128 int y = anchor_size_.height() - insets.top();
93 129
94 gfx::Point view_origin(x, y); 130 gfx::Point view_origin(x + anchor_screen_origin_.x(),
95 views::View::ConvertPointToScreen(anchor_, &view_origin); 131 y + anchor_screen_origin_.y());
96 132
97 return gfx::Rect(view_origin, border_size); 133 return gfx::Rect(view_origin, border_size);
98 } 134 }
99 135
100 void MaximizeBubbleBorder::Paint(const views::View& view, 136 void MaximizeBubbleBorder::Paint(const views::View& view,
101 gfx::Canvas* canvas) const { 137 gfx::Canvas* canvas) const {
102 gfx::Insets inset; 138 gfx::Insets inset;
103 GetInsets(&inset); 139 GetInsets(&inset);
104 140
105 // Draw the border line around everything. 141 // Draw the border line around everything.
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 public views::MouseWatcherListener { 219 public views::MouseWatcherListener {
184 public: 220 public:
185 explicit Bubble(MaximizeBubbleController* owner); 221 explicit Bubble(MaximizeBubbleController* owner);
186 virtual ~Bubble() {} 222 virtual ~Bubble() {}
187 223
188 // The window of the menu under which the SnapSizer will get created. 224 // The window of the menu under which the SnapSizer will get created.
189 aura::Window* GetBubbleWindow(); 225 aura::Window* GetBubbleWindow();
190 226
191 // Overridden from views::BubbleDelegateView. 227 // Overridden from views::BubbleDelegateView.
192 virtual gfx::Rect GetAnchorRect() OVERRIDE; 228 virtual gfx::Rect GetAnchorRect() OVERRIDE;
229 virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE;
230
231 // Overridden from views::WidgetDelegateView.
232 virtual bool HasHitTestMask() const OVERRIDE;
233 virtual void GetHitTestMask(gfx::Path* mask) const OVERRIDE;
193 234
194 // Implementation of MouseWatcherListener. 235 // Implementation of MouseWatcherListener.
195 virtual void MouseMovedOutOfHost(); 236 virtual void MouseMovedOutOfHost();
196 237
197 // Implementation of MouseWatcherHost. 238 // Implementation of MouseWatcherHost.
198 virtual bool Contains(const gfx::Point& screen_point, 239 virtual bool Contains(const gfx::Point& screen_point,
199 views::MouseWatcherHost::MouseEventType type); 240 views::MouseWatcherHost::MouseEventType type);
200 241
201 // Overridden from views::View. 242 // Overridden from views::View.
202 virtual gfx::Size GetPreferredSize() OVERRIDE; 243 virtual gfx::Size GetPreferredSize() OVERRIDE;
(...skipping 19 matching lines...) Expand all
222 263
223 // Our owning class. 264 // Our owning class.
224 MaximizeBubbleController* owner_; 265 MaximizeBubbleController* owner_;
225 266
226 // The widget which contains our menu and the bubble border. 267 // The widget which contains our menu and the bubble border.
227 views::Widget* bubble_widget_; 268 views::Widget* bubble_widget_;
228 269
229 // The content accessor of the menu. 270 // The content accessor of the menu.
230 BubbleContentsView* contents_view_; 271 BubbleContentsView* contents_view_;
231 272
273 // The bubble border.
274 MaximizeBubbleBorder* bubble_border_;
275
276 // The rectangle before the animation starts.
277 gfx::Rect initial_position_;
278
232 // The mouse watcher which takes care of out of window hover events. 279 // The mouse watcher which takes care of out of window hover events.
233 scoped_ptr<views::MouseWatcher> mouse_watcher_; 280 scoped_ptr<views::MouseWatcher> mouse_watcher_;
234 281
235 DISALLOW_COPY_AND_ASSIGN(Bubble); 282 DISALLOW_COPY_AND_ASSIGN(Bubble);
236 }; 283 };
237 284
238 // A class that creates all buttons and put them into a view. 285 // A class that creates all buttons and put them into a view.
239 class BubbleContentsButtonRow : public views::View, 286 class BubbleContentsButtonRow : public views::View,
240 public views::ButtonListener { 287 public views::ButtonListener {
241 public: 288 public:
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 355
309 DISALLOW_COPY_AND_ASSIGN(BubbleDialogButton); 356 DISALLOW_COPY_AND_ASSIGN(BubbleDialogButton);
310 }; 357 };
311 358
312 MaximizeBubbleController::Bubble::Bubble(MaximizeBubbleController* owner) 359 MaximizeBubbleController::Bubble::Bubble(MaximizeBubbleController* owner)
313 : views::BubbleDelegateView(owner->frame_maximize_button(), 360 : views::BubbleDelegateView(owner->frame_maximize_button(),
314 views::BubbleBorder::TOP_RIGHT), 361 views::BubbleBorder::TOP_RIGHT),
315 shutting_down_(false), 362 shutting_down_(false),
316 owner_(owner), 363 owner_(owner),
317 bubble_widget_(NULL), 364 bubble_widget_(NULL),
318 contents_view_(NULL) { 365 contents_view_(NULL),
366 bubble_border_(NULL) {
319 set_margins(gfx::Insets()); 367 set_margins(gfx::Insets());
320 368
321 // The window needs to be owned by the root so that the SnapSizer does not 369 // The window needs to be owned by the root so that the SnapSizer does not
322 // cover it upon animation. 370 // cover it upon animation.
323 aura::Window* parent = Shell::GetContainer( 371 aura::Window* parent = Shell::GetContainer(
324 Shell::GetActiveRootWindow(), 372 Shell::GetActiveRootWindow(),
325 internal::kShellWindowId_LauncherContainer); 373 internal::kShellWindowId_LauncherContainer);
326 set_parent_window(parent); 374 set_parent_window(parent);
327 375
328 set_notify_enter_exit_on_child(true); 376 set_notify_enter_exit_on_child(true);
(...skipping 11 matching lines...) Expand all
340 contents_view_ = new BubbleContentsView(this); 388 contents_view_ = new BubbleContentsView(this);
341 AddChildView(contents_view_); 389 AddChildView(contents_view_);
342 390
343 // Note that the returned widget has an observer which points to our 391 // Note that the returned widget has an observer which points to our
344 // functions. 392 // functions.
345 bubble_widget_ = views::BubbleDelegateView::CreateBubble(this); 393 bubble_widget_ = views::BubbleDelegateView::CreateBubble(this);
346 394
347 SetAlignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE); 395 SetAlignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE);
348 bubble_widget_->non_client_view()->frame_view()->set_background(NULL); 396 bubble_widget_->non_client_view()->frame_view()->set_background(NULL);
349 397
350 MaximizeBubbleBorder* bubble_border = new MaximizeBubbleBorder( 398 bubble_border_ = new MaximizeBubbleBorder(this, anchor_view());
351 this, 399 GetBubbleFrameView()->SetBubbleBorder(bubble_border_);
352 anchor_view());
353 GetBubbleFrameView()->SetBubbleBorder(bubble_border);
354 GetBubbleFrameView()->set_background(NULL); 400 GetBubbleFrameView()->set_background(NULL);
355 401
356 // Recalculate size with new border. 402 // Recalculate size with new border.
357 SizeToContents(); 403 SizeToContents();
358 404
359 // Setup animation. 405 StartFade(true);
360 ash::SetWindowVisibilityAnimationType(
361 bubble_widget_->GetNativeWindow(),
362 ash::WINDOW_VISIBILITY_ANIMATION_TYPE_FADE);
363 ash::SetWindowVisibilityAnimationTransition(
364 bubble_widget_->GetNativeWindow(),
365 ash::ANIMATE_BOTH);
366 ash::SetWindowVisibilityAnimationDuration(
367 bubble_widget_->GetNativeWindow(),
368 base::TimeDelta::FromMilliseconds(kAnimationDurationForPopupMS));
369 406
370 Show();
371 // We don't want to lose the focus on our parent window because the button
372 // would otherwise lose the highlight when the "helper bubble" is shown.
373 views::Widget* widget =
374 owner_->frame_maximize_button()->parent()->GetWidget();
375 if (widget) {
376 aura::Window* parent_window = widget->GetNativeWindow();
377 parent_window->GetFocusManager()->SetFocusedWindow(parent_window, NULL);
378 }
379 mouse_watcher_.reset(new views::MouseWatcher( 407 mouse_watcher_.reset(new views::MouseWatcher(
380 new BubbleMouseWatcherHost(this), 408 new BubbleMouseWatcherHost(this),
381 this)); 409 this));
382 mouse_watcher_->Start(); 410 mouse_watcher_->Start();
383 } 411 }
384 412
385 bool BubbleMouseWatcherHost::Contains( 413 bool BubbleMouseWatcherHost::Contains(
386 const gfx::Point& screen_point, 414 const gfx::Point& screen_point,
387 views::MouseWatcherHost::MouseEventType type) { 415 views::MouseWatcherHost::MouseEventType type) {
388 return bubble_->Contains(screen_point, type); 416 return bubble_->Contains(screen_point, type);
389 } 417 }
390 418
391 aura::Window* MaximizeBubbleController::Bubble::GetBubbleWindow() { 419 aura::Window* MaximizeBubbleController::Bubble::GetBubbleWindow() {
392 return bubble_widget_ ? bubble_widget_->GetNativeWindow() : NULL; 420 return bubble_widget_ ? bubble_widget_->GetNativeWindow() : NULL;
393 } 421 }
394 422
395 gfx::Rect MaximizeBubbleController::Bubble::GetAnchorRect() { 423 gfx::Rect MaximizeBubbleController::Bubble::GetAnchorRect() {
396 if (!owner_) 424 if (!owner_)
397 return gfx::Rect(); 425 return gfx::Rect();
398 426
399 gfx::Rect anchor_rect = 427 gfx::Rect anchor_rect =
400 owner_->frame_maximize_button()->GetBoundsInScreen(); 428 owner_->frame_maximize_button()->GetBoundsInScreen();
401 return anchor_rect; 429 return anchor_rect;
402 } 430 }
403 431
432 void MaximizeBubbleController::Bubble::AnimationProgressed(
433 const ui::Animation* animation) {
434 // First do everything needed for the fade by calling the base function.
435 BubbleDelegateView::AnimationProgressed(animation);
436 // When fading in we are done.
437 if (!shutting_down_)
438 return;
439 // Upon fade out an additional shift is required.
440 int shift = animation->CurrentValueBetween(kBubbleAnimationOffsetY, 0);
441 gfx::Rect rect = initial_position_;
442
443 rect.set_y(rect.y() + shift);
444 bubble_widget_->GetNativeWindow()->SetBounds(rect);
445 }
446
447 bool MaximizeBubbleController::Bubble::HasHitTestMask() const {
448 return bubble_border_ != NULL;
449 }
450
451 void MaximizeBubbleController::Bubble::GetHitTestMask(gfx::Path* mask) const {
452 DCHECK(mask);
453 DCHECK(bubble_border_);
454 bubble_border_->GetMask(mask);
455 }
456
404 void MaximizeBubbleController::Bubble::MouseMovedOutOfHost() { 457 void MaximizeBubbleController::Bubble::MouseMovedOutOfHost() {
405 if (!owner_ || shutting_down_) 458 if (!owner_ || shutting_down_)
406 return; 459 return;
407 // When we leave the bubble, we might be still be in gesture mode or over 460 // When we leave the bubble, we might be still be in gesture mode or over
408 // the maximize button. So only close if none of the other cases apply. 461 // the maximize button. So only close if none of the other cases apply.
409 if (!owner_->frame_maximize_button()->is_snap_enabled()) { 462 if (!owner_->frame_maximize_button()->is_snap_enabled()) {
410 gfx::Point screen_location = gfx::Screen::GetCursorScreenPoint(); 463 gfx::Point screen_location = gfx::Screen::GetCursorScreenPoint();
411 if (!owner_->frame_maximize_button()->GetBoundsInScreen().Contains( 464 if (!owner_->frame_maximize_button()->GetBoundsInScreen().Contains(
412 screen_location)) { 465 screen_location)) {
413 owner_->RequestDestructionThroughOwner(); 466 owner_->RequestDestructionThroughOwner();
414 } 467 }
415 } 468 }
416 } 469 }
417 470
418 bool MaximizeBubbleController::Bubble::Contains( 471 bool MaximizeBubbleController::Bubble::Contains(
419 const gfx::Point& screen_point, 472 const gfx::Point& screen_point,
420 views::MouseWatcherHost::MouseEventType type) { 473 views::MouseWatcherHost::MouseEventType type) {
421 if (!owner_ || shutting_down_) 474 if (!owner_ || shutting_down_)
422 return false; 475 return false;
476 bool inside_button =
477 owner_->frame_maximize_button()->GetBoundsInScreen().Contains(
478 screen_point);
479 if (!owner_->frame_maximize_button()->is_snap_enabled() && inside_button) {
480 SetSnapType(controller()->is_maximized() ? SNAP_RESTORE : SNAP_MAXIMIZE);
481 return true;
482 }
423 // Check if either a gesture is taking place (=> bubble stays no matter what 483 // Check if either a gesture is taking place (=> bubble stays no matter what
424 // the mouse does) or the mouse is over the maximize button or the bubble 484 // the mouse does) or the mouse is over the maximize button or the bubble
425 // content. 485 // content.
426 return (owner_->frame_maximize_button()->is_snap_enabled() || 486 return (owner_->frame_maximize_button()->is_snap_enabled() ||
427 owner_->frame_maximize_button()->GetBoundsInScreen().Contains( 487 inside_button ||
428 screen_point) ||
429 contents_view_->GetBoundsInScreen().Contains(screen_point)); 488 contents_view_->GetBoundsInScreen().Contains(screen_point));
430 } 489 }
431 490
432 gfx::Size MaximizeBubbleController::Bubble::GetPreferredSize() { 491 gfx::Size MaximizeBubbleController::Bubble::GetPreferredSize() {
433 return contents_view_->GetPreferredSize(); 492 return contents_view_->GetPreferredSize();
434 } 493 }
435 494
436 void MaximizeBubbleController::Bubble::OnWidgetClosing(views::Widget* widget) { 495 void MaximizeBubbleController::Bubble::OnWidgetClosing(views::Widget* widget) {
437 if (bubble_widget_ != widget) 496 if (bubble_widget_ != widget)
438 return; 497 return;
(...skipping 12 matching lines...) Expand all
451 anchor_widget()->RemoveObserver(this); 510 anchor_widget()->RemoveObserver(this);
452 } 511 }
453 512
454 void MaximizeBubbleController::Bubble::ControllerRequestsCloseAndDelete() { 513 void MaximizeBubbleController::Bubble::ControllerRequestsCloseAndDelete() {
455 // This only gets called from the owning base class once it is deleted. 514 // This only gets called from the owning base class once it is deleted.
456 if (shutting_down_) 515 if (shutting_down_)
457 return; 516 return;
458 shutting_down_ = true; 517 shutting_down_ = true;
459 owner_ = NULL; 518 owner_ = NULL;
460 519
461 // Close the widget asynchronously. 520 // Close the widget asynchronously after the hide animation is finished.
462 bubble_widget_->Close(); 521 initial_position_ = bubble_widget_->GetNativeWindow()->bounds();
522 StartFade(false);
463 } 523 }
464 524
465 void MaximizeBubbleController::Bubble::SetSnapType(SnapType snap_type) { 525 void MaximizeBubbleController::Bubble::SetSnapType(SnapType snap_type) {
466 if (contents_view_) 526 if (contents_view_)
467 contents_view_->SetSnapType(snap_type); 527 contents_view_->SetSnapType(snap_type);
468 } 528 }
469 529
470 BubbleContentsButtonRow::BubbleContentsButtonRow( 530 BubbleContentsButtonRow::BubbleContentsButtonRow(
471 MaximizeBubbleController::Bubble* bubble) 531 MaximizeBubbleController::Bubble* bubble)
472 : bubble_(bubble), 532 : bubble_(bubble),
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
537 views::Background::CreateSolidBackground(kBubbleBackgroundColor)); 597 views::Background::CreateSolidBackground(kBubbleBackgroundColor));
538 598
539 buttons_view_ = new BubbleContentsButtonRow(bubble); 599 buttons_view_ = new BubbleContentsButtonRow(bubble);
540 AddChildView(buttons_view_); 600 AddChildView(buttons_view_);
541 601
542 label_view_ = new views::Label(); 602 label_view_ = new views::Label();
543 SetSnapType(SNAP_NONE); 603 SetSnapType(SNAP_NONE);
544 label_view_->SetHorizontalAlignment(views::Label::ALIGN_CENTER); 604 label_view_->SetHorizontalAlignment(views::Label::ALIGN_CENTER);
545 label_view_->SetBackgroundColor(kBubbleBackgroundColor); 605 label_view_->SetBackgroundColor(kBubbleBackgroundColor);
546 label_view_->SetEnabledColor(kBubbleTextColor); 606 label_view_->SetEnabledColor(kBubbleTextColor);
607 label_view_->set_border(views::Border::CreateEmptyBorder(
608 kLabelSpacing, 0, kLabelSpacing, 0));
547 AddChildView(label_view_); 609 AddChildView(label_view_);
548 } 610 }
549 611
550 // Set the label content to reflect the currently selected |snap_type|. 612 // Set the label content to reflect the currently selected |snap_type|.
551 // This function can be executed through the frame maximize button as well as 613 // This function can be executed through the frame maximize button as well as
552 // through hover operations. 614 // through hover operations.
553 void BubbleContentsView::SetSnapType(SnapType snap_type) { 615 void BubbleContentsView::SetSnapType(SnapType snap_type) {
554 if (!bubble_->controller()) 616 if (!bubble_->controller())
555 return; 617 return;
556 618
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 button_row_->ButtonHovered(this); 734 button_row_->ButtonHovered(this);
673 views::ImageButton::OnMouseEntered(event); 735 views::ImageButton::OnMouseEntered(event);
674 } 736 }
675 737
676 void BubbleDialogButton::OnMouseExited(const views::MouseEvent& event) { 738 void BubbleDialogButton::OnMouseExited(const views::MouseEvent& event) {
677 button_row_->ButtonHovered(NULL); 739 button_row_->ButtonHovered(NULL);
678 views::ImageButton::OnMouseExited(event); 740 views::ImageButton::OnMouseExited(event);
679 } 741 }
680 742
681 } // namespace ash 743 } // namespace ash
OLDNEW
« no previous file with comments | « no previous file | ash/wm/workspace/frame_maximize_button.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698