| Index: mojo/services/view_manager/view_manager_connection.cc
|
| diff --git a/mojo/services/view_manager/view_manager_connection.cc b/mojo/services/view_manager/view_manager_connection.cc
|
| index 8d4d0a6438ec31f1a7336fed2ddfdb1d7ab66464..0c724bd77638faf2d208dd9dbe71ac98c6b7e594 100644
|
| --- a/mojo/services/view_manager/view_manager_connection.cc
|
| +++ b/mojo/services/view_manager/view_manager_connection.cc
|
| @@ -170,6 +170,23 @@ void ViewManagerConnection::ProcessNodeHierarchyChanged(
|
| NodesToINodes(to_send));
|
| }
|
|
|
| +void ViewManagerConnection::ProcessNodeReorder(const Node* node,
|
| + const Node* relative_node,
|
| + OrderDirection direction,
|
| + Id server_change_id,
|
| + bool originated_change) {
|
| + if (originated_change ||
|
| + !known_nodes_.count(NodeIdToTransportId(node->id())) ||
|
| + !known_nodes_.count(NodeIdToTransportId(relative_node->id()))) {
|
| + return;
|
| + }
|
| +
|
| + client()->OnNodeReordered(NodeIdToTransportId(node->id()),
|
| + NodeIdToTransportId(relative_node->id()),
|
| + direction,
|
| + server_change_id);
|
| +}
|
| +
|
| void ViewManagerConnection::ProcessNodeViewReplaced(
|
| const Node* node,
|
| const View* new_view,
|
| @@ -267,6 +284,36 @@ bool ViewManagerConnection::CanAddNode(const Node* parent,
|
| return (IsNodeDescendantOfRoots(child) || child->id().connection_id == id_);
|
| }
|
|
|
| +bool ViewManagerConnection::CanReorderNode(const Node* node,
|
| + const Node* relative_node,
|
| + OrderDirection direction) const {
|
| + if (!node || !relative_node)
|
| + return false;
|
| +
|
| + if (node->id().connection_id != id_)
|
| + return false;
|
| +
|
| + const Node* parent = node->GetParent();
|
| + if (!parent || parent != relative_node->GetParent())
|
| + return false;
|
| +
|
| + if (known_nodes_.count(NodeIdToTransportId(parent->id())) == 0)
|
| + return false;
|
| +
|
| + std::vector<const Node*> children = parent->GetChildren();
|
| + const size_t child_i =
|
| + std::find(children.begin(), children.end(), node) - children.begin();
|
| + const size_t target_i =
|
| + std::find(children.begin(), children.end(), relative_node) -
|
| + children.begin();
|
| + if ((direction == ORDER_ABOVE && child_i == target_i + 1) ||
|
| + (direction == ORDER_BELOW && child_i + 1 == target_i)) {
|
| + return false;
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| bool ViewManagerConnection::CanDeleteNode(const NodeId& node_id) const {
|
| return node_id.connection_id == id_;
|
| }
|
| @@ -553,6 +600,27 @@ void ViewManagerConnection::RemoveNodeFromParent(
|
| callback.Run(success);
|
| }
|
|
|
| +void ViewManagerConnection::ReorderNode(Id node_id,
|
| + Id relative_node_id,
|
| + OrderDirection direction,
|
| + Id server_change_id,
|
| + const Callback<void(bool)>& callback) {
|
| + bool success = false;
|
| + if (server_change_id == root_node_manager_->next_server_change_id()) {
|
| + Node* node = GetNode(NodeIdFromTransportId(node_id));
|
| + Node* relative_node = GetNode(NodeIdFromTransportId(relative_node_id));
|
| + if (CanReorderNode(node, relative_node, direction)) {
|
| + success = true;
|
| + RootNodeManager::ScopedChange change(
|
| + this, root_node_manager_,
|
| + RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID, false);
|
| + node->GetParent()->Reorder(node, relative_node, direction);
|
| + root_node_manager_->ProcessNodeReorder(node, relative_node, direction);
|
| + }
|
| + }
|
| + callback.Run(success);
|
| +}
|
| +
|
| void ViewManagerConnection::GetNodeTree(
|
| Id node_id,
|
| const Callback<void(Array<INodePtr>)>& callback) {
|
|
|