Chromium Code Reviews| 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) { |