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

Unified Diff: mojo/services/view_manager/view_manager_connection.cc

Issue 327073003: Reorder (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 6 years, 6 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: 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) {
« no previous file with comments | « mojo/services/view_manager/view_manager_connection.h ('k') | mojo/services/view_manager/view_manager_connection_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698