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 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
// Copyright (c) 2013 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_TOAST_CONTENTS_VIEW_H_
#define UI_MESSAGE_CENTER_VIEWS_TOAST_CONTENTS_VIEW_H_
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "ui/gfx/animation/animation_delegate.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
#include "ui/message_center/views/message_center_controller.h"
#include "ui/views/widget/widget_delegate.h"
namespace gfx {
class Animation;
class SlideAnimation;
}
namespace views {
class View;
}
namespace message_center {
namespace test {
class MessagePopupCollectionTest;
}
class MessagePopupCollection;
class MessageView;
class Notification;
class PopupAlignmentDelegate;
// The widget host for a popup. Also implements MessageCenterController
// which delegates over to MessagePopupCollection, but takes care about
// checking the weakref since MessagePopupCollection may disappear before
// widget/views are closed/destructed.
class ToastContentsView : public views::WidgetDelegateView,
public MessageCenterController,
public gfx::AnimationDelegate {
public:
// Computes the size of a toast assuming it will host the given view.
static gfx::Size GetToastSizeForView(const views::View* view);
ToastContentsView(const std::string& notification_id,
PopupAlignmentDelegate* alignment_delegate,
base::WeakPtr<MessagePopupCollection> collection);
~ToastContentsView() override;
// Sets the inner view of the toast. If it has contents already,
// |a11y_feedback_for_updates| causes the view to notify that the
// accessibility message should be read after this update.
void SetContents(MessageView* view, bool a11y_feedback_for_updates);
void UpdateContents(const Notification& notification,
bool a11y_feedback_for_updates);
// Shows the new toast for the first time, animated.
// |origin| is the right-bottom corner of the toast.
void RevealWithAnimation(gfx::Point origin);
// Disconnectes the toast from the rest of the system immediately and start
// an animation. Once animation finishes, closes the widget.
void CloseWithAnimation();
void SetBoundsWithAnimation(gfx::Rect new_bounds);
// Origin and bounds are not 'instant', but rather 'current stable values',
// there could be animation in progress that targets these values.
gfx::Point origin() { return origin_; }
gfx::Rect bounds() { return gfx::Rect(origin_, preferred_size_); }
const std::string& id() const { return id_; }
// Overridden from views::View:
void OnMouseEntered(const ui::MouseEvent& event) override;
void OnMouseExited(const ui::MouseEvent& event) override;
void Layout() override;
gfx::Size GetPreferredSize() const override;
void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
private:
friend class test::MessagePopupCollectionTest;
// Overridden from MessageCenterController:
void ClickOnNotification(const std::string& notification_id) override;
void RemoveNotification(const std::string& notification_id,
bool by_user) override;
std::unique_ptr<ui::MenuModel> CreateMenuModel(
const NotifierId& notifier_id,
const base::string16& display_source) override;
bool HasClickedListener(const std::string& notification_id) override;
void ClickOnNotificationButton(const std::string& notification_id,
int button_index) override;
void ClickOnSettingsButton(const std::string& notification_id) override;
// Overridden from gfx::AnimationDelegate:
void AnimationProgressed(const gfx::Animation* animation) override;
void AnimationEnded(const gfx::Animation* animation) override;
void AnimationCanceled(const gfx::Animation* animation) override;
// Overridden from views::WidgetDelegate:
void WindowClosing() override;
void OnDisplayChanged() override;
void OnWorkAreaChanged() override;
// Recalculates preferred size from underlying view and notifies about it.
void UpdatePreferredSize();
// Initialization and update.
void CreateWidget(PopupAlignmentDelegate* alignment_delegate);
// Immediately moves the toast without any sort of delay or animation.
void SetBoundsInstantly(gfx::Rect new_bounds);
// Given the bounds of a toast on the screen, compute the bounds for that
// toast in 'closed' node_data. The 'closed' node_data is used as
// origin/destination in reveal/closing animations.
gfx::Rect GetClosedToastBounds(gfx::Rect bounds);
void StartFadeIn();
void StartFadeOut(); // Will call Widget::Close() when animation ends.
void OnBoundsAnimationEndedOrCancelled(const gfx::Animation* animation);
base::WeakPtr<MessagePopupCollection> collection_;
// Id if the corresponding Notification.
std::string id_;
std::unique_ptr<gfx::SlideAnimation> bounds_animation_;
std::unique_ptr<gfx::SlideAnimation> fade_animation_;
gfx::Rect animated_bounds_start_;
gfx::Rect animated_bounds_end_;
// Started closing animation, will close at the end.
bool is_closing_;
// Closing animation - when it ends, close the widget. Weak, only used
// for referential equality.
gfx::Animation* closing_animation_;
gfx::Point origin_;
gfx::Size preferred_size_;
DISALLOW_COPY_AND_ASSIGN(ToastContentsView);
};
} // namespace message_center
#endif // UI_MESSAGE_CENTER_VIEWS_TOAST_CONTENTS_VIEW_H_
|