blob: 6fd32ab37d037e3d471c7b35a745d96f23a1665b [file] [log] [blame]
// 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.
#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 associated tray bubbles can be dragged.
class ASH_EXPORT TrayDragController {
// 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);
// Gesture related functions:
void 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;
} // namespace ash