|
|
|
@ -1,71 +1,71 @@ |
|
|
|
define(function(require) { |
|
|
|
/** |
|
|
|
* @class SelectComponent |
|
|
|
* @private |
|
|
|
* */ |
|
|
|
var ToolbarView = require('DomComponents/view/ToolbarView'); |
|
|
|
var Toolbar = require('DomComponents/model/Toolbar'); |
|
|
|
/** |
|
|
|
* @class SelectComponent |
|
|
|
* @private |
|
|
|
* */ |
|
|
|
var ToolbarView = require('DomComponents/view/ToolbarView'); |
|
|
|
var Toolbar = require('DomComponents/model/Toolbar'); |
|
|
|
|
|
|
|
return { |
|
|
|
return { |
|
|
|
|
|
|
|
init: function(o){ |
|
|
|
_.bindAll(this, 'onHover', 'onOut', 'onClick', 'onKeyPress'); |
|
|
|
}, |
|
|
|
init: function(o){ |
|
|
|
_.bindAll(this, 'onHover', 'onOut', 'onClick', 'onKeyPress'); |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
enable: function() { |
|
|
|
_.bindAll(this, 'copyComp', 'pasteComp', 'onFrameScroll'); |
|
|
|
this.frameOff = this.canvasOff = this.adjScroll = null; |
|
|
|
var config = this.config.em.get('Config'); |
|
|
|
this.startSelectComponent(); |
|
|
|
this.toggleClipboard(config.copyPaste); |
|
|
|
var em = this.config.em; |
|
|
|
enable: function() { |
|
|
|
_.bindAll(this, 'copyComp', 'pasteComp', 'onFrameScroll'); |
|
|
|
this.frameOff = this.canvasOff = this.adjScroll = null; |
|
|
|
var config = this.config.em.get('Config'); |
|
|
|
this.startSelectComponent(); |
|
|
|
this.toggleClipboard(config.copyPaste); |
|
|
|
var em = this.config.em; |
|
|
|
|
|
|
|
em.on('component:update', this.updateAttached, this); |
|
|
|
em.on('change:canvasOffset', this.updateAttached, this); |
|
|
|
em.on('change:selectedComponent', this.updateToolbar, this); |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Toggle clipboard function |
|
|
|
* @param {Boolean} active |
|
|
|
* @return {this} |
|
|
|
* @private |
|
|
|
*/ |
|
|
|
toggleClipboard: function(active){ |
|
|
|
var en = active || 0; |
|
|
|
if(en){ |
|
|
|
key('⌘+c, ctrl+c', this.copyComp); |
|
|
|
key('⌘+v, ctrl+v', this.pasteComp); |
|
|
|
}else{ |
|
|
|
key.unbind('⌘+c, ctrl+c'); |
|
|
|
key.unbind('⌘+v, ctrl+v'); |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Copy component to the clipboard |
|
|
|
* @private |
|
|
|
*/ |
|
|
|
copyComp: function() { |
|
|
|
var el = this.editorModel.get('selectedComponent'); |
|
|
|
if(el && el.get('copyable')) |
|
|
|
this.editorModel.set('clipboard', el); |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Paste component from clipboard |
|
|
|
* @private |
|
|
|
*/ |
|
|
|
pasteComp: function() { |
|
|
|
var clp = this.editorModel.get('clipboard'), |
|
|
|
sel = this.editorModel.get('selectedComponent'); |
|
|
|
if(clp && sel && sel.collection){ |
|
|
|
var index = sel.collection.indexOf(sel), |
|
|
|
clone = clp.clone(); |
|
|
|
sel.collection.add(clone, { at: index + 1 }); |
|
|
|
} |
|
|
|
}, |
|
|
|
em.on('change:canvasOffset', this.updateAttached, this); |
|
|
|
em.on('change:selectedComponent', this.updateToolbar, this); |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Toggle clipboard function |
|
|
|
* @param {Boolean} active |
|
|
|
* @return {this} |
|
|
|
* @private |
|
|
|
*/ |
|
|
|
toggleClipboard: function(active){ |
|
|
|
var en = active || 0; |
|
|
|
if(en){ |
|
|
|
key('⌘+c, ctrl+c', this.copyComp); |
|
|
|
key('⌘+v, ctrl+v', this.pasteComp); |
|
|
|
}else{ |
|
|
|
key.unbind('⌘+c, ctrl+c'); |
|
|
|
key.unbind('⌘+v, ctrl+v'); |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Copy component to the clipboard |
|
|
|
* @private |
|
|
|
*/ |
|
|
|
copyComp: function() { |
|
|
|
var el = this.editorModel.get('selectedComponent'); |
|
|
|
if(el && el.get('copyable')) |
|
|
|
this.editorModel.set('clipboard', el); |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Paste component from clipboard |
|
|
|
* @private |
|
|
|
*/ |
|
|
|
pasteComp: function() { |
|
|
|
var clp = this.editorModel.get('clipboard'), |
|
|
|
sel = this.editorModel.get('selectedComponent'); |
|
|
|
if(clp && sel && sel.collection){ |
|
|
|
var index = sel.collection.indexOf(sel), |
|
|
|
clone = clp.clone(); |
|
|
|
sel.collection.add(clone, { at: index + 1 }); |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Returns canavs body el |
|
|
|
@ -110,35 +110,35 @@ define(function(require) { |
|
|
|
cw[method]('keydown', this.onKeyPress); |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* On key press event |
|
|
|
* @private |
|
|
|
* */ |
|
|
|
onKeyPress: function(e) { |
|
|
|
var key = e.which || e.keyCode; |
|
|
|
var comp = this.editorModel.get('selectedComponent'); |
|
|
|
var focused = this.frameEl.contentDocument.activeElement.tagName !== 'BODY'; |
|
|
|
|
|
|
|
// On CANC (46) or Backspace (8)
|
|
|
|
if(key == 8 || key == 46) { |
|
|
|
if(!focused) |
|
|
|
e.preventDefault(); |
|
|
|
if(comp && !focused) { |
|
|
|
if(!comp.get('removable')) |
|
|
|
return; |
|
|
|
comp.set('status',''); |
|
|
|
comp.destroy(); |
|
|
|
this.hideBadge(); |
|
|
|
this.clean(); |
|
|
|
this.hideHighlighter(); |
|
|
|
this.editorModel.set('selectedComponent', null); |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
/** |
|
|
|
* On key press event |
|
|
|
* @private |
|
|
|
* */ |
|
|
|
onKeyPress: function(e) { |
|
|
|
var key = e.which || e.keyCode; |
|
|
|
var comp = this.editorModel.get('selectedComponent'); |
|
|
|
var focused = this.frameEl.contentDocument.activeElement.tagName !== 'BODY'; |
|
|
|
|
|
|
|
// On CANC (46) or Backspace (8)
|
|
|
|
if(key == 8 || key == 46) { |
|
|
|
if(!focused) |
|
|
|
e.preventDefault(); |
|
|
|
if(comp && !focused) { |
|
|
|
if(!comp.get('removable')) |
|
|
|
return; |
|
|
|
comp.set('status',''); |
|
|
|
comp.destroy(); |
|
|
|
this.hideBadge(); |
|
|
|
this.clean(); |
|
|
|
this.hideHighlighter(); |
|
|
|
this.editorModel.set('selectedComponent', null); |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Hover command |
|
|
|
* @param {Object} e |
|
|
|
* @param {Object} e |
|
|
|
* @private |
|
|
|
*/ |
|
|
|
onHover: function(e) { |
|
|
|
@ -147,8 +147,8 @@ define(function(require) { |
|
|
|
|
|
|
|
// Adjust tools scroll top
|
|
|
|
if(!this.adjScroll){ |
|
|
|
this.adjScroll = 1; |
|
|
|
this.onFrameScroll(e); |
|
|
|
this.adjScroll = 1; |
|
|
|
this.onFrameScroll(e); |
|
|
|
this.updateAttached(); |
|
|
|
} |
|
|
|
|
|
|
|
@ -160,7 +160,7 @@ define(function(require) { |
|
|
|
|
|
|
|
/** |
|
|
|
* Out command |
|
|
|
* @param {Object} e |
|
|
|
* @param {Object} e |
|
|
|
* @private |
|
|
|
*/ |
|
|
|
onOut: function(e) { |
|
|
|
@ -172,7 +172,7 @@ define(function(require) { |
|
|
|
|
|
|
|
/** |
|
|
|
* Show element offset viewer |
|
|
|
* @param {HTMLElement} el |
|
|
|
* @param {HTMLElement} el |
|
|
|
* @param {Object} pos |
|
|
|
*/ |
|
|
|
showElementOffset: function(el, pos) { |
|
|
|
@ -189,7 +189,7 @@ define(function(require) { |
|
|
|
|
|
|
|
/** |
|
|
|
* Hide element offset viewer |
|
|
|
* @param {HTMLElement} el |
|
|
|
* @param {HTMLElement} el |
|
|
|
* @param {Object} pos |
|
|
|
*/ |
|
|
|
hideElementOffset: function(el, pos) { |
|
|
|
@ -198,7 +198,7 @@ define(function(require) { |
|
|
|
|
|
|
|
/** |
|
|
|
* Show fixed element offset viewer |
|
|
|
* @param {HTMLElement} el |
|
|
|
* @param {HTMLElement} el |
|
|
|
* @param {Object} pos |
|
|
|
*/ |
|
|
|
showFixedElementOffset: function(el, pos) { |
|
|
|
@ -211,7 +211,7 @@ define(function(require) { |
|
|
|
|
|
|
|
/** |
|
|
|
* Hide fixed element offset viewer |
|
|
|
* @param {HTMLElement} el |
|
|
|
* @param {HTMLElement} el |
|
|
|
* @param {Object} pos |
|
|
|
*/ |
|
|
|
hideFixedElementOffset: function(el, pos) { |
|
|
|
@ -219,106 +219,110 @@ define(function(require) { |
|
|
|
this.editor.stopCommand('show-offset', {state: 'Fixed'}); |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Hide Highlighter element |
|
|
|
*/ |
|
|
|
hideHighlighter: function () { |
|
|
|
this.canvas.getHighlighter().style.display = 'none'; |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Hover command |
|
|
|
* @param {Object} e |
|
|
|
* @private |
|
|
|
*/ |
|
|
|
onClick: function(e) { |
|
|
|
var m = $(e.target).data('model'); |
|
|
|
if(!m) |
|
|
|
return; |
|
|
|
var s = m.get('stylable'); |
|
|
|
if(!(s instanceof Array) && !s) |
|
|
|
return; |
|
|
|
this.onSelect(e, e.target); |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Update badge for the component |
|
|
|
* @param {Object} Component |
|
|
|
* @param {Object} pos Position object |
|
|
|
* @private |
|
|
|
* */ |
|
|
|
updateBadge: function(el, pos) { |
|
|
|
var $el = $(el); |
|
|
|
this.cacheEl = el; |
|
|
|
var model = $el.data("model"); |
|
|
|
if(!model || !model.get('badgable')) |
|
|
|
return; |
|
|
|
var badge = this.getBadge(); |
|
|
|
badge.innerHTML = model.getName(); |
|
|
|
var bStyle = badge.style; |
|
|
|
var u = 'px'; |
|
|
|
bStyle.display = 'block'; |
|
|
|
var canvasPos = this.canvas.getCanvasView().getPosition(); |
|
|
|
var badgeH = badge ? badge.offsetHeight : 0; |
|
|
|
var badgeW = badge ? badge.offsetWidth : 0; |
|
|
|
var top = pos.top - badgeH < canvasPos.top ? canvasPos.top : pos.top - badgeH; |
|
|
|
var left = pos.left + badgeW < canvasPos.left ? canvasPos.left : pos.left; |
|
|
|
bStyle.top = top + u; |
|
|
|
bStyle.left = left + u; |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Update highlighter element |
|
|
|
* @param {HTMLElement} el |
|
|
|
* @param {Object} pos Position object |
|
|
|
* @private |
|
|
|
*/ |
|
|
|
updateHighlighter: function(el, pos) { |
|
|
|
var hlEl = this.canvas.getHighlighter(); |
|
|
|
var hlStyle = hlEl.style; |
|
|
|
var unit = 'px'; |
|
|
|
hlStyle.left = pos.left + unit; |
|
|
|
hlStyle.top = pos.top + unit; |
|
|
|
hlStyle.height = pos.height + unit; |
|
|
|
hlStyle.width = pos.width + unit; |
|
|
|
hlStyle.display = 'block'; |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Say what to do after the component was selected |
|
|
|
* @param {Object} e |
|
|
|
* @param {Object} el |
|
|
|
* @private |
|
|
|
* */ |
|
|
|
onSelect: function(e, el) { |
|
|
|
e.stopPropagation(); |
|
|
|
var md = this.editorModel.get('selectedComponent'); |
|
|
|
this.cleanPrevious(md); |
|
|
|
var $el = $(el); |
|
|
|
var nMd = $el.data('model'); |
|
|
|
if(nMd){ |
|
|
|
var mirror = nMd.get('mirror'); |
|
|
|
nMd = mirror ? mirror : nMd; |
|
|
|
|
|
|
|
// Close all opened components inside Navigator
|
|
|
|
var opened = this.em.get('opened'); |
|
|
|
for (var cid in opened){ |
|
|
|
var m = opened[cid]; |
|
|
|
m.set('open', 0); |
|
|
|
} |
|
|
|
var parent = nMd.collection ? nMd.collection.parent : null; |
|
|
|
while(parent) { |
|
|
|
parent.set('open', 1); |
|
|
|
opened[parent.cid] = parent; |
|
|
|
parent = parent.collection ? parent.collection.parent : null; |
|
|
|
} |
|
|
|
|
|
|
|
this.editorModel.set('selectedComponent', nMd); |
|
|
|
nMd.set('status','selected'); |
|
|
|
this.showFixedElementOffset(el); |
|
|
|
/** |
|
|
|
* Hide Highlighter element |
|
|
|
*/ |
|
|
|
hideHighlighter: function () { |
|
|
|
this.canvas.getHighlighter().style.display = 'none'; |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Hover command |
|
|
|
* @param {Object} e |
|
|
|
* @private |
|
|
|
*/ |
|
|
|
onClick: function(e) { |
|
|
|
var m = $(e.target).data('model'); |
|
|
|
if(!m) |
|
|
|
return; |
|
|
|
var s = m.get('stylable'); |
|
|
|
if(!(s instanceof Array) && !s) |
|
|
|
return; |
|
|
|
this.onSelect(e, e.target); |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Update badge for the component |
|
|
|
* @param {Object} Component |
|
|
|
* @param {Object} pos Position object |
|
|
|
* @private |
|
|
|
* */ |
|
|
|
updateBadge: function(el, pos) { |
|
|
|
var $el = $(el); |
|
|
|
this.cacheEl = el; |
|
|
|
var model = $el.data("model"); |
|
|
|
if(!model || !model.get('badgable')) |
|
|
|
return; |
|
|
|
var badge = this.getBadge(); |
|
|
|
badge.innerHTML = model.getName(); |
|
|
|
var bStyle = badge.style; |
|
|
|
var u = 'px'; |
|
|
|
bStyle.display = 'block'; |
|
|
|
var canvasPos = this.canvas.getCanvasView().getPosition(); |
|
|
|
var badgeH = badge ? badge.offsetHeight : 0; |
|
|
|
var badgeW = badge ? badge.offsetWidth : 0; |
|
|
|
var top = pos.top - badgeH < canvasPos.top ? canvasPos.top : pos.top - badgeH; |
|
|
|
var left = pos.left + badgeW < canvasPos.left ? canvasPos.left : pos.left; |
|
|
|
bStyle.top = top + u; |
|
|
|
bStyle.left = left + u; |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Update highlighter element |
|
|
|
* @param {HTMLElement} el |
|
|
|
* @param {Object} pos Position object |
|
|
|
* @private |
|
|
|
*/ |
|
|
|
updateHighlighter: function(el, pos) { |
|
|
|
var hlEl = this.canvas.getHighlighter(); |
|
|
|
var hlStyle = hlEl.style; |
|
|
|
var unit = 'px'; |
|
|
|
hlStyle.left = pos.left + unit; |
|
|
|
hlStyle.top = pos.top + unit; |
|
|
|
hlStyle.height = pos.height + unit; |
|
|
|
hlStyle.width = pos.width + unit; |
|
|
|
hlStyle.display = 'block'; |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Say what to do after the component was selected |
|
|
|
* @param {Object} e |
|
|
|
* @param {Object} el |
|
|
|
* @private |
|
|
|
* */ |
|
|
|
onSelect: function(e, el) { |
|
|
|
e.stopPropagation(); |
|
|
|
var md = this.editorModel.get('selectedComponent'); |
|
|
|
this.cleanPrevious(md); |
|
|
|
var $el = $(el); |
|
|
|
var nMd = $el.data('model'); |
|
|
|
if(nMd){ |
|
|
|
var em = this.em; |
|
|
|
var config = em.get('Config'); |
|
|
|
var mirror = nMd.get('mirror'); |
|
|
|
nMd = mirror ? mirror : nMd; |
|
|
|
|
|
|
|
// Close all opened components inside Navigator
|
|
|
|
var opened = em.get('opened'); |
|
|
|
for (var cid in opened){ |
|
|
|
var m = opened[cid]; |
|
|
|
m.set('open', 0); |
|
|
|
} |
|
|
|
var parent = nMd.collection ? nMd.collection.parent : null; |
|
|
|
while(parent) { |
|
|
|
parent.set('open', 1); |
|
|
|
opened[parent.cid] = parent; |
|
|
|
parent = parent.collection ? parent.collection.parent : null; |
|
|
|
} |
|
|
|
|
|
|
|
this.editorModel.set('selectedComponent', nMd); |
|
|
|
nMd.set('status','selected'); |
|
|
|
if(config.showOffsetsSelected) { |
|
|
|
this.showFixedElementOffset(el); |
|
|
|
} |
|
|
|
this.hideElementOffset(); |
|
|
|
} |
|
|
|
}, |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Update toolbar if the component has one |
|
|
|
@ -377,13 +381,13 @@ define(function(require) { |
|
|
|
toolbarStyle.left = leftPos + unit; |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Return canvas dimensions and positions |
|
|
|
* @return {Object} |
|
|
|
*/ |
|
|
|
getCanvasPosition: function () { |
|
|
|
return this.canvas.getCanvasView().getPosition(); |
|
|
|
}, |
|
|
|
/** |
|
|
|
* Return canvas dimensions and positions |
|
|
|
* @return {Object} |
|
|
|
*/ |
|
|
|
getCanvasPosition: function () { |
|
|
|
return this.canvas.getCanvasView().getPosition(); |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* Removes all highlighting effects on components |
|
|
|
|