Playground: Using the Evaluator in the Filter Bar

The first posting contains the xml code that you can copy and paste to the context menu. It has remained unchanged.

I am sorry, Alexander. I am still not getting it. I see this

But in your screenshot I see EditQuickFilter, and I do not have that and I can't see how to make it appear.

In customize, right click on context menu > Insert New > New Button

Then:

Thank you but I'm still having trouble. I can see nowhere to right-click that will allow me to insert a new button.

Copy the xml code to the clipboard, then proceed like this:

I will try that this evening. Thank you.

Update 2024-03-15

  • EditQuickFilter: Implemented dropdown dialog support for all columns using a Rename script.
  • Outcommented line 95. Remove the comment signs if the file display is not updating correctly. And let us know, in which circumstances the error occurs.

How to set up

Save GetAnyColumn.orp to

%appdata%\GPSoftware\Directory Opus\Rename Presets

and CommandEditQuickFilter.js.txt to

%appdata%\GPSoftware\Directory Opus\Script AddIns

No changes are needed for the context menu.

Rename Preset

DOpus.vars.Set('columnValue', '');

function OnGetNewName(getNewNameData) {
    var tmp = getNewNameData.newname;
    if (!tmp) return true;

    // Undoing rename
    tmp = tmp.replace(/;/g, ':');
    tmp = tmp.replace(/!/g, '?');
    tmp = tmp.replace(/_/g, '/');

    var colVal = DOpus.vars.Get('columnValue');
    if (colVal) colVal += '\n';
    colVal += tmp;
    DOpus.vars.Set('columnValue', colVal);
    return true;
}

Script AddIn

function OnAddCommands(addCmdData) {
    var cmd = addCmdData.AddCommand();
    cmd.name = 'EditQuickFilter';
    cmd.method = 'OnEditQuickFilter';
    cmd.desc = 'cmd.desc';
    cmd.label = 'cmd.label';
    cmd.template = 'headerkey/k';
    cmd.hide = false;
    cmd.icon = 'script';
}

function OnInit(initData) {
    initData.name = 'EditQuickFilter';
    initData.version = '2024-03-15';
    initData.url = 'https://resource.dopus.com/t/playground-using-the-evaluator-in-the-filter-bar/49510';
    initData.desc = 'initData.desc';
    initData.default_enable = true;
    initData.min_version = '13.3.4';
}

function OnEditQuickFilter(scriptCmdData) {
    var cmd = scriptCmdData.func.command;
    var tab = scriptCmdData.func.sourcetab;
    var args = scriptCmdData.func.args;
    var dlg = scriptCmdData.func.Dlg();
    var vec = DOpus.Create().Vector();

    cmd.deselect = false;

    var evalMode = cmd.IsSet('Set QUICKFILTERFLAGS=evalon');
    var headerkey = args.headerkey;
    if (!headerkey) headerkey = '';

    if (headerkey.match(/(^\d.*|.*[$:/]+.*)/)) {
        var hk = 'Val("' + headerkey + '")';
        var fromProperties = false;
    } else {
        var hk = headerkey;
        var fromProperties = true;
    }

    if (fromProperties) {
        for (var e = new Enumerator(tab.all); !e.atEnd(); e.moveNext()) {
            var item = e.item();
            var md = GetMetadataFromHeaderkey(item, headerkey);
            if (!md) continue;

            if (DOpus.TypeOf(md) == 'object.Vector') {
                vec.append(md);
            } else {
                vec.push_back(String(md)); // might be a path object
            }
        }
    } else {
        cmd.SetFiles(tab.all);
        cmd.RunCommand('Rename' +
            ' PRESET=GetAnyColumn' +
            ' TO="{' + headerkey + '}"');

        vec.assign(DOpus.vars.Get('columnValue').split('\n'));
    }

    vec.unique();
    vec.sort();

    var filterValue = '';

    // no dropdown for unknown columns or those with too many different values
    if (vec.count > 0 && vec.count < 21) {
        var dlg2 = scriptCmdData.func.Dlg();
        dlg2.message = 'Please select a filter value:';
        dlg2.selection = 0;
        dlg2.choices = vec;
        // if (dlg2.Show()) filterValue = '"' + vec(dlg2.selection) + '"';
        if (dlg2.Show()) filterValue = vec(dlg2.selection);
    }

    var newFilter = tab.quickfilter.filter;

    if (!evalMode && newFilter) newFilter = 'Match(name,"*' + newFilter + '*")';

    if (newFilter) newFilter += ' && ';

    // if (hk) newFilter += hk + '==' + filterValue;
    if (hk) newFilter += hk + '=="' + filterValue + '"';

    dlg.GetString('Edit QuickFilter:', newFilter);

    if (dlg.result == 0) return;
    // if (dlg.input == newFilter) return;

    var newFilter = (typeof dlg.input == 'string') ? dlg.input.replace(/"/g, '""') : '';
    // DOpus.Output(newFilter);

    // cmd.RunCommand('Set QUICKFILTERCLEAR'); // shouldn't be needed, but without it the filter occasionally fails
    cmd.RunCommand('Set QUICKFILTERFLAGS=evalon QUICKFILTER="' + newFilter + '"');
}

function GetMetadataFromHeaderkey(item, headerkey) {
    if (false);

    else if (headerkey == 'desc') return item.metadata.other.autodesc;

    else if (headerkey == 'keywords') {
        var itemTags = item.metadata.tags;
        return itemTags.count ? itemTags : null;
    }

    else if (headerkey == 'label') {
        var itemLabels = item.Labels();
        return itemLabels.count ? itemLabels : null;
    }

    else if (headerkey == 'rating') {
        var rtg = item.metadata.other.rating;
        return rtg ? [1, 25, 50, 75, 99][rtg - 1] : null;
    }

    else if (headerkey == 'status') return '*';


    else if (headerkey.substring(0, 3) == 'ext') return item.ext.substring(1);
    // // else if (headerkey == 'ext_m') return item.ext_m;
    // // else if (headerkey == 'extdir') return item.extdir;

    else if (headerkey == 'mp3artists') return item.metadata.audio.mp3artists;
    // // else if (headerkey == 'mp3artist') return item.metadata.image.mp3artist;

    // else if (headerkey == 'duration') return item.metadata.audio.duration;
    // else if (headerkey == 'duration') return item.metadata.video.duration;

    else if (headerkey == '35mmfocallength') return item.metadata.image['35mmfocallength'];


    else if (headerkey == 'access') return item.access;
    else if (headerkey == 'access_utc') return item.access_utc;
    else if (headerkey == 'accessed') return item.accessed;
    else if (headerkey == 'accesseddate') return item.accesseddate;
    else if (headerkey == 'accessedtime') return item.accessedtime;
    else if (headerkey == 'album') return item.metadata.audio.album;
    else if (headerkey == 'albumartist') return item.metadata.audio.albumartist;
    else if (headerkey == 'altitude') return item.metadata.image.altitude;
    else if (headerkey == 'aperture') return item.metadata.image.aperture;
    else if (headerkey == 'apertureval') return item.metadata.image.apertureval;
    else if (headerkey == 'artist') return item.metadata.audio.artist;
    else if (headerkey == 'artist') return item.metadata.video.artist;
    else if (headerkey == 'aspectratio') return item.metadata.image.aspectratio;
    else if (headerkey == 'aspectratio') return item.metadata.video.aspectratio;
    else if (headerkey == 'attr') return item.attr;
    else if (headerkey == 'attr') return item.metadata.other.attr;
    else if (headerkey == 'attr_text') return item.attr_text;
    else if (headerkey == 'audiocodec') return item.metadata.audio.audiocodec;
    else if (headerkey == 'author') return item.metadata.doc.author;
    else if (headerkey == 'authorurl') return item.metadata.audio.authorurl;
    else if (headerkey == 'authorurl') return item.metadata.video.authorurl;
    else if (headerkey == 'autodesc') return item.metadata.other.autodesc;
    else if (headerkey == 'availability') return item.metadata.other.availability;
    else if (headerkey == 'bpm') return item.metadata.audio.bpm;
    else if (headerkey == 'bpm') return item.metadata.video.bpm;
    else if (headerkey == 'broadcastdate') return item.metadata.video.broadcastdate;
    else if (headerkey == 'cameramake') return item.metadata.image.cameramake;
    else if (headerkey == 'cameramodel') return item.metadata.image.cameramodel;
    else if (headerkey == 'category') return item.metadata.doc.category;
    else if (headerkey == 'cdaterel') return item.cdaterel;
    else if (headerkey == 'channel') return item.metadata.video.channel;
    else if (headerkey == 'checked') return item.checked;
    else if (headerkey == 'colorspace') return item.metadata.image.colorspace;
    else if (headerkey == 'comments') return item.metadata.doc.comments;
    else if (headerkey == 'company') return item.metadata.doc.company;
    else if (headerkey == 'companyname') return item.metadata.doc.companyname;
    else if (headerkey == 'companyname') return item.metadata.exe.companyname;
    else if (headerkey == 'compilation') return item.metadata.audio.compilation;
    else if (headerkey == 'composers') return item.metadata.audio.composers;
    else if (headerkey == 'composers') return item.metadata.video.composers;
    else if (headerkey == 'conductor') return item.metadata.audio.conductor;
    else if (headerkey == 'conductor') return item.metadata.video.conductor;
    else if (headerkey == 'conductors') return item.metadata.audio.conductors;
    else if (headerkey == 'contentgroup') return item.metadata.audio.contentgroup;
    else if (headerkey == 'contentgroup') return item.metadata.video.contentgroup;
    else if (headerkey == 'contentstatus') return item.metadata.doc.contentstatus;
    else if (headerkey == 'contenttype') return item.metadata.doc.contenttype;
    else if (headerkey == 'contrast') return item.metadata.image.contrast;
    else if (headerkey == 'coords') return item.metadata.image.coords;
    else if (headerkey == 'copyright') return item.metadata.audio.copyright;
    else if (headerkey == 'copyright') return item.metadata.doc.copyright;
    else if (headerkey == 'copyright') return item.metadata.exe.copyright;
    else if (headerkey == 'copyright') return item.metadata.image.copyright;
    else if (headerkey == 'create') return item.create;
    else if (headerkey == 'create_utc') return item.create_utc;
    else if (headerkey == 'created') return item.created;
    else if (headerkey == 'createddate') return item.createddate;
    else if (headerkey == 'createdtime') return item.createdtime;
    else if (headerkey == 'creator') return item.metadata.doc.creator;
    else if (headerkey == 'credits') return item.metadata.video.credits;
    else if (headerkey == 'current') return item.current;
    else if (headerkey == 'datarate') return item.metadata.video.datarate;
    else if (headerkey == 'datedigitized') return item.metadata.image.datedigitized;
    else if (headerkey == 'daterel') return item.daterel;
    else if (headerkey == 'datetaken') return item.metadata.image.datetaken;
    else if (headerkey == 'digitalzoom') return item.metadata.image.digitalzoom;
    else if (headerkey == 'dimensions') return item.metadata.image.dimensions;
    else if (headerkey == 'dimensions') return item.metadata.video.dimensions;
    else if (headerkey == 'dircount') return item.metadata.other.dircount;
    else if (headerkey == 'dircounttotal') return item.metadata.other.dircounttotal;
    else if (headerkey == 'directors') return item.metadata.video.directors;
    else if (headerkey == 'discnumber') return item.metadata.audio.discnumber;
    else if (headerkey == 'disksize') return item.disksize;
    else if (headerkey == 'disksizeauto') return item.disksizeauto;
    else if (headerkey == 'disksizekb') return item.disksizekb;
    else if (headerkey == 'disksizerel') return item.disksizerel;
    else if (headerkey == 'display_name') return item.display_name;
    else if (headerkey == 'doccreateddate') return item.metadata.doc.doccreateddate;
    else if (headerkey == 'docedittime') return item.metadata.doc.docedittime;
    else if (headerkey == 'doclastsavedby') return item.metadata.doc.doclastsavedby;
    else if (headerkey == 'doclastsaveddate') return item.metadata.doc.doclastsaveddate;
    else if (headerkey == 'encoder') return item.metadata.audio.encoder;
    else if (headerkey == 'encoder') return item.metadata.video.encoder;
    else if (headerkey == 'encodingsoftware') return item.metadata.audio.encodingsoftware;
    else if (headerkey == 'encodingsoftware') return item.metadata.video.encodingsoftware;
    else if (headerkey == 'episodename') return item.metadata.video.episodename;
    else if (headerkey == 'exposurebias') return item.metadata.image.exposurebias;
    else if (headerkey == 'exposureprogram') return item.metadata.image.exposureprogram;
    else if (headerkey == 'exposuretime') return item.metadata.image.exposuretime;
    else if (headerkey == 'failed') return item.failed;
    else if (headerkey == 'fileattr') return item.fileattr;
    else if (headerkey == 'filecount') return item.metadata.other.filecount;
    else if (headerkey == 'filecounttotal') return item.metadata.other.filecounttotal;
    else if (headerkey == 'flash') return item.metadata.image.flash;
    else if (headerkey == 'fnumber') return item.metadata.image.fnumber;
    else if (headerkey == 'focallength') return item.metadata.image.focallength;
    else if (headerkey == 'foldercontents') return item.metadata.other.foldercontents;
    else if (headerkey == 'fontname') return item.metadata.other.fontname;
    else if (headerkey == 'fourcc') return item.metadata.video.fourcc;
    else if (headerkey == 'framerate') return item.metadata.video.framerate;
    else if (headerkey == 'fullpath') return item.fullpath;
    else if (headerkey == 'genre') return item.metadata.audio.genre;
    else if (headerkey == 'genre') return item.metadata.video.genre;
    else if (headerkey == 'got_size') return item.got_size;
    else if (headerkey == 'gpsaltitude') return item.metadata.image.gpsaltitude;
    else if (headerkey == 'gpslatitude') return item.metadata.image.gpslatitude;
    else if (headerkey == 'gpslongitude') return item.metadata.image.gpslongitude;
    else if (headerkey == 'group') return item.metadata.other.group;
    else if (headerkey == 'id') return item.id;
    else if (headerkey == 'imagedesc') return item.metadata.image.imagedesc;
    else if (headerkey == 'imagequality') return item.metadata.image.imagequality;
    else if (headerkey == 'index') return item.metadata.other.index;
    else if (headerkey == 'initialkey') return item.metadata.audio.initialkey;
    else if (headerkey == 'instructions') return item.metadata.image.instructions;
    else if (headerkey == 'ishd') return item.metadata.video.ishd;
    else if (headerkey == 'isorating') return item.metadata.image.isorating;
    else if (headerkey == 'isospeed') return item.metadata.image.isospeed;
    else if (headerkey == 'isrepeat') return item.metadata.video.isrepeat;
    else if (headerkey == 'language') return item.metadata.doc.language;
    else if (headerkey == 'lastsavedby') return item.metadata.doc.lastsavedby;
    else if (headerkey == 'latitude') return item.metadata.image.latitude;
    else if (headerkey == 'lensmake') return item.metadata.image.lensmake;
    else if (headerkey == 'lensmodel') return item.metadata.image.lensmodel;
    else if (headerkey == 'lenstype') return item.metadata.image.lenstype;
    else if (headerkey == 'longitude') return item.metadata.image.longitude;
    else if (headerkey == 'macromode') return item.metadata.image.macromode;
    else if (headerkey == 'manager') return item.metadata.doc.manager;
    else if (headerkey == 'md5sum') return item.metadata.other.md5sum;
    else if (headerkey == 'meteringmode') return item.metadata.image.meteringmode;
    else if (headerkey == 'moddesc') return item.metadata.exe.moddesc;
    else if (headerkey == 'modified') return item.modified;
    else if (headerkey == 'modifieddate') return item.modifieddate;
    else if (headerkey == 'modifiedtime') return item.modifiedtime;
    else if (headerkey == 'modify') return item.modify;
    else if (headerkey == 'modify_utc') return item.modify_utc;
    else if (headerkey == 'modversion') return item.metadata.exe.modversion;
    else if (headerkey == 'mood') return item.metadata.audio.mood;
    else if (headerkey == 'mood') return item.metadata.video.mood;
    else if (headerkey == 'mp3album') return item.metadata.audio.mp3album;
    else if (headerkey == 'mp3albumartist') return item.metadata.audio.mp3albumartist;
    else if (headerkey == 'mp3bitrate') return item.metadata.audio.mp3bitrate;
    else if (headerkey == 'mp3bitrate') return item.metadata.video.mp3bitrate;
    else if (headerkey == 'mp3bpm') return item.metadata.audio.mp3bpm;
    else if (headerkey == 'mp3comment') return item.metadata.audio.mp3comment;
    else if (headerkey == 'mp3disc') return item.metadata.audio.mp3disc;
    else if (headerkey == 'mp3disk') return item.metadata.audio.mp3disk;
    else if (headerkey == 'mp3drm') return item.metadata.audio.mp3drm;
    else if (headerkey == 'mp3encoder') return item.metadata.audio.mp3encoder;
    else if (headerkey == 'mp3encodingsoftware') return item.metadata.audio.mp3encodingsoftware;
    else if (headerkey == 'mp3genre') return item.metadata.audio.mp3genre;
    else if (headerkey == 'mp3info') return item.metadata.audio.mp3info;
    else if (headerkey == 'mp3mode') return item.metadata.audio.mp3mode;
    else if (headerkey == 'mp3mode') return item.metadata.video.mp3mode;
    else if (headerkey == 'mp3samplerate') return item.metadata.audio.mp3samplerate;
    else if (headerkey == 'mp3samplerate') return item.metadata.video.mp3samplerate;
    else if (headerkey == 'mp3songlength') return item.metadata.audio.mp3songlength;
    else if (headerkey == 'mp3songlength') return item.metadata.video.mp3songlength;
    else if (headerkey == 'mp3title') return item.metadata.audio.mp3title;
    else if (headerkey == 'mp3track') return item.metadata.audio.mp3track;
    else if (headerkey == 'mp3type') return item.metadata.audio.mp3type;
    else if (headerkey == 'mp3type') return item.metadata.video.mp3type;
    else if (headerkey == 'mp3year') return item.metadata.audio.mp3year;
    else if (headerkey == 'name') return item.name;
    else if (headerkey == 'name_stem') return item.name_stem;
    else if (headerkey == 'name_stem_m') return item.name_stem_m;
    else if (headerkey == 'nsdesc') return item.metadata.other.nsdesc;
    else if (headerkey == 'orientation') return item.metadata.image.orientation;
    else if (headerkey == 'origartist') return item.metadata.audio.origartist;
    else if (headerkey == 'owner') return item.metadata.other.owner;
    else if (headerkey == 'pages') return item.metadata.doc.pages;
    else if (headerkey == 'parent') return item.parent;
    else if (headerkey == 'parentlocation') return item.parentlocation;
    else if (headerkey == 'parentpath') return item.parentpath;
    else if (headerkey == 'path') return item.path;
    else if (headerkey == 'pathlen') return item.pathlen;
    else if (headerkey == 'pathrel') return item.pathrel;
    else if (headerkey == 'picdepth') return item.metadata.audio.picdepth;
    else if (headerkey == 'picdepth') return item.metadata.image.picdepth;
    else if (headerkey == 'picdepth') return item.metadata.video.picdepth;
    else if (headerkey == 'picheight') return item.metadata.image.picheight;
    else if (headerkey == 'picheight') return item.metadata.video.picheight;
    else if (headerkey == 'picphyssize') return item.metadata.image.picphyssize;
    else if (headerkey == 'picphyssize') return item.metadata.video.picphyssize;
    else if (headerkey == 'picphysx') return item.metadata.image.picphysx;
    else if (headerkey == 'picphysy') return item.metadata.image.picphysy;
    else if (headerkey == 'picresx') return item.metadata.image.picresx;
    else if (headerkey == 'picresy') return item.metadata.image.picresy;
    else if (headerkey == 'picsize') return item.metadata.image.picsize;
    else if (headerkey == 'picsize') return item.metadata.video.picsize;
    else if (headerkey == 'picwidth') return item.metadata.image.picwidth;
    else if (headerkey == 'picwidth') return item.metadata.video.picwidth;
    else if (headerkey == 'prodname') return item.metadata.exe.prodname;
    else if (headerkey == 'producer') return item.metadata.doc.producer;
    else if (headerkey == 'producers') return item.metadata.video.producers;
    else if (headerkey == 'prodversion') return item.metadata.exe.prodversion;
    else if (headerkey == 'publisher') return item.metadata.audio.publisher;
    else if (headerkey == 'publisher') return item.metadata.video.publisher;
    else if (headerkey == 'realpath') return item.realpath;
    else if (headerkey == 'recordingtime') return item.metadata.video.recordingtime;
    else if (headerkey == 'releasedate') return item.metadata.audio.releasedate;
    else if (headerkey == 'releasedate') return item.metadata.video.releasedate;
    else if (headerkey == 'rotation') return item.metadata.image.rotation;
    else if (headerkey == 'saturation') return item.metadata.image.saturation;
    else if (headerkey == 'scenecapturetype') return item.metadata.image.scenecapturetype;
    else if (headerkey == 'scenemode') return item.metadata.image.scenemode;
    else if (headerkey == 'selected') return item.selected;
    else if (headerkey == 'sharpness') return item.metadata.image.sharpness;
    else if (headerkey == 'shasum') return item.metadata.other.shasum;
    else if (headerkey == 'shootingtime') return item.metadata.image.shootingtime;
    else if (headerkey == 'shortname') return item.shortname;
    else if (headerkey == 'shortpath') return item.shortpath;
    else if (headerkey == 'shutterspeed') return item.metadata.image.shutterspeed;
    else if (headerkey == 'size') return item.size;
    else if (headerkey == 'sizeauto') return item.sizeauto;
    else if (headerkey == 'sizekb') return item.sizekb;
    else if (headerkey == 'sizerel') return item.sizerel;
    else if (headerkey == 'software') return item.metadata.image.software;
    else if (headerkey == 'station') return item.metadata.video.station;
    else if (headerkey == 'subject') return item.metadata.doc.subject;
    else if (headerkey == 'subject') return item.metadata.image.subject;
    else if (headerkey == 'subjectdistance') return item.metadata.image.subjectdistance;
    else if (headerkey == 'subtitle') return item.metadata.audio.subtitle;
    else if (headerkey == 'subtitle') return item.metadata.video.subtitle;
    else if (headerkey == 'target') return item.metadata.other.target;
    else if (headerkey == 'target_type') return item.metadata.other.target_type;
    else if (headerkey == 'thumbnail') return item.metadata.other.thumbnail;
    else if (headerkey == 'title') return item.metadata.doc.title;
    else if (headerkey == 'title') return item.metadata.image.title;
    else if (headerkey == 'track') return item.metadata.audio.track;
    else if (headerkey == 'type') return item.metadata.other.type;
    else if (headerkey == 'usercomment') return item.metadata.other.usercomment;
    else if (headerkey == 'userdesc') return item.metadata.other.userdesc;
    else if (headerkey == 'videocodec') return item.metadata.video.videocodec;
    else if (headerkey == 'whitebalance') return item.metadata.image.whitebalance;
    else if (headerkey == 'writers') return item.metadata.video.writers;
    else if (headerkey == 'year') return item.metadata.audio.year;
    else if (headerkey == 'year') return item.metadata.video.year;

    return null;
}
1 Like

can you give any example for using GetAnyColumn with script?

Yes, the lines 55-60 in the main script use the preset. Outside of the scripting context the preset is fairly useless, it's just a workaround to get the column values.

1 Like

Update 2024-03-16

  • Converted the dropdown to a checkbox dialog. All checked items will be added to the evaluator clause (OR combined).
  • Added two alternative modes of getting shell and custom column values. Now there are the modes A, B, and C. They can be picked in the configuration menu. Which one works best for you?

:information_source: If you use the ExifTool Custom Columns with this script, make sure to let ExifTool create the cache before you apply any quick filter. Otherwise, Opus might hide the files without giving the script a chance to get a list of the files for which it's supposed to generate the cache.


Here's all you need, up to date:

The script

CommandEditQuickFilter.js.txt

The rename preset

GetAnyColumn.orp

The context menu

XML
<?xml version="1.0"?>
<button backcol="none" display="label" label_pos="right" textcol="none">
	<label>Edit QuickFilter with &lt;b&gt;%1&lt;/b&gt;</label>
	<icon1>#newcommand</icon1>
	<function type="normal">
		<instruction>@label:Format(original_label, %headername%)</instruction>
		<instruction>EditQuickFilter HEADERKEY=%headerkey%</instruction>
	</function>
</button>

The configuration button

XML
<?xml version="1.0"?>
<button backcol="none" display="both" label_pos="right" textcol="none">
	<label>Configuration EditQuickFilter</label>
	<tip>Open Configuration Dialog</tip>
	<icon1>#editprefs</icon1>
	<function type="normal">
		<instruction>Prefs SCRIPTS=CommandEditQuickFilter.js*</instruction>
	</function>
</button>
3 Likes

Does anyone know why Prefs SCRIPTS=EditQuickFilter.js* only brings up the Script Management dialog and not the script's configuration dialog? It works in all my other configurable scripts. What makes this one different?

Edit: It's CommandEditQuickFilter.js, for crying out loud! Pay attention, you fool!

Fantastic! This improves the usability significantly IMO! I increased the upper range before it skips showing the checkbox dialog to 200 as I have some larger folders but it can be rather unwieldy so I understand why that limitation is in place. You can quickly jump to L for example by pressing L but being able to directly filter the list via an auto-focused filter box at the top would be great. Not sure if it's possible currently though as no filter control exists yet. This is a good picture illustrating it:

image

Also this is probably outside your control but I noticed the color of the currently selected item in the checkbox list changes depending on whether you are using mouse or keyboard, which I taught was odd:

image

In the above image you can just barely see the color of the first item is different, it is the one selected.

Whereas with the mouse it looks like this:

image

In the theme tester, when using the keyboard to navigate it looks like the latter so I'm not sure what the source of the discrepancy is.

This is a really handy little utility. I've noticed that if I try and filter on 'User Description' as the first thing I do, I get this

17/03/2024 08:42 EditQuickFilter:  Error at line 411, position 39
17/03/2024 08:42 EditQuickFilter:  'metadata.other.userdesc' is null or not an object (0x800a138f)

However if it's not the first filter, eg I have already filtered on 'Label' then no such error happens. I glanced at the code and nothing jumped out.

Edit: A little poking around revealed it was barfing on a .mp4 file that wasn't actually a valid file. There was another file with a .log extension that was also causing a problem. Both of these were to do with filtering by userdesc.

Both the filter box and the colors in the check box are limits set by Opus. You are lucky to have colors at all: people who use Opus' light mode don't get to see any color changes :wink:

Nonetheless important info!

The headerkey for User Description is userdesc and there is item.metadata.other.userdesc, but the correct mapping seems to be item.metadata.other.usercomment (odd!).

Adding a line

else if (headerkey == 'userdesc') return item.metadata.other.usercomment;

in GetMetadataFromHeaderkey() somewhere after if (false); (line 145) makes the field work properly.

Maybe you need a try block to catch edge cases like that .mp4 file of mine that was 0 bytes in length?

Also, Alexander, is there a reason why it will go and read every file if I have asked it to filter on userdesc? I can see for labels that would be needed to generate the list of labels, but does it make sense for something like userdesc?

Wow!

I found some time to install this for the first time this morning starting with the latest version.
I'm having a blast with photo metadata columns.
I mean filter and view to determine what went right or wrong with photo shots.

Thanks again @lxp .

It's totally my use case, too!

I'll add some checks to avoid script errors.

Valid question! The script isn't smart enough yet to make this kind of decision. Here's a context menu button that let's you skip the dialog and copy the headerkey in the right format directly:

@evalalways:hk=Match(headerkey, "(^\d.*|.*[$:/]+.*)", "r") ? "Val(""" + headerkey + """)" : headerkey
@label:Format(original_label, hk)

Clipboard SET={=hk=}
XML
<?xml version="1.0"?>
<button backcol="none" display="label" label_pos="right" separate="yes" textcol="none">
	<label>Copy &lt;b&gt;%1&lt;/b&gt; to Clipboard</label>
	<icon1>#newcommand</icon1>
	<function type="normal">
		<instruction>@evalalways:hk=Match(headerkey, &quot;(^\d.*|.*[$:/]+.*)&quot;, &quot;r&quot;) ? &quot;Val(&quot;&quot;&quot; + headerkey + &quot;&quot;&quot;)&quot; : headerkey</instruction>
		<instruction>@label:Format(original_label, hk)</instruction>
		<instruction />
		<instruction>Clipboard SET={=hk=}</instruction>
	</function>
</button>
1 Like

I fixed it this way

try
{
    var md = GetMetadataFromHeaderkey(item, hk);
}
catch (error)
{
    continue;
}