Playground: Using the Evaluator in the Filter Bar

Note: This thread is a playground. It's not as tidy as others like in the buttons section. Go to the most recent posts to find the newest info. We'll do the cleanup later :slight_smile:


Opus 13.3.4 brings the Evaluator to the Filter Bar - that's even more seriously cool stuff. Two thumbs up!

Let's have a look

Here are a few tools that make exploring and playing with the new functionality a bit easier.

EditQuickFilter works best as a column header context menu. It lets you add the clicked column to the filter.

function OnInit(initData) {
    initData.name = 'EditQuickFilter';
    initData.version = '2024-03-04b';
    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 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 OnEditQuickFilter(scriptCmdData) {
    var cmd = scriptCmdData.func.command;
    var tab = scriptCmdData.func.sourcetab;
    var args = scriptCmdData.func.args;
    var dlg = scriptCmdData.func.Dlg();

    cmd.deselect = false;

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

    if (headerkey.match(/(^\d.*|.*[$:/]+.*)/)) headerkey = 'Val("' + headerkey + '")';

    var newFilter = tab.quickfilter.filter;

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

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

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

    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 + '"');
}

CommandEditQuickFilter.js.txt

The context menu button:

@label:"Edit QuickFilter with <b>" + headername + "</b>"
EditQuickFilter HEADERKEY={=headerkey=}

XML
<?xml version="1.0"?>
<button backcol="none" display="label" label_pos="right" separate="yes" textcol="none">
	<label>EditQuickFilter</label>
	<icon1>#newcommand</icon1>
	<function type="normal">
		<instruction>@label:&quot;Edit QuickFilter with &lt;b&gt;&quot; + headername + &quot;&lt;/b&gt;&quot;</instruction>
		<instruction>EditQuickFilter HEADERKEY={=headerkey=}</instruction>
	</function>
</button>

ClipCopy (get it here) has the new argument QUICKFILTER that copies the current filter to the clipboard, optionally in an xml format that can be pasted to a toolbar.

The toolbar button:

@keydown:none
ClipCopy QUICKFILTER

@keydown:ctrl
ClipCopy QUICKFILTER BUTTON
XML
<?xml version="1.0"?>
<button backcol="none" display="both" label_pos="right" textcol="none">
	<label>QuickFilter</label>
	<tip>Copy QuickFilter as command (Ctrl: as Button) to Clipboard</tip>
	<icon1>#clipcopy</icon1>
	<function type="normal">
		<instruction>@keydown:none</instruction>
		<instruction>ClipCopy QUICKFILTER</instruction>
		<instruction />
		<instruction>@keydown:ctrl</instruction>
		<instruction>ClipCopy QUICKFILTER BUTTON</instruction>
	</function>
</button>

Let's play and receive some feedback! :slight_smile:

7 Likes

Nice! No words!
What did I do wrong?
new eval

P.S. Aaahh! quotation marks! it works fine ext=="osp"

sorry, do your really upgrade your ClipCopy script?)))) no changes from summer 2023.

( 04/03/24 18:18 ClipCopy:
<< Clipboard has not been changed >>>)

P.S.
you're fast))) now works fine)

Update 2024-03-04b

  • EditQuickFilter: Added support for custom columns and 35mmfocallength.
2 Likes

((acts with body column of your OutlookMail script?
Val("scp:OutlookMail/Body")=="hello" - i've got nothing))
or maybe this only applies to search results or collections?

P.S.
it seems that filter MUST begin with
Match(name,"*sham*") && sizeauto>1gb
(i.e. Match must be the first)

thus doesn't work:
sizeauto>1gb && name=="sham"

Script columns should work ok. I've tried a few, and they were fine. The order of the statements shouldn't matter. However, I did notice that results can be inconsistent, so make sure to save the quickfilter, refresh the file display, and re-apply the quickfilter.

Really great script, it's so perfect to implement Excel-like filtering data function, and at the same time, together with ClipCopy script can also make the commonly used settings into buttons for easy subsequent calls. With EditQuickFilter script, other scripts seem less important.

How should I set up partial matching of column names, * doesn't work

two main issues for me:

  • can't filter by name only if i pre-filter as usual with * (it seems like partial match and Eval works together in a different way[video 2])
  • can't paste a button after ClipCopy is runed (syntax? video 3)

quick
quick2
quick3

thank you for your great work (first to DO team of course)

Yes! Without the evaluator, Crash is interpreted as *Crash*. For the clause name="Crash", the evaluator will only return true for that one file named Crash with no extension. That's why the script converts an existing filter with Match().

That's odd. Can't really tell from the video. Three small flickering gifs in a row are not that much fun to study. Maybe post mp4 files with decent fps next time. It's not 1995 anymore :wink:

Update 2024-03-06

  • EditQuickFilter: Added a dropdown dialog for built-in columns that contain 20 or less unique values. Another step towards Excel-fying Opus :slight_smile:

function OnInit(initData) {
    initData.name = 'EditQuickFilter';
    initData.version = '2024-03-06';
    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 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 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 + '")';
    } else {
        var hk = headerkey;
    }

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

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

    var filterValue = '';

    // no dropdown for unknown columns or those with too many different values
    if (vec.count && 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) + '"';
    }

    var newFilter = tab.quickfilter.filter;

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

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

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

    dlg.GetString('Edit QuickFilter:', newFilter);
    DOpus.Output(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 == '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 == 'desc') return item.metadata.other.desc;
    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 == 'duration') return item.metadata.audio.duration;
    else if (headerkey == 'duration') return item.metadata.video.duration;
    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 == 'ext') return item.ext;
    else if (headerkey == 'ext_m') return item.ext_m;
    else if (headerkey == 'extdir') return item.extdir;
    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 == 'intended use') return covArt;
    else if (headerkey == 'is_dir') return item.is_dir;
    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 == 'keywords') return item.metadata.other.keywords;
    else if (headerkey == 'label') return item.metadata.other.label;
    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 == 'metadata') return item.metadata;
    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 == 'mp3artist') return item.metadata.audio.mp3artist;
    else if (headerkey == 'mp3artist') return item.metadata.image.mp3artist;
    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 == 'rating') return item.metadata.other.rating;
    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 == 'status') return item.metadata.other.status;
    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;
}

CommandEditQuickFilter.js.txt

...and yes, I know, GetMetadataFromHeaderkey() needs a bit of manual editing :blush:

9 Likes

Update 2024-03-08

  • EditQuickFilter: Added support for Description, Tags, Label, Rating, and Status.

Rating stars equate as follows: 1..5 => 1, 25, 50, 75, 99. For a rating that is zero or missing, use an empty string. Values can be used with or without quotes, e.g. rating > "49".

Status seems to have only two states: no status = empty string, any status = "*".

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-08';
    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 + '")';
    } else {
        var hk = headerkey;
    }

    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
        }
    }

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

    var filterValue = '';

    // no dropdown for unknown columns or those with too many different values
    if (vec.count && 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) + '"';
    }

    var newFilter = tab.quickfilter.filter;

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

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

    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 == '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 == 'duration') return item.metadata.audio.duration;
    else if (headerkey == 'duration') return item.metadata.video.duration;
    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 == 'ext') return item.ext;
    else if (headerkey == 'ext_m') return item.ext_m;
    else if (headerkey == 'extdir') return item.extdir;
    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 == 'intended use') return covArt;
    else if (headerkey == 'is_dir') return item.is_dir;
    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 == 'metadata') return item.metadata;
    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 == 'mp3artist') return item.metadata.audio.mp3artist;
    else if (headerkey == 'mp3artist') return item.metadata.image.mp3artist;
    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;
}

CommandEditQuickFilter.js.txt

3 Likes

How can I get EditQuickFilter to appear in the Column Header Context Menu, Alexander? I've installed the script already.

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?