From ca34894f22bef4b07b8bdcd91d6b018bdbe53dec Mon Sep 17 00:00:00 2001 From: "Alex A. Naanou" Date: Mon, 5 Oct 2020 16:03:22 +0300 Subject: [PATCH] export presets mostly done, still need testing and tweaking... Signed-off-by: Alex A. Naanou --- Viewer/features/filesystem.js | 117 +++++++++++++++------------------- Viewer/package-lock.json | 6 +- Viewer/package.json | 2 +- 3 files changed, 56 insertions(+), 69 deletions(-) diff --git a/Viewer/features/filesystem.js b/Viewer/features/filesystem.js index 50e9054a..8d8346ca 100755 --- a/Viewer/features/filesystem.js +++ b/Viewer/features/filesystem.js @@ -3105,21 +3105,12 @@ var FileSystemWriterUIActions = actions.Actions({ 'exportDialog: "images"'], - // XXX ASAP BUG: affecting preset name will delete on dialog close... - // to reproduce: - // - open dialog - // - edit preset changing path - // - close - // result: - // .config['export-presets'] will contain undefined instead - // of last preset - // likely cause: - // - inconsistent keys and on .close(..) we can't get the - // correct preset... + // XXX BUG: changing values from history (button) changes the default + // and not the current preset... + // ...bug in exportDialog(..) // XXX ASAP BUG: running a preset from the editor will use the default // settings and not the loaded preset... // ...can't reproduce... (revise) - // XXX ASAP handle presets with repeating titles... // XXX UI: // - element format: // TITLE @@ -3128,6 +3119,7 @@ var FileSystemWriterUIActions = actions.Actions({ // - button shortcuts... // XXX add a 'name' field to the exportDialog(..) (???) // XXX would be nice to mark/title sections -- presets / history... (???) + // XXX use UniqueKeyMap(..) in browse2's listers... exportPresets: ['- File/Export presets and history...', core.doc` `, @@ -3135,13 +3127,6 @@ var FileSystemWriterUIActions = actions.Actions({ var that = this var logger = this.logger && this.logger.push('exportPresets') - - // XXX use this as index... - // XXX use this in browse2... - var index = containers.UniqueKeyMap() - - - var getName = function(preset){ var date = preset.date && Date.fromTimeStamp(preset.date).toShortDate() @@ -3157,40 +3142,42 @@ var FileSystemWriterUIActions = actions.Actions({ `${ preset.mode }: ` +`"${ preset['preview-name-pattern'] }" → "${ preset.path }"${ clean }` : `${ preset.mode }: → "${ preset.path }"${ clean }`)) } - - var buildIndex = function(presets){ + var buildIndex = function(source){ var index return [ - // index... - (index = presets - .reduce(function(res, e, i){ - res[getName(e)] = i - return res }, {})), - // keys... - Object.keys(index), ] } - var getPreset = function(title, presets, index){ - return presets[index[title]] } + index = containers.UniqueKeyMap(source + .map(function(e){ + return [getName(e), e] })), + [...index.keys()], ] } + // presets... var presets = that.config['export-presets'] || [] - var [index, keys] = buildIndex(presets) + var [preset_index, preset_keys] = buildIndex(presets) - var updateIndex = function(){ - var [idx, k] = buildIndex(presets) - index = idx - // NOTE: keys must be updated in-place... - keys.splice(0, keys.length, ...k) } + var updateIndex = function(full=false){ + var k + ;[preset_index, k] = full ? + buildIndex(presets) + : [preset_index, [...preset_index.keys()]] + // NOTE: preset_keys must be updated in-place... + preset_keys.splice(0, preset_keys.length, ...k) } + var renamePreset = function(from, to){ + to = preset_index.rename(from, to, true) + // update keys... + preset_keys[preset_keys.indexOf(from)] = to + return to } // history... // NOTE: history is reversed in view... var history = (that.config['export-history'] || []) .slice() .reverse() - var [history_index, history_keys] = buildIndex(history) + var [history_index, history_keys] = buildIndex(history) return browse.makeLister(null, function(path, make){ // preset list... - keys.length > 0 - && make.EditableList(keys, { + preset_keys.length > 0 + && make.EditableList(preset_keys, { list_id: 'presets', sortable: true, update_merge: 'live', @@ -3198,17 +3185,18 @@ var FileSystemWriterUIActions = actions.Actions({ // saving an empty string on item edit will clear .name... allow_empty: true, itemedit: function(evt, from, to){ - var preset = getPreset(from, presets, index) + var preset = preset_index.get(from) // reset... if(to.trim() == ''){ delete preset.name - to = keys[keys.indexOf(from)] = getName(preset) + // XXX need to ignore .date here... + to = getName(preset) // set... } else { to = preset.name = to.trim() } - // update index... - index[to] = index[from] - delete index[from] + + to = renamePreset(from, to) + // select item... // NOTE: this is not done automatically because // we are changing the title .EditableList(..) @@ -3220,35 +3208,34 @@ var FileSystemWriterUIActions = actions.Actions({ // edit... ['edit', function(title){ - var preset = getPreset(title, presets, index) + var preset = preset_index.get(title) + var o = getName(preset) that.exportDialog(preset) .close(function(){ var n = getName(preset) // update the list if name is affected... - if(n != title){ - keys[keys.indexOf(title)] = n - index[n] = index[title] - delete index[title] + if(n != o){ + n = renamePreset(o, n) + make.dialog.select(n) make.dialog.update() } })}], // duplicate... //['', ['clone', function(title){ + // clone... var preset = JSON.parse( - JSON.stringify( - getPreset(title, presets, index) )) + JSON.stringify( preset_index.get(title) )) preset.name = title + ' (copy)' - // place preset in list... - var i = index[preset.name] = index[title]+1 - presets.splice(i, 0, preset) - keys.splice(keys.indexOf(title)+1, 0, preset.name) + // place new preset in list... + presets.splice(preset_keys.indexOf(title)+1, 0, preset) + updateIndex(true) make.dialog.update() }], ['♦', 'TO_TOP'], 'REMOVE'], // export... open: function(evt, title){ - var preset = getPreset(title, presets, index) + var preset = preset_index.get(title) // export only if we get a good preset... if(preset && getName(preset) == title){ console.log('>>>>>>>>>', preset) @@ -3265,7 +3252,7 @@ var FileSystemWriterUIActions = actions.Actions({ that.exportDialog() // new preset saved... .on('save-preset', function(){ - updateIndex() + updateIndex(true) make.dialog.update() }) // close dialog on export... .close(function(evt, reason){ @@ -3285,14 +3272,14 @@ var FileSystemWriterUIActions = actions.Actions({ // view... ['view', function(title){ - var preset = getPreset(title, history, history_index) + var preset = history_index.get(title) preset && that.exportDialog( // prevent editing history... JSON.parse(JSON.stringify( preset )) ) // new preset saved... .on('save-preset', function(){ - updateIndex() + updateIndex(true) make.dialog.update() }) // close dialog on export... .close(function(evt, reason){ @@ -3301,16 +3288,16 @@ var FileSystemWriterUIActions = actions.Actions({ // to preset... ['save', function(title){ - var preset = getPreset(title, history, history_index) + var preset = history_index.get(title) if(preset){ that.exportPresetSave(preset) - updateIndex() + updateIndex(true) make.dialog.update() } }], 'REMOVE', ], // export... open: function(evt, title){ - var preset = getPreset(title, history, history_index) + var preset = history_index.get(title) // export only if we get a good preset... if(preset && getName(preset) == title){ console.log('>>>>>>>>>', preset) @@ -3331,15 +3318,15 @@ var FileSystemWriterUIActions = actions.Actions({ // save things after we are done... .close(function(){ // update preset order and count... - that.config['export-presets'] = keys + that.config['export-presets'] = preset_keys .map(function(e){ - return getPreset(e, presets, index) }) + return preset_index.get(e) }) // handle history delete... history.length != that.config['export-history'] && (that.config['export-history'] = history_keys .reverse() .map(function(e){ - return getPreset(e, history, history_index) })) }) })], + return history_index.get(e) })) }) })], // XXX these do note need the ui -- move to a separate feature... // XXX these are essentially the same as the history API, make a diff --git a/Viewer/package-lock.json b/Viewer/package-lock.json index 614fb2c8..a0c7ef98 100755 --- a/Viewer/package-lock.json +++ b/Viewer/package-lock.json @@ -1112,9 +1112,9 @@ "integrity": "sha512-EzT4CP6d6lI8bnknNgT3W8mUQhSVXflO0yPbKD4dKsFcINiC6npjoEBz+8m3VQmWJhc+36pXD4JLwNxUEgzi+Q==" }, "ig-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ig-types/-/ig-types-2.0.1.tgz", - "integrity": "sha512-hiNlUxNvfgoSoH6r2P7Qn3v+W5IEuVIian7UqNK3zjCkZNiOn8XN6hNu7iHnFBoZcxT19+B4nQ6OnwXogGISag==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/ig-types/-/ig-types-2.0.4.tgz", + "integrity": "sha512-yIeuVShcgZZsK5wMWO/u24jmKJ1hKpXk53x+YpCK3vmI5IzdI8Q34Vk2bZBIiveSFZ4kwHzfBHEvFNbkUpjmYw==", "requires": { "ig-object": "^5.2.8", "object-run": "^1.0.1" diff --git a/Viewer/package.json b/Viewer/package.json index c319cf54..f9e63a45 100755 --- a/Viewer/package.json +++ b/Viewer/package.json @@ -31,7 +31,7 @@ "ig-argv": "^2.15.0", "ig-features": "^3.4.2", "ig-object": "^5.2.8", - "ig-types": "^2.0.1", + "ig-types": "^2.0.4", "moment": "^2.29.0", "object-run": "^1.0.1", "requirejs": "^2.3.6",