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

Unified Diff: ui/v2/src/view.cc

Issue 25757007: V2: Implement reparenting, bounds and visibility change notifications, and write more tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: ui/v2/src/view.cc
diff --git a/ui/v2/src/view.cc b/ui/v2/src/view.cc
index bef82e10d6b1f37b0faf2789d6112658d3913d88..ee7242ae5bde6e2676a57eeaaf555665bc17845c 100644
--- a/ui/v2/src/view.cc
+++ b/ui/v2/src/view.cc
@@ -7,24 +7,10 @@
#include <algorithm>
#include "ui/v2/public/view_observer.h"
+#include "ui/v2/src/view_private.h"
namespace v2 {
-// Friend of View. Provides a way to get at a View's observer list for
-// notification methods.
-class ViewObserversAccessor {
- public:
- explicit ViewObserversAccessor(View* view) : view_(view) {}
- ~ViewObserversAccessor() {}
-
- ObserverList<ViewObserver>* get() { return &view_->observers_; }
-
- private:
- View* view_;
-
- DISALLOW_COPY_AND_ASSIGN(ViewObserversAccessor);
-};
-
enum StackDirection {
STACK_ABOVE,
STACK_BELOW
@@ -41,9 +27,8 @@ void StackChildRelativeTo(View* parent,
DCHECK_EQ(parent, child->parent());
DCHECK_EQ(parent, other->parent());
- // Notify stacking changing.
-
- // TODO(beng): This is simpler than aura::Window's for now.
+ // TODO(beng): Notify stacking changing.
+ // TODO(beng): consult layout manager
const size_t child_i =
std::find(children->begin(), children->end(), child) - children->begin();
const size_t other_i =
@@ -55,9 +40,8 @@ void StackChildRelativeTo(View* parent,
children->erase(children->begin() + child_i);
children->insert(children->begin() + destination_i, child);
- // TODO(beng): restack layers.
-
- // Notify stacking changed.
+ // TODO(beng): update layer.
+ // TODO(beng): Notify stacking changed.
}
void NotifyViewTreeChangeAtReceiver(
@@ -66,7 +50,7 @@ void NotifyViewTreeChangeAtReceiver(
ViewObserver::TreeChangeParams local_params = params;
local_params.receiver = receiver;
FOR_EACH_OBSERVER(ViewObserver,
- *ViewObserversAccessor(receiver).get(),
+ *ViewPrivate(receiver).observers(),
OnViewTreeChange(local_params));
}
@@ -120,16 +104,26 @@ class ScopedTreeNotifier {
DISALLOW_COPY_AND_ASSIGN(ScopedTreeNotifier);
};
+void RemoveChildImpl(View* child, View::Children* children) {
+ std::vector<View*>::iterator it =
+ std::find(children->begin(), children->end(), child);
+ if (it != children->end()) {
+ children->erase(it);
+ ViewPrivate(child).ClearParent();
+ }
+}
+
////////////////////////////////////////////////////////////////////////////////
// View, public:
// Creation, configuration -----------------------------------------------------
-View::View() : visible_(false), owned_by_parent_(true), parent_(NULL) {
+View::View() : visible_(true), owned_by_parent_(true), parent_(NULL) {
}
View::~View() {
- FOR_EACH_OBSERVER(ViewObserver, observers_, OnViewDestroying());
+ FOR_EACH_OBSERVER(ViewObserver, observers_,
+ OnViewDestroy(this, ViewObserver::DISPOSITION_CHANGING));
while (!children_.empty()) {
View* child = children_.front();
@@ -146,7 +140,8 @@ View::~View() {
if (parent_)
parent_->RemoveChild(this);
- FOR_EACH_OBSERVER(ViewObserver, observers_, OnViewDestroyed());
+ FOR_EACH_OBSERVER(ViewObserver, observers_,
+ OnViewDestroy(this, ViewObserver::DISPOSITION_CHANGED));
}
void View::AddObserver(ViewObserver* observer) {
@@ -168,30 +163,50 @@ void View::SetLayout(Layout* layout) {
// Disposition -----------------------------------------------------------------
void View::SetBounds(const gfx::Rect& bounds) {
- if (parent_ && parent_->layout_.get())
- parent_->layout_->SetChildBounds(this, bounds);
- else
- SetBoundsInternal(bounds);
+ gfx::Rect old_bounds = bounds_;
+ // TODO(beng): consult layout manager
+ bounds_ = bounds;
+ // TODO(beng): update layer
+
+ // TODO(beng): write tests for this where layoutmanager prevents a change
+ // and no changed notification is sent.
+ if (bounds_ != old_bounds) {
+ FOR_EACH_OBSERVER(ViewObserver, observers_, OnViewBoundsChanged(this,
+ old_bounds, bounds_));
+ }
}
-void View::SetVisible(bool visible) {}
+void View::SetVisible(bool visible) {
+ FOR_EACH_OBSERVER(ViewObserver, observers_, OnViewVisibilityChange(this,
+ ViewObserver::DISPOSITION_CHANGING));
+
+ bool old_visible = visible_;
+ // TODO(beng): consult layout manager
+ visible_ = visible;
+ // TODO(beng): update layer
+
+ // TODO(beng): write tests for this where layoutmanager prevents a change
+ // and no changed notification is sent.
+ if (old_visible != visible_) {
+ FOR_EACH_OBSERVER(ViewObserver, observers_, OnViewVisibilityChange(this,
+ ViewObserver::DISPOSITION_CHANGED));
+ }
+}
// Tree ------------------------------------------------------------------------
void View::AddChild(View* child) {
ScopedTreeNotifier notifier(child, child->parent(), this);
+ if (child->parent())
+ RemoveChildImpl(child, &child->parent_->children_);
children_.push_back(child);
child->parent_ = this;
}
void View::RemoveChild(View* child) {
+ DCHECK_EQ(this, child->parent());
ScopedTreeNotifier(child, this, NULL);
- std::vector<View*>::iterator it =
- std::find(children_.begin(), children_.end(), child);
- if (it != children_.end()) {
- children_.erase(it);
- child->parent_ = NULL;
- }
+ RemoveChildImpl(child, &children_);
}
bool View::Contains(View* child) const {
@@ -222,14 +237,4 @@ void View::StackChildBelow(View* child, View* other) {
StackChildRelativeTo(this, &children_, child, other, STACK_BELOW);
}
-////////////////////////////////////////////////////////////////////////////////
-// View, private:
-
-void View::SetBoundsInternal(const gfx::Rect& bounds) {
- bounds_ = bounds;
-
- // TODO(beng): Update layer.
- // TODO(beng): Notify changed.
-}
-
} // namespace v2
« no previous file with comments | « ui/v2/src/layout.cc ('k') | ui/v2/src/view_private.h » ('j') | ui/v2/src/view_private.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698