Note: This thread is a playground. It's not as tidy as others like in the buttons section. Go to the most recent posts to find the newest info. We'll do the cleanup later
Opus 13.3.4 brings the Evaluator to the Filter Bar - that's even more seriously cool stuff. Two thumbs up!
Let's have a look
Here are a few tools that make exploring and playing with the new functionality a bit easier.
EditQuickFilter works best as a column header context menu. It lets you add the clicked column to the filter.
function OnInit(initData) {
initData.name = 'EditQuickFilter';
initData.version = '2024-03-04b';
initData.url = 'https://resource.dopus.com/t/playground-using-the-evaluator-in-the-filter-bar/49510';
initData.desc = 'initData.desc';
initData.default_enable = true;
initData.min_version = '13.3.4';
}
function OnAddCommands(addCmdData) {
var cmd = addCmdData.AddCommand();
cmd.name = 'EditQuickFilter';
cmd.method = 'OnEditQuickFilter';
cmd.desc = 'cmd.desc';
cmd.label = 'cmd.label';
cmd.template = 'headerkey/k';
cmd.hide = false;
cmd.icon = 'script';
}
function OnEditQuickFilter(scriptCmdData) {
var cmd = scriptCmdData.func.command;
var tab = scriptCmdData.func.sourcetab;
var args = scriptCmdData.func.args;
var dlg = scriptCmdData.func.Dlg();
cmd.deselect = false;
var evalMode = cmd.IsSet('Set QUICKFILTERFLAGS=evalon');
var headerkey = args.headerkey;
if (!headerkey) headerkey = '';
// DOpus.Output(headerkey);
if (headerkey.match(/(^\d.*|.*[$:/]+.*)/)) headerkey = 'Val("' + headerkey + '")';
var newFilter = tab.quickfilter.filter;
if (!evalMode && newFilter) newFilter = 'Match(name,"*' + newFilter + '*")';
if (newFilter) newFilter += ' && ';
if (headerkey) newFilter += headerkey + '==';
dlg.GetString('Edit QuickFilter:', newFilter);
if (dlg.result == 0) return;
if (dlg.input == newFilter) return;
var newFilter = (typeof dlg.input == 'string') ? dlg.input.replace(/"/g, '""') : '';
// DOpus.Output(newFilter);
cmd.RunCommand('Set QUICKFILTERCLEAR'); // shouldn't be needed, but without it the filter occasionally fails
cmd.RunCommand('Set QUICKFILTERFLAGS=evalon QUICKFILTER="' + newFilter + '"');
}
ClipCopy (get it here) has the new argument QUICKFILTER that copies the current filter to the clipboard, optionally in an xml format that can be pasted to a toolbar.
((acts with body column of your OutlookMail script?
Val("scp:OutlookMail/Body")=="hello" - i've got nothing))
or maybe this only applies to search results or collections?
P.S.
it seems that filter MUST begin with Match(name,"*sham*") && sizeauto>1gb
(i.e. Match must be the first)
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
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
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;
}
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.