Chromium Code Reviews| 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 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 63 #endif | 63 #endif |
| 64 | 64 |
| 65 using base::UserMetricsAction; | 65 using base::UserMetricsAction; |
| 66 using ui::DropTargetEvent; | 66 using ui::DropTargetEvent; |
| 67 | 67 |
| 68 namespace { | 68 namespace { |
| 69 | 69 |
| 70 static const int kTabStripAnimationVSlop = 40; | 70 static const int kTabStripAnimationVSlop = 40; |
| 71 // Inactive tabs in a native frame are slightly transparent. | 71 // Inactive tabs in a native frame are slightly transparent. |
| 72 static const int kNativeFrameInactiveTabAlpha = 200; | 72 static const int kNativeFrameInactiveTabAlpha = 200; |
| 73 #if defined(OS_WIN) | |
| 73 // If there are multiple tabs selected then make non-selected inactive tabs | 74 // If there are multiple tabs selected then make non-selected inactive tabs |
| 74 // even more transparent. | 75 // even more transparent. |
| 75 static const int kNativeFrameInactiveTabAlphaMultiSelection = 150; | 76 static const int kNativeFrameInactiveTabAlphaMultiSelection = 150; |
|
sky
2014/02/03 21:53:03
Rename this to better match other naming.
Matt Giuca
2014/02/05 23:25:31
Done.
| |
| 77 #endif | |
| 76 | 78 |
| 77 // Alpha applied to all elements save the selected tabs. | 79 // Alpha applied to all elements save the selected tabs. |
| 78 static const int kInactiveTabAndNewTabButtonAlphaAsh = 230; | 80 static const int kInactiveTabAndNewTabButtonAlphaAsh = 230; |
| 79 static const int kInactiveTabAndNewTabButtonAlpha = 255; | 81 static const int kInactiveTabAndNewTabButtonAlpha = 255; |
| 80 | 82 |
| 81 // Inverse ratio of the width of a tab edge to the width of the tab. When | 83 // Inverse ratio of the width of a tab edge to the width of the tab. When |
| 82 // hovering over the left or right edge of a tab, the drop indicator will | 84 // hovering over the left or right edge of a tab, the drop indicator will |
| 83 // point between tabs. | 85 // point between tabs. |
| 84 static const int kTabEdgeRatioInverse = 4; | 86 static const int kTabEdgeRatioInverse = 4; |
| 85 | 87 |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 326 gfx::Path* path) const OVERRIDE; | 328 gfx::Path* path) const OVERRIDE; |
| 327 #if defined(OS_WIN) | 329 #if defined(OS_WIN) |
| 328 virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE; | 330 virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE; |
| 329 #endif | 331 #endif |
| 330 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; | 332 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; |
| 331 | 333 |
| 332 // Overridden from ui::EventHandler: | 334 // Overridden from ui::EventHandler: |
| 333 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; | 335 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; |
| 334 | 336 |
| 335 private: | 337 private: |
| 336 bool ShouldUseNativeFrame() const; | 338 // Returns true on Windows if the Glass styling is being used. |
| 339 // This implies that the tab strip overlaps a native window frame. | |
| 340 bool UsingWindowsGlass() const; | |
| 337 gfx::ImageSkia GetBackgroundImage(views::CustomButton::ButtonState state, | 341 gfx::ImageSkia GetBackgroundImage(views::CustomButton::ButtonState state, |
| 338 ui::ScaleFactor scale_factor) const; | 342 ui::ScaleFactor scale_factor) const; |
| 339 gfx::ImageSkia GetImageForState(views::CustomButton::ButtonState state, | 343 gfx::ImageSkia GetImageForState(views::CustomButton::ButtonState state, |
| 340 ui::ScaleFactor scale_factor) const; | 344 ui::ScaleFactor scale_factor) const; |
| 341 gfx::ImageSkia GetImageForScale(ui::ScaleFactor scale_factor) const; | 345 gfx::ImageSkia GetImageForScale(ui::ScaleFactor scale_factor) const; |
| 342 | 346 |
| 343 // Tab strip that contains this button. | 347 // Tab strip that contains this button. |
| 344 TabStrip* tab_strip_; | 348 TabStrip* tab_strip_; |
| 345 | 349 |
| 346 // The offset used to paint the background image. | 350 // The offset used to paint the background image. |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 420 canvas->DrawImageInt(image, 0, height() - image.height()); | 424 canvas->DrawImageInt(image, 0, height() - image.height()); |
| 421 } | 425 } |
| 422 | 426 |
| 423 void NewTabButton::OnGestureEvent(ui::GestureEvent* event) { | 427 void NewTabButton::OnGestureEvent(ui::GestureEvent* event) { |
| 424 // Consume all gesture events here so that the parent (Tab) does not | 428 // Consume all gesture events here so that the parent (Tab) does not |
| 425 // start consuming gestures. | 429 // start consuming gestures. |
| 426 views::ImageButton::OnGestureEvent(event); | 430 views::ImageButton::OnGestureEvent(event); |
| 427 event->SetHandled(); | 431 event->SetHandled(); |
| 428 } | 432 } |
| 429 | 433 |
| 430 bool NewTabButton::ShouldUseNativeFrame() const { | 434 bool NewTabButton::UsingWindowsGlass() const { |
| 435 #if defined(OS_WIN) | |
| 431 return GetWidget() && | 436 return GetWidget() && |
| 432 GetWidget()->GetTopLevelWidget()->ShouldUseNativeFrame(); | 437 GetWidget()->GetTopLevelWidget()->ShouldUseNativeFrame(); |
| 438 #endif | |
| 439 return false; | |
| 433 } | 440 } |
| 434 | 441 |
| 435 gfx::ImageSkia NewTabButton::GetBackgroundImage( | 442 gfx::ImageSkia NewTabButton::GetBackgroundImage( |
| 436 views::CustomButton::ButtonState state, | 443 views::CustomButton::ButtonState state, |
| 437 ui::ScaleFactor scale_factor) const { | 444 ui::ScaleFactor scale_factor) const { |
| 438 int background_id = 0; | 445 int background_id = 0; |
| 439 if (ShouldUseNativeFrame()) { | 446 if (UsingWindowsGlass()) { |
| 440 background_id = IDR_THEME_TAB_BACKGROUND_V; | 447 background_id = IDR_THEME_TAB_BACKGROUND_V; |
| 441 } else if (tab_strip_->controller()->IsIncognito()) { | 448 } else if (tab_strip_->controller()->IsIncognito()) { |
| 442 background_id = IDR_THEME_TAB_BACKGROUND_INCOGNITO; | 449 background_id = IDR_THEME_TAB_BACKGROUND_INCOGNITO; |
| 443 #if defined(OS_WIN) | 450 #if defined(OS_WIN) |
| 444 } else if (win8::IsSingleWindowMetroMode()) { | 451 } else if (win8::IsSingleWindowMetroMode()) { |
| 445 background_id = IDR_THEME_TAB_BACKGROUND_V; | 452 background_id = IDR_THEME_TAB_BACKGROUND_V; |
| 446 #endif | 453 #endif |
| 447 } else { | 454 } else { |
| 448 background_id = IDR_THEME_TAB_BACKGROUND; | 455 background_id = IDR_THEME_TAB_BACKGROUND; |
| 449 } | 456 } |
| 450 | 457 |
| 451 int alpha = 0; | 458 int alpha = 0; |
| 452 switch (state) { | 459 switch (state) { |
| 453 case views::CustomButton::STATE_NORMAL: | 460 case views::CustomButton::STATE_NORMAL: |
| 454 case views::CustomButton::STATE_HOVERED: | 461 case views::CustomButton::STATE_HOVERED: |
| 455 alpha = ShouldUseNativeFrame() ? kNativeFrameInactiveTabAlpha : 255; | 462 alpha = UsingWindowsGlass() ? kNativeFrameInactiveTabAlpha : 255; |
| 456 break; | 463 break; |
| 457 case views::CustomButton::STATE_PRESSED: | 464 case views::CustomButton::STATE_PRESSED: |
| 458 alpha = 145; | 465 alpha = 145; |
| 459 break; | 466 break; |
| 460 default: | 467 default: |
| 461 NOTREACHED(); | 468 NOTREACHED(); |
| 462 break; | 469 break; |
| 463 } | 470 } |
| 464 | 471 |
| 465 gfx::ImageSkia* mask = | 472 gfx::ImageSkia* mask = |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 516 IDR_NEWTAB_BUTTON_P : IDR_NEWTAB_BUTTON; | 523 IDR_NEWTAB_BUTTON_P : IDR_NEWTAB_BUTTON; |
| 517 gfx::ImageSkia* overlay = GetThemeProvider()->GetImageSkiaNamed(overlay_id); | 524 gfx::ImageSkia* overlay = GetThemeProvider()->GetImageSkiaNamed(overlay_id); |
| 518 | 525 |
| 519 gfx::Canvas canvas( | 526 gfx::Canvas canvas( |
| 520 gfx::Size(overlay->width(), overlay->height()), | 527 gfx::Size(overlay->width(), overlay->height()), |
| 521 ui::GetImageScale(scale_factor), | 528 ui::GetImageScale(scale_factor), |
| 522 false); | 529 false); |
| 523 canvas.DrawImageInt(GetBackgroundImage(state, scale_factor), 0, 0); | 530 canvas.DrawImageInt(GetBackgroundImage(state, scale_factor), 0, 0); |
| 524 | 531 |
| 525 // Draw the button border with a slight alpha. | 532 // Draw the button border with a slight alpha. |
| 526 const int kNativeFrameOverlayAlpha = 178; | 533 const int kNativeFrameOverlayAlpha = 178; |
|
sky
2014/02/03 21:53:03
rename these too.
Matt Giuca
2014/02/05 23:25:31
Done.
| |
| 527 const int kOpaqueFrameOverlayAlpha = 230; | 534 const int kOpaqueFrameOverlayAlpha = 230; |
| 528 uint8 alpha = ShouldUseNativeFrame() ? | 535 uint8 alpha = UsingWindowsGlass() ? |
| 529 kNativeFrameOverlayAlpha : kOpaqueFrameOverlayAlpha; | 536 kNativeFrameOverlayAlpha : kOpaqueFrameOverlayAlpha; |
| 530 canvas.DrawImageInt(*overlay, 0, 0, alpha); | 537 canvas.DrawImageInt(*overlay, 0, 0, alpha); |
| 531 | 538 |
| 532 return gfx::ImageSkia(canvas.ExtractImageRep()); | 539 return gfx::ImageSkia(canvas.ExtractImageRep()); |
| 533 } | 540 } |
| 534 | 541 |
| 535 gfx::ImageSkia NewTabButton::GetImageForScale( | 542 gfx::ImageSkia NewTabButton::GetImageForScale( |
| 536 ui::ScaleFactor scale_factor) const { | 543 ui::ScaleFactor scale_factor) const { |
| 537 if (!hover_animation_->is_animating()) | 544 if (!hover_animation_->is_animating()) |
| 538 return GetImageForState(state(), scale_factor); | 545 return GetImageForState(state(), scale_factor); |
| (...skipping 786 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1325 } | 1332 } |
| 1326 | 1333 |
| 1327 for (int i = tab_count() - 1; i > active_tab_index; --i) { | 1334 for (int i = tab_count() - 1; i > active_tab_index; --i) { |
| 1328 Tab* tab = tab_at(i); | 1335 Tab* tab = tab_at(i); |
| 1329 tab->Paint(canvas); | 1336 tab->Paint(canvas); |
| 1330 } | 1337 } |
| 1331 } | 1338 } |
| 1332 if (inactive_tab_alpha < 255) | 1339 if (inactive_tab_alpha < 255) |
| 1333 canvas->Restore(); | 1340 canvas->Restore(); |
| 1334 | 1341 |
| 1342 #if defined(OS_WIN) | |
|
sky
2014/02/03 21:53:03
I would rather move the ifdef to a function with a
Matt Giuca
2014/02/05 23:25:31
Done.
| |
| 1335 if (GetWidget()->ShouldUseNativeFrame()) { | 1343 if (GetWidget()->ShouldUseNativeFrame()) { |
| 1344 // On Windows, a native frame implies Glass. | |
| 1336 // Make sure non-active tabs are somewhat transparent. | 1345 // Make sure non-active tabs are somewhat transparent. |
| 1337 SkPaint paint; | 1346 SkPaint paint; |
| 1338 // If there are multiple tabs selected, fade non-selected tabs more to make | 1347 // If there are multiple tabs selected, fade non-selected tabs more to make |
| 1339 // the selected tabs more noticable. | 1348 // the selected tabs more noticable. |
| 1340 int alpha = selected_tab_count > 1 ? | 1349 int alpha = selected_tab_count > 1 ? |
| 1341 kNativeFrameInactiveTabAlphaMultiSelection : | 1350 kNativeFrameInactiveTabAlphaMultiSelection : |
| 1342 kNativeFrameInactiveTabAlpha; | 1351 kNativeFrameInactiveTabAlpha; |
| 1343 paint.setColor(SkColorSetARGB(alpha, 255, 255, 255)); | 1352 paint.setColor(SkColorSetARGB(alpha, 255, 255, 255)); |
| 1344 paint.setXfermodeMode(SkXfermode::kDstIn_Mode); | 1353 paint.setXfermodeMode(SkXfermode::kDstIn_Mode); |
| 1345 paint.setStyle(SkPaint::kFill_Style); | 1354 paint.setStyle(SkPaint::kFill_Style); |
| 1346 // The tabstrip area overlaps the toolbar area by 2 px. | 1355 // The tabstrip area overlaps the toolbar area by 2 px. |
| 1347 canvas->DrawRect(gfx::Rect(0, 0, width(), height() - 2), paint); | 1356 canvas->DrawRect(gfx::Rect(0, 0, width(), height() - 2), paint); |
| 1348 } | 1357 } |
| 1358 #endif | |
| 1349 | 1359 |
| 1350 // Now selected but not active. We don't want these dimmed if using native | 1360 // Now selected but not active. We don't want these dimmed if using native |
| 1351 // frame, so they're painted after initial pass. | 1361 // frame, so they're painted after initial pass. |
| 1352 for (size_t i = 0; i < selected_tabs.size(); ++i) | 1362 for (size_t i = 0; i < selected_tabs.size(); ++i) |
| 1353 selected_tabs[i]->Paint(canvas); | 1363 selected_tabs[i]->Paint(canvas); |
| 1354 | 1364 |
| 1355 // Next comes the active tab. | 1365 // Next comes the active tab. |
| 1356 if (active_tab && !is_dragging) | 1366 if (active_tab && !is_dragging) |
| 1357 active_tab->Paint(canvas); | 1367 active_tab->Paint(canvas); |
| 1358 | 1368 |
| (...skipping 1414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2773 #if defined(USE_AURA) | 2783 #if defined(USE_AURA) |
| 2774 return chrome::GetHostDesktopTypeForNativeView( | 2784 return chrome::GetHostDesktopTypeForNativeView( |
| 2775 GetWidget()->GetNativeView()) == chrome::HOST_DESKTOP_TYPE_ASH; | 2785 GetWidget()->GetNativeView()) == chrome::HOST_DESKTOP_TYPE_ASH; |
| 2776 #else | 2786 #else |
| 2777 if (ui::GetDisplayLayout() != ui::LAYOUT_TOUCH) | 2787 if (ui::GetDisplayLayout() != ui::LAYOUT_TOUCH) |
| 2778 return false; | 2788 return false; |
| 2779 #endif | 2789 #endif |
| 2780 | 2790 |
| 2781 return true; | 2791 return true; |
| 2782 } | 2792 } |
| OLD | NEW |