Playground: Using the Evaluator in the Filter Bar

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