Playground: Using the Evaluator in the Filter Bar

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?

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.