Index: ui/message_center/views/message_list_view.h |
diff --git a/ui/message_center/views/message_list_view.h b/ui/message_center/views/message_list_view.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4e6b48d0bd1fbb94f9068f61db141216691e978d |
--- /dev/null |
+++ b/ui/message_center/views/message_list_view.h |
@@ -0,0 +1,103 @@ |
+// Copyright (c) 2015 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_MESSAGE_LIST_VIEW_H_ |
+#define UI_MESSAGE_CENTER_VIEWS_MESSAGE_LIST_VIEW_H_ |
+ |
+#include <list> |
+#include <set> |
+ |
+#include "ui/compositor/paint_context.h" |
+#include "ui/gfx/geometry/rect.h" |
+#include "ui/gfx/geometry/size.h" |
+#include "ui/message_center/notification.h" |
+#include "ui/views/animation/bounds_animator_observer.h" |
+#include "ui/views/view.h" |
+ |
+namespace gfx { |
+class Canvas; |
+} |
+ |
+namespace ui { |
+class Layer; |
+} |
+ |
+namespace views { |
+class BoundsAnimator; |
+} |
+ |
+namespace message_center { |
+ |
+class MessageCenterView; |
+class MessageView; |
+ |
+// Displays a list of messages for rich notifications. Functions as an array of |
+// MessageViews and animates them on transitions. It also supports |
+// repositioning. |
+class MessageListView : public views::View, |
+ public views::BoundsAnimatorObserver { |
+ public: |
+ explicit MessageListView(MessageCenterView* message_center_view, |
+ bool top_down); |
+ ~MessageListView() override; |
+ |
+ void AddNotificationAt(MessageView* view, int i); |
+ void RemoveNotification(MessageView* view); |
+ void UpdateNotification(MessageView* view, const Notification& notification); |
+ void SetRepositionTarget(const gfx::Rect& target_rect); |
+ void ResetRepositionSession(); |
+ void ClearAllNotifications(const gfx::Rect& visible_scroll_rect); |
+ |
+ protected: |
+ // Overridden from views::View. |
+ void Layout() override; |
+ gfx::Size GetPreferredSize() const override; |
+ int GetHeightForWidth(int width) const override; |
+ void PaintChildren(const ui::PaintContext& context) override; |
+ void ReorderChildLayers(ui::Layer* parent_layer) override; |
+ |
+ // Overridden from views::BoundsAnimatorObserver. |
+ void OnBoundsAnimatorProgressed(views::BoundsAnimator* animator) override; |
+ void OnBoundsAnimatorDone(views::BoundsAnimator* animator) override; |
+ |
+ private: |
+ bool IsValidChild(const views::View* child) const; |
+ void DoUpdateIfPossible(); |
+ |
+ // Animates all notifications below target upwards to align with the top of |
+ // the last closed notification. |
+ void AnimateNotificationsBelowTarget(); |
+ // Animates all notifications above target downwards to align with the top of |
+ // the last closed notification. |
+ void AnimateNotificationsAboveTarget(); |
+ |
+ // Schedules animation for a child to the specified position. Returns false |
+ // if |child| will disappear after the animation. |
+ bool AnimateChild(views::View* child, int top, int height); |
+ |
+ // Animate clearing one notification. |
+ void AnimateClearingOneNotification(); |
+ MessageCenterView* message_center_view() const { |
+ return message_center_view_; |
+ } |
+ |
+ MessageCenterView* message_center_view_; // Weak reference. |
+ // The top position of the reposition target rectangle. |
+ int reposition_top_; |
+ int fixed_height_; |
+ bool has_deferred_task_; |
+ bool clear_all_started_; |
+ bool top_down_; |
+ std::set<views::View*> adding_views_; |
+ std::set<views::View*> deleting_views_; |
+ std::set<views::View*> deleted_when_done_; |
+ std::list<views::View*> clearing_all_views_; |
+ scoped_ptr<views::BoundsAnimator> animator_; |
+ base::WeakPtrFactory<MessageListView> weak_ptr_factory_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MessageListView); |
+}; |
+ |
+} // namespace message_center |
+#endif // UI_MESSAGE_CENTER_VIEWS_MESSAGE_LIST_VIEW_H_ |