From c987abac35b9a07a87839d228c9f27ed2b47cf25 Mon Sep 17 00:00:00 2001 From: "Alex A. Naanou" Date: Sun, 8 May 2016 18:27:59 +0300 Subject: [PATCH] refactored external editor... Signed-off-by: Alex A. Naanou --- ui (gen4)/Makefile | 3 +- ui (gen4)/features/app.js | 16 ++ ui (gen4)/features/external-editor.js | 398 +++++++++++++------------- 3 files changed, 216 insertions(+), 201 deletions(-) diff --git a/ui (gen4)/Makefile b/ui (gen4)/Makefile index 89f878ec..10bfc443 100755 --- a/ui (gen4)/Makefile +++ b/ui (gen4)/Makefile @@ -156,7 +156,7 @@ chrome-app: $(APP_ZIP) $(CHROME_APP_BUILD_DIR) # nwjs win64 -# XXX include exiftool... +# XXX include exiftool??? # XXX include scripts/utils??? win64: $(APP_ZIP) $(WIN_BUILD_DIR) rm -rf $(WIN_BUILD_DIR) @@ -169,7 +169,6 @@ win64: $(APP_ZIP) $(WIN_BUILD_DIR) chmod +x $(WIN_BUILD_DIR)/*.{exe,dll} cp -vR \ $(NODE_DIR) $(WIN_BUILD_DIR) - # XXX is this correct??? cp -vR "`which exiftool`" $(WIN_BUILD_DIR) # cleanup nwjs-sdk... rm -f $(WIN_BUILD_DIR)/nwsnapshot.exe \ diff --git a/ui (gen4)/features/app.js b/ui (gen4)/features/app.js index affa941d..bfaac2ee 100755 --- a/ui (gen4)/features/app.js +++ b/ui (gen4)/features/app.js @@ -7,6 +7,9 @@ define(function(require){ var module = {} //var DEBUG = DEBUG != null ? DEBUG : true +if(typeof(process) != 'undefined'){ + var pathlib = requirejs('path') +} var actions = require('lib/actions') var features = require('lib/features') @@ -154,6 +157,19 @@ var AppControlActions = actions.Actions({ nw.Window.get().showDevTools && nw.Window.get().showDevTools() }], + + // XXX should this be here??? + showInFolder: ['File|Image/Show in folder', + function(image){ + image = this.images[this.data.getImage(image)] + + var base = image.base_path || this.location.path + var filename = image.path + + path = pathlib.normalize(base + '/' + filename) + + nw.Shell.showItemInFolder(path) + }], }) diff --git a/ui (gen4)/features/external-editor.js b/ui (gen4)/features/external-editor.js index ee52affc..c0a6602d 100755 --- a/ui (gen4)/features/external-editor.js +++ b/ui (gen4)/features/external-editor.js @@ -38,7 +38,7 @@ var ExternalEditorActions = actions.Actions({ { // NOTE: empty means use app name... title: 'System default', - // NOTE: empty means system to select editor... + // NOTE: empty means system default editor... path: '', // NOTE: empty is the same as '$TARGET'... arguments: '', @@ -58,7 +58,7 @@ var ExternalEditorActions = actions.Actions({ // ...irfanview for instance does not understand '/' in paths // while windows in general have no problem... // XXX target is not yet used... - openInExtenalEditor: ['Edit/Open with external editor', + openInExtenalEditor: ['Edit|Image/Open with external editor', function(editor, image, type){ editor = editor || 0 editor = typeof(editor) == typeof('str') ? @@ -69,6 +69,7 @@ var ExternalEditorActions = actions.Actions({ if(editor == null){ // XXX ERR??? + console.error('Unknown editor') return } @@ -84,6 +85,7 @@ var ExternalEditorActions = actions.Actions({ var img = this.images[this.data.getImage(image)] if(img == null){ + console.error('No image data') return } @@ -92,8 +94,7 @@ var ExternalEditorActions = actions.Actions({ var full_path = img.base_path +'/'+ img.path // XXX is this portable enough??? - var path = requirejs('path') - full_path = path.normalize(full_path) + full_path = pathlib.normalize(full_path) editor = editor // XXX make '$' quotable.... @@ -128,12 +129,13 @@ module.ExternalEditor = core.ImageGridFeatures.Feature({ }) + //--------------------------------------------------------------------- var ExternalEditorUIActions = actions.Actions({ // XXX empty title -- use app name without ext... externalEditorDialog: ['- Edit/', - function(editor){ + widgets.makeUIDialog(function(editor){ var that = this editor = editor || 0 @@ -158,103 +160,102 @@ var ExternalEditorUIActions = actions.Actions({ var editor_i = this.config['external-editors'].indexOf(editor) - var o = overlay.Overlay(this.ribbons.viewer, - browse.makeLister(null, function(_, make){ - make(['Title: ', function(){ return editor.title || '' }]) - .on('open', function(){ - event.preventDefault() - widgets.makeEditableItem(o.client, $(this), - $(this).find('.text').last(), - function(_, text){ editor.title = text }) }) + var dialog = browse.makeLister(null, function(_, make){ + make(['Title: ', function(){ return editor.title || '' }]) + .on('open', function(){ + event.preventDefault() + widgets.makeEditableItem(dialog, $(this), + $(this).find('.text').last(), + function(_, text){ editor.title = text }) }) - make(['Path: ', function(){ return editor.path }], { - buttons: [ - ['browse', function(p){ - var e = this.filter('"'+p+'"', false) - var path = e.find('.text').last().text() - var txt = e.find('.text').first().text() + make(['Path: ', function(){ return editor.path }], { + buttons: [ + ['browse', function(p){ + var e = this.filter('"'+p+'"', false) + var path = e.find('.text').last().text() + var txt = e.find('.text').first().text() - var b = overlay.Overlay(that.ribbons.viewer, - browseWalk.makeWalk(null, path, - // XXX - '*+(exe|cmd|ps1|sh)', - {}) - // path selected... - .open(function(evt, path){ - editor.path = path + var b = overlay.Overlay(that.ribbons.viewer, + browseWalk.makeWalk(null, path, + // XXX + '*+(exe|cmd|ps1|sh)', + {}) + // path selected... + .open(function(evt, path){ + editor.path = path - b.close() + b.close() - o.client.update() - .then(function(){ o.client.select(txt+path) }) - })) - .close(function(){ - // XXX - that.getOverlay().focus() - }) - }] - ] - }) - .on('open', function(){ - event.preventDefault() - widgets.makeEditableItem(o.client, $(this), - $(this).find('.text').last(), - function(_, text){ editor.path = text }) }) + dialog.update() + .then(function(){ dialog.select(txt+path) }) + })) + .close(function(){ + // XXX + that.getOverlay().focus() + }) + }] + ] + }) + .on('open', function(){ + event.preventDefault() + widgets.makeEditableItem(dialog, $(this), + $(this).find('.text').last(), + function(_, text){ editor.path = text }) }) - make(['Arguments: ', function(){ return editor.arguments || '' }]) - .on('open', function(){ - event.preventDefault() - widgets.makeEditableItem(o.client, $(this), - $(this).find('.text').last(), - function(_, text){ editor.arguments = text }) }) + make(['Arguments: ', function(){ return editor.arguments || '' }]) + .on('open', function(){ + event.preventDefault() + widgets.makeEditableItem(dialog, $(this), + $(this).find('.text').last(), + function(_, text){ editor.arguments = text }) }) - make(['Target: ', - function(){ - return editor.target - || that.config['external-editor-targets'][0] }]) - .on('open', - widgets.makeNestedConfigListEditor(that, o, - 'external-editor-targets', - function(val){ - if(val == null){ - return editor.target - || that.config['external-editor-targets'][0] + make(['Target: ', + function(){ + return editor.target + || that.config['external-editor-targets'][0] }]) + .on('open', + widgets.makeNestedConfigListEditor(that, dialog.parent, + 'external-editor-targets', + function(val){ + if(val == null){ + return editor.target + || that.config['external-editor-targets'][0] - } else { - editor.target = val - || that.config['external-editor-targets'][0] - } - }, - { - new_button: false, - itemButtons: [], - })) + } else { + editor.target = val + || that.config['external-editor-targets'][0] + } + }, + { + new_button: false, + itemButtons: [], + })) - make(['Save']) - .on('open', function(){ - var editors = that.config['external-editors'] + make(['Save']) + .on('open', function(){ + var editors = that.config['external-editors'] - // updated editor... - if(editor_i >= 0){ - that.config['external-editors'] = editors.slice() + // updated editor... + if(editor_i >= 0){ + that.config['external-editors'] = editors.slice() - // new editor... - } else { - that.config['external-editors'] = editors.concat([editor]) - } + // new editor... + } else { + that.config['external-editors'] = editors.concat([editor]) + } - o.close() - }) - })) + dialog.parent.close() + }) + }) - o.client.dom.addClass('metadata-view tail-action') + dialog.dom.addClass('metadata-view tail-action') - return o - }], + return dialog + })], // XXX need to support $TARGET in args... // ...append if not present... - listExtenalEditors: ['Edit/List external editors', - function(){ + listExtenalEditors: ['Edit|Image/Choose external editor...', + widgets.makeUIDialog(function(){ var that = this var closingPrevented = false var editors = this.config['external-editors'] || [] @@ -269,122 +270,122 @@ var ExternalEditorUIActions = actions.Actions({ var to_remove = [] // build the dialog... - var o = overlay.Overlay(this.ribbons.viewer, - //browse.makeList(null, list, { - browse.makeLister(null, - function(_, make){ - editors - .forEach(function(e, i){ - make([function(){ return e.title || pathlib.basename(e.path)}]) - .on('open', function(){ - that.openInExtenalEditor(i) + var dialog = browse.makeLister(null, + function(_, make){ + + editors + .forEach(function(e, i){ + make([function(){ return e.title || pathlib.basename(e.path)}]) + .on('open', function(){ + that.openInExtenalEditor(i) + }) + .addClass(i == 0 ? 'selected' : '') + }) + + make(['Add new editor...']) + .on('open', function(){ + closingPrevented = true + var b = overlay.Overlay(that.ribbons.viewer, + browseWalk.makeWalk( + null, '/', + // XXX + '*+(exe|cmd|ps1|sh)', + {}) + // path selected... + .open(function(evt, path){ + // add a pretty name... + editors.push({ + path: path, + }) + that.config['external-editors'] = editors + + // is this the correct way to do this??? + b.close() + dialog.update()//.close() + //that.listExtenalEditors() + })) + .close(function(){ + dialog.parent.focus() }) - }) + return b + }) + }, + { + // add item buttons... + itemButtons: [ + // edit... + ['edit', + function(p){ + that.externalEditorDialog(p) + .on('close', function(){ + dialog.update() + }) + }], + // move to top... + ['♦', + function(p){ + var target = this.filter(0, false) + var cur = this.filter('"'+p+'"', false) - make(['Add new editor...']) - .on('open', function(){ - closingPrevented = true - var b = overlay.Overlay(that.ribbons.viewer, - browseWalk.makeWalk( - null, '/', - // XXX - '*+(exe|cmd|ps1|sh)', - {}) - // path selected... - .open(function(evt, path){ - // add a pretty name... - editors.push({ - path: path, - }) - that.config['external-editors'] = editors + var i = _getEditor(p) - // is this the correct way to do this??? - b.close() - o.client.update()//.close() - //that.listExtenalEditors() - })) - .close(function(){ - o.focus() - }) - return b - }) - }, - { - // add item buttons... - itemButtons: [ - // edit... - ['edit', - function(p){ - that.externalEditorDialog(p) - .close(function(){ - o.client.update() - }) - }], - // move to top... - ['♦', - function(p){ - var target = this.filter(0, false) - var cur = this.filter('"'+p+'"', false) + if(!target.is(cur)){ + target.before(cur) + editors.splice(0, 0, editors.splice(i, 1)[0]) - var i = _getEditor(p) + that.config['external-editors'] = editors + } + }], + // set secondary editor... + // XXX make a simpler icon.... + ['♦♦', + function(p){ + var target = this.filter(1, false) + var cur = this.filter('"'+p+'"', false) - if(!target.is(cur)){ - target.before(cur) - editors.splice(0, 0, editors.splice(i, 1)[0]) - - that.config['external-editors'] = editors - } - }], - // set secondary editor... - // XXX make a simpler icon.... - ['♦♦', - function(p){ - var target = this.filter(1, false) - var cur = this.filter('"'+p+'"', false) - - var i = _getEditor(p) - - if(!target.is(cur)){ - if(target.prev().is(cur)){ - target.after(cur) - } else { - target.before(cur) - } - editors.splice(1, 0, editors.splice(i, 1)[0]) - - that.config['external-editors'] = editors - } - }], - // mark for removal... - ['×', - function(p){ - if(p == that.config['external-editor-default']){ - return - } - - var e = this.filter('"'+p+'"', false) - .toggleClass('strike-out') - - if(e.hasClass('strike-out')){ - to_remove.indexOf(p) < 0 - && to_remove.push(p) + var i = _getEditor(p) + if(!target.is(cur)){ + if(target.prev().is(cur)){ + target.after(cur) } else { - var i = to_remove.indexOf(p) - if(i >= 0){ - to_remove.splice(i, 1) - } + target.before(cur) } - }], - ] }) - .open(function(evt){ - // close self if no dialog is triggered... - if(!closingPrevented){ - o.close() - } - closingPrevented = false - })) - .close(function(){ + editors.splice(1, 0, editors.splice(i, 1)[0]) + + that.config['external-editors'] = editors + } + }], + // mark for removal... + ['×', + function(p){ + if(p == that.config['external-editor-default']){ + return + } + + var e = this.filter('"'+p+'"', false) + .toggleClass('strike-out') + + if(e.hasClass('strike-out')){ + to_remove.indexOf(p) < 0 + && to_remove.push(p) + + } else { + var i = to_remove.indexOf(p) + if(i >= 0){ + to_remove.splice(i, 1) + } + } + }], + ] }) + .open(function(evt){ + // close self if no dialog is triggered... + if(!closingPrevented){ + dialog.parent.close() + } + closingPrevented = false + }) + .on('close', function(){ // remove elements marked for removal... to_remove.forEach(function(e){ if(e == that.config['external-editor-default']){ @@ -396,11 +397,10 @@ var ExternalEditorUIActions = actions.Actions({ }) }) - o.client.select(0) - o.client.dom.addClass('editor-list tail-action') + dialog.dom.addClass('editor-list tail-action') - return o - }], + return dialog + })], }) var ExternalEditorUI =