Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1008)

Unified Diff: ui/views/view.cc

Issue 2500623002: Add ViewObserver to View for view updates (Closed)
Patch Set: skys comments Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/views/view.cc
diff --git a/ui/views/view.cc b/ui/views/view.cc
index b6cd9d0e97f9345128f754a62f0b80e15fa2430f..596fbf9863c3e05de8801420f0e5a19fe1e0013b 100644
--- a/ui/views/view.cc
+++ b/ui/views/view.cc
@@ -51,6 +51,7 @@
#include "ui/views/drag_controller.h"
#include "ui/views/focus/view_storage.h"
#include "ui/views/layout/layout_manager.h"
+#include "ui/views/view_observer.h"
#include "ui/views/views_delegate.h"
#include "ui/views/widget/native_widget_private.h"
#include "ui/views/widget/root_view.h"
@@ -220,6 +221,8 @@ void View::AddChildViewAt(View* view, int index) {
if (layout_manager_.get())
layout_manager_->ViewAdded(this, view);
+
+ NotifyViewParentChanged(view, nullptr, this);
}
void View::ReorderChildView(View* view, int index) {
@@ -247,6 +250,9 @@ void View::ReorderChildView(View* view, int index) {
InitFocusSiblings(view, index);
children_.insert(children_.begin() + index, view);
+ for (ViewObserver& observer : observers_)
+ observer.OnChildViewReordered(view, index);
sky 2016/11/21 16:33:37 Is index really useful for this notification?
Sarmad Hashmi 2016/11/21 17:09:53 Avoids looking up where the view was placed after
+
ReorderLayers();
}
@@ -298,6 +304,9 @@ void View::SetBoundsRect(const gfx::Rect& bounds) {
gfx::Rect prev = bounds_;
bounds_ = bounds;
BoundsChanged(prev);
+
+ for (ViewObserver& observer : observers_)
+ observer.OnViewBoundsChanged(this);
}
void View::SetSize(const gfx::Size& size) {
@@ -418,6 +427,9 @@ void View::SetVisible(bool visible) {
parent_->NotifyAccessibilityEvent(ui::AX_EVENT_CHILDREN_CHANGED, false);
}
+ for (ViewObserver& observer : observers_)
+ observer.OnViewVisibilityChanged(this);
+
// This notifies all sub-views recursively.
PropagateVisibilityNotifications(this, visible_);
UpdateLayerVisibility();
@@ -436,6 +448,10 @@ void View::SetEnabled(bool enabled) {
if (enabled != enabled_) {
enabled_ = enabled;
AdvanceFocusIfNecessary();
+
+ for (ViewObserver& observer : observers_)
+ observer.OnViewEnabledChanged(this);
sky 2016/11/21 16:33:37 I mildly favor calling this after OnEnabledChanged
Sarmad Hashmi 2016/11/21 17:09:53 Done.
+
OnEnabledChanged();
}
}
@@ -1364,6 +1380,27 @@ int View::GetLineScrollIncrement(ScrollView* scroll_view,
return 0;
}
+// Observers -------------------------------------------------------------------
sky 2016/11/21 16:33:37 No need for this comment, please remove.
Sarmad Hashmi 2016/11/21 17:09:53 Done.
+void View::AddObserver(ViewObserver* observer) {
+ CHECK(observer);
+ observers_.AddObserver(observer);
+}
+
+void View::RemoveObserver(ViewObserver* observer) {
+ observers_.RemoveObserver(observer);
+}
+
+bool View::HasObserver(const ViewObserver* observer) const {
+ return observers_.HasObserver(observer);
+}
+
+void View::NotifyViewParentChanged(View* view,
+ View* old_parent,
+ View* new_parent) {
+ for (ViewObserver& observer : observers_)
+ observer.OnViewParentChanged(view, old_parent, new_parent);
+}
+
////////////////////////////////////////////////////////////////////////////////
// View, protected:
@@ -1839,6 +1876,8 @@ void View::DoRemoveChildView(View* view,
if (layout_manager_)
layout_manager_->ViewRemoved(this, view);
+
+ NotifyViewParentChanged(view, this, nullptr);
sky 2016/11/21 16:33:37 DoRemoveChildView is called from AddChildView. So,
Sarmad Hashmi 2016/11/21 17:09:53 Already have this under the ViewParentChanged test
sky 2016/11/21 18:32:12 Sure, but your test is verifying the observer is c
}
void View::PropagateRemoveNotifications(View* old_parent, View* new_parent) {

Powered by Google App Engine
This is Rietveld 408576698