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 "chrome/browser/ui/views/tabs/tab_strip.h" | 5 #include "chrome/browser/ui/views/tabs/tab_strip.h" |
6 | 6 |
7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
8 #include <windowsx.h> | 8 #include <windowsx.h> |
9 #endif | 9 #endif |
10 | 10 |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE; | 220 virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE; |
221 #endif | 221 #endif |
222 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; | 222 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; |
223 | 223 |
224 // Overridden from ui::EventHandler: | 224 // Overridden from ui::EventHandler: |
225 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; | 225 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; |
226 | 226 |
227 private: | 227 private: |
228 bool ShouldWindowContentsBeTransparent() const; | 228 bool ShouldWindowContentsBeTransparent() const; |
229 gfx::ImageSkia GetBackgroundImage(views::CustomButton::ButtonState state, | 229 gfx::ImageSkia GetBackgroundImage(views::CustomButton::ButtonState state, |
230 ui::ScaleFactor scale_factor) const; | 230 float scale) const; |
231 gfx::ImageSkia GetImageForState(views::CustomButton::ButtonState state, | 231 gfx::ImageSkia GetImageForState(views::CustomButton::ButtonState state, |
232 ui::ScaleFactor scale_factor) const; | 232 float scale) const; |
233 gfx::ImageSkia GetImageForScale(ui::ScaleFactor scale_factor) const; | 233 gfx::ImageSkia GetImageForScale(float scale) const; |
234 | 234 |
235 // Tab strip that contains this button. | 235 // Tab strip that contains this button. |
236 TabStrip* tab_strip_; | 236 TabStrip* tab_strip_; |
237 | 237 |
238 // The offset used to paint the background image. | 238 // The offset used to paint the background image. |
239 gfx::Point background_offset_; | 239 gfx::Point background_offset_; |
240 | 240 |
241 // were we destroyed? | 241 // were we destroyed? |
242 bool* destroyed_; | 242 bool* destroyed_; |
243 | 243 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 | 300 |
301 destroyed_ = NULL; | 301 destroyed_ = NULL; |
302 SetState(views::CustomButton::STATE_NORMAL); | 302 SetState(views::CustomButton::STATE_NORMAL); |
303 return; | 303 return; |
304 } | 304 } |
305 views::ImageButton::OnMouseReleased(event); | 305 views::ImageButton::OnMouseReleased(event); |
306 } | 306 } |
307 #endif | 307 #endif |
308 | 308 |
309 void NewTabButton::OnPaint(gfx::Canvas* canvas) { | 309 void NewTabButton::OnPaint(gfx::Canvas* canvas) { |
310 gfx::ImageSkia image = | 310 gfx::ImageSkia image = GetImageForScale(canvas->image_scale()); |
311 GetImageForScale(ui::GetSupportedScaleFactor(canvas->image_scale())); | |
312 canvas->DrawImageInt(image, 0, height() - image.height()); | 311 canvas->DrawImageInt(image, 0, height() - image.height()); |
313 } | 312 } |
314 | 313 |
315 void NewTabButton::OnGestureEvent(ui::GestureEvent* event) { | 314 void NewTabButton::OnGestureEvent(ui::GestureEvent* event) { |
316 // Consume all gesture events here so that the parent (Tab) does not | 315 // Consume all gesture events here so that the parent (Tab) does not |
317 // start consuming gestures. | 316 // start consuming gestures. |
318 views::ImageButton::OnGestureEvent(event); | 317 views::ImageButton::OnGestureEvent(event); |
319 event->SetHandled(); | 318 event->SetHandled(); |
320 } | 319 } |
321 | 320 |
322 bool NewTabButton::ShouldWindowContentsBeTransparent() const { | 321 bool NewTabButton::ShouldWindowContentsBeTransparent() const { |
323 return GetWidget() && | 322 return GetWidget() && |
324 GetWidget()->GetTopLevelWidget()->ShouldWindowContentsBeTransparent(); | 323 GetWidget()->GetTopLevelWidget()->ShouldWindowContentsBeTransparent(); |
325 } | 324 } |
326 | 325 |
327 gfx::ImageSkia NewTabButton::GetBackgroundImage( | 326 gfx::ImageSkia NewTabButton::GetBackgroundImage( |
328 views::CustomButton::ButtonState state, | 327 views::CustomButton::ButtonState state, |
329 ui::ScaleFactor scale_factor) const { | 328 float scale) const { |
330 int background_id = 0; | 329 int background_id = 0; |
331 if (ShouldWindowContentsBeTransparent()) { | 330 if (ShouldWindowContentsBeTransparent()) { |
332 background_id = IDR_THEME_TAB_BACKGROUND_V; | 331 background_id = IDR_THEME_TAB_BACKGROUND_V; |
333 } else if (tab_strip_->controller()->IsIncognito()) { | 332 } else if (tab_strip_->controller()->IsIncognito()) { |
334 background_id = IDR_THEME_TAB_BACKGROUND_INCOGNITO; | 333 background_id = IDR_THEME_TAB_BACKGROUND_INCOGNITO; |
335 } else { | 334 } else { |
336 background_id = IDR_THEME_TAB_BACKGROUND; | 335 background_id = IDR_THEME_TAB_BACKGROUND; |
337 } | 336 } |
338 | 337 |
339 int alpha = 0; | 338 int alpha = 0; |
340 switch (state) { | 339 switch (state) { |
341 case views::CustomButton::STATE_NORMAL: | 340 case views::CustomButton::STATE_NORMAL: |
342 case views::CustomButton::STATE_HOVERED: | 341 case views::CustomButton::STATE_HOVERED: |
343 alpha = ShouldWindowContentsBeTransparent() ? kGlassFrameInactiveTabAlpha | 342 alpha = ShouldWindowContentsBeTransparent() ? kGlassFrameInactiveTabAlpha |
344 : 255; | 343 : 255; |
345 break; | 344 break; |
346 case views::CustomButton::STATE_PRESSED: | 345 case views::CustomButton::STATE_PRESSED: |
347 alpha = 145; | 346 alpha = 145; |
348 break; | 347 break; |
349 default: | 348 default: |
350 NOTREACHED(); | 349 NOTREACHED(); |
351 break; | 350 break; |
352 } | 351 } |
353 | 352 |
354 gfx::ImageSkia* mask = | 353 gfx::ImageSkia* mask = |
355 GetThemeProvider()->GetImageSkiaNamed(IDR_NEWTAB_BUTTON_MASK); | 354 GetThemeProvider()->GetImageSkiaNamed(IDR_NEWTAB_BUTTON_MASK); |
356 int height = mask->height(); | 355 int height = mask->height(); |
357 int width = mask->width(); | 356 int width = mask->width(); |
358 float scale = ui::GetImageScale(scale_factor); | |
359 // The canvas and mask has to use the same scale factor. | 357 // The canvas and mask has to use the same scale factor. |
360 if (!mask->HasRepresentation(scale)) | 358 if (!mask->HasRepresentation(scale)) |
361 scale_factor = ui::SCALE_FACTOR_100P; | 359 scale = ui::GetScaleForScaleFactor(ui::SCALE_FACTOR_100P); |
362 | 360 |
363 gfx::Canvas canvas(gfx::Size(width, height), scale, false); | 361 gfx::Canvas canvas(gfx::Size(width, height), scale, false); |
364 | 362 |
365 // For custom images the background starts at the top of the tab strip. | 363 // For custom images the background starts at the top of the tab strip. |
366 // Otherwise the background starts at the top of the frame. | 364 // Otherwise the background starts at the top of the frame. |
367 gfx::ImageSkia* background = | 365 gfx::ImageSkia* background = |
368 GetThemeProvider()->GetImageSkiaNamed(background_id); | 366 GetThemeProvider()->GetImageSkiaNamed(background_id); |
369 int offset_y = GetThemeProvider()->HasCustomImage(background_id) ? | 367 int offset_y = GetThemeProvider()->HasCustomImage(background_id) ? |
370 0 : background_offset_.y(); | 368 0 : background_offset_.y(); |
371 | 369 |
(...skipping 21 matching lines...) Expand all Loading... |
393 // White highlight on hover. | 391 // White highlight on hover. |
394 if (state == views::CustomButton::STATE_HOVERED) | 392 if (state == views::CustomButton::STATE_HOVERED) |
395 canvas.FillRect(GetLocalBounds(), SkColorSetARGB(64, 255, 255, 255)); | 393 canvas.FillRect(GetLocalBounds(), SkColorSetARGB(64, 255, 255, 255)); |
396 | 394 |
397 return gfx::ImageSkiaOperations::CreateMaskedImage( | 395 return gfx::ImageSkiaOperations::CreateMaskedImage( |
398 gfx::ImageSkia(canvas.ExtractImageRep()), *mask); | 396 gfx::ImageSkia(canvas.ExtractImageRep()), *mask); |
399 } | 397 } |
400 | 398 |
401 gfx::ImageSkia NewTabButton::GetImageForState( | 399 gfx::ImageSkia NewTabButton::GetImageForState( |
402 views::CustomButton::ButtonState state, | 400 views::CustomButton::ButtonState state, |
403 ui::ScaleFactor scale_factor) const { | 401 float scale) const { |
404 const int overlay_id = state == views::CustomButton::STATE_PRESSED ? | 402 const int overlay_id = state == views::CustomButton::STATE_PRESSED ? |
405 IDR_NEWTAB_BUTTON_P : IDR_NEWTAB_BUTTON; | 403 IDR_NEWTAB_BUTTON_P : IDR_NEWTAB_BUTTON; |
406 gfx::ImageSkia* overlay = GetThemeProvider()->GetImageSkiaNamed(overlay_id); | 404 gfx::ImageSkia* overlay = GetThemeProvider()->GetImageSkiaNamed(overlay_id); |
407 | 405 |
408 gfx::Canvas canvas( | 406 gfx::Canvas canvas( |
409 gfx::Size(overlay->width(), overlay->height()), | 407 gfx::Size(overlay->width(), overlay->height()), |
410 ui::GetImageScale(scale_factor), | 408 scale, |
411 false); | 409 false); |
412 canvas.DrawImageInt(GetBackgroundImage(state, scale_factor), 0, 0); | 410 canvas.DrawImageInt(GetBackgroundImage(state, scale), 0, 0); |
413 | 411 |
414 // Draw the button border with a slight alpha. | 412 // Draw the button border with a slight alpha. |
415 const int kGlassFrameOverlayAlpha = 178; | 413 const int kGlassFrameOverlayAlpha = 178; |
416 const int kOpaqueFrameOverlayAlpha = 230; | 414 const int kOpaqueFrameOverlayAlpha = 230; |
417 uint8 alpha = ShouldWindowContentsBeTransparent() ? | 415 uint8 alpha = ShouldWindowContentsBeTransparent() ? |
418 kGlassFrameOverlayAlpha : kOpaqueFrameOverlayAlpha; | 416 kGlassFrameOverlayAlpha : kOpaqueFrameOverlayAlpha; |
419 canvas.DrawImageInt(*overlay, 0, 0, alpha); | 417 canvas.DrawImageInt(*overlay, 0, 0, alpha); |
420 | 418 |
421 return gfx::ImageSkia(canvas.ExtractImageRep()); | 419 return gfx::ImageSkia(canvas.ExtractImageRep()); |
422 } | 420 } |
423 | 421 |
424 gfx::ImageSkia NewTabButton::GetImageForScale( | 422 gfx::ImageSkia NewTabButton::GetImageForScale(float scale) const { |
425 ui::ScaleFactor scale_factor) const { | |
426 if (!hover_animation_->is_animating()) | 423 if (!hover_animation_->is_animating()) |
427 return GetImageForState(state(), scale_factor); | 424 return GetImageForState(state(), scale); |
428 return gfx::ImageSkiaOperations::CreateBlendedImage( | 425 return gfx::ImageSkiaOperations::CreateBlendedImage( |
429 GetImageForState(views::CustomButton::STATE_NORMAL, scale_factor), | 426 GetImageForState(views::CustomButton::STATE_NORMAL, scale), |
430 GetImageForState(views::CustomButton::STATE_HOVERED, scale_factor), | 427 GetImageForState(views::CustomButton::STATE_HOVERED, scale), |
431 hover_animation_->GetCurrentValue()); | 428 hover_animation_->GetCurrentValue()); |
432 } | 429 } |
433 | 430 |
434 /////////////////////////////////////////////////////////////////////////////// | 431 /////////////////////////////////////////////////////////////////////////////// |
435 // TabStrip::RemoveTabDelegate | 432 // TabStrip::RemoveTabDelegate |
436 // | 433 // |
437 // AnimationDelegate used when removing a tab. Does the necessary cleanup when | 434 // AnimationDelegate used when removing a tab. Does the necessary cleanup when |
438 // done. | 435 // done. |
439 class TabStrip::RemoveTabDelegate | 436 class TabStrip::RemoveTabDelegate |
440 : public views::BoundsAnimator::OwnedAnimationDelegate { | 437 : public views::BoundsAnimator::OwnedAnimationDelegate { |
(...skipping 2204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2645 else | 2642 else |
2646 RemoveMessageLoopObserver(); | 2643 RemoveMessageLoopObserver(); |
2647 } | 2644 } |
2648 | 2645 |
2649 bool TabStrip::GetAdjustLayout() const { | 2646 bool TabStrip::GetAdjustLayout() const { |
2650 if (!adjust_layout_) | 2647 if (!adjust_layout_) |
2651 return false; | 2648 return false; |
2652 return chrome::GetHostDesktopTypeForNativeView( | 2649 return chrome::GetHostDesktopTypeForNativeView( |
2653 GetWidget()->GetNativeView()) == chrome::HOST_DESKTOP_TYPE_ASH; | 2650 GetWidget()->GetNativeView()) == chrome::HOST_DESKTOP_TYPE_ASH; |
2654 } | 2651 } |
OLD | NEW |