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