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

Side by Side Diff: ui/views/view.cc

Issue 2713643002: Add View::AddedToWidget and RemovedFromWidget. (Closed)
Patch Set: Reimplement without using the additional member View::attached_widget_. Created 3 years, 9 months 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 unified diff | Download patch
« no previous file with comments | « ui/views/view.h ('k') | ui/views/view_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #define _USE_MATH_DEFINES // For VC++ to get M_PI. This has to be first. 5 #define _USE_MATH_DEFINES // For VC++ to get M_PI. This has to be first.
6 6
7 #include "ui/views/view.h" 7 #include "ui/views/view.h"
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <cmath> 10 #include <cmath>
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 } 189 }
190 190
191 void View::AddChildViewAt(View* view, int index) { 191 void View::AddChildViewAt(View* view, int index) {
192 CHECK_NE(view, this) << "You cannot add a view as its own child"; 192 CHECK_NE(view, this) << "You cannot add a view as its own child";
193 DCHECK_GE(index, 0); 193 DCHECK_GE(index, 0);
194 DCHECK_LE(index, child_count()); 194 DCHECK_LE(index, child_count());
195 195
196 // If |view| has a parent, remove it from its parent. 196 // If |view| has a parent, remove it from its parent.
197 View* parent = view->parent_; 197 View* parent = view->parent_;
198 ui::NativeTheme* old_theme = NULL; 198 ui::NativeTheme* old_theme = NULL;
199 Widget* old_widget = NULL;
199 if (parent) { 200 if (parent) {
200 old_theme = view->GetNativeTheme(); 201 old_theme = view->GetNativeTheme();
202 old_widget = view->GetWidget();
201 if (parent == this) { 203 if (parent == this) {
202 ReorderChildView(view, index); 204 ReorderChildView(view, index);
203 return; 205 return;
204 } 206 }
205 parent->DoRemoveChildView(view, true, true, false, this); 207 parent->DoRemoveChildView(view, true, true, false, this);
206 } 208 }
207 209
208 // Sets the prev/next focus views. 210 // Sets the prev/next focus views.
209 InitFocusSiblings(view, index); 211 InitFocusSiblings(view, index);
210 212
(...skipping 30 matching lines...) Expand all
241 for (View* v = this; v; v = v->parent_) 243 for (View* v = this; v; v = v->parent_)
242 v->ViewHierarchyChangedImpl(false, details); 244 v->ViewHierarchyChangedImpl(false, details);
243 245
244 view->PropagateAddNotifications(details); 246 view->PropagateAddNotifications(details);
245 247
246 UpdateTooltip(); 248 UpdateTooltip();
247 249
248 if (widget) { 250 if (widget) {
249 RegisterChildrenForVisibleBoundsNotification(view); 251 RegisterChildrenForVisibleBoundsNotification(view);
250 252
253 if (widget != old_widget)
254 view->PropagateAddedToWidget();
sky 2017/02/27 16:46:54 I would like to avoid more tree walking. Can't you
msimonides 2017/02/28 10:07:27 Ok. I will merge PropagateAddedToWidget into Propa
sky 2017/02/28 17:35:33 That's fine. These are implementation details of V
msimonides 2017/03/01 10:31:52 Done.
255
251 if (view->visible()) 256 if (view->visible())
252 view->SchedulePaint(); 257 view->SchedulePaint();
253 } 258 }
254 259
255 if (layout_manager_.get()) 260 if (layout_manager_.get())
256 layout_manager_->ViewAdded(this, view); 261 layout_manager_->ViewAdded(this, view);
257 262
258 for (ViewObserver& observer : observers_) 263 for (ViewObserver& observer : observers_)
259 observer.OnChildViewAdded(view); 264 observer.OnChildViewAdded(view);
260 } 265 }
(...skipping 1248 matching lines...) Expand 10 before | Expand all | Expand 10 after
1509 void View::NativeViewHierarchyChanged() { 1514 void View::NativeViewHierarchyChanged() {
1510 FocusManager* focus_manager = GetFocusManager(); 1515 FocusManager* focus_manager = GetFocusManager();
1511 if (accelerator_focus_manager_ != focus_manager) { 1516 if (accelerator_focus_manager_ != focus_manager) {
1512 UnregisterAccelerators(true); 1517 UnregisterAccelerators(true);
1513 1518
1514 if (focus_manager) 1519 if (focus_manager)
1515 RegisterPendingAccelerators(); 1520 RegisterPendingAccelerators();
1516 } 1521 }
1517 } 1522 }
1518 1523
1524 void View::AddedToWidget() {}
1525
1526 void View::RemovedFromWidget() {}
1527
1519 // Painting -------------------------------------------------------------------- 1528 // Painting --------------------------------------------------------------------
1520 1529
1521 void View::PaintChildren(const ui::PaintContext& context) { 1530 void View::PaintChildren(const ui::PaintContext& context) {
1522 TRACE_EVENT1("views", "View::PaintChildren", "class", GetClassName()); 1531 TRACE_EVENT1("views", "View::PaintChildren", "class", GetClassName());
1523 View::Views children = GetChildrenInZOrder(); 1532 View::Views children = GetChildrenInZOrder();
1524 DCHECK_EQ(child_count(), static_cast<int>(children.size())); 1533 DCHECK_EQ(child_count(), static_cast<int>(children.size()));
1525 for (auto* child : children) { 1534 for (auto* child : children) {
1526 if (!child->layer()) 1535 if (!child->layer())
1527 child->Paint(context); 1536 child->Paint(context);
1528 } 1537 }
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after
1927 if (next_focusable) 1936 if (next_focusable)
1928 next_focusable->previous_focusable_view_ = prev_focusable; 1937 next_focusable->previous_focusable_view_ = prev_focusable;
1929 } 1938 }
1930 1939
1931 Widget* widget = GetWidget(); 1940 Widget* widget = GetWidget();
1932 if (widget) { 1941 if (widget) {
1933 UnregisterChildrenForVisibleBoundsNotification(view); 1942 UnregisterChildrenForVisibleBoundsNotification(view);
1934 if (view->visible()) 1943 if (view->visible())
1935 view->SchedulePaint(); 1944 view->SchedulePaint();
1936 1945
1937 if (!new_parent || new_parent->GetWidget() != widget) 1946 if (!new_parent || new_parent->GetWidget() != widget) {
1938 widget->NotifyWillRemoveView(view); 1947 widget->NotifyWillRemoveView(view);
1948 view->PropagateRemovedFromWidget();
1949 }
1939 } 1950 }
1940 1951
1941 // Make sure the layers belonging to the subtree rooted at |view| get 1952 // Make sure the layers belonging to the subtree rooted at |view| get
1942 // removed. 1953 // removed.
1943 view->OrphanLayers(); 1954 view->OrphanLayers();
1944 if (widget) 1955 if (widget)
1945 widget->LayerTreeChanged(); 1956 widget->LayerTreeChanged();
1946 1957
1947 view->PropagateRemoveNotifications(this, new_parent); 1958 view->PropagateRemoveNotifications(this, new_parent);
1948 view->parent_ = nullptr; 1959 view->parent_ = nullptr;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
2020 return; 2031 return;
2021 2032
2022 { 2033 {
2023 internal::ScopedChildrenLock lock(this); 2034 internal::ScopedChildrenLock lock(this);
2024 for (auto* child : children_) 2035 for (auto* child : children_)
2025 child->PropagateNativeThemeChanged(theme); 2036 child->PropagateNativeThemeChanged(theme);
2026 } 2037 }
2027 OnNativeThemeChanged(theme); 2038 OnNativeThemeChanged(theme);
2028 } 2039 }
2029 2040
2041 void View::PropagateAddedToWidget() {
2042 {
2043 internal::ScopedChildrenLock lock(this);
2044 for (auto* child : children_)
2045 child->PropagateAddedToWidget();
2046 }
2047 AddedToWidget();
2048 }
2049
2050 void View::PropagateRemovedFromWidget() {
2051 {
2052 internal::ScopedChildrenLock lock(this);
2053 for (auto* child : children_)
2054 child->PropagateRemovedFromWidget();
2055 }
2056 RemovedFromWidget();
2057 }
2058
2030 // Size and disposition -------------------------------------------------------- 2059 // Size and disposition --------------------------------------------------------
2031 2060
2032 void View::PropagateVisibilityNotifications(View* start, bool is_visible) { 2061 void View::PropagateVisibilityNotifications(View* start, bool is_visible) {
2033 { 2062 {
2034 internal::ScopedChildrenLock lock(this); 2063 internal::ScopedChildrenLock lock(this);
2035 for (auto* child : children_) 2064 for (auto* child : children_)
2036 child->PropagateVisibilityNotifications(start, is_visible); 2065 child->PropagateVisibilityNotifications(start, is_visible);
2037 } 2066 }
2038 VisibilityChangedImpl(start, is_visible); 2067 VisibilityChangedImpl(start, is_visible);
2039 } 2068 }
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after
2551 // Message the RootView to do the drag and drop. That way if we're removed 2580 // Message the RootView to do the drag and drop. That way if we're removed
2552 // the RootView can detect it and avoid calling us back. 2581 // the RootView can detect it and avoid calling us back.
2553 gfx::Point widget_location(event.location()); 2582 gfx::Point widget_location(event.location());
2554 ConvertPointToWidget(this, &widget_location); 2583 ConvertPointToWidget(this, &widget_location);
2555 widget->RunShellDrag(this, data, widget_location, drag_operations, source); 2584 widget->RunShellDrag(this, data, widget_location, drag_operations, source);
2556 // WARNING: we may have been deleted. 2585 // WARNING: we may have been deleted.
2557 return true; 2586 return true;
2558 } 2587 }
2559 2588
2560 } // namespace views 2589 } // namespace views
OLDNEW
« no previous file with comments | « ui/views/view.h ('k') | ui/views/view_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698