Chromium Code Reviews| Index: ui/views/view.cc |
| diff --git a/ui/views/view.cc b/ui/views/view.cc |
| index b6cd9d0e97f9345128f754a62f0b80e15fa2430f..6a22018119ac2a636ed5caa18071e8bd5b04cae6 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); |
| + |
| + view->NotifyViewParentChanged(nullptr); |
|
sky
2016/11/21 18:32:12
Don't you want to pass parent here? Please add tes
Sarmad Hashmi
2016/11/21 19:14:13
Done.
|
| } |
| 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); |
| + |
| 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,7 +448,11 @@ void View::SetEnabled(bool enabled) { |
| if (enabled != enabled_) { |
| enabled_ = enabled; |
| AdvanceFocusIfNecessary(); |
| + |
| OnEnabledChanged(); |
| + |
| + for (ViewObserver& observer : observers_) |
| + observer.OnViewEnabledChanged(this); |
| } |
| } |
| @@ -1364,6 +1380,19 @@ int View::GetLineScrollIncrement(ScrollView* scroll_view, |
| return 0; |
| } |
| +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); |
| +} |
| + |
| //////////////////////////////////////////////////////////////////////////////// |
| // View, protected: |
| @@ -1839,6 +1868,8 @@ void View::DoRemoveChildView(View* view, |
| if (layout_manager_) |
| layout_manager_->ViewRemoved(this, view); |
| + |
| + view->NotifyViewParentChanged(this); |
| } |
| void View::PropagateRemoveNotifications(View* old_parent, View* new_parent) { |
| @@ -2421,4 +2452,9 @@ bool View::DoDrag(const ui::LocatedEvent& event, |
| return true; |
| } |
| +void View::NotifyViewParentChanged(View* old_parent) { |
| + for (ViewObserver& observer : observers_) |
| + observer.OnViewParentChanged(this, old_parent); |
| +} |
| + |
| } // namespace views |