Chromium Code Reviews| Index: mojo/examples/embedded_app/embedded_app.cc |
| diff --git a/mojo/examples/embedded_app/embedded_app.cc b/mojo/examples/embedded_app/embedded_app.cc |
| index 6ca0ad3ece27d73c1792f433fb7c52ce582c4a81..86b3dbe7b9ab231145f060998170ca4d6d6134f4 100644 |
| --- a/mojo/examples/embedded_app/embedded_app.cc |
| +++ b/mojo/examples/embedded_app/embedded_app.cc |
| @@ -4,43 +4,89 @@ |
| #include "base/basictypes.h" |
| #include "base/bind.h" |
| +#include "mojo/examples/window_manager/window_manager.mojom.h" |
| #include "mojo/public/cpp/application/application.h" |
| #include "mojo/services/public/cpp/view_manager/view.h" |
| #include "mojo/services/public/cpp/view_manager/view_manager.h" |
| +#include "mojo/services/public/cpp/view_manager/view_observer.h" |
| #include "mojo/services/public/cpp/view_manager/view_tree_node.h" |
| +#include "mojo/services/public/cpp/view_manager/view_tree_node_observer.h" |
| +#include "ui/events/event_constants.h" |
| + |
| +using mojo::view_manager::View; |
| +using mojo::view_manager::ViewManager; |
| +using mojo::view_manager::ViewObserver; |
| +using mojo::view_manager::ViewTreeNode; |
| +using mojo::view_manager::ViewTreeNodeObserver; |
| namespace mojo { |
| namespace examples { |
| +namespace { |
| + |
| +const SkColor kColors[] = { SK_ColorYELLOW, |
| + SK_ColorRED, |
| + SK_ColorGREEN, |
| + SK_ColorMAGENTA }; |
| + |
| +} // namespace |
| -class EmbeddedApp : public Application { |
| +class EmbeddedApp : public Application, |
| + public ViewObserver, |
| + public ViewTreeNodeObserver { |
| public: |
| - EmbeddedApp() : view_manager_(NULL) {} |
| + EmbeddedApp() |
| + : view_manager_(NULL) {} |
| virtual ~EmbeddedApp() {} |
| private: |
| // Overridden from Application: |
| virtual void Initialize() MOJO_OVERRIDE { |
| - view_manager::ViewManager::Create(this, |
| - base::Bind(&EmbeddedApp::OnRootAdded, base::Unretained(this))); |
| + ViewManager::Create(this, |
| + base::Bind(&EmbeddedApp::OnRootAdded, base::Unretained(this)), |
| + base::Bind(&EmbeddedApp::OnRootRemoved, base::Unretained(this))); |
| + ConnectTo<IWindowManager>("mojo:mojo_window_manager", &window_manager_); |
| + } |
| + |
| + // Overridden from ViewObserver: |
| + virtual void OnViewInputEvent(View* view, EventPtr event) OVERRIDE { |
| + if (event->action == ui::ET_MOUSE_RELEASED) |
| + window_manager_->CloseWindow(view->node()->id()); |
| } |
| - void OnRootAdded(view_manager::ViewManager* view_manager) { |
| + // Overridden from ViewTreeNodeObserver: |
| + virtual void OnNodeActiveViewChange( |
| + ViewTreeNode* node, |
| + View* old_view, |
| + View* new_view, |
| + ViewTreeNodeObserver::DispositionChangePhase phase) OVERRIDE { |
| + if (new_view == 0) |
| + views_to_reap_[node] = old_view; |
|
Ben Goodger (Google)
2014/06/05 22:35:42
I have to do this because on the server side when
sky
2014/06/05 22:51:30
Sounds reasonable. I'll do that for the client tha
|
| + } |
| + |
| + void OnRootAdded(ViewManager* view_manager, ViewTreeNode* root) { |
| if (!view_manager_) |
| view_manager_ = view_manager; |
| DCHECK_EQ(view_manager_, view_manager); |
| - if (view_manager_->roots().size() == 1) { |
| - view_manager::View* view = view_manager::View::Create(view_manager_); |
| - view_manager_->roots().front()->SetActiveView(view); |
| - view->SetColor(SK_ColorYELLOW); |
| - } else { |
| - view_manager::View* view = view_manager::View::Create(view_manager_); |
| - view_manager_->roots().back()->SetActiveView(view); |
| - view->SetColor(SK_ColorRED); |
| - } |
| + View* view = View::Create(view_manager_); |
| + view->AddObserver(this); |
| + root->SetActiveView(view); |
| + root->AddObserver(this); |
| + size_t index = view_manager_->roots().size() - 1; |
| + view->SetColor(kColors[index % arraysize(kColors)]); |
| + } |
| + |
| + void OnRootRemoved(ViewManager* view_manager, |
| + ViewTreeNode* root) { |
| + std::map<ViewTreeNode*, View*>::const_iterator it = |
| + views_to_reap_.find(root); |
| + if (it != views_to_reap_.end()) |
| + it->second->Destroy(); |
| } |
| - view_manager::ViewManager* view_manager_; |
| + IWindowManagerPtr window_manager_; |
| + ViewManager* view_manager_; |
| + std::map<ViewTreeNode*, View*> views_to_reap_; |
| DISALLOW_COPY_AND_ASSIGN(EmbeddedApp); |
| }; |