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 #include <algorithm> | 7 #include <algorithm> |
8 #include <iterator> | 8 #include <iterator> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 #include "ui/gfx/win/hwnd_util.h" | 72 #include "ui/gfx/win/hwnd_util.h" |
73 #include "ui/views/widget/monitor_win.h" | 73 #include "ui/views/widget/monitor_win.h" |
74 #include "ui/views/win/hwnd_util.h" | 74 #include "ui/views/win/hwnd_util.h" |
75 #endif | 75 #endif |
76 | 76 |
77 using base::UserMetricsAction; | 77 using base::UserMetricsAction; |
78 using ui::DropTargetEvent; | 78 using ui::DropTargetEvent; |
79 | 79 |
80 namespace { | 80 namespace { |
81 | 81 |
82 const int kNewTabButtonHeight = 18; | |
83 | |
84 const int kTabStripAnimationVSlop = 40; | 82 const int kTabStripAnimationVSlop = 40; |
85 | 83 |
86 // Inverse ratio of the width of a tab edge to the width of the tab. When | 84 // Inverse ratio of the width of a tab edge to the width of the tab. When |
87 // hovering over the left or right edge of a tab, the drop indicator will | 85 // hovering over the left or right edge of a tab, the drop indicator will |
88 // point between tabs. | 86 // point between tabs. |
89 const int kTabEdgeRatioInverse = 4; | 87 const int kTabEdgeRatioInverse = 4; |
90 | 88 |
91 // Size of the drop indicator. | 89 // Size of the drop indicator. |
92 int drop_indicator_width; | 90 int drop_indicator_width; |
93 int drop_indicator_height; | 91 int drop_indicator_height; |
(...skipping 21 matching lines...) Expand all Loading... |
115 | 113 |
116 #if defined(OS_MACOSX) | 114 #if defined(OS_MACOSX) |
117 const int kPinnedToNonPinnedOffset = 2; | 115 const int kPinnedToNonPinnedOffset = 2; |
118 #else | 116 #else |
119 const int kPinnedToNonPinnedOffset = 3; | 117 const int kPinnedToNonPinnedOffset = 3; |
120 #endif | 118 #endif |
121 | 119 |
122 // The vertical offset of the tab strip button. | 120 // The vertical offset of the tab strip button. |
123 const int kNewTabButtonVerticalOffset = 7; | 121 const int kNewTabButtonVerticalOffset = 7; |
124 | 122 |
125 // Returns the size of the new tab button, not including any bounds extension to | |
126 // enlarge the clickable area. | |
127 gfx::Size GetNewTabButtonSize() { | |
128 return gfx::Size(GetLayoutConstant(NEW_TAB_BUTTON_WIDTH), | |
129 kNewTabButtonHeight); | |
130 } | |
131 | |
132 // Returns the width needed for the new tab button (and padding). | 123 // Returns the width needed for the new tab button (and padding). |
133 int GetNewTabButtonWidth() { | 124 int GetNewTabButtonWidth() { |
134 return GetLayoutConstant(NEW_TAB_BUTTON_WIDTH) - | 125 return GetLayoutSize(NEW_TAB_BUTTON).width() - |
135 GetLayoutConstant(TABSTRIP_NEW_TAB_BUTTON_OVERLAP); | 126 GetLayoutConstant(TABSTRIP_NEW_TAB_BUTTON_OVERLAP); |
136 } | 127 } |
137 | 128 |
138 skia::RefPtr<SkDrawLooper> CreateShadowDrawLooper(SkAlpha alpha) { | 129 skia::RefPtr<SkDrawLooper> CreateShadowDrawLooper(SkAlpha alpha) { |
139 SkLayerDrawLooper::Builder looper_builder; | 130 SkLayerDrawLooper::Builder looper_builder; |
140 looper_builder.addLayer(); | 131 looper_builder.addLayer(); |
141 | 132 |
142 SkLayerDrawLooper::LayerInfo layer_info; | 133 SkLayerDrawLooper::LayerInfo layer_info; |
143 layer_info.fPaintBits |= SkLayerDrawLooper::kMaskFilter_Bit; | 134 layer_info.fPaintBits |= SkLayerDrawLooper::kMaskFilter_Bit; |
144 layer_info.fPaintBits |= SkLayerDrawLooper::kColorFilter_Bit; | 135 layer_info.fPaintBits |= SkLayerDrawLooper::kColorFilter_Bit; |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 | 356 |
366 void NewTabButton::OnGestureEvent(ui::GestureEvent* event) { | 357 void NewTabButton::OnGestureEvent(ui::GestureEvent* event) { |
367 // Consume all gesture events here so that the parent (Tab) does not | 358 // Consume all gesture events here so that the parent (Tab) does not |
368 // start consuming gestures. | 359 // start consuming gestures. |
369 views::ImageButton::OnGestureEvent(event); | 360 views::ImageButton::OnGestureEvent(event); |
370 event->SetHandled(); | 361 event->SetHandled(); |
371 } | 362 } |
372 | 363 |
373 void NewTabButton::OnPaint(gfx::Canvas* canvas) { | 364 void NewTabButton::OnPaint(gfx::Canvas* canvas) { |
374 gfx::ScopedCanvas scoped_canvas(canvas); | 365 gfx::ScopedCanvas scoped_canvas(canvas); |
375 canvas->Translate(gfx::Vector2d(0, height() - kNewTabButtonHeight)); | 366 const int visible_height = GetLayoutSize(NEW_TAB_BUTTON).height(); |
| 367 canvas->Translate(gfx::Vector2d(0, height() - visible_height)); |
376 | 368 |
377 const bool pressed = state() == views::CustomButton::STATE_PRESSED; | 369 const bool pressed = state() == views::CustomButton::STATE_PRESSED; |
378 double hover_value = | 370 double hover_value = |
379 (state() == views::CustomButton::STATE_HOVERED) ? 1 : 0; | 371 (state() == views::CustomButton::STATE_HOVERED) ? 1 : 0; |
380 if (hover_animation_->is_animating()) | 372 if (hover_animation_->is_animating()) |
381 hover_value = hover_animation_->GetCurrentValue(); | 373 hover_value = hover_animation_->GetCurrentValue(); |
382 const float scale = canvas->image_scale(); | 374 const float scale = canvas->image_scale(); |
383 | 375 |
384 SkPath fill; | 376 SkPath fill; |
385 if (ui::MaterialDesignController::IsModeMaterial()) { | 377 if (ui::MaterialDesignController::IsModeMaterial()) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 paint.setLooper(stroke_looper.get()); | 410 paint.setLooper(stroke_looper.get()); |
419 paint.setColor(SkColorSetA(SK_ColorBLACK, pressed ? 0x38 : 0x27)); | 411 paint.setColor(SkColorSetA(SK_ColorBLACK, pressed ? 0x38 : 0x27)); |
420 canvas->DrawPath(stroke, paint); | 412 canvas->DrawPath(stroke, paint); |
421 } else { | 413 } else { |
422 // Fill. | 414 // Fill. |
423 gfx::ImageSkia* mask = | 415 gfx::ImageSkia* mask = |
424 GetThemeProvider()->GetImageSkiaNamed(IDR_NEWTAB_BUTTON_MASK); | 416 GetThemeProvider()->GetImageSkiaNamed(IDR_NEWTAB_BUTTON_MASK); |
425 // The canvas and mask have to use the same scale factor. | 417 // The canvas and mask have to use the same scale factor. |
426 const float fill_canvas_scale = mask->HasRepresentation(scale) ? | 418 const float fill_canvas_scale = mask->HasRepresentation(scale) ? |
427 scale : ui::GetScaleForScaleFactor(ui::SCALE_FACTOR_100P); | 419 scale : ui::GetScaleForScaleFactor(ui::SCALE_FACTOR_100P); |
428 gfx::Canvas fill_canvas(GetNewTabButtonSize(), fill_canvas_scale, false); | 420 gfx::Canvas fill_canvas(GetLayoutSize(NEW_TAB_BUTTON), fill_canvas_scale, |
| 421 false); |
429 PaintFill(pressed, hover_value, fill_canvas_scale, fill, &fill_canvas); | 422 PaintFill(pressed, hover_value, fill_canvas_scale, fill, &fill_canvas); |
430 gfx::ImageSkia image(fill_canvas.ExtractImageRep()); | 423 gfx::ImageSkia image(fill_canvas.ExtractImageRep()); |
431 canvas->DrawImageInt( | 424 canvas->DrawImageInt( |
432 gfx::ImageSkiaOperations::CreateMaskedImage(image, *mask), 0, 0); | 425 gfx::ImageSkiaOperations::CreateMaskedImage(image, *mask), 0, 0); |
433 | 426 |
434 // Stroke. Draw the button border with a slight alpha. | 427 // Stroke. Draw the button border with a slight alpha. |
435 static const SkAlpha kGlassFrameOverlayAlpha = 178; | 428 static const SkAlpha kGlassFrameOverlayAlpha = 178; |
436 static const SkAlpha kOpaqueFrameOverlayAlpha = 230; | 429 static const SkAlpha kOpaqueFrameOverlayAlpha = 230; |
437 const SkAlpha alpha = GetWidget()->ShouldWindowContentsBeTransparent() ? | 430 const SkAlpha alpha = GetWidget()->ShouldWindowContentsBeTransparent() ? |
438 kGlassFrameOverlayAlpha : kOpaqueFrameOverlayAlpha; | 431 kGlassFrameOverlayAlpha : kOpaqueFrameOverlayAlpha; |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
545 } | 538 } |
546 | 539 |
547 // Clip to just the fill region for any theme drawing and hover/pressed | 540 // Clip to just the fill region for any theme drawing and hover/pressed |
548 // state overlay drawing below. In non-MD mode, this is done on the caller | 541 // state overlay drawing below. In non-MD mode, this is done on the caller |
549 // side using image masking operations. | 542 // side using image masking operations. |
550 canvas->ClipPath(fill, true); | 543 canvas->ClipPath(fill, true); |
551 canvas->sk_canvas()->scale(scale, scale); | 544 canvas->sk_canvas()->scale(scale, scale); |
552 } | 545 } |
553 | 546 |
554 // Draw the fill background image. | 547 // Draw the fill background image. |
555 const gfx::Size size(GetNewTabButtonSize()); | 548 const gfx::Size size(GetLayoutSize(NEW_TAB_BUTTON)); |
556 if (custom_image || !md) { | 549 if (custom_image || !md) { |
557 const ui::ThemeProvider* theme_provider = GetThemeProvider(); | 550 const ui::ThemeProvider* theme_provider = GetThemeProvider(); |
558 gfx::ImageSkia* background = theme_provider->GetImageSkiaNamed(bg_id); | 551 gfx::ImageSkia* background = theme_provider->GetImageSkiaNamed(bg_id); |
559 // For custom tab backgrounds the background starts at the top of the tab | 552 // For custom tab backgrounds the background starts at the top of the tab |
560 // strip. Otherwise the background starts at the top of the frame. | 553 // strip. Otherwise the background starts at the top of the frame. |
561 const int offset_y = theme_provider->HasCustomImage(bg_id) ? | 554 const int offset_y = theme_provider->HasCustomImage(bg_id) ? |
562 -GetLayoutConstant(TAB_TOP_EXCLUSION_HEIGHT) : background_offset_.y(); | 555 -GetLayoutConstant(TAB_TOP_EXCLUSION_HEIGHT) : background_offset_.y(); |
563 | 556 |
564 // The new tab background is mirrored in RTL mode, but the theme background | 557 // The new tab background is mirrored in RTL mode, but the theme background |
565 // should never be mirrored. Mirror it here to compensate. | 558 // should never be mirrored. Mirror it here to compensate. |
(...skipping 1095 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1661 } | 1654 } |
1662 | 1655 |
1663 /////////////////////////////////////////////////////////////////////////////// | 1656 /////////////////////////////////////////////////////////////////////////////// |
1664 // TabStrip, private: | 1657 // TabStrip, private: |
1665 | 1658 |
1666 void TabStrip::Init() { | 1659 void TabStrip::Init() { |
1667 set_id(VIEW_ID_TAB_STRIP); | 1660 set_id(VIEW_ID_TAB_STRIP); |
1668 // So we get enter/exit on children to switch stacked layout on and off. | 1661 // So we get enter/exit on children to switch stacked layout on and off. |
1669 set_notify_enter_exit_on_child(true); | 1662 set_notify_enter_exit_on_child(true); |
1670 | 1663 |
1671 newtab_button_bounds_.set_size(GetNewTabButtonSize()); | 1664 newtab_button_bounds_.set_size(GetLayoutSize(NEW_TAB_BUTTON)); |
1672 newtab_button_bounds_.Inset(0, 0, 0, -kNewTabButtonVerticalOffset); | 1665 newtab_button_bounds_.Inset(0, 0, 0, -kNewTabButtonVerticalOffset); |
1673 newtab_button_ = new NewTabButton(this, this); | 1666 newtab_button_ = new NewTabButton(this, this); |
1674 newtab_button_->SetTooltipText( | 1667 newtab_button_->SetTooltipText( |
1675 l10n_util::GetStringUTF16(IDS_TOOLTIP_NEW_TAB)); | 1668 l10n_util::GetStringUTF16(IDS_TOOLTIP_NEW_TAB)); |
1676 newtab_button_->SetAccessibleName( | 1669 newtab_button_->SetAccessibleName( |
1677 l10n_util::GetStringUTF16(IDS_ACCNAME_NEWTAB)); | 1670 l10n_util::GetStringUTF16(IDS_ACCNAME_NEWTAB)); |
1678 newtab_button_->SetImageAlignment(views::ImageButton::ALIGN_LEFT, | 1671 newtab_button_->SetImageAlignment(views::ImageButton::ALIGN_LEFT, |
1679 views::ImageButton::ALIGN_BOTTOM); | 1672 views::ImageButton::ALIGN_BOTTOM); |
1680 newtab_button_->SetEventTargeter( | 1673 newtab_button_->SetEventTargeter( |
1681 scoped_ptr<views::ViewTargeter>(new views::ViewTargeter(newtab_button_))); | 1674 scoped_ptr<views::ViewTargeter>(new views::ViewTargeter(newtab_button_))); |
(...skipping 1169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2851 ConvertPointToViewAndGetEventHandler(this, newtab_button_, point); | 2844 ConvertPointToViewAndGetEventHandler(this, newtab_button_, point); |
2852 if (view) | 2845 if (view) |
2853 return view; | 2846 return view; |
2854 } | 2847 } |
2855 Tab* tab = FindTabForEvent(point); | 2848 Tab* tab = FindTabForEvent(point); |
2856 if (tab) | 2849 if (tab) |
2857 return ConvertPointToViewAndGetEventHandler(this, tab, point); | 2850 return ConvertPointToViewAndGetEventHandler(this, tab, point); |
2858 } | 2851 } |
2859 return this; | 2852 return this; |
2860 } | 2853 } |
OLD | NEW |