1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_ASH_SHELL_DELEGATE_TAB_SCRUBBER_H_
#define CHROME_BROWSER_UI_ASH_SHELL_DELEGATE_TAB_SCRUBBER_H_
#include <memory>
#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "chrome/browser/ui/browser_list_observer.h"
#include "chrome/browser/ui/views/tabs/tab_strip_observer.h"
#include "ui/events/event_handler.h"
class Browser;
class BrowserView;
class ImmersiveRevealedLock;
class Tab;
class TabStrip;
namespace gfx {
class Point;
}
namespace ash {
// Class to enable quick tab switching via horizontal X finger swipes (see
// kFingerCount definition).
class TabScrubber : public ui::EventHandler,
public BrowserListObserver,
public TabStripObserver {
public:
static constexpr int kFingerCount = 3;
enum Direction { LEFT, RIGHT };
TabScrubber(const TabScrubber&) = delete;
TabScrubber& operator=(const TabScrubber&) = delete;
// Returns a the single instance of a TabScrubber.
static TabScrubber* GetInstance();
// Returns the starting position (in tabstrip coordinates) of a swipe starting
// in the tab at |index| and traveling in |direction|.
static gfx::Point GetStartPoint(TabStrip* tab_strip,
int index,
TabScrubber::Direction direction);
int highlighted_tab() const { return highlighted_tab_; }
bool IsActivationPending();
void SetEnabled(bool enabled);
// Synthesize an ScrollEvent given a x offset (in DIPs).
// `is_fling_scroll_event` is set to true when the scroll event should be
// fling scroll event.
void SynthesizedScrollEvent(float x_offset, bool is_fling_scroll_event);
private:
friend class TabScrubberTest;
TabScrubber();
~TabScrubber() override;
// ui::EventHandler overrides:
void OnScrollEvent(ui::ScrollEvent* event) override;
// BrowserListObserver overrides:
void OnBrowserRemoved(Browser* browser) override;
// TabStripObserver overrides.
void OnTabAdded(int index) override;
void OnTabMoved(int from_index, int to_index) override;
void OnTabRemoved(int index) override;
Browser* GetActiveBrowser();
void BeginScrub(BrowserView* browser_view, float x_offset);
// Returns true if it does finish the ongoing scrubbing.
bool FinishScrub(bool activate);
void ScheduleFinishScrubIfNeeded();
// Updates the direction and the starting point of the swipe.
void ScrubDirectionChanged(Direction direction);
// Updates the X co-ordinate of the swipe taking into account RTL layouts if
// any.
void UpdateSwipeX(float x_offset);
void UpdateHighlightedTab(Tab* new_tab, int new_index);
bool GetEnabledForTesting() const { return enabled_; }
// Are we currently scrubbing?.
bool scrubbing_ = false;
// The last browser we used for scrubbing, NULL if |scrubbing_| is false and
// there is no pending work.
raw_ptr<Browser> browser_ = nullptr;
// The TabStrip of the active browser we're scrubbing.
raw_ptr<TabStrip> tab_strip_ = nullptr;
// The current accumulated x and y positions of a swipe, in the coordinates
// of the TabStrip of |browser_|.
float swipe_x_ = -1;
int swipe_y_ = -1;
// The direction the current swipe is headed.
Direction swipe_direction_ = LEFT;
// The index of the tab that is currently highlighted.
int highlighted_tab_ = -1;
// Timer to control a delayed activation of the |highlighted_tab_|.
base::RetainingOneShotTimer activate_timer_;
// True if the default activation delay should be used with |activate_timer_|.
// A value of false means the |activate_timer_| gets a really long delay.
bool use_default_activation_delay_ = true;
// Forces the tabs to be revealed if we are in immersive fullscreen.
std::unique_ptr<ImmersiveRevealedLock> immersive_reveal_lock_;
// The time at which scrubbing started. Needed for UMA reporting of scrubbing
// duration.
base::TimeTicks scrubbing_start_time_;
// If |enabled_|, tab scrubber takes events and determines whether tabs should
// scrub. If not |enabled_|, tab scrubber ignores events. Should be disabled
// when clashing interactions can occur, like window cycle list scrolling
// gesture.
bool enabled_ = true;
};
} // namespace ash
#endif // CHROME_BROWSER_UI_ASH_SHELL_DELEGATE_TAB_SCRUBBER_H_
|