Browse Source

Support multiple moving

multiple-select
Artur Arseniev 8 years ago
parent
commit
2b0a1df760
  1. 6
      src/commands/index.js
  2. 21
      src/commands/view/MoveComponent.js
  3. 16
      src/editor/model/Editor.js
  4. 31
      src/utils/Sorter.js

6
src/commands/index.js

@ -129,6 +129,7 @@ module.exports = () => {
const em = ed.getModel(); const em = ed.getModel();
const event = opts && opts.event; const event = opts && opts.event;
const sel = ed.getSelected(); const sel = ed.getSelected();
const selAll = [...ed.getSelectedAll()];
const toolbarStyle = ed.Canvas.getToolbarEl().style; const toolbarStyle = ed.Canvas.getToolbarEl().style;
const nativeDrag = event && event.type == 'dragstart'; const nativeDrag = event && event.type == 'dragstart';
@ -155,7 +156,7 @@ module.exports = () => {
const onEnd = (e, opts) => { const onEnd = (e, opts) => {
em.runDefault(); em.runDefault();
em.setSelected(sel); ed.select(selAll);
sel.emitUpdate(); sel.emitUpdate();
dragger && dragger.blur(); dragger && dragger.blur();
}; };
@ -184,7 +185,8 @@ module.exports = () => {
const cmdMove = ed.Commands.get('move-comp'); const cmdMove = ed.Commands.get('move-comp');
cmdMove.onEndMoveFromModel = onEnd; cmdMove.onEndMoveFromModel = onEnd;
cmdMove.initSorterFromModel(sel); // cmdMove.initSorterFromModel(sel);
cmdMove.initSorterFromModels(selAll);
} }
sel.set('status', 'freezed-selected'); sel.set('status', 'freezed-selected');

21
src/commands/view/MoveComponent.js

@ -81,6 +81,24 @@ module.exports = _.extend({}, SelectPosition, SelectComponent, {
on(this.getContentWindow(), 'keydown', this.rollback); on(this.getContentWindow(), 'keydown', this.rollback);
}, },
/**
* Init sorter from model
* @param {Object} model
* @private
*/
initSorterFromModels(models) {
// TODO: if one only check for `draggable`
// Avoid badge showing on move
this.cacheEl = null;
models = [...models];
const lastModel = models[models.length - 1];
const doc = this.frameEl.contentDocument;
this.startSelectPosition(lastModel.view.el, doc);
this.sorter.draggable = lastModel.get('draggable');
this.sorter.toMove = models.reverse();
this.sorter.onEndMove = this.onEndMoveFromModel.bind(this);
},
onEndMoveFromModel() { onEndMoveFromModel() {
off(this.getContentWindow(), 'keydown', this.rollback); off(this.getContentWindow(), 'keydown', this.rollback);
}, },
@ -142,8 +160,7 @@ module.exports = _.extend({}, SelectPosition, SelectComponent, {
this.getBadgeEl().removeClass(this.badgeClass); this.getBadgeEl().removeClass(this.badgeClass);
this.getHighlighterEl().removeClass(this.hoverClass); this.getHighlighterEl().removeClass(this.hoverClass);
var wp = this.$wrapper; var wp = this.$wrapper;
wp wp.css('cursor', '')
.css('cursor', '')
.unbind() .unbind()
.removeClass(this.noSelClass); .removeClass(this.noSelClass);
} }

16
src/editor/model/Editor.js

@ -1,4 +1,4 @@
import { isUndefined, defaults } from 'underscore'; import { isUndefined, defaults, isArray } from 'underscore';
import { getModel } from 'utils/mixins'; import { getModel } from 'utils/mixins';
const deps = [ const deps = [
@ -233,11 +233,17 @@ module.exports = Backbone.Model.extend({
* @private * @private
*/ */
setSelected(el, opts = {}) { setSelected(el, opts = {}) {
const model = getModel(el, $); const multiple = isArray(el);
if (model && !model.get('selectable')) return; const els = multiple ? el : [el];
const selected = this.get('selected'); const selected = this.get('selected');
selected.remove(selected.filter(sel => sel !== model)); multiple && selected.remove(selected.models);
this.addSelected(model, opts);
els.forEach(el => {
const model = getModel(el, $);
if (model && !model.get('selectable')) return;
!multiple && selected.remove(selected.filter(sel => sel !== model));
this.addSelected(model, opts);
});
}, },
/** /**

31
src/utils/Sorter.js

@ -1,6 +1,6 @@
import Backbone from 'backbone'; import Backbone from 'backbone';
import { isString, isFunction } from 'underscore'; import { isString, isFunction, isArray } from 'underscore';
import { on, off, matches } from 'utils/mixins'; import { on, off, matches, getElement } from 'utils/mixins';
const $ = Backbone.$; const $ = Backbone.$;
module.exports = Backbone.View.extend({ module.exports = Backbone.View.extend({
@ -482,9 +482,9 @@ module.exports = Backbone.View.extend({
* @param {HTMLElement} trg * @param {HTMLElement} trg
* @return {Boolean} * @return {Boolean}
*/ */
validTarget(trg) { validTarget(trg, src) {
let srcModel = this.getSourceModel(); let srcModel = this.getSourceModel(src);
let src = srcModel && srcModel.view && srcModel.view.el; src = srcModel && srcModel.view && srcModel.view.el;
let trgModel = this.getTargetModel(trg); let trgModel = this.getTargetModel(trg);
trg = trgModel && trgModel.view && trgModel.view.el; trg = trgModel && trgModel.view && trgModel.view.el;
let result = { let result = {
@ -925,11 +925,23 @@ module.exports = Backbone.View.extend({
} }
if (this.moved) { if (this.moved) {
created = this.move(this.target, src, this.lastPos); const toMove = this.toMove;
const onEndMove = this.onEndMove;
if (!toMove || !toMove.length) {
created = this.move(this.target, src, this.lastPos);
isFunction(onEndMove) && onEndMove(created, this);
} else {
const toMoveArr = isArray(toMove) ? toMove : [toMove];
toMoveArr.forEach(model => {
console.log('toMove', model);
created = this.move(this.target, model, this.lastPos);
isFunction(onEndMove) && onEndMove(created, this);
});
}
} }
if (this.plh) this.plh.style.display = 'none'; if (this.plh) this.plh.style.display = 'none';
if (isFunction(this.onEndMove)) this.onEndMove(created, this);
var dragHelper = this.dragHelper; var dragHelper = this.dragHelper;
if (dragHelper) { if (dragHelper) {
@ -949,11 +961,12 @@ module.exports = Backbone.View.extend({
* */ * */
move(dst, src, pos) { move(dst, src, pos) {
var em = this.em; var em = this.em;
em && em.trigger('component:dragEnd:before', dst, src, pos); // @depricated const srcEl = getElement(src);
em && em.trigger('component:dragEnd:before', dst, srcEl, pos); // @depricated
var warns = []; var warns = [];
var index = pos.index; var index = pos.index;
var modelToDrop, modelTemp, created; var modelToDrop, modelTemp, created;
var validResult = this.validTarget(dst); var validResult = this.validTarget(dst, srcEl);
var targetCollection = $(dst).data('collection'); var targetCollection = $(dst).data('collection');
var model = validResult.srcModel; var model = validResult.srcModel;
var droppable = validResult.droppable; var droppable = validResult.droppable;

Loading…
Cancel
Save