blob: ed10291b63cb97b5252aabe2db8bee91b6d99fc4 [file] [log] [blame]
// Copyright (c) 2012 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 UI_MESSAGE_CENTER_VIEWS_SLIDE_OUT_CONTROLLER_H_
#define UI_MESSAGE_CENTER_VIEWS_SLIDE_OUT_CONTROLLER_H_
#include "base/macros.h"
#include "ui/compositor/layer_animation_observer.h"
#include "ui/events/scoped_target_handler.h"
#include "ui/message_center/message_center_export.h"
#include "ui/views/view.h"
namespace message_center {
// This class contains logic to control sliding out of a layer in response to
// swipes, i.e. gesture scroll events.
class MESSAGE_CENTER_EXPORT SlideOutController
: public ui::EventHandler,
public ui::ImplicitAnimationObserver {
public:
enum class SlideMode {
FULL,
PARTIALLY,
NO_SLIDE,
};
class Delegate {
public:
// Returns the layer for slide operations.
virtual ui::Layer* GetSlideOutLayer() = 0;
// Called when a manual slide starts.
virtual void OnSlideStarted() {}
// Called when a manual slide updates or ends. The argument is true if the
// slide starts or in progress, false if it ends.
virtual void OnSlideChanged(bool in_progress) = 0;
// Called when user intends to close the View by sliding it out.
virtual void OnSlideOut() = 0;
};
SlideOutController(ui::EventTarget* target, Delegate* delegate);
~SlideOutController() override;
void set_update_opacity(bool update_opacity) {
update_opacity_ = update_opacity;
}
void set_slide_mode(SlideMode mode) {
// TODO(yoshiki): Close the slide when the slide mode sets to NO_SLIDE.
mode_ = mode;
}
float gesture_amount() const { return gesture_amount_; }
SlideMode mode() const { return mode_; }
// ui::EventHandler
void OnGestureEvent(ui::GestureEvent* event) override;
// ui::ImplicitAnimationObserver
void OnImplicitAnimationsCompleted() override;
// Enables the swipe control with specifying the width of buttons. Buttons
// will appear behind the view as user slides it partially and it's kept open
// after the gesture.
void SetSwipeControlWidth(int swipe_control_width);
float GetGestureAmount() const { return gesture_amount_; }
// Moves slide back to the center position to closes the swipe control.
// Effective only when swipe control is enabled by EnableSwipeControl().
void CloseSwipeControl();
private:
// Positions where the slided view stays after the touch released.
enum class SwipeControlOpenState { CLOSED, OPEN_ON_LEFT, OPEN_ON_RIGHT };
// Restores the transform and opacity of the view.
void RestoreVisualState();
// Decides which position the slide should go back after touch is released.
void CaptureControlOpenState();
// Slides the view out and closes it after the animation. The sign of
// |direction| indicates which way the slide occurs.
void SlideOutAndClose(int direction);
// Sets the opacity of the slide out layer if |update_opacity_| is true.
void SetOpacityIfNecessary(float opacity);
// Sets the transform matrix and performs animation if the matrix is changed.
void SetTransformWithAnimationIfNecessary(const gfx::Transform& transform,
base::TimeDelta animation_duration);
ui::ScopedTargetHandler target_handling_;
Delegate* delegate_;
// Cumulative scroll amount since the beginning of current slide gesture.
// Includes the initial shift when swipe control was open at gesture start.
float gesture_amount_ = 0.f;
// Whether or not this view can be slided and/or swiped out.
SlideMode mode_ = SlideMode::FULL;
// Whether the swipe control is enabled. See EnableSwipeControl().
// Effective only when |mode_| is FULL.
bool has_swipe_control_ = false;
// The horizontal position offset to for swipe control.
// See |EnableSwipeControl|.
int swipe_control_width_ = 0;
// The position where the slided view stays after the touch released.
// Changed only when |mode_| is FULL and |has_swipe_control_| is true.
SwipeControlOpenState control_open_state_ = SwipeControlOpenState::CLOSED;
// If false, it doesn't update the opacity.
bool update_opacity_ = true;
// Last opacity set by SetOpacityIfNecessary.
float opacity_ = 1.0;
DISALLOW_COPY_AND_ASSIGN(SlideOutController);
};
} // namespace message_center
#endif // UI_MESSAGE_CENTER_VIEWS_SLIDE_OUT_CONTROLLER_H_