Chromium Code Reviews| Index: ash/system/tray_drag_controller.h |
| diff --git a/ash/system/tray_drag_controller.h b/ash/system/tray_drag_controller.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..d43ebb69c4cc4daac6b6a1bcc5df4cd718397ad8 |
| --- /dev/null |
| +++ b/ash/system/tray_drag_controller.h |
| @@ -0,0 +1,75 @@ |
| +// Copyright 2017 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#ifndef ASH_SYSTEM_TRAY_DRAG_CONTROLLER_H_ |
| +#define ASH_SYSTEM_TRAY_DRAG_CONTROLLER_H_ |
| + |
| +#include "ash/ash_export.h" |
| +#include "ash/shelf/shelf.h" |
| +#include "ui/views/view.h" |
| + |
| +namespace ash { |
| +class TrayBackgroundView; |
| + |
| +// The TrayDragController helps to process the swiping events that happened on |
| +// TrayBackgroundView or TrayBubbleView. Not all the TrayBackgroundView can be |
| +// dragged currently. Only ImeMenuTray, SystemTray, PaletteTray, |
| +// WebNotificationTray and their's accosiated tray bubbles can be dragged. |
|
tdanderson
2017/07/18 16:38:05
Thanks, this is a nice description. One small typo
minch1
2017/07/18 20:01:52
Done.
|
| +class ASH_EXPORT TrayDragController { |
| + public: |
| + // The threshold of the velocity of the fling event. |
| + static constexpr float kFlingVelocity = 100.0f; |
| + |
| + explicit TrayDragController(Shelf* shelf); |
| + |
| + // Processes a gesture event and updates the dragging state of the bubble when |
| + // appropriate. |
| + void ProcessGestureEvent(ui::GestureEvent* event, |
| + TrayBackgroundView* tray_view); |
| + |
| + private: |
| + // Gesture related functions: |
| + bool StartGestureDrag(const ui::GestureEvent& gesture); |
| + void UpdateGestureDrag(const ui::GestureEvent& gesture); |
| + void CompleteGestureDrag(const ui::GestureEvent& gesture); |
| + |
| + // Update the bounds of the tray bubble according to |
| + // |gesture_drag_amount_|. |
| + void UpdateBubbleBounds(); |
| + |
| + // Return true if the bubble should be shown (i.e., animated upward to |
| + // be made fully visible) after a sequence of scroll events terminated by |
| + // |sequence_end|. Otherwise return false, indicating that the |
| + // partially-visible bubble should be animated downward and made fully |
| + // hidden. |
| + bool ShouldShowBubbleAfterScrollSequence( |
| + const ui::GestureEvent& sequence_end); |
| + |
| + // The shelf containing the TrayBackgroundView. |
| + Shelf* shelf_; |
| + |
| + // The specific TrayBackgroundView that dragging happened on. e.g, SystemTray. |
| + TrayBackgroundView* tray_view_ = nullptr; |
| + |
| + // The original bounds of the tray bubble. |
| + gfx::Rect tray_bubble_bounds_; |
| + |
| + // Tracks the amount of the drag. Only valid if |is_in_drag_| is true. |
| + float gesture_drag_amount_ = 0.f; |
| + |
| + // True if the user is in the process of gesture-dragging on |
| + // TrayBackgroundView to open the tray bubble, or on the already-opened |
| + // TrayBubbleView to close it. Otherwise false. |
| + bool is_in_drag_ = false; |
| + |
| + // True if the dragging happened on the bubble view, false if it happened on |
| + // the tray view. Note, only valid if |is_in_drag_| is true. |
| + bool is_on_bubble_ = false; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(TrayDragController); |
| +}; |
| + |
| +} // namespace ash |
| + |
| +#endif // ASH_SYSTEM_TRAY_DRAG_CONTROLLER_H_ |