diff options
author | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-07 16:25:31 +0000 |
---|---|---|
committer | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-07 16:25:31 +0000 |
commit | 18da0fd59dfacb8d00f803103fdbdc556d5d6fe3 (patch) | |
tree | 80d9a8611e92beef34416e7f5a753d8fdf1475d7 /views/view.cc | |
parent | e9086261fcbc97bf37a5dab2c666be93f7d1e828 (diff) | |
download | chromium_src-18da0fd59dfacb8d00f803103fdbdc556d5d6fe3.zip chromium_src-18da0fd59dfacb8d00f803103fdbdc556d5d6fe3.tar.gz chromium_src-18da0fd59dfacb8d00f803103fdbdc556d5d6fe3.tar.bz2 |
Keep the Layer tree in sync with View tree.
The View tree represents draw order, so it is imperative that order of the Layer tree reflect the order of the View tree. Whenever the order of the View tree changes, we now fix up the order of the Layer tree.
BUG=none
TEST=can change the stack order of windows on the views_desktop
Review URL: http://codereview.chromium.org/8202001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@104496 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views/view.cc')
-rw-r--r-- | views/view.cc | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/views/view.cc b/views/view.cc index ffca496..ce96853 100644 --- a/views/view.cc +++ b/views/view.cc @@ -181,6 +181,9 @@ void View::AddChildViewAt(View* view, int index) { if (layout_manager_.get()) layout_manager_->ViewAdded(this, view); + + if (use_acceleration_when_possible) + ReorderLayers(); } void View::ReorderChildView(View* view, int index) { @@ -207,6 +210,9 @@ void View::ReorderChildView(View* view, int index) { // Add it in the specified index now. InitFocusSiblings(view, index); children_.insert(children_.begin() + index, view); + + if (use_acceleration_when_possible) + ReorderLayers(); } void View::RemoveChildView(View* view) { @@ -1717,6 +1723,12 @@ void View::CreateLayer() { layer_->SetVisible(IsVisible()); UpdateParentLayers(); + + // The new layer needs to be ordered in the layer tree according + // to the view tree. Children of this layer were added in order + // in UpdateParentLayers(). + if (parent()) + parent()->ReorderLayers(); } void View::UpdateParentLayers() { @@ -1783,6 +1795,9 @@ void View::DestroyLayer() { layer_.reset(); + if (new_parent) + ReorderLayers(); + gfx::Point offset; CalculateOffsetToAncestorWithLayer(&offset, NULL); UpdateChildLayerBounds(offset); @@ -1790,6 +1805,29 @@ void View::DestroyLayer() { SchedulePaint(); } +void View::ReorderLayers() { + View* v = this; + while (v && !v->layer()) + v = v->parent(); + + if (v) { + for (Views::const_iterator i(v->children_.begin()); + i != v->children_.end(); + ++i) + (*i)->ReorderChildLayers(v->layer()); + } +} + +void View::ReorderChildLayers(ui::Layer* parent_layer) { + if (layer()) { + DCHECK_EQ(parent_layer, layer()->parent()); + parent_layer->MoveToFront(layer()); + } else { + for (Views::const_iterator i(children_.begin()); i != children_.end(); ++i) + (*i)->ReorderChildLayers(parent_layer); + } +} + // Input ----------------------------------------------------------------------- bool View::ProcessMousePressed(const MouseEvent& event, DragInfo* drag_info) { |