Skip to content

Commit

Permalink
Merge pull request intel#74 from 01org/ctrl-drag-copy
Browse files Browse the repository at this point in the history
[Layout View] New Feature: Copy subtree on Ctrl-Drag of widgets
  • Loading branch information
sbryan committed Jun 20, 2012
2 parents 8f49951 + 4cff9bb commit 1830bdb
Showing 1 changed file with 98 additions and 84 deletions.
182 changes: 98 additions & 84 deletions src/js/composer.js
Expand Up @@ -279,6 +279,58 @@ $(function() {
}
};

var addNewNodeOnDrop = function (domParent, domChildren, adm, pid,
nodeRef, role, domNode) {
var newNode, domSibling, sid, admChildren, domIndex, debug;

debug = (window.top.$.rib && window.top.$.rib.debug());
domIndex = domChildren.index(domNode);

// Append first(only)/last child to this container
if (domIndex >= domChildren.length-1 || role === 'page') {
if (adm.addChild(pid, nodeRef, true)) {
newNode = adm.addChild(pid, nodeRef);
debug && console.log('Appended node',role);
newNode && adm.setSelected(newNode);
} else {
console.warn('Append child failed:',role);
}
} else if (domIndex > 0) {
// Insert nth child into this container
domSibling = $(domNode, domParent).prev('.adm-node');
sid = domSibling.attr('data-uid');
if (adm.insertChildAfter(sid, nodeRef, true)) {
newNode = adm.insertChildAfter(sid, nodeRef);
debug && console.log('Inserted nth node',role);
newNode && adm.setSelected(newNode);
} else {
console.warn('Insert nth child failed:',role);
}
} else {
// Add 1st child into an empty container
if (domChildren.length-1 <= 0) {
if (adm.addChild(pid, nodeRef, true)) {
newNode = adm.addChild(pid, nodeRef);
debug && console.log('Added 1st node',role);
newNode && adm.setSelected(newNode);
} else {
console.warn('Add 1st child failed:',role);
}
} else {
// Insert 1st child into non-empty container
admChildren = adm.toNode(pid).getChildren();
sid = admChildren.length && admChildren[0].getUid();
if (adm.insertChildBefore(sid, nodeRef, true)) {
newNode = adm.insertChildBefore(sid, nodeRef);
debug && console.log('Inserted 1st node', role);
newNode && adm.setSelected(newNode);
} else {
console.warn('Insert 1st child failed:', role);
}
}
}
};

window.top.$.rib = window.top.$.rib || {};
window.top.$.rib.dndfilter = dndfilter;

Expand Down Expand Up @@ -649,60 +701,16 @@ $(function() {

children = $($(this).sortable('option', 'items'), this)
.add(ui.item);
idx = children.index(ui.item);

// Append first(only)/last child to this container
if (idx >= children.length-1 || role === 'page') {
if (adm.addChild(pid, type, true)) {
node = adm.addChild(pid, type);
debug && console.log('Appended node',role);
if (node) adm.setSelected(node.getUid());
} else {
console.warn('Append child failed:',role);
}
} else if (idx > 0) {
// Insert nth child into this container
sibling = $(ui.item, this).prev('.adm-node');
sid = sibling.attr('data-uid');
if (adm.insertChildAfter(sid, type, true)) {
node = adm.insertChildAfter(sid, type);
debug && console.log('Inserted nth node',role);
if (node) adm.setSelected(node.getUid());
} else {
console.warn('Insert nth child failed:',role);
}
} else {
// Add 1st child into an empty container
if (children.length-1 <= 0) {
if (adm.addChild(pid, type, true)) {
node = adm.addChild(pid, type);
debug && console.log('Added 1st node',role);
if (node) adm.setSelected(node.getUid());
} else {
console.warn('Add 1st child failed:',role);
}
} else {
// Insert 1st child into non-empty container
sibling = children.not(ui.item).first();
sid = sibling.attr('data-uid');
if (adm.insertChildBefore(sid, type, true)) {
node = adm.insertChildBefore(sid, type);
debug && console.log('Inserted 1st node',
role);
if (node) adm.setSelected(node.getUid());
} else {
console.warn('Insert 1st child failed:',
role);
}
}
}
addNewNodeOnDrop(this, children, adm, pid, type,
role, ui.item);
ui.item.remove();
return;

// Sorted from layoutView: move a node
} else {
idx = ui.item.parent().children('.adm-node')
.index(ui.item);
children = ui.item.parent().children('.adm-node')
.add(ui.item);
idx = children.index(ui.item);
cid = ui.item.attr('data-uid');
// closest() will select current element if it matches
// the selector, so we start with its parent.
Expand All @@ -711,46 +719,52 @@ $(function() {
'.orig-adm-node.ui-sortable')
.attr('data-uid');
node = cid && root.findNodeByUid(cid);
newParent = pid && root.findNodeByUid(pid);
zones = newParent && bw.getZones(newParent.getType());
card = newParent && zones &&
bw.getZoneCardinality(newParent.getType(),
zones[0]);

// Notify the ADM that element has been moved
if ((zones && zones.length===1 && card !== '1')) {
if (!node ||
!adm.moveNode(node, newParent, zones[0],
idx)) {
console.warn('Move node failed');
ui.item.remove();
return false;
} else {
debug && console.log('Moved node');
if (node) adm.setSelected(node.getUid());
}
} else if (node && newParent &&
newParent.getType() === 'Header') {
for (var z=0; z < zones.length; z++) {
if (adm.moveNode(node, newParent, zones[z],
0, true)) {
newZone = zones[z];
break;
if (event && event.ctrlKey) {
node = adm.copySubtree(node); // Clone it
addNewNodeOnDrop(this, children, adm, pid, node,
role, ui.item);
} else {
newParent = pid && root.findNodeByUid(pid);
zones = newParent && bw.getZones(newParent.getType());
card = newParent && zones &&
bw.getZoneCardinality(newParent.getType(),
zones[0]);

// Notify the ADM that element has been moved
if ((zones && zones.length===1 && card !== '1')) {
if (!node ||
!adm.moveNode(node, newParent, zones[0],
idx)) {
console.warn('Move node failed');
ui.item.remove();
return false;
} else {
debug && console.log('Move node worked');
if (node) adm.setSelected(node.getUid());
}
} else if (node && newParent &&
newParent.getType() === 'Header') {
for (var z=0; z < zones.length; z++) {
if (adm.moveNode(node, newParent, zones[z],
0, true)) {
newZone = zones[z];
break;
}
}
if (newZone) {
adm.moveNode(node, newParent, newZone, 0);
debug && console.log('Move node worked');
if (node) adm.setSelected(node.getUid());
} else {
console.warn('Move node failed');
ui.item.remove();
return false;
}
}
if (newZone) {
adm.moveNode(node, newParent, newZone, 0);
debug && console.log('Moved node');
if (node) adm.setSelected(node.getUid());
} else {
console.warn('Move node failed');
console.warn('Move node failed: invalid zone');
ui.item.remove();
return false;
}
} else {
console.warn('Move node failed: invalid zone');
ui.item.remove();
return false;
}
}
}
Expand Down

0 comments on commit 1830bdb

Please sign in to comment.