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

Side by Side Diff: chrome/browser/ui/views/fullscreen_exit_bubble_views.cc

Issue 7740044: Implement fullscreen info bubble on Win and Mac (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix ups Created 9 years, 2 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "chrome/browser/ui/views/fullscreen_exit_bubble_views.h" 5 #include "chrome/browser/ui/views/fullscreen_exit_bubble_views.h"
6 6
7 #include "base/message_loop.h" 7 #include "base/message_loop.h"
8 #include "base/utf_string_conversions.h" 8 #include "base/utf_string_conversions.h"
9 #include "chrome/app/chrome_command_ids.h" 9 #include "chrome/app/chrome_command_ids.h"
10 #include "chrome/browser/ui/views/bubble/bubble.h"
10 #include "grit/generated_resources.h" 11 #include "grit/generated_resources.h"
11 #include "ui/base/animation/slide_animation.h" 12 #include "ui/base/animation/slide_animation.h"
12 #include "ui/base/keycodes/keyboard_codes.h" 13 #include "ui/base/keycodes/keyboard_codes.h"
13 #include "ui/base/l10n/l10n_util.h" 14 #include "ui/base/l10n/l10n_util.h"
14 #include "ui/base/resource/resource_bundle.h" 15 #include "ui/base/resource/resource_bundle.h"
15 #include "ui/gfx/canvas_skia.h" 16 #include "ui/gfx/canvas_skia.h"
16 #include "ui/gfx/screen.h" 17 #include "ui/gfx/screen.h"
18 #include "views/bubble/bubble_border.h"
19 #include "views/controls/button/text_button.h"
17 #include "views/controls/link.h" 20 #include "views/controls/link.h"
18 #include "views/widget/widget.h" 21 #include "views/widget/widget.h"
19 22
20 #if defined(OS_WIN) 23 #if defined(OS_WIN)
21 #include "ui/base/l10n/l10n_util_win.h" 24 #include "ui/base/l10n/l10n_util_win.h"
22 #endif 25 #endif
23 26
24 // FullscreenExitView ---------------------------------------------------------- 27 // FullscreenExitView ----------------------------------------------------------
25 28
26 class FullscreenExitBubbleViews::FullscreenExitView : public views::View { 29 class FullscreenExitBubbleViews::FullscreenExitView : public views::View,
30 public views::ButtonListener {
Peter Kasting 2011/10/11 23:08:32 Nit: Must be aligned with other parent class decla
koz (OOO until 15th September) 2011/10/12 05:38:23 Done.
27 public: 31 public:
28 FullscreenExitView(FullscreenExitBubbleViews* bubble, 32 FullscreenExitView(FullscreenExitBubbleViews* bubble,
29 const std::wstring& accelerator); 33 const std::wstring& accelerator,
34 const GURL& url,
35 bool ask_permission);
30 virtual ~FullscreenExitView(); 36 virtual ~FullscreenExitView();
31 37
32 // views::View 38 // views::View
33 virtual gfx::Size GetPreferredSize(); 39 virtual gfx::Size GetPreferredSize();
34 40
41 // views::ButtonListener
Peter Kasting 2011/10/11 23:08:32 Nit: Can this be private?
koz (OOO until 15th September) 2011/10/12 05:38:23 Done.
42 virtual void ButtonPressed(views::Button* sender, const views::Event& event);
43
44 virtual void HideButtons();
Peter Kasting 2011/10/11 23:08:32 Nit: Is this really virtual? Seems like no? Also
koz (OOO until 15th September) 2011/10/12 05:38:23 Done.
45
35 private: 46 private:
47 string16 GetMessage(const GURL& url);
48 // Space between the site info label and the buttons / link.
Peter Kasting 2011/10/11 23:08:32 Nit: Blank line above this
koz (OOO until 15th September) 2011/10/12 05:38:23 Done.
49 static const int kMiddlePaddingPx = 30;
50
36 // views::View 51 // views::View
37 virtual void Layout(); 52 virtual void Layout();
38 virtual void OnPaint(gfx::Canvas* canvas); 53 // virtual void OnPaint(gfx::Canvas* canvas);
Peter Kasting 2011/10/11 23:08:32 Don't comment out declarations -- remove it entire
koz (OOO until 15th September) 2011/10/12 05:38:23 Done.
54
55 FullscreenExitBubbleViews* bubble_;
39 56
40 // Clickable hint text to show in the bubble. 57 // Clickable hint text to show in the bubble.
41 views::Link link_; 58 views::Link link_;
59 views::Label message_label_;
60 views::NativeTextButton* accept_button_;
61 views::NativeTextButton* deny_button_;
62
63 bool show_buttons_;
42 }; 64 };
43 65
44 FullscreenExitBubbleViews::FullscreenExitView::FullscreenExitView( 66 FullscreenExitBubbleViews::FullscreenExitView::FullscreenExitView(
45 FullscreenExitBubbleViews* bubble, 67 FullscreenExitBubbleViews* bubble,
46 const std::wstring& accelerator) { 68 const std::wstring& accelerator,
69 const GURL& url,
70 bool ask_permission)
71 : bubble_(bubble),
72 accept_button_(NULL),
73 deny_button_(NULL),
74 show_buttons_(ask_permission) {
75 set_focusable(false);
47 link_.set_parent_owned(false); 76 link_.set_parent_owned(false);
77 link_.set_collapse_when_hidden(false);
78 link_.set_focusable(false);
48 #if !defined(OS_CHROMEOS) 79 #if !defined(OS_CHROMEOS)
49 link_.SetText( 80 link_.SetText(
50 l10n_util::GetStringFUTF16(IDS_EXIT_FULLSCREEN_MODE, 81 l10n_util::GetStringFUTF16(IDS_EXIT_FULLSCREEN_MODE,
51 WideToUTF16(accelerator))); 82 WideToUTF16(accelerator)));
52 #else 83 #else
53 link_.SetText(l10n_util::GetStringUTF16(IDS_EXIT_FULLSCREEN_MODE)); 84 link_.SetText(l10n_util::GetStringUTF16(IDS_EXIT_FULLSCREEN_MODE));
54 #endif 85 #endif
55 link_.set_listener(bubble); 86 link_.set_listener(bubble);
56 link_.SetFont(ResourceBundle::GetSharedInstance().GetFont( 87 link_.SetFont(ResourceBundle::GetSharedInstance().GetFont(
57 ResourceBundle::LargeFont)); 88 ResourceBundle::MediumFont));
58 link_.SetNormalColor(SK_ColorWHITE); 89 link_.SetNormalColor(SK_ColorBLACK);
Peter Kasting 2011/10/11 23:08:32 There are potential accessibility issues here. Yo
koz (OOO until 15th September) 2011/10/12 05:38:23 Cool. I'll make this change once your patch lands.
Peter Kasting 2011/10/12 23:09:21 This has now landed.
59 link_.SetHighlightedColor(SK_ColorWHITE); 90 link_.SetHighlightedColor(SK_ColorBLACK);
91
92 message_label_.set_parent_owned(false);
93 message_label_.SetText(
94 GetMessage(url));
95 message_label_.SetFont(ResourceBundle::GetSharedInstance().GetFont(
96 ResourceBundle::MediumFont));
97 AddChildView(&message_label_);
60 AddChildView(&link_); 98 AddChildView(&link_);
99
100 views::BubbleBorder* bubble_border =
Peter Kasting 2011/10/11 23:08:32 Nit: Instead of manually creating a bubble border,
koz (OOO until 15th September) 2011/10/12 05:38:23 There were a few reasons why we abandoned our atte
101 new views::BubbleBorder(views::BubbleBorder::NONE);
102 bubble_border->set_background_color(Bubble::kBackgroundColor);
103 set_background(new views::BubbleBackground(bubble_border));
104 set_border(bubble_border);
105
106 accept_button_ = new views::NativeTextButton(this,
107 UTF16ToWide(l10n_util::GetStringUTF16(IDS_FULLSCREEN_INFOBAR_ALLOW)));
108 AddChildView(accept_button_);
109
110 deny_button_ = new views::NativeTextButton(this,
111 UTF16ToWide(l10n_util::GetStringUTF16(IDS_FULLSCREEN_INFOBAR_DENY)));
112 AddChildView(deny_button_);
113 accept_button_->set_focusable(false);
114 deny_button_->set_focusable(false);
115 link_.SetVisible(false);
116 if (!show_buttons_) {
Peter Kasting 2011/10/11 23:08:32 Nit: No {}
koz (OOO until 15th September) 2011/10/12 05:38:23 Done.
117 HideButtons();
118 }
119 }
120
121 string16 FullscreenExitBubbleViews::FullscreenExitView::GetMessage(
122 const GURL& url) {
123 UTF16ToWide(
Peter Kasting 2011/10/11 23:08:32 This line is erroneous.
koz (OOO until 15th September) 2011/10/12 05:38:23 Done.
124 if (url.empty()) {
125 return l10n_util::GetStringUTF16(
126 IDS_FULLSCREEN_INFOBAR_USER_ENTERED_FULLSCREEN);
127 } else if (url.SchemeIsFile()) {
Peter Kasting 2011/10/11 23:08:32 Nit: No else after return (2 places)
koz (OOO until 15th September) 2011/10/12 05:38:23 Done.
128 return l10n_util::GetStringUTF16(IDS_FULLSCREEN_INFOBAR_FILE_PAGE_NAME);
129 } else {
130 return
131 l10n_util::GetStringFUTF16(IDS_FULLSCREEN_INFOBAR_REQUEST_PERMISSION,
132 UTF8ToUTF16(url.host()));
133 }
61 } 134 }
62 135
63 FullscreenExitBubbleViews::FullscreenExitView::~FullscreenExitView() { 136 FullscreenExitBubbleViews::FullscreenExitView::~FullscreenExitView() {
64 } 137 }
65 138
139 void FullscreenExitBubbleViews::FullscreenExitView::ButtonPressed(
140 views::Button* sender, const views::Event& event) {
141 if (sender == accept_button_)
142 bubble_->OnAcceptFullscreen();
143 else
144 bubble_->OnCancelFullscreen();
145 }
146
147 void FullscreenExitBubbleViews::FullscreenExitView::HideButtons() {
148 show_buttons_ = false;
149 accept_button_->SetVisible(false);
150 deny_button_->SetVisible(false);
151 link_.SetVisible(true);
152 }
153
66 gfx::Size FullscreenExitBubbleViews::FullscreenExitView::GetPreferredSize() { 154 gfx::Size FullscreenExitBubbleViews::FullscreenExitView::GetPreferredSize() {
67 gfx::Size preferred_size(link_.GetPreferredSize()); 155 gfx::Size link_preferred_size(link_.GetPreferredSize());
68 preferred_size.Enlarge(kPaddingPx * 2, kPaddingPx * 2); 156 gfx::Size site_info_preferred_size(message_label_.GetPreferredSize());
69 return preferred_size; 157 gfx::Size accept_preferred_size(accept_button_->GetPreferredSize());
158 gfx::Size deny_preferred_size(deny_button_->GetPreferredSize());
159 gfx::Insets insets(GetInsets());
160
161 int buttons_width = accept_preferred_size.width() + kPaddingPx +
162 deny_preferred_size.width();
163 int button_box_width = std::max(buttons_width, link_preferred_size.width());
164 int width = kPaddingPx + site_info_preferred_size.width() + kMiddlePaddingPx +
165 button_box_width + kPaddingPx;
166
167 gfx::Size result(width + insets.width(),
168 kPaddingPx * 2 + accept_preferred_size.height() + insets.height());
169 return result;
70 } 170 }
71 171
72 void FullscreenExitBubbleViews::FullscreenExitView::Layout() { 172 void FullscreenExitBubbleViews::FullscreenExitView::Layout() {
73 gfx::Size link_preferred_size(link_.GetPreferredSize()); 173 gfx::Size link_preferred_size(link_.GetPreferredSize());
Peter Kasting 2011/10/11 23:08:32 Did you consider using a layout manager like GridL
koz (OOO until 15th September) 2011/10/12 05:38:23 I'm not sure if that would work here as we need to
74 link_.SetBounds(kPaddingPx, 174 gfx::Size site_info_preferred_size(message_label_.GetPreferredSize());
75 height() - kPaddingPx - link_preferred_size.height(), 175 gfx::Size accept_preferred_size(accept_button_->GetPreferredSize());
176 gfx::Size deny_preferred_size(deny_button_->GetPreferredSize());
177 gfx::Insets insets(GetInsets());
178
179 int inner_height = height() - insets.height();
180 int button_box_x = insets.left() + kPaddingPx +
181 site_info_preferred_size.width() + kMiddlePaddingPx;
182 int site_info_y = insets.top() +
183 (inner_height - site_info_preferred_size.height()) / 2;
184 int link_x = width() - insets.right() - kPaddingPx -
185 link_preferred_size.width();
186 int link_y = insets.top() + (inner_height - link_preferred_size.height()) / 2;
187
188 message_label_.SetBounds(insets.left() + kPaddingPx,
189 site_info_y,
190 site_info_preferred_size.width(),
191 site_info_preferred_size.height());
192 link_.SetBounds(link_x,
Peter Kasting 2011/10/11 23:08:32 Nit: Wrapping here is odd
koz (OOO until 15th September) 2011/10/12 05:38:23 Done.
193 link_y,
76 link_preferred_size.width(), link_preferred_size.height()); 194 link_preferred_size.width(), link_preferred_size.height());
77 } 195 if (show_buttons_) {
78 196 accept_button_->SetBounds(button_box_x,
79 void FullscreenExitBubbleViews::FullscreenExitView::OnPaint( 197 insets.top() + kPaddingPx,
80 gfx::Canvas* canvas) { 198 accept_preferred_size.width(),
81 // Create a round-bottomed rect to fill the whole View. 199 accept_preferred_size.height());
82 SkRect rect; 200 deny_button_->SetBounds(
83 SkScalar padding = SkIntToScalar(kPaddingPx); 201 button_box_x + accept_preferred_size.width() + kPaddingPx,
84 // The "-padding" top coordinate ensures that the rect is always tall enough 202 insets.top() + kPaddingPx,
85 // to contain the complete rounded corner radius. If we set this to 0, as the 203 deny_preferred_size.width(),
86 // popup slides offscreen (in reality, squishes to 0 height), the corners will 204 deny_preferred_size.height());
87 // flatten out as the height becomes less than the corner radius. 205 }
88 rect.set(0, -padding, SkIntToScalar(width()), SkIntToScalar(height()));
89 SkScalar rad[8] = { 0, 0, 0, 0, padding, padding, padding, padding };
90 SkPath path;
91 path.addRoundRect(rect, rad, SkPath::kCW_Direction);
92
93 // Fill it black.
94 SkPaint paint;
95 paint.setStyle(SkPaint::kFill_Style);
96 paint.setFlags(SkPaint::kAntiAlias_Flag);
97 paint.setColor(SK_ColorBLACK);
98 canvas->GetSkCanvas()->drawPath(path, paint);
99 } 206 }
100 207
101 // FullscreenExitBubbleViews --------------------------------------------------- 208 // FullscreenExitBubbleViews ---------------------------------------------------
102 209
103 FullscreenExitBubbleViews::FullscreenExitBubbleViews( 210 FullscreenExitBubbleViews::FullscreenExitBubbleViews(
104 views::Widget* frame, 211 views::Widget* frame,
Peter Kasting 2011/10/11 23:08:32 Nit: Move up to previous line and align other args
koz (OOO until 15th September) 2011/10/12 05:38:23 Done.
105 CommandUpdater::CommandUpdaterDelegate* delegate) 212 Browser* browser,
106 : FullscreenExitBubble(delegate), 213 const GURL& url,
214 bool ask_permission)
215 : FullscreenExitBubble(browser),
107 root_view_(frame->GetRootView()), 216 root_view_(frame->GetRootView()),
108 popup_(NULL), 217 popup_(NULL),
109 size_animation_(new ui::SlideAnimation(this)) { 218 size_animation_(new ui::SlideAnimation(this)),
219 url_(url) {
110 size_animation_->Reset(1); 220 size_animation_->Reset(1);
111 221
112 // Create the contents view. 222 // Create the contents view.
113 views::Accelerator accelerator(ui::VKEY_UNKNOWN, false, false, false); 223 views::Accelerator accelerator(ui::VKEY_UNKNOWN, false, false, false);
114 bool got_accelerator = frame->GetAccelerator(IDC_FULLSCREEN, &accelerator); 224 bool got_accelerator = frame->GetAccelerator(IDC_FULLSCREEN, &accelerator);
115 DCHECK(got_accelerator); 225 DCHECK(got_accelerator);
116 view_ = new FullscreenExitView( 226 view_ = new FullscreenExitView(
117 this, UTF16ToWideHack(accelerator.GetShortcutText())); 227 this, UTF16ToWideHack(accelerator.GetShortcutText()), url,
Peter Kasting 2011/10/11 23:08:32 Nit: I think you can fit this all on 2 lines if yo
koz (OOO until 15th September) 2011/10/12 05:38:23 Done.
228 ask_permission);
118 229
119 // Initialize the popup. 230 // Initialize the popup.
120 popup_ = new views::Widget; 231 popup_ = new views::Widget;
121 views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP); 232 views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
122 params.transparent = true; 233 params.transparent = true;
123 params.can_activate = false; 234 params.can_activate = false;
124 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 235 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
125 params.parent = frame->GetNativeView(); 236 params.parent = frame->GetNativeView();
126 params.bounds = GetPopupRect(false); 237 params.bounds = GetPopupRect(false);
127 popup_->Init(params); 238 popup_->Init(params);
239 gfx::Size size = GetPopupRect(true).size();
128 popup_->SetContentsView(view_); 240 popup_->SetContentsView(view_);
129 popup_->SetOpacity(static_cast<unsigned char>(0xff * kOpacity)); 241 popup_->GetRootView()->SetLayoutManager(NULL);
Peter Kasting 2011/10/11 23:08:32 If you're removing this you should kill the kOpaci
koz (OOO until 15th September) 2011/10/12 05:38:23 I've removed the constant (thanks), but as I talke
Peter Kasting 2011/10/11 23:08:32 Why is this needed?
koz (OOO until 15th September) 2011/10/12 05:38:23 I've added a comment.
242 view_->SetBounds(0, 0, size.width(), size.height());
130 popup_->Show(); // This does not activate the popup. 243 popup_->Show(); // This does not activate the popup.
131 244
132 StartWatchingMouse(); 245 if (!ask_permission)
246 StartWatchingMouse();
133 } 247 }
134 248
135 FullscreenExitBubbleViews::~FullscreenExitBubbleViews() { 249 FullscreenExitBubbleViews::~FullscreenExitBubbleViews() {
136 // This is tricky. We may be in an ATL message handler stack, in which case 250 // This is tricky. We may be in an ATL message handler stack, in which case
137 // the popup cannot be deleted yet. We also can't set the popup's ownership 251 // the popup cannot be deleted yet. We also can't set the popup's ownership
138 // model to NATIVE_WIDGET_OWNS_WIDGET because if the user closed the last tab 252 // model to NATIVE_WIDGET_OWNS_WIDGET because if the user closed the last tab
139 // while in fullscreen mode, Windows has already destroyed the popup HWND by 253 // while in fullscreen mode, Windows has already destroyed the popup HWND by
140 // the time we get here, and thus either the popup will already have been 254 // the time we get here, and thus either the popup will already have been
141 // deleted (if we set this in our constructor) or the popup will never get 255 // deleted (if we set this in our constructor) or the popup will never get
142 // another OnFinalMessage() call (if not, as currently). So instead, we tell 256 // another OnFinalMessage() call (if not, as currently). So instead, we tell
143 // the popup to synchronously hide, and then asynchronously close and delete 257 // the popup to synchronously hide, and then asynchronously close and delete
144 // itself. 258 // itself.
145 popup_->Close(); 259 popup_->Close();
146 MessageLoop::current()->DeleteSoon(FROM_HERE, popup_); 260 MessageLoop::current()->DeleteSoon(FROM_HERE, popup_);
147 } 261 }
148 262
149 void FullscreenExitBubbleViews::LinkClicked( 263 void FullscreenExitBubbleViews::LinkClicked(
150 views::Link* source, int event_flags) { 264 views::Link* source, int event_flags) {
151 ToggleFullscreen(); 265 ToggleFullscreen();
152 } 266 }
153 267
268 void FullscreenExitBubbleViews::OnAcceptFullscreen() {
269 AcceptFullscreen(url_);
270 view_->HideButtons();
271 StartWatchingMouse();
272 }
273
274 void FullscreenExitBubbleViews::OnCancelFullscreen() {
275 CancelFullscreen();
276 }
277
154 void FullscreenExitBubbleViews::AnimationProgressed( 278 void FullscreenExitBubbleViews::AnimationProgressed(
155 const ui::Animation* animation) { 279 const ui::Animation* animation) {
156 gfx::Rect popup_rect(GetPopupRect(false)); 280 gfx::Rect popup_rect(GetPopupRect(false));
157 if (popup_rect.IsEmpty()) { 281 if (popup_rect.IsEmpty()) {
158 popup_->Hide(); 282 popup_->Hide();
159 } else { 283 } else {
160 popup_->SetBounds(popup_rect); 284 popup_->SetBounds(popup_rect);
285 view_->SetY(popup_rect.height() - view_->height());
161 popup_->Show(); 286 popup_->Show();
162 } 287 }
163 } 288 }
289
164 void FullscreenExitBubbleViews::AnimationEnded( 290 void FullscreenExitBubbleViews::AnimationEnded(
165 const ui::Animation* animation) { 291 const ui::Animation* animation) {
166 AnimationProgressed(animation); 292 AnimationProgressed(animation);
167 } 293 }
168 294
169 void FullscreenExitBubbleViews::Hide() { 295 void FullscreenExitBubbleViews::Hide() {
170 size_animation_->SetSlideDuration(kSlideOutDurationMs); 296 size_animation_->SetSlideDuration(kSlideOutDurationMs);
171 size_animation_->Hide(); 297 size_animation_->Hide();
172 } 298 }
173 299
(...skipping 17 matching lines...) Expand all
191 gfx::Point FullscreenExitBubbleViews::GetCursorScreenPoint() { 317 gfx::Point FullscreenExitBubbleViews::GetCursorScreenPoint() {
192 gfx::Point cursor_pos = gfx::Screen::GetCursorScreenPoint(); 318 gfx::Point cursor_pos = gfx::Screen::GetCursorScreenPoint();
193 gfx::Point transformed_pos(cursor_pos); 319 gfx::Point transformed_pos(cursor_pos);
194 views::View::ConvertPointToView(NULL, root_view_, &transformed_pos); 320 views::View::ConvertPointToView(NULL, root_view_, &transformed_pos);
195 return transformed_pos; 321 return transformed_pos;
196 } 322 }
197 323
198 gfx::Rect FullscreenExitBubbleViews::GetPopupRect( 324 gfx::Rect FullscreenExitBubbleViews::GetPopupRect(
199 bool ignore_animation_state) const { 325 bool ignore_animation_state) const {
200 gfx::Size size(view_->GetPreferredSize()); 326 gfx::Size size(view_->GetPreferredSize());
201 if (!ignore_animation_state) {
202 size.set_height(static_cast<int>(static_cast<double>(size.height()) *
203 size_animation_->GetCurrentValue()));
204 }
205 // NOTE: don't use the bounds of the root_view_. On linux changing window 327 // NOTE: don't use the bounds of the root_view_. On linux changing window
206 // size is async. Instead we use the size of the screen. 328 // size is async. Instead we use the size of the screen.
207 gfx::Rect screen_bounds = gfx::Screen::GetMonitorAreaNearestWindow( 329 gfx::Rect screen_bounds = gfx::Screen::GetMonitorAreaNearestWindow(
208 root_view_->GetWidget()->GetNativeView()); 330 root_view_->GetWidget()->GetNativeView());
209 gfx::Point origin(screen_bounds.x() + 331 gfx::Point origin(screen_bounds.x() +
210 (screen_bounds.width() - size.width()) / 2, 332 (screen_bounds.width() - size.width()) / 2,
211 screen_bounds.y()); 333 kPopupTopPx + screen_bounds.y());
334 if (!ignore_animation_state) {
335 int total_height = size.height() + kPopupTopPx;
336 int animation_height = static_cast<int>(
Peter Kasting 2011/10/11 23:08:32 Nit: Use size_animation_.CurrentValueBetween().
koz (OOO until 15th September) 2011/10/12 05:38:23 Done.
337 static_cast<double>(total_height) *
338 (1.0f - size_animation_->GetCurrentValue()));
339 int offset_delta, height_delta;
340 if (animation_height <= kPopupTopPx) {
Peter Kasting 2011/10/11 23:08:32 Nit: Simpler: int y_offset = std::min(animation
koz (OOO until 15th September) 2011/10/12 05:38:23 Yes, that would be the best way to do it, but we w
Peter Kasting 2011/10/12 07:38:40 Test and see. Grab two monitors and tell Windows
341 offset_delta = animation_height;
342 height_delta = 0;
343 } else {
344 offset_delta = kPopupTopPx;
345 height_delta = animation_height - kPopupTopPx;
346 }
347
348 size.set_height(size.height() - height_delta);
349 origin.set_y(origin.y() - offset_delta);
350 }
212 return gfx::Rect(origin, size); 351 return gfx::Rect(origin, size);
213 } 352 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698