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

Unified Diff: chrome/browser/ui/views/tabs/tab_strip.cc

Issue 362843003: NewTabButton should implement MaskedTargeterDelegate (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: re-upload Created 6 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/views/tabs/tab_strip.cc
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc
index 1b3df8a2a05ce44710126aa46bc633da6a3b5a4a..04423f5044c9fe237b90ad7212744e07c9787c3c 100644
--- a/chrome/browser/ui/views/tabs/tab_strip.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -46,7 +46,9 @@
#include "ui/gfx/rect_conversions.h"
#include "ui/gfx/screen.h"
#include "ui/gfx/size.h"
+#include "ui/gfx/skia_util.h"
#include "ui/views/controls/image_view.h"
+#include "ui/views/masked_targeter_delegate.h"
#include "ui/views/mouse_watcher_view_host.h"
#include "ui/views/rect_based_targeting_utils.h"
#include "ui/views/view_model_utils.h"
@@ -229,7 +231,8 @@ TabDragController::EventSource EventSourceFromEvent(
// A subclass of button that hit-tests to the shape of the new tab button and
// does custom drawing.
-class NewTabButton : public views::ImageButton {
+class NewTabButton : public views::ImageButton,
+ public views::MaskedTargeterDelegate {
public:
NewTabButton(TabStrip* tab_strip, views::ButtonListener* listener);
virtual ~NewTabButton();
@@ -241,19 +244,19 @@ class NewTabButton : public views::ImageButton {
}
protected:
- // Overridden from views::View:
- virtual bool HasHitTestMask() const OVERRIDE;
- virtual void GetHitTestMaskDeprecated(HitTestSource source,
- gfx::Path* path) const OVERRIDE;
+ // views::View:
#if defined(OS_WIN)
virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE;
#endif
virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
- // Overridden from ui::EventHandler:
+ // ui::EventHandler:
virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
private:
+ // views::MaskedTargeterDelegate:
+ virtual bool GetHitTestMask(gfx::Path* mask) const OVERRIDE;
+
bool ShouldWindowContentsBeTransparent() const;
gfx::ImageSkia GetBackgroundImage(views::CustomButton::ButtonState state,
float scale) const;
@@ -288,35 +291,6 @@ NewTabButton::~NewTabButton() {
*destroyed_ = true;
}
-bool NewTabButton::HasHitTestMask() const {
- // When the button is sized to the top of the tab strip we want the user to
- // be able to click on complete bounds, and so don't return a custom hit
- // mask.
- return !tab_strip_->SizeTabButtonToTopOfTabStrip();
-}
-
-void NewTabButton::GetHitTestMaskDeprecated(HitTestSource source,
- gfx::Path* path) const {
- DCHECK(path);
-
- SkScalar w = SkIntToScalar(width());
- SkScalar v_offset = SkIntToScalar(TabStrip::kNewTabButtonVerticalOffset);
-
- // These values are defined by the shape of the new tab image. Should that
- // image ever change, these values will need to be updated. They're so
- // custom it's not really worth defining constants for.
- // These values are correct for regular and USE_ASH versions of the image.
- path->moveTo(0, v_offset + 1);
- path->lineTo(w - 7, v_offset + 1);
- path->lineTo(w - 4, v_offset + 4);
- path->lineTo(w, v_offset + 16);
- path->lineTo(w - 1, v_offset + 17);
- path->lineTo(7, v_offset + 17);
- path->lineTo(4, v_offset + 13);
- path->lineTo(0, v_offset + 1);
- path->close();
-}
-
#if defined(OS_WIN)
void NewTabButton::OnMouseReleased(const ui::MouseEvent& event) {
if (event.IsOnlyRightMouseButton()) {
@@ -348,6 +322,39 @@ void NewTabButton::OnGestureEvent(ui::GestureEvent* event) {
event->SetHandled();
}
+bool NewTabButton::GetHitTestMask(gfx::Path* mask) const {
+ DCHECK(mask);
+
+ // When the button is sized to the top of the tab strip, we want the hit
+ // test mask to be defined as the complete (rectangular) bounds of the
+ // button.
+ if (tab_strip_->SizeTabButtonToTopOfTabStrip()) {
+ gfx::Rect button_bounds(GetContentsBounds());
+ button_bounds.set_x(GetMirroredXForRect(button_bounds));
+ mask->addRect(RectToSkRect(button_bounds));
+ return true;
+ }
+
+ SkScalar w = SkIntToScalar(width());
+ SkScalar v_offset = SkIntToScalar(TabStrip::kNewTabButtonVerticalOffset);
+
+ // These values are defined by the shape of the new tab image. Should that
+ // image ever change, these values will need to be updated. They're so
+ // custom it's not really worth defining constants for.
+ // These values are correct for regular and USE_ASH versions of the image.
+ mask->moveTo(0, v_offset + 1);
+ mask->lineTo(w - 7, v_offset + 1);
+ mask->lineTo(w - 4, v_offset + 4);
+ mask->lineTo(w, v_offset + 16);
+ mask->lineTo(w - 1, v_offset + 17);
+ mask->lineTo(7, v_offset + 17);
+ mask->lineTo(4, v_offset + 13);
+ mask->lineTo(0, v_offset + 1);
+ mask->close();
+
+ return true;
+}
+
bool NewTabButton::ShouldWindowContentsBeTransparent() const {
return GetWidget() &&
GetWidget()->GetTopLevelWidget()->ShouldWindowContentsBeTransparent();
@@ -1470,7 +1477,10 @@ void TabStrip::Init() {
l10n_util::GetStringUTF16(IDS_ACCNAME_NEWTAB));
newtab_button_->SetImageAlignment(views::ImageButton::ALIGN_LEFT,
views::ImageButton::ALIGN_BOTTOM);
+ newtab_button_->SetEventTargeter(
+ scoped_ptr<views::ViewTargeter>(new views::ViewTargeter(newtab_button_)));
AddChildView(newtab_button_);
+
if (drop_indicator_width == 0) {
// Direction doesn't matter, both images are the same size.
gfx::ImageSkia* drop_image = GetDropArrowImage(true);
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698