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

Unified Diff: chrome/browser/ui/views/ash/tab_scrubber.cc

Issue 11411247: Support 3f swipe for tab scrubbing (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 1 month 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 | « chrome/browser/ui/views/ash/tab_scrubber.h ('k') | ui/base/events/event.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/views/ash/tab_scrubber.cc
diff --git a/chrome/browser/ui/views/ash/tab_scrubber.cc b/chrome/browser/ui/views/ash/tab_scrubber.cc
index 23e26b88dd05e7ab761641c8e2582a0c9d2c3c8e..5626d45d2f50cef353ab832da9cc4c44d2346ac3 100644
--- a/chrome/browser/ui/views/ash/tab_scrubber.cc
+++ b/chrome/browser/ui/views/ash/tab_scrubber.cc
@@ -16,6 +16,20 @@
#include "content/public/browser/notification_source.h"
#include "ui/aura/window.h"
#include "ui/base/events/event.h"
+#include "ui/base/events/event_utils.h"
+
+namespace {
+Tab* GetTabAt(TabStrip* tab_strip, gfx::Point point) {
+ for (int i = 0; i < tab_strip->tab_count(); ++i) {
+ Tab* tab = tab_strip->tab_at(i);
+ if (tab_strip->tab_at(i)->bounds().Contains(point))
+ return tab;
+ }
+ return NULL;
+}
+
+const int kInitialTabOffset = 10;
sky 2012/11/28 23:36:19 nit: constants before methods, and add a descripti
+}
// static
TabScrubber* TabScrubber::GetInstance() {
@@ -28,59 +42,68 @@ TabScrubber* TabScrubber::GetInstance() {
TabScrubber::TabScrubber()
: scrubbing_(false),
browser_(NULL),
- initial_tab_index_(-1),
- initial_x_(-1) {
+ scroll_x_(-1),
+ scroll_y_(-1) {
ash::Shell::GetInstance()->AddPreTargetHandler(this);
}
TabScrubber::~TabScrubber() {
}
-ui::EventResult TabScrubber::OnMouseEvent(ui::MouseEvent* event) {
- Browser* browser = GetActiveBrowser();
+ui::EventResult TabScrubber::OnScrollEvent(ui::ScrollEvent* event) {
+ if (event->type() == ui::ET_SCROLL_FLING_CANCEL) {
+ if (scrubbing_)
+ StopScrubbing();
+ return ui::ER_UNHANDLED;
+ }
- if (!(event->type() == ui::ET_MOUSE_PRESSED ||
- event->type() == ui::ET_MOUSE_DRAGGED ||
- event->type() == ui::ET_MOUSE_RELEASED))
+ if (event->finger_count() != 3 ||
+ event->type() != ui::ET_SCROLL)
return ui::ER_UNHANDLED;
- if (!browser ||
- (event->type() == ui::ET_MOUSE_RELEASED) ||
- !(event->flags() & ui::EF_CONTROL_DOWN) ||
- !(event->flags() & ui::EF_LEFT_MOUSE_BUTTON) ||
- (browser_ && browser != browser_)) {
+ Browser* browser = GetActiveBrowser();
+ if (!browser || (browser_ && browser != browser_)) {
if (scrubbing_)
StopScrubbing();
return ui::ER_UNHANDLED;
}
+ BrowserView* browser_view =
+ BrowserView::GetBrowserViewForNativeWindow(
sky 2012/11/28 23:36:19 BrowserView::GetBrowserViewForBrowser(browser);
+ browser->window()->GetNativeWindow());
+ TabStrip* tab_strip = browser_view->tabstrip();
+
+ float x_offset = -event->x_offset();
if (!scrubbing_) {
scrubbing_ = true;
- initial_x_ = event->x();
browser_ = browser;
- initial_tab_index_ = browser_->active_index();
+ Tab* initial_tab = tab_strip->tab_at(browser_->active_index());
+ scroll_x_ = initial_tab->x();
+ scroll_x_ += (x_offset < 0) ?
+ kInitialTabOffset : initial_tab->width() - kInitialTabOffset;
+ scroll_y_ = initial_tab->height() / 2;
registrar_.Add(
this,
chrome::NOTIFICATION_BROWSER_CLOSING,
content::Source<Browser>(browser_));
- } else {
- BrowserView* browser_view =
- BrowserView::GetBrowserViewForNativeWindow(
- browser_->window()->GetNativeWindow());
- TabStrip* tab_strip = browser_view->tabstrip();
- Tab* initial_tab = tab_strip->tab_at(initial_tab_index_);
- if (!initial_tab) {
- StopScrubbing();
- return ui::ER_UNHANDLED;
- }
-
- gfx::Point tab_point((initial_tab->width() / 2) + event->x() - initial_x_,
- initial_tab->height() / 2);
- Tab* new_tab = tab_strip->GetTabAt(initial_tab, tab_point);
- if (new_tab && !new_tab->IsActive()) {
- int new_index = tab_strip->GetModelIndexOfTab(new_tab);
- browser->tab_strip_model()->ActivateTabAt(new_index, true);
- }
+ }
+
+ if (ui::IsNaturalScrollEnabled())
+ scroll_x_ += event->x_offset();
+ else
+ scroll_x_ -= event->x_offset();
+ Tab* first_tab = tab_strip->tab_at(0);
+ Tab* last_tab = tab_strip->tab_at(tab_strip->tab_count() - 1);
+ if (scroll_x_ < first_tab->x())
+ scroll_x_ = first_tab->x();
+ if (scroll_x_ > last_tab->bounds().right())
+ scroll_x_ = last_tab->bounds().right();
+
+ gfx::Point tab_point(scroll_x_, scroll_y_);
+ Tab* new_tab = GetTabAt(tab_strip, tab_point);
+ if (new_tab && !new_tab->IsActive()) {
+ int new_index = tab_strip->GetModelIndexOfTab(new_tab);
+ browser->tab_strip_model()->ActivateTabAt(new_index, true);
}
return ui::ER_CONSUMED;
@@ -107,11 +130,13 @@ Browser* TabScrubber::GetActiveBrowser() {
}
void TabScrubber::StopScrubbing() {
+ if (!scrubbing_)
+ return;
+
registrar_.Remove(
this,
chrome::NOTIFICATION_BROWSER_CLOSING,
content::Source<Browser>(browser_));
scrubbing_ = false;
browser_ = NULL;
- initial_tab_index_ = -1;
}
« no previous file with comments | « chrome/browser/ui/views/ash/tab_scrubber.h ('k') | ui/base/events/event.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698