summaryrefslogtreecommitdiffstats
path: root/views/view.cc
diff options
context:
space:
mode:
Diffstat (limited to 'views/view.cc')
-rw-r--r--views/view.cc36
1 files changed, 29 insertions, 7 deletions
diff --git a/views/view.cc b/views/view.cc
index c67aac2..fbf952d 100644
--- a/views/view.cc
+++ b/views/view.cc
@@ -21,6 +21,7 @@
#include "views/background.h"
#include "views/context_menu_controller.h"
#include "views/drag_controller.h"
+#include "views/layer_property_setter.h"
#include "views/layout/layout_manager.h"
#include "views/views_delegate.h"
#include "views/widget/native_widget_private.h"
@@ -176,8 +177,10 @@ void View::AddChildViewAt(View* view, int index) {
view->PropagateAddNotifications(this, view);
UpdateTooltip();
- if (GetWidget())
+ if (GetWidget()) {
RegisterChildrenForVisibleBoundsNotification(view);
+ view->CreateLayerIfNecessary();
+ }
if (layout_manager_.get())
layout_manager_->ViewAdded(this, view);
@@ -442,7 +445,7 @@ void View::SetTransform(const ui::Transform& transform) {
if (!ShouldPaintToLayer())
DestroyLayerAndReparent();
else if (layer_.get())
- layer_->set_transform(transform);
+ layer_property_setter_->SetTransform(layer_.get(), transform);
SchedulePaint();
} else {
@@ -456,7 +459,7 @@ void View::SetTransform(const ui::Transform& transform) {
CreateLayer();
SchedulePaint();
} else {
- layer_->set_transform(transform);
+ layer_property_setter_->SetTransform(layer_.get(), transform);
// We have a layer. When the transform changes and the layer is up to
// date we don't want to SchedulePaint as it'll trigger painting to the
// layer. Instead we tell the Widget to paint, which makes the
@@ -481,6 +484,19 @@ void View::SetPaintToLayer(bool value) {
CreateLayer();
}
+void View::SetLayerPropertySetter(LayerPropertySetter* setter) {
+ if (layer_property_setter_.get() == setter)
+ return;
+
+ if (layer_property_setter_.get() && layer_.get())
+ layer_property_setter_->Uninstalled(layer_.get());
+ layer_property_setter_.reset(setter);
+ if (!setter && layer_.get())
+ layer_property_setter_.reset(LayerPropertySetter::CreateDefaultSetter());
+ if (layer_property_setter_.get() && layer_.get())
+ layer_property_setter_->Installed(layer_.get());
+}
+
// RTL positioning -------------------------------------------------------------
gfx::Rect View::GetMirroredBounds() const {
@@ -1430,7 +1446,7 @@ void View::VisibilityChangedImpl(View* starting_from, bool is_visible) {
void View::BoundsChanged(const gfx::Rect& previous_bounds) {
if (IsVisible()) {
if (layer_.get())
- layer_->set_bounds(bounds_);
+ layer_property_setter_->SetBounds(layer_.get(), bounds_);
// Paint the new bounds.
SchedulePaintBoundsChanged(
@@ -1617,14 +1633,15 @@ void View::CreateLayer() {
if (!compositor)
return;
- // TODO: if we want to share compositors among widgets then this code needs to
- // ascend widget boundaries.
View* ancestor_with_layer = NULL;
gfx::Point offset(CalculateOffsetToAncestorWithLayer(&ancestor_with_layer));
DCHECK(ancestor_with_layer || parent_ == NULL);
layer_.reset(new ui::Layer(compositor));
+ if (!layer_property_setter_.get())
+ layer_property_setter_.reset(LayerPropertySetter::CreateDefaultSetter());
+ layer_property_setter_->Installed(layer_.get());
layer_->set_bounds(gfx::Rect(offset.x(), offset.y(), width(), height()));
if (ancestor_with_layer)
ancestor_with_layer->layer_->Add(layer_.get());
@@ -1657,6 +1674,8 @@ void View::DestroyLayerAndReparent() {
}
void View::DestroyLayer() {
+ if (layer_property_setter_.get())
+ layer_property_setter_->Uninstalled(layer_.get());
layer_.reset();
}
@@ -1675,7 +1694,8 @@ void View::MoveLayerToParent(ui::Layer* parent_layer,
void View::UpdateLayerBounds(const gfx::Point& offset) {
if (layer_.get()) {
- layer_->set_bounds(
+ layer_property_setter_->SetBounds(
+ layer_.get(),
gfx::Rect(offset.x() + x(), offset.y() + y(), width(), height()));
} else {
gfx::Point new_offset(offset.x() + x(), offset.y() + y());
@@ -1687,6 +1707,8 @@ void View::UpdateLayerBounds(const gfx::Point& offset) {
gfx::Point View::CalculateOffsetToAncestorWithLayer(
View** ancestor) {
gfx::Point offset;
+ // TODO: if we want to share compositors among widgets then this code needs to
+ // ascend widget boundaries.
View* ancestor_with_layer = this;
while (ancestor_with_layer && !ancestor_with_layer->layer()) {
offset.Offset(ancestor_with_layer->x(), ancestor_with_layer->y());