added experimental histogram/waveform to metadata view...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2020-05-15 16:46:36 +03:00
parent e1aecdfcf4
commit 9f4a378cc3
2 changed files with 95 additions and 9 deletions

View File

@ -3,10 +3,20 @@
// //
// XXX still thinking on how to package this correctly... // XXX still thinking on how to package this correctly...
// //
//---------------------------------------------------------------------
((typeof define)[0]=='u'?function(f){module.exports=f(require)}:define)
(function(require){ var module={} // make module AMD/node compatible...
//---------------------------------------------------------------------
var object = require('lib/object')
//--------------------------------------------------------------------- //---------------------------------------------------------------------
// image manipulation basics... // image manipulation basics...
var Filters = { var Filters =
module.Filters = {
makeCanvas: function(w, h){ makeCanvas: function(w, h){
var c = document.createElement('canvas') var c = document.createElement('canvas')
c.width = w c.width = w
@ -213,14 +223,23 @@ var Filters = {
//--------------------------------------------------------------------- //---------------------------------------------------------------------
// helpers... // helpers...
var WAVEFORM_SIZE = 1000 var WAVEFORM_SIZE =
var waveform = function(img, canvas, mode, color){ module.WAVEFORM_SIZE = 1000
var waveform =
module.waveform =
function(img, canvas, mode, color){
var d = Filters.getPixels(img, WAVEFORM_SIZE) var d = Filters.getPixels(img, WAVEFORM_SIZE)
var w = Filters.waveform(d, mode, color) var w = Filters.waveform(d, mode, color)
Filters.setPixels(canvas, w) } Filters.setPixels(canvas, w) }
var HISTOGRAM_SIZE = 1000
var histogram = function(img, canvas, mode, color){ var HISTOGRAM_SIZE =
module.HISTOGRAM_SIZE = 1000
var histogram =
module.histogram =
function(img, canvas, mode, color){
var d = Filters.getPixels(img) var d = Filters.getPixels(img)
var w = Filters.histogram(d, mode, color) var w = Filters.histogram(d, mode, color)
Filters.setPixels(canvas, w) } Filters.setPixels(canvas, w) }
@ -274,7 +293,9 @@ igImageGraph_template = `
<div class="controls"></div> <div class="controls"></div>
` `
var igImageGraph = var igImageGraph =
module.igImageGraph =
object.Constructor('igImageGraph', HTMLElement, { object.Constructor('igImageGraph', HTMLElement, {
template: 'ig-image-graph', template: 'ig-image-graph',
graphs: { graphs: {
@ -324,6 +345,7 @@ object.Constructor('igImageGraph', HTMLElement, {
this.update() }, this.update() },
get src(){ get src(){
return this.getAttribute('src') }, return this.getAttribute('src') },
// XXX make this async...
set src(value){ set src(value){
var that = this var that = this
this.__update_handler = this.__update_handler this.__update_handler = this.__update_handler
@ -425,6 +447,8 @@ object.Constructor('igImageGraph', HTMLElement, {
.forEach(function(button){ .forEach(function(button){
controls.appendChild(button) }) controls.appendChild(button) })
return this }, return this },
// XXX add option to update graph in a worker...
// XXX show a spinner while updating...
update: function(){ update: function(){
var that = this var that = this
var mode = this.mode var mode = this.mode
@ -458,7 +482,11 @@ window.customElements.define('ig-image-graph', igImageGraph)
//---------------------------------------------------------------------
// helper...
var makeImageGraph = var makeImageGraph =
module.makeImageGraph =
function(img, options){ function(img, options){
var g = document.createElement('ig-image-graph') var g = document.createElement('ig-image-graph')
Object.assign(g, Object.assign(g,
@ -469,5 +497,5 @@ function(img, options){
//--------------------------------------------------------------------- /**********************************************************************
// vim:set ts=4 sw=4 : * vim:set ts=4 sw=4 : */ return module })

View File

@ -14,6 +14,15 @@ if(typeof(process) != 'undefined'){
var fs = requirejs('fs') var fs = requirejs('fs')
var path = requirejs('path') var path = requirejs('path')
var exiftool = requirejs('exiftool') var exiftool = requirejs('exiftool')
// XXX EXPERIMENTAL: graph...
// XXX move this to ./components/
try {
// do this only if browser is loaded...
var graph = window != null ?
requirejs('experiments/ig-image-graph-obj')
: null
} catch(e){}
} }
@ -332,6 +341,13 @@ var MetadataUIActions = actions.Actions({
'Mime Type', 'Mime Type',
], ],
// XXX EXPERIMENTAL: graph...
'metadata-graph': true,
'metadata-graph-config': {
graph: 'waveform',
mode: 'color',
},
}, },
toggleMetadataAutoSelect: ['Interface/Metadata value auto-select', toggleMetadataAutoSelect: ['Interface/Metadata value auto-select',
@ -380,10 +396,36 @@ var MetadataUIActions = actions.Actions({
p.style.width = preview_size +'px' p.style.width = preview_size +'px'
}, },
}) } }) }
// XXX EXPERIMENTAL: graph
// XXX make this actually update the elem if it exists...
// XXX do the calculations in a worker...
make.dialog.updateGraph = function(gid, size){
if(!graph || !that.config['metadata-graph']){
return }
gid = that.data.getImage(gid || 'current')
var config = that.config['metadata-graph-config'] || {}
var url = that.images[gid].preview ?
that.images.getBestPreview(gid, size || 300, null, true).url
: that.getImagePath(gid)
var elem = this.graph =
this.graph ?
Object.assign(this.graph, config)
: graph.makeImageGraph(url, config)
Object.assign(elem.style, {
width: '500px',
height: '200px',
})
return elem }
// preview... // preview...
make(['Preview:', this.updatePreview()], make(['Preview:', this.updatePreview()],
{ cls: 'preview' }) { cls: 'preview' })
// XXX EXPERIMENTAL: graph
// graph...
graph
&& that.config['metadata-graph']
&& make(['Graph:', $(this.updateGraph())],
{ cls: 'preview' })
// NOTE: these are 1-based and not 0-based... // NOTE: these are 1-based and not 0-based...
make(['Position: ', make(['Position: ',
$('<small>') $('<small>')
@ -484,8 +526,16 @@ var MetadataUIActions = actions.Actions({
cls: 'table-view metadata-view', cls: 'table-view metadata-view',
showDisabled: false, showDisabled: false,
}) })
.on('attached', function(){ this.updatePreview() }) .on('attached', function(){
.on('update', function(){ this.updatePreview() }) this.updatePreview()
graph
&& this.updateGraph()
})
.on('update', function(){
this.updatePreview()
graph
&& this.updateGraph()
})
// select value of current item... // select value of current item...
.on('select', function(evt, elem){ .on('select', function(evt, elem){
that.config['metadata-auto-select-mode'] == 'on select' that.config['metadata-auto-select-mode'] == 'on select'
@ -495,6 +545,14 @@ var MetadataUIActions = actions.Actions({
// XXX // XXX
that.refresh(image) that.refresh(image)
// XXX EXPERIMENTAL: graph...
// save graph settings...
this.graph
&& (that.config['metadata-graph-config'] = {
graph: this.graph.graph,
mode: this.graph.mode,
})
}) })
})], })],