From 46cc5c23269d35292925d5ed4d1bd74f3a13a2ee Mon Sep 17 00:00:00 2001 From: coderaiser Date: Thu, 23 Jul 2015 09:05:11 -0400 Subject: [PATCH 1/4] 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() { From b5ee03c816da14c66220627ac28f8d9d58c372df Mon Sep 17 00:00:00 2001 From: coderaiser Date: Thu, 23 Jul 2015 09:19:10 -0400 Subject: [PATCH 2/4] feature(dom) add unselectFiles --- lib/client/dom.js | 16 ++++++++++++++++ lib/client/key.js | 4 ++++ lib/client/listeners.js | 2 ++ 3 files changed, 22 insertions(+) diff --git a/lib/client/dom.js b/lib/client/dom.js index 8e903f32..1bd9a340 100644 --- a/lib/client/dom.js +++ b/lib/client/dom.js @@ -583,6 +583,22 @@ var CloudCmd, Util, DOM, CloudFunc, Dialog; return ret; }; + + /* + * unselect all files + */ + this.unselectFiles = function(files) { + var array, + isArray = Array.isArray(files); + + if (!files) { + array = DOM.getSelectedFiles(); + } else if (!isArray) + array = [].slice.call(files); + + array.forEach(DOM.toggleSelectedFile); + }; + /** * get all selected files with current included * diff --git a/lib/client/key.js b/lib/client/key.js index 2ebcd672..47e4baa8 100644 --- a/lib/client/key.js +++ b/lib/client/key.js @@ -367,6 +367,8 @@ var CloudCmd, Util, DOM; case Key.UP: if (shift) DOM.toggleSelectedFile(current); + else + DOM.unselectFiles(); DOM.setCurrentFile(prev); event.preventDefault(); @@ -377,6 +379,8 @@ var CloudCmd, Util, DOM; case Key.DOWN: if (shift) DOM.toggleSelectedFile(current); + else + DOM.unselectFiles(); DOM.setCurrentFile(next); event.preventDefault(); diff --git a/lib/client/listeners.js b/lib/client/listeners.js index 33da03bb..19416259 100644 --- a/lib/client/listeners.js +++ b/lib/client/listeners.js @@ -166,6 +166,8 @@ var Util, DOM, CloudFunc, CloudCmd; if (!DOM.isSelected(current)) DOM.toggleSelectedFile(current); }); + else + DOM.unselectFiles(); } function changePanel(element) { From 5b8a83c3984b6b23c1976c66f70287d986f5884a Mon Sep 17 00:00:00 2001 From: coderaiser Date: Thu, 23 Jul 2015 09:27:37 -0400 Subject: [PATCH 3/4] feature(key) rm unselectFiles --- lib/client/key.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/client/key.js b/lib/client/key.js index 47e4baa8..2ebcd672 100644 --- a/lib/client/key.js +++ b/lib/client/key.js @@ -367,8 +367,6 @@ var CloudCmd, Util, DOM; case Key.UP: if (shift) DOM.toggleSelectedFile(current); - else - DOM.unselectFiles(); DOM.setCurrentFile(prev); event.preventDefault(); @@ -379,8 +377,6 @@ var CloudCmd, Util, DOM; case Key.DOWN: if (shift) DOM.toggleSelectedFile(current); - else - DOM.unselectFiles(); DOM.setCurrentFile(next); event.preventDefault(); From 3e52f7f954b9a8423e274c00ea3cd3b39d637532 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Thu, 23 Jul 2015 10:22:43 -0400 Subject: [PATCH 4/4] feature(listeners) toggleSelect only when left mouse button --- lib/client/listeners.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/client/listeners.js b/lib/client/listeners.js index 19416259..e7aad33f 100644 --- a/lib/client/listeners.js +++ b/lib/client/listeners.js @@ -255,6 +255,7 @@ var Util, DOM, CloudFunc, CloudCmd; function setCurrentFileByEvent(event) { var fromName, toName, + BUTTON_LEFT = 0, files = [], key = { ctrl: event.ctrlKey, @@ -268,12 +269,13 @@ var Util, DOM, CloudFunc, CloudCmd; DOM.setCurrentFile(element); toName = Info.name; - if (key.shift) + if (key.shift) files = getFilesRange(fromName, toName); else files.push(Info.element); - - toggleSelect(key, files); + + if (event.button === BUTTON_LEFT) + toggleSelect(key, files); } function getFilesRange(from, to) {