Home | History | Annotate | Download | only in wm
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef ATHENA_WM_BEZEL_CONTROLLER_H_
      6 #define ATHENA_WM_BEZEL_CONTROLLER_H_
      7 
      8 #include "ui/events/event_handler.h"
      9 
     10 namespace aura {
     11 class Window;
     12 }
     13 
     14 namespace gfx {
     15 class PointF;
     16 }
     17 
     18 namespace ui {
     19 class EventTarget;
     20 }
     21 
     22 namespace athena {
     23 
     24 // Responsible for detecting bezel gestures and notifying the delegate(s)
     25 // subscribed to them.
     26 class BezelController : public ui::EventHandler {
     27  public:
     28   enum Bezel { BEZEL_NONE, BEZEL_LEFT, BEZEL_RIGHT, BEZEL_TOP, BEZEL_BOTTOM };
     29 
     30   // Responsible for handling scroll gestures initiated from the bezel.
     31   // Two touch points are need to perform the bezel scroll gesture from
     32   // the left and right bezel.
     33   class ScrollDelegate {
     34    public:
     35     virtual ~ScrollDelegate() {}
     36 
     37     // Beginning of a bezel scroll gesture started from the |bezel|.
     38     // |delta| is the difference between the x-coordinate of the current scroll
     39     // position and the bezel. It will be zero or negative for the right bezel.
     40     virtual void BezelScrollBegin(Bezel bezel, float delta) = 0;
     41 
     42     // End of the current bezel scroll
     43     virtual void BezelScrollEnd() = 0;
     44 
     45     // Update of the scroll position for the currently active bezel scroll.
     46     // |delta| has the same meaning as in ScrollBegin().
     47     virtual void BezelScrollUpdate(float delta) = 0;
     48 
     49     // Should return false if the delegate isn't going to react to the scroll
     50     // events.
     51     virtual bool BezelCanScroll() = 0;
     52   };
     53 
     54   explicit BezelController(aura::Window* container);
     55   virtual ~BezelController() {}
     56 
     57   // Set the delegate to handle the gestures from left and right bezels.
     58   // Two touch points are need to perform the bezel scroll gesture from
     59   // the left and right bezel.
     60   void set_left_right_delegate(ScrollDelegate* delegate) {
     61     left_right_delegate_ = delegate;
     62   }
     63 
     64  private:
     65   enum State {
     66     NONE,
     67     IGNORE_CURRENT_SCROLL,
     68     BEZEL_GESTURE_STARTED,
     69     BEZEL_SCROLLING_ONE_FINGER,
     70     BEZEL_SCROLLING_TWO_FINGERS,
     71   };
     72 
     73   void SetState(State state);
     74   // |scroll_delta| only needs to be passed when |state| is one of the
     75   // BEZEL_SROLLING states.
     76   void SetState(State state, float scroll_delta);
     77 
     78   // ui::EventHandler overrides
     79   virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
     80 
     81   aura::Window* container_;
     82 
     83   State state_;
     84 
     85   // The bezel where the currently active scroll was started.
     86   Bezel scroll_bezel_;
     87 
     88   // The target of the bezel scroll gesture. Used to filter out other gestures
     89   // when the bezel scroll is in progress.
     90   ui::EventTarget* scroll_target_;
     91 
     92   // Responsible for handling gestures started from the left and right bezels.
     93   // Not owned.
     94   ScrollDelegate* left_right_delegate_;
     95 
     96   DISALLOW_COPY_AND_ASSIGN(BezelController);
     97 };
     98 
     99 }  // namespace athena
    100 
    101 #endif  // ATHENA_WM_BEZEL_CONTROLLER_H_
    102