Commit fc21ef7f authored by Dana Fried's avatar Dana Fried Committed by Commit Bot

Changing the border of a view should cause re-layout.

Because border thickness changes the default result of calling

contents of a view that has had its border changed must be re-laid-out.

View: :GetInsets() and by extension View::GetContentsBounds(), the
Change-Id: I42b9c95b72162d8bc4ca26d283062d6f154c021e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1669655
Commit-Queue: Dana Fried <dfried@chromium.org>
Reviewed-by: default avatarPeter Kasting <pkasting@chromium.org>
Cr-Commit-Position: refs/heads/master@{#671880}
parent bfdee0db
...@@ -1004,6 +1004,16 @@ void View::SetBackground(std::unique_ptr<Background> b) { ...@@ -1004,6 +1004,16 @@ void View::SetBackground(std::unique_ptr<Background> b) {
void View::SetBorder(std::unique_ptr<Border> b) { void View::SetBorder(std::unique_ptr<Border> b) {
border_ = std::move(b); border_ = std::move(b);
// Conceptually, this should be PreferredSizeChanged(), but for some view
// hierarchies that triggers synchronous add/remove operations that are unsafe
// in some contexts where SetBorder is called.
//
// InvalidateLayout() still triggers a re-layout of the view, which should
// include re-querying its preferred size so in practice this is both safe and
// has the intended effect.
InvalidateLayout();
SchedulePaint(); SchedulePaint();
} }
...@@ -2176,6 +2186,11 @@ void View::AddChildViewAtImpl(View* view, int index) { ...@@ -2176,6 +2186,11 @@ void View::AddChildViewAtImpl(View* view, int index) {
view->PropagateThemeChanged(); view->PropagateThemeChanged();
} }
// Need to notify the layout manager because one of the callbacks below might
// want to know the view's new preferred size, minimum size, etc.
if (layout_manager_)
layout_manager_->ViewAdded(this, view);
ViewHierarchyChangedDetails details(true, this, view, parent); ViewHierarchyChangedDetails details(true, this, view, parent);
for (View* v = this; v; v = v->parent_) for (View* v = this; v; v = v->parent_)
...@@ -2192,9 +2207,6 @@ void View::AddChildViewAtImpl(View* view, int index) { ...@@ -2192,9 +2207,6 @@ void View::AddChildViewAtImpl(View* view, int index) {
view->SchedulePaint(); view->SchedulePaint();
} }
if (layout_manager_)
layout_manager_->ViewAdded(this, view);
for (ViewObserver& observer : observers_) for (ViewObserver& observer : observers_)
observer.OnChildViewAdded(this, view); observer.OnChildViewAdded(this, view);
} }
...@@ -2238,6 +2250,11 @@ void View::DoRemoveChildView(View* view, ...@@ -2238,6 +2250,11 @@ void View::DoRemoveChildView(View* view,
if (widget) if (widget)
widget->LayerTreeChanged(); widget->LayerTreeChanged();
// Need to notify the layout manager because one of the callbacks below might
// want to know the view's new preferred size, minimum size, etc.
if (layout_manager_)
layout_manager_->ViewRemoved(this, view);
view->PropagateRemoveNotifications(this, new_parent, is_removed_from_widget); view->PropagateRemoveNotifications(this, new_parent, is_removed_from_widget);
view->parent_ = nullptr; view->parent_ = nullptr;
...@@ -2252,9 +2269,6 @@ void View::DoRemoveChildView(View* view, ...@@ -2252,9 +2269,6 @@ void View::DoRemoveChildView(View* view,
if (update_tool_tip) if (update_tool_tip)
UpdateTooltip(); UpdateTooltip();
if (layout_manager_)
layout_manager_->ViewRemoved(this, view);
for (ViewObserver& observer : observers_) for (ViewObserver& observer : observers_)
observer.OnChildViewRemoved(this, view); observer.OnChildViewRemoved(this, view);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment