From 46cc5c23269d35292925d5ed4d1bd74f3a13a2ee Mon Sep 17 00:00:00 2001 From: coderaiser Date: Thu, 23 Jul 2015 09:05:11 -0400 Subject: [PATCH] feature(listeners) add ability to select files with shift+click --- lib/client/listeners.js | 74 +++++++++++++++++++++++++++++++++++------ 1 file changed, 63 insertions(+), 11 deletions(-) diff --git a/lib/client/listeners.js b/lib/client/listeners.js index 74878d5f..33da03bb 100644 --- a/lib/client/listeners.js +++ b/lib/client/listeners.js @@ -145,23 +145,27 @@ var Util, DOM, CloudFunc, CloudCmd; } function onClick(event) { - var ctrl = event.ctrlKey, - meta = event.metaKey; + var ctrl = event.ctrlKey; - if (!ctrl && !meta) + if (!ctrl) event.preventDefault(); - else - toggleSelect(ctrl, meta); changePanel(event.target); } - function toggleSelect(ctrl, meta) { - var Info = DOM.CurrentInfo, - isMac = /Mac/.test(window.navigator.platform); + function toggleSelect(key, files) { + var isMac = /Mac/.test(window.navigator.platform); - if (isMac && meta || ctrl) - DOM.toggleSelectedFile(Info.element); + if (!key) + throw Error('key should not be undefined!'); + + if (isMac && key.meta || key.ctrl) + DOM.toggleSelectedFile(files[0]); + else if (key.shift) + files.forEach(function(current) { + if (!DOM.isSelected(current)) + DOM.toggleSelectedFile(current); + }); } function changePanel(element) { @@ -247,8 +251,56 @@ var Util, DOM, CloudFunc, CloudCmd; } function setCurrentFileByEvent(event) { - var element = getLIElement(event.target); + var fromName, + toName, + files = [], + key = { + ctrl: event.ctrlKey, + meta: event.metaKey, + shift: event.shiftKey + }, + + element = getLIElement(event.target); + + fromName = Info.name; DOM.setCurrentFile(element); + toName = Info.name; + + if (key.shift) + files = getFilesRange(fromName, toName); + else + files.push(Info.element); + + toggleSelect(key, files); + } + + function getFilesRange(from, to) { + var i = 0, + delta = 0, + result = [], + files = [].slice.call(DOM.getFiles()), + names = DOM.getSelectedNames(files), + indexFrom, + indexTo; + + if (names[0] === '..') { + names.shift(); + delta = 1; + } + + indexFrom = names.indexOf(from); + indexTo = names.indexOf(to); + + if (indexFrom < indexTo) + for (i = indexFrom; i <= indexTo; i++) + result.push(files[i + delta]); + else if (indexFrom > indexTo) + for (i = indexFrom; i >= indexTo; i--) + result.push(files[i + delta]); + else + result.push(to); + + return result; } function contextMenu() {