From 33eff763ed37e186d5271d4272bd6823cd4b371d Mon Sep 17 00:00:00 2001 From: kekee000 Date: Sat, 18 Apr 2015 00:43:47 +0800 Subject: [PATCH] modify selection --- src/fonteditor/controller/default.js | 15 ++-- src/fonteditor/widget/glyfviewer/binder.js | 86 ++++++++++++++++++++-- src/fonteditor/widget/glyfviewer/viewer.js | 1 + 3 files changed, 91 insertions(+), 11 deletions(-) diff --git a/src/fonteditor/controller/default.js b/src/fonteditor/controller/default.js index 867fee6..40bd853 100644 --- a/src/fonteditor/controller/default.js +++ b/src/fonteditor/controller/default.js @@ -375,7 +375,11 @@ define( }) .on('moveleft', function (e) { var editingIndex = program.viewer.getEditing(); - if (program.editor.isVisible() && editingIndex > 0) { + if (program.editor.isVisible()) { + if (editingIndex <= 0) { + editingIndex = program.ttfManager.get().glyf.length; + } + if (program.editor.isChanged() && !confirm('是否放弃保存当前编辑的字形?')) { return; } @@ -393,10 +397,11 @@ define( }) .on('moveright', function (e) { var editingIndex = program.viewer.getEditing(); - if (program.editor.isVisible() - && editingIndex >= 0 - && editingIndex < program.ttfManager.get().glyf.length - 1 - ) { + if (program.editor.isVisible()) { + if (editingIndex >= program.ttfManager.get().glyf.length - 1) { + editingIndex = -1; + } + if (program.editor.isChanged() && !confirm('是否放弃保存当前编辑的字形?')) { return; } diff --git a/src/fonteditor/widget/glyfviewer/binder.js b/src/fonteditor/widget/glyfviewer/binder.js index 4e5a5c2..f8b2abe 100644 --- a/src/fonteditor/widget/glyfviewer/binder.js +++ b/src/fonteditor/widget/glyfviewer/binder.js @@ -25,10 +25,15 @@ define( // 被选中的情况下需要移出 selectedGlyf.remove(); - var selectedIndex = this.selectedList.indexOf(selected); + var selectedIndex = this.getSelected().indexOf(selected); if (selectedIndex >= 0) { this.selectedList.splice(selectedIndex, 1); } + + if (selected === this.getEditing()) { + this.setEditing(-1); + } + } else if (action === 'edit') { this.setEditing(selected); @@ -137,13 +142,82 @@ define( function bindEvents() { var me = this; - me.main.on('click', '[data-index]', function (e) { - if (!e.target.getAttribute('data-action')) { - $(this).toggleClass('selected'); - me.fire('selection:change'); + me.main.on('click', '[data-action]', lang.bind(onItemClick, this)) + .on('dblclick', '[data-index]', function (e) { + if (!e.ctrlKey && !e.shiftKey && !e.target.getAttribute('data-action')) { + var selected = $(this).attr('data-index'); + me.setEditing(selected); + me.fire('edit', { + list: [selected] + }); } + }) + .on('click', '[data-index]', function (e) { + if (!e.target.getAttribute('data-action')) { + var selectedItems = null; + var element = this; + var the = $(element); - }).on('click', '[data-action]', lang.bind(onItemClick, this)); + // 选中单个 + if (!e.ctrlKey && !e.shiftKey) { + if (me.mode === 'editor') { + var selected = the.attr('data-index'); + me.setEditing(selected); + me.fire('edit', { + list: [selected] + }); + } + + selectedItems = me.main.find('.selected'); + if (the.hasClass('selected') && selectedItems.length === 1 && selectedItems[0] === element) { + return; + } + + selectedItems.removeClass('selected'); + the.addClass('selected'); + me.fire('selection:change'); + return; + } + + // 增加/减少选中 + if (e.ctrlKey) { + the.toggleClass('selected'); + me.fire('selection:change'); + return; + } + // 选中多个 + else if (e.shiftKey) { + selectedItems = Array.prototype.slice.call(me.main.find('.selected')); + the.addClass('selected'); + + if (!selectedItems.length) { + me.fire('selection:change'); + } + else if (selectedItems.indexOf(element) === -1) { + var index = +element.getAttribute('data-index'); + var nearest = null; + var distance = 0; + var minDistance = 0xFFFFFFFF; + + selectedItems.forEach(function (item) { + distance = Math.abs(index - item.getAttribute('data-index')); + if (distance < minDistance) { + nearest = item; + minDistance = distance; + } + }); + + if (minDistance > 1) { + nearest = index < +nearest.getAttribute('data-index') ? element : nearest; + for (distance = 1; distance < minDistance; distance++) { + $(nearest = nearest.nextElementSibling).addClass('selected'); + } + } + me.fire('selection:change'); + } + } + } + }); me.downlistener = lang.bind(downlistener, this); } diff --git a/src/fonteditor/widget/glyfviewer/viewer.js b/src/fonteditor/widget/glyfviewer/viewer.js index 12266c7..64ed818 100644 --- a/src/fonteditor/widget/glyfviewer/viewer.js +++ b/src/fonteditor/widget/glyfviewer/viewer.js @@ -223,6 +223,7 @@ define( */ GLYFViewer.prototype.setEditing = function (editingIndex) { this.clearEditing(); + editingIndex = +editingIndex; this.editingIndex = editingIndex >= 0 ? editingIndex : -1; if (editingIndex !== -1) { this.main.find('[data-index="' + editingIndex + '"]').addClass('editing');