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

Side by Side Diff: examples/ui/tile/tile_view.cc

Issue 1869263002: Mozart: Enhance tile app to test various sync behaviors. (Closed) Base URL: git@github.com:domokit/mojo.git@moz-1
Patch Set: Created 4 years, 8 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 | « examples/ui/tile/tile_view.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 #include "base/bind.h" 5 #include "base/bind.h"
6 #include "examples/ui/tile/tile_view.h" 6 #include "examples/ui/tile/tile_view.h"
7 #include "mojo/services/geometry/cpp/geometry_util.h" 7 #include "mojo/services/geometry/cpp/geometry_util.h"
8 8
9 namespace examples { 9 namespace examples {
10 10
11 namespace { 11 namespace {
12 constexpr uint32_t kViewResourceIdBase = 100; 12 constexpr uint32_t kViewResourceIdBase = 100;
13 constexpr uint32_t kViewResourceIdSpacing = 100; 13 constexpr uint32_t kViewResourceIdSpacing = 100;
14 14
15 constexpr uint32_t kRootNodeId = mojo::gfx::composition::kSceneRootNodeId; 15 constexpr uint32_t kRootNodeId = mojo::gfx::composition::kSceneRootNodeId;
16 constexpr uint32_t kViewNodeIdBase = 100; 16 constexpr uint32_t kViewNodeIdBase = 100;
17 constexpr uint32_t kViewNodeIdSpacing = 100; 17 constexpr uint32_t kViewNodeIdSpacing = 100;
18 constexpr uint32_t kViewSceneNodeIdOffset = 1; 18 constexpr uint32_t kViewSceneNodeIdOffset = 1;
19 constexpr uint32_t kViewFallbackSceneNodeIdOffset = 2; 19 constexpr uint32_t kViewFallbackColorNodeIdOffset = 2;
20 constexpr uint32_t kViewFallbackColorNodeIdOffset = 3; 20 constexpr uint32_t kViewFallbackDimLayerNodeIdOffset = 3;
21 constexpr uint32_t kViewFallbackDimSceneNodeIdOffset = 4;
21 } // namespace 22 } // namespace
22 23
24 TileParams::TileParams() {}
25
26 TileParams::~TileParams() {}
27
23 TileView::TileView( 28 TileView::TileView(
24 mojo::ApplicationImpl* app_impl, 29 mojo::ApplicationImpl* app_impl,
25 mojo::InterfaceRequest<mojo::ui::ViewOwner> view_owner_request, 30 mojo::InterfaceRequest<mojo::ui::ViewOwner> view_owner_request,
26 const std::vector<std::string>& view_urls) 31 const TileParams& params)
27 : BaseView(app_impl, view_owner_request.Pass(), "Tile"), 32 : BaseView(app_impl, view_owner_request.Pass(), "Tile"), params_(params) {
28 view_urls_(view_urls) {
29 ConnectViews(); 33 ConnectViews();
30 } 34 }
31 35
32 TileView::~TileView() {} 36 TileView::~TileView() {}
33 37
34 void TileView::ConnectViews() { 38 void TileView::ConnectViews() {
35 uint32_t child_key = 0; 39 uint32_t child_key = 0;
36 for (const auto& url : view_urls_) { 40 for (const auto& url : params_.view_urls) {
37 // Start connecting to the view provider. 41 // Start connecting to the view provider.
38 mojo::ui::ViewProviderPtr provider; 42 mojo::ui::ViewProviderPtr provider;
39 app_impl()->ConnectToService(url, &provider); 43 app_impl()->ConnectToService(url, &provider);
40 44
41 LOG(INFO) << "Connecting to view: child_key=" << child_key 45 LOG(INFO) << "Connecting to view: child_key=" << child_key
42 << ", url=" << url; 46 << ", url=" << url;
43 mojo::ui::ViewOwnerPtr child_view_owner; 47 mojo::ui::ViewOwnerPtr child_view_owner;
44 provider->CreateView(mojo::GetProxy(&child_view_owner), nullptr, nullptr); 48 provider->CreateView(mojo::GetProxy(&child_view_owner), nullptr, nullptr);
45 49
46 GetViewContainer()->AddChild(child_key, child_view_owner.Pass()); 50 GetViewContainer()->AddChild(child_key, child_view_owner.Pass());
(...skipping 28 matching lines...) Expand all
75 } 79 }
76 80
77 void TileView::OnPropertiesChanged(uint32_t old_scene_version, 81 void TileView::OnPropertiesChanged(uint32_t old_scene_version,
78 mojo::ui::ViewPropertiesPtr old_properties) { 82 mojo::ui::ViewPropertiesPtr old_properties) {
79 if (!properties()) 83 if (!properties())
80 return; 84 return;
81 85
82 // Layout all children in a row. 86 // Layout all children in a row.
83 if (!views_.empty()) { 87 if (!views_.empty()) {
84 const mojo::Size& size = *properties()->view_layout->size; 88 const mojo::Size& size = *properties()->view_layout->size;
89 const bool vertical =
90 (params_.orientation_mode == TileParams::OrientationMode::kVertical);
91
85 uint32_t index = 0; 92 uint32_t index = 0;
86 uint32_t base_width = size.width / views_.size(); 93 uint32_t space = vertical ? size.height : size.width;
87 uint32_t excess_width = size.width % views_.size(); 94 uint32_t base = space / views_.size();
88 uint32_t x = 0; 95 uint32_t excess = space % views_.size();
96 uint32_t offset = 0;
89 for (auto it = views_.begin(); it != views_.end(); ++it, ++index) { 97 for (auto it = views_.begin(); it != views_.end(); ++it, ++index) {
90 ViewData* view_data = it->second.get(); 98 ViewData* view_data = it->second.get();
91 99
92 // Distribute any excess width among the leading children. 100 // Distribute any excess width among the leading children.
93 uint32_t child_width = base_width; 101 uint32_t extent = base;
94 if (excess_width) { 102 if (excess) {
95 child_width++; 103 extent++;
96 excess_width--; 104 excess--;
97 } 105 }
98 uint32_t child_height = size.height;
99 uint32_t child_x = x;
100 x += child_width;
101 106
102 view_data->layout_bounds.x = child_x; 107 if (vertical) {
103 view_data->layout_bounds.y = 0; 108 view_data->layout_bounds.x = 0;
104 view_data->layout_bounds.width = child_width; 109 view_data->layout_bounds.y = offset;
105 view_data->layout_bounds.height = child_height; 110 view_data->layout_bounds.width = size.width;
111 view_data->layout_bounds.height = extent;
112 } else {
113 view_data->layout_bounds.x = offset;
114 view_data->layout_bounds.y = 0;
115 view_data->layout_bounds.width = extent;
116 view_data->layout_bounds.height = size.height;
117 }
118 offset += extent;
106 119
107 auto view_properties = mojo::ui::ViewProperties::New(); 120 auto view_properties = mojo::ui::ViewProperties::New();
108 view_properties->view_layout = mojo::ui::ViewLayout::New(); 121 view_properties->view_layout = mojo::ui::ViewLayout::New();
109 view_properties->view_layout->size = mojo::Size::New(); 122 view_properties->view_layout->size = mojo::Size::New();
110 view_properties->view_layout->size->width = child_width; 123 view_properties->view_layout->size->width =
111 view_properties->view_layout->size->height = child_height; 124 view_data->layout_bounds.width;
125 view_properties->view_layout->size->height =
126 view_data->layout_bounds.height;
112 127
113 if (view_data->view_properties.Equals(view_properties)) 128 if (view_data->view_properties.Equals(view_properties))
114 continue; // no layout work to do 129 continue; // no layout work to do
115 130
116 view_data->view_properties = view_properties.Clone(); 131 view_data->view_properties = view_properties.Clone();
117 view_data->scene_version++; 132 view_data->scene_version++;
118 GetViewContainer()->SetChildProperties( 133 GetViewContainer()->SetChildProperties(
119 it->first, view_data->scene_version, view_properties.Pass()); 134 it->first, view_data->scene_version, view_properties.Pass());
120 } 135 }
121 } 136 }
(...skipping 11 matching lines...) Expand all
133 // Create the root node. 148 // Create the root node.
134 auto root_node = mojo::gfx::composition::Node::New(); 149 auto root_node = mojo::gfx::composition::Node::New();
135 150
136 // Add the children. 151 // Add the children.
137 for (auto it = views_.cbegin(); it != views_.cend(); it++) { 152 for (auto it = views_.cbegin(); it != views_.cend(); it++) {
138 const ViewData& view_data = *(it->second.get()); 153 const ViewData& view_data = *(it->second.get());
139 const uint32_t scene_resource_id = 154 const uint32_t scene_resource_id =
140 kViewResourceIdBase + view_data.key * kViewResourceIdSpacing; 155 kViewResourceIdBase + view_data.key * kViewResourceIdSpacing;
141 const uint32_t container_node_id = 156 const uint32_t container_node_id =
142 kViewNodeIdBase + view_data.key * kViewNodeIdSpacing; 157 kViewNodeIdBase + view_data.key * kViewNodeIdSpacing;
143 const uint32_t scene_node_id = container_node_id + kViewSceneNodeIdOffset;
144 158
145 mojo::RectF extent; 159 mojo::RectF extent;
146 extent.width = view_data.layout_bounds.width; 160 extent.width = view_data.layout_bounds.width;
147 extent.height = view_data.layout_bounds.height; 161 extent.height = view_data.layout_bounds.height;
148 162
149 // Create a container to represent the place where the child view 163 // Create a container to represent the place where the child view
150 // will be presented. The children of the container provide 164 // will be presented. The children of the container provide
151 // fallback behavior in case the view is not available. 165 // fallback behavior in case the view is not available.
152 auto container_node = mojo::gfx::composition::Node::New(); 166 auto container_node = mojo::gfx::composition::Node::New();
153 container_node->content_clip = extent.Clone(); 167 container_node->content_clip = extent.Clone();
154 container_node->content_transform = mojo::Transform::New(); 168 container_node->content_transform = mojo::Transform::New();
155 SetTranslationTransform(container_node->content_transform.get(), 169 SetTranslationTransform(container_node->content_transform.get(),
156 view_data.layout_bounds.x, 170 view_data.layout_bounds.x,
157 view_data.layout_bounds.y, 0.f); 171 view_data.layout_bounds.y, 0.f);
158 container_node->combinator =
159 mojo::gfx::composition::Node::Combinator::FALLBACK;
160 172
161 // If we have the view, add it to the scene. 173 // If we have the view, add it to the scene.
162 if (view_data.view_info) { 174 if (view_data.view_info) {
163 auto scene_resource = mojo::gfx::composition::Resource::New(); 175 auto scene_resource = mojo::gfx::composition::Resource::New();
164 scene_resource->set_scene(mojo::gfx::composition::SceneResource::New()); 176 scene_resource->set_scene(mojo::gfx::composition::SceneResource::New());
165 scene_resource->get_scene()->scene_token = 177 scene_resource->get_scene()->scene_token =
166 view_data.view_info->scene_token.Clone(); 178 view_data.view_info->scene_token.Clone();
167 update->resources.insert(scene_resource_id, scene_resource.Pass()); 179 update->resources.insert(scene_resource_id, scene_resource.Pass());
168 180
181 const uint32_t scene_node_id = container_node_id + kViewSceneNodeIdOffset;
169 auto scene_node = mojo::gfx::composition::Node::New(); 182 auto scene_node = mojo::gfx::composition::Node::New();
170 scene_node->op = mojo::gfx::composition::NodeOp::New(); 183 scene_node->op = mojo::gfx::composition::NodeOp::New();
171 scene_node->op->set_scene(mojo::gfx::composition::SceneNodeOp::New()); 184 scene_node->op->set_scene(mojo::gfx::composition::SceneNodeOp::New());
172 scene_node->op->get_scene()->scene_resource_id = scene_resource_id; 185 scene_node->op->get_scene()->scene_resource_id = scene_resource_id;
173 scene_node->op->get_scene()->scene_version = view_data.scene_version; 186 if (params_.version_mode == TileParams::VersionMode::kExact)
187 scene_node->op->get_scene()->scene_version = view_data.scene_version;
174 update->nodes.insert(scene_node_id, scene_node.Pass()); 188 update->nodes.insert(scene_node_id, scene_node.Pass());
175 container_node->child_node_ids.push_back(scene_node_id); 189 container_node->child_node_ids.push_back(scene_node_id);
176 } 190 }
177 191
178 // TODO(jeffbrown): Reenable once everything works or make configurable. 192 if (params_.combinator_mode == TileParams::CombinatorMode::kPrune) {
179 if (false) { 193 container_node->combinator =
180 // Add the fallback scene content, use last available version. 194 mojo::gfx::composition::Node::Combinator::PRUNE;
181 const uint32_t fallback_node_id = 195 } else if (params_.combinator_mode ==
182 container_node_id + kViewFallbackSceneNodeIdOffset; 196 TileParams::CombinatorMode::kFallbackFlash) {
183 auto fallback_node = mojo::gfx::composition::Node::New(); 197 container_node->combinator =
184 fallback_node->op = mojo::gfx::composition::NodeOp::New(); 198 mojo::gfx::composition::Node::Combinator::FALLBACK;
185 fallback_node->op->set_scene(mojo::gfx::composition::SceneNodeOp::New()); 199
186 fallback_node->op->get_scene()->scene_resource_id = scene_resource_id; 200 const uint32_t color_node_id =
187 update->nodes.insert(fallback_node_id, fallback_node.Pass());
188 container_node->child_node_ids.push_back(fallback_node_id);
189 }
190 if (false) {
191 // Add the fallback color content, fill with solid color.
192 const uint32_t fallback_node_id =
193 container_node_id + kViewFallbackColorNodeIdOffset; 201 container_node_id + kViewFallbackColorNodeIdOffset;
194 auto fallback_node = mojo::gfx::composition::Node::New(); 202 auto color_node = mojo::gfx::composition::Node::New();
195 fallback_node->op = mojo::gfx::composition::NodeOp::New(); 203 color_node->op = mojo::gfx::composition::NodeOp::New();
196 fallback_node->op->set_rect(mojo::gfx::composition::RectNodeOp::New()); 204 color_node->op->set_rect(mojo::gfx::composition::RectNodeOp::New());
197 fallback_node->op->get_rect()->content_rect = extent.Clone(); 205 color_node->op->get_rect()->content_rect = extent.Clone();
198 fallback_node->op->get_rect()->color = 206 color_node->op->get_rect()->color = mojo::gfx::composition::Color::New();
199 mojo::gfx::composition::Color::New(); 207 color_node->op->get_rect()->color->red = 255;
200 fallback_node->op->get_rect()->color->red = 255; 208 color_node->op->get_rect()->color->alpha = 255;
201 fallback_node->op->get_rect()->color->alpha = 255; 209 update->nodes.insert(color_node_id, color_node.Pass());
202 update->nodes.insert(fallback_node_id, fallback_node.Pass()); 210 container_node->child_node_ids.push_back(color_node_id);
203 container_node->child_node_ids.push_back(fallback_node_id); 211 } else if (params_.combinator_mode ==
212 TileParams::CombinatorMode::kFallbackDim) {
213 container_node->combinator =
214 mojo::gfx::composition::Node::Combinator::FALLBACK;
215
216 const uint32_t dim_node_id =
217 container_node_id + kViewFallbackDimLayerNodeIdOffset;
218 auto dim_node = mojo::gfx::composition::Node::New();
219 dim_node->combinator = mojo::gfx::composition::Node::Combinator::PRUNE;
220 dim_node->op = mojo::gfx::composition::NodeOp::New();
221 dim_node->op->set_layer(mojo::gfx::composition::LayerNodeOp::New());
222 dim_node->op->get_layer()->layer_rect = extent.Clone();
223 dim_node->op->get_layer()->blend = mojo::gfx::composition::Blend::New();
224 dim_node->op->get_layer()->blend->alpha = 200;
225
226 if (view_data.view_info) {
227 const uint32_t scene_node_id =
228 container_node_id + kViewFallbackDimSceneNodeIdOffset;
229 auto scene_node = mojo::gfx::composition::Node::New();
230 scene_node->op = mojo::gfx::composition::NodeOp::New();
231 scene_node->op->set_scene(mojo::gfx::composition::SceneNodeOp::New());
232 scene_node->op->get_scene()->scene_resource_id = scene_resource_id;
233 update->nodes.insert(scene_node_id, scene_node.Pass());
234 dim_node->child_node_ids.push_back(scene_node_id);
235 }
236
237 update->nodes.insert(dim_node_id, dim_node.Pass());
238 container_node->child_node_ids.push_back(dim_node_id);
204 } 239 }
205 240
206 // Add the container. 241 // Add the container.
207 update->nodes.insert(container_node_id, container_node.Pass()); 242 update->nodes.insert(container_node_id, container_node.Pass());
208 root_node->child_node_ids.push_back(container_node_id); 243 root_node->child_node_ids.push_back(container_node_id);
209 } 244 }
210 245
211 // Add the root node. 246 // Add the root node.
212 update->nodes.insert(kRootNodeId, root_node.Pass()); 247 update->nodes.insert(kRootNodeId, root_node.Pass());
213 scene()->Update(update.Pass()); 248 scene()->Update(update.Pass());
214 249
215 // Publish the scene. 250 // Publish the scene.
216 auto metadata = mojo::gfx::composition::SceneMetadata::New(); 251 auto metadata = mojo::gfx::composition::SceneMetadata::New();
217 metadata->version = scene_version(); 252 metadata->version = scene_version();
218 scene()->Publish(metadata.Pass()); 253 scene()->Publish(metadata.Pass());
219 } 254 }
220 255
221 TileView::ViewData::ViewData(const std::string& url, uint32_t key) 256 TileView::ViewData::ViewData(const std::string& url, uint32_t key)
222 : url(url), key(key) {} 257 : url(url), key(key) {}
223 258
224 TileView::ViewData::~ViewData() {} 259 TileView::ViewData::~ViewData() {}
225 260
226 } // namespace examples 261 } // namespace examples
OLDNEW
« no previous file with comments | « examples/ui/tile/tile_view.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698