| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |