// Global variable defaults d_all = false; d_clearoutput = false; d_dbg = false; d_editor1 = 'mspaint'; d_editor2 = 'photoshopelementseditor'; d_imagedesc = false; // Default is to use 2-pane template with no editable image description field d_info = false; // Default is not to start with information overlays enabled d_info_bg = '#FFFFB9'; // Default is a yellowish background for overlaid item meta information d_locateWith = DOpus.Create.Vector(0,"OSM","Google","Bing"); d_locateWithURL = DOpus.Create.Vector("https://www.openstreetmap.org/?mlat=","https://www.google.com/maps?q=","https://www.bing.com/maps?v=2&q="); d_max_collnames = 12; d_meta_delay = 512; d_nearby = true; d_nearby_collgeo = true; d_nearby_collname = 'nearby'; d_noconfirm = false; d_noconfirmmulti = false; d_preview_tooltip = true; d_thumb_delay = 512; d_OSMzoom = 17; d_precision = 3; // Default is 3 digit precision when searching with Everything for nearby images d_rpreview = DOpus.Create.Vector(0,"Next","Editor1","Editor2","View"); d_sound1 = "/windows/media/Windows Default.wav"; d_test = false; d_toptags = false; d_transparency = 128; // Hotkeys d_apply_key = "alt+a"; d_editor1_key = "alt+e"; d_editor2_key = "alt+f"; d_info_key = "f10"; // For consistency with DOpus standalone viewer d_locate_key = "alt+l"; d_next_key = "alt+x"; d_prefs_key = "alt+p"; d_prev_key = "alt+z"; d_quit_key = "alt+q"; d_refresh_key = "alt+r"; d_selected_key = "alt+s"; d_stars0_key = "alt+0"; d_stars1_key = "alt+1"; d_stars2_key = "alt+2"; d_stars3_key = "alt+3"; d_stars4_key = "alt+4"; d_stars5_key = "alt+5"; d_test_key = ""; d_view_key = "alt+v"; // Global constants and variables, identified by g_ prefix g_col = { black:"#000000", black_green:"#000000 #2D792B", black_red:"#000000 #FF0000", black_yellow:"#000000 #FFFF00", blue:"#0000FF", blue_yellow:"#0000FF #FFFF00", bg_default:"", bg_info:"#FFFFB9", fg_default:"", green:"#2D792B", purple:"#990070", qual:"#4060C0", red:"#FF0000", toggle:"#FFFF00", white:"#FFFFFF", white_blue:"#FFFFFF #0000FF", white_green:"#FFFFFF #2D792B", white_red:"#FFFFFF #FF0000", yellow:"#FFFF00" } g_fsu = DOpus.FSUtil; g_me = { name:'Filetags2', method:'Main', version:'v1.0 (25th March, 2025)', copyright:'(c) @aussieboykie', desc:'Simplified evolution of filetags with a resizeable dialog', minver:'13.13.5', // Adds support for tooltips on dialog controls. See https://resource.dopus.com/t/directory-opus-13-13-5-beta/54671 template:'ALL/S,CLEAROUTPUT/S,DEBUG/S,IMAGEDESC/S,NEARBY/S,NOCONFIRM/S,NOCONFIRMMULTI/S,PRECISION/N,TEST/S,TOPTAGS/S' } g_vScratch = DOpus.Create().Vector(); String.prototype.trim = function(s){s=s||"\\s";return this.replace(new RegExp("^("+s+"){1,}\|("+s+"){1,}$","g"),"");} // Code starts here function apply_meta(keyword,meta,multi) { var id = "apply_meta"; // e.g. apply_meta('tags';'+test;-junk',true) g_cmd.Clearfiles(); (multi) ? g_cmd.AddFiles(g_candidates) : g_cmd.AddFile(g_item); var msg = (multi) ? g_cmd.filecount+' items?' : g_item; var ask = ((multi) && (!g_noconfirmmulti)); if (ask) g_cmd.RunCommand('Play "'+g_sound1+'" QUIET'); var res = ((!g_noconfirm) || (ask)) ? g_promptdlg.Request('Apply '+keyword+' to '+msg,"Yes|No","Confirm?") : 1; if ((res == 0) && (multi)) {g_cmd.ClearFiles();g_cmd.AddFile(g_item);} log('keyword = '+keyword+' | g_cmd.filecount = '+g_cmd.filecount+' | g_item = '+g_item,id,g_col.blue); g_cmd.Clear(); var cmdstring = 'SetAttr META "'+keyword+':'+meta+'"'; log(cmdstring,id,g_col.black_yellow); g_cmd.AddLine(cmdstring); if (g_test) g_cmd.RunCommand('Play "'+g_sound1+'" QUIET'); // Do not execute in TEST mode else g_cmd.Run(); } function find_exe(exec,def) { var id = "find_exe"; var default_exec = (def) ? g_fsu.Resolve(def) : g_fsu.Resolve('/home/d8viewer.exe'); if (g_fsu.Exists(exec)) return g_fsu.Resolve(exec); if (!g_ei.isrunning) return default_exec; var v = DOpus.Create().Vector(); v = g_ei.Query('file:endwith:'+exec+'.exe'); if (v.count > 0) return String(v(0).fullpath); v = g_ei.Query('file:endwith:'+exec); if (v.count > 0) return String(v(0).fullpath); return default_exec; } function find_tags() { var id = "find_tags"; var str = g_promptdlg.GetString("Enter tags e.g. one two or one|two:","",0,"Search|Quit","Find files with matching tags"); if ((g_promptdlg.result == 0) || (str == "")) return; var tags = str.split('|'); var sep = (tags.length > 1) ? '|' : ' '; if (tags.length == 1) tags = str.split(' '); var querystr = 'tags:'+tags[0].trim(); for (var i = 1; i < tags.length; i++) querystr = querystr+sep+'tags:'+tags[i].trim(); g_cmd.clear(); g_cmd.addline('Go "'+g_cmd.source+'" NEW'); var cmdstr = '[Find COLLNAME="evquery" CLEAR QUERYENGINE=everythingglobal SHOWRESULTS=dest QUERY '+querystr+']'; log(cmdstr,id); g_cmd.addline(cmdstr); g_cmd.run(); } function get_meta() { var id = 'get_meta'; var metaType = String(g_item.metadata); g_vScratch.clear(); switch (metaType) { case 'image': return (g_item.metadata.image_text.imagedesc) ? g_item.metadata.image_text.imagedesc : ''; case 'audio': { if (g_item.metadata.audio_text.mp3artist) g_vScratch.push_back('Artist: '+g_item.metadata.audio_text.mp3artist); if (g_item.metadata.audio_text.mp3title) g_vScratch.push_back('Title: '+g_item.metadata.audio_text.mp3title); if (g_item.metadata.audio_text.mp3album) g_vScratch.push_back('Album: '+g_item.metadata.audio_text.mp3album); if (g_item.metadata.audio_text.mp3year) g_vScratch.push_back('Year: '+g_item.metadata.audio_text.mp3year); if (g_item.metadata.audio_text.mp3songlength) g_vScratch.push_back('Duration: '+g_item.metadata.audio_text.mp3songlength); if (g_item.metadata.audio_text.audiocodec) g_vScratch.push_back('Codec: '+g_item.metadata.audio_text.audiocodec); } case 'doc': { if (g_item.metadata.doc_text.author) g_vScratch.push_back('Author: '+g_item.metadata.doc_text.author); if (g_item.metadata.doc_text.subject) g_vScratch.push_back('Subject: '+g_item.metadata.doc_text.subject); } case 'exe': { if (g_item.metadata.exe_text.prodname) g_vScratch.push_back('Name: '+g_item.metadata.exe_text.prodname); if (g_item.metadata.exe_text.prodversion) g_vScratch.push_back('Version: '+g_item.metadata.exe_text.prodversion); if (g_item.metadata.exe_text.companyname) g_vScratch.push_back('Company: '+g_item.metadata.exe_text.companyname); if (g_item.metadata.exe_text.copyright) g_vScratch.push_back('Copyright: '+g_item.metadata.exe_text.copyright); if ((g_item.metadata.exe_text.moddesc) && (g_item.metadata.exe_text.moddesc != g_item.metadata.exe_text.prodname)) g_vScratch.push_back('Module: '+g_item.metadata.exe_text.moddesc); if ((g_item.metadata.exe_text.modversion) && (g_item.metadata.exe_text.modversion != g_item.metadata.exe_text.prodversion)) g_vScratch.push_back('Version: '+g_item.metadata.exe_text.modversion); } case 'video': { if (g_item.metadata.video_text.dimensions) g_vScratch.push_back('Dimensions: '+g_item.metadata.video_text.dimensions); if (g_item.metadata.video_text.duration) g_vScratch.push_back('Duration: '+g_item.metadata.video_text.duration); if (g_item.metadata.video_text.framerate) g_vScratch.push_back('Frame Rate: '+g_item.metadata.video_text.framerate); if (g_item.metadata.video_text.videocodec) g_vScratch.push_back('Video Codec: '+g_item.metadata.video_text.videocodec); if (g_item.metadata.video_text.audiocodec) g_vScratch.push_back('Audio Codec: '+g_item.metadata.video_text.audiocodec); } } var str = (g_vScratch.count > 0) ? g_vScratch(0) : ''; for (var i = 1; i < g_vScratch.count; i++) str+='\r\n'+g_vScratch(i); return str; } function load_preview(delay) { var id = 'load_preview'; if (typeof delay == 'number') {DOpus.Delay(delay);log(delay+' millisecond delay',id,g_col.red);} g_item = g_candidates(g_ix); g_item.Update(); log('g_item = '+g_item,id,g_col.blue); var ctl = g_dlg.control("sPreview") ctl.visible = false; ctl.rotate = 0; g_dlg.control('bLocate').enabled = false; var metaType = (g_item.metadata) ? String(g_item.metadata) : 'unknown'; var hasMeta = ((metaType != 'none') && (metaType != 'unknown')); if (!hasMeta) g_cmd.runcommand("Play \""+g_sound1+"\" QUIET"); // Warn that something may be wrong with the file if (g_template == 'dialog2') { var midGroup = g_dlg.control('groupMiddle'); var midEdit = g_dlg.control('editMiddle'); midEdit.value = ''; midEdit.enabled = false; switch (metaType) { case 'image': {midGroup.label = 'Image Description';midEdit.enabled = true;break;} case 'audio': {midGroup.label = 'Music Properties';break;} case 'video': {midGroup.label = 'Video Properties';break;} case 'doc': {midGroup.label = 'Document Properties';break;} default: {midGroup.label = 'metaType = '+metaType;} } } var isImage = ((g_item.InGroup("Images")) && (g_item.metadata == "image")); if (g_item.InGroup("Archives")) ctl.label = DOpus.LoadImage('/system/zipfldr.dll',200,200); else ctl.label = (isImage) ? DOpus.LoadImage(g_item) : DOpus.LoadThumbnail(g_item,g_thumb_delay,0,0,"ic"); var str = (g_ix + 1)+' of '+g_candidates.count; (g_candidates.count < g_cmd.sourcetab.files.count) ? str+=' selected' : str+=' items'; str+=' | '+g_item.size.fmt; if (g_item.groups.count > 0) { var typ = String(g_item.groups(0)); if (typ.slice(-1) == 's') typ = typ.slice(0,-1); str+=' '+typ; } var sfx = 'm '+g_item.modify.Format('D#yyyy-MM-dd T#HH:mm:ss'); if (isImage) { ctl.rotate = 0 - g_item.metadata.image.rotation; g_dlg.control('bLocate').enabled = (typeof g_item.metadata.image.latitude == 'number'); if (typeof g_item.metadata.image.picwidth == 'number') str+=' | '+g_item.metadata.image_text.dimensions; if (g_item.metadata.image.datetaken) sfx = 't '+g_item.metadata.image.datetaken.Format('D#yyyy-MM-dd T#HH:mm:ss'); } str+=' | '+sfx; maybe_show_info(); ctl.visible = true; g_dlg.control("group1").label = str g_dlg.control("groupPreview").label = g_item.name; g_dlg.control("sFullname").fg = ((hasMeta) && (g_item.metadata.other.target)) ? g_col.red : g_col.fg_default; // Flag symlinked files in red g_dlg.control("sFullname").label = ((hasMeta) && (g_item.metadata.other.target)) ? g_item.metadata.other.target : g_item; refresh_meta(); } function log(msg,pfx,col) { if (!g_dbg) return; var str = String(msg).trim(); if (pfx) str = "("+String(pfx)+") "+str; if (col) str = "<"+col+">"+str+""; //if (g_test) str = String(DOpus.Create().Date().Format("D#yyyy-MM-dd T#MHH:mm:ss","M"))+" "+str; DOpus.output(str); } function Main(ScriptCommandData) { var id = "Main"; g_func = ScriptCommandData.func g_cmd = g_func.command; g_cmd.deselect = false; g_sound1 = (g_fsu.Exists(Script.config.sound1)) ? g_fsu.Resolve(Script.config.sound1) : g_fsu.Resolve(d_sound1); if (!DOpus.version.AtLeast(g_me.minver)) { g_cmd.runcommand('Play "'+g_sound1+'" QUIET'); DOpus.output(g+me+' requires Directory Opus v'+g_me.minver+' or later. Current version is '+DOpus.Version.module,true); return; } g_argsmap = g_func.argsmap; g_cmdline = ScriptCommandData.cmdline; if ((g_cmdline.split(' ').length > 1) && (g_argsmap.count == 0)) { // If any command line option is not recognised, all command line options are discarded g_cmd.runcommand('Play "'+g_sound1+'" QUIET'); DOpus.Output('Invalid option specified on command line: '+g_cmdline,true); return; } g_promptdlg = g_cmd.sourcetab.Dlg(); var clearoutput = ((g_argsmap.exists("CLEAROUTPUT")) || (Script.config.clearoutput)); g_test = ((g_argsmap.exists("TEST")) || (Script.config.test)); g_dbg = ((g_argsmap.exists("DEBUG")) || (Script.config.debug) || (clearoutput) || (g_test)); if (g_dbg) g_cmd.RunCommand("Set Utility=OtherLog,On"); if (clearoutput) DOpus.ClearOutput(); log('Starting.. Command line is '+g_cmdline+' | qualifiers = '+g_func.qualifiers,id,g_col.white_green); log('Directory Opus version is '+DOpus.Version.module,id); log(g_me.name+' version is '+g_me.version,id); g_scriptname = Script.file.slice(Script.file.lastIndexOf('\\') + 1); log('Script filename is '+g_scriptname,id); if (g_test) { g_cmd.runcommand('Play "'+g_sound1+'" QUIET'); log('TEST mode is active. Changes will NOT be applied.',id,g_col.black_yellow); } if (Script.Vars.Exists ("lastrun")) log("Last run was "+Script.Vars.Get("lastrun"),id); g_ei = DOpus.Create().EverythingInterface(); if (g_ei.isrunning) log('Everything (voidtools) is running',id); else { log('Everything (voidtools) does not appear to be running!',id,g_col.red); g_cmd.runcommand('Play "'+g_sound1+'" QUIET'); } g_meta_delay = Math.max(Script.config.meta_delay,d_meta_delay); log("meta_delay = "+g_meta_delay+" milliseconds",id); g_thumb_delay = Math.max(Script.config.thumb_delay,d_thumb_delay); log("thumb_delay = "+g_thumb_delay+" milliseconds",id); g_editor1 = find_exe(Script.config.editor1); log("Editor1 = "+g_editor1,id); g_editor2 = find_exe(Script.config.editor2); log("Editor2 = "+g_editor2,id); g_imagedesc = ((g_argsmap.exists("IMAGEDESC")) || Script.config.imagedesc); log("Show editable image description field = "+g_imagedesc,id); g_info = Script.config.info; log('Start with item information overlay enabled = '+g_info,id); g_locateWithURL = Script.config.locatewithurl(Script.config.locatewith); log("Locate with "+g_locateWithURL,id); g_OSMzoom = Script.config.osmzoom; if (g_locateWithURL.toLowerCase().indexOf('openstreetmap') > 0) log("Open Street Map zoom level = "+g_OSMzoom,id); log("Right click preview action is "+d_rpreview(Script.config.rpreview + 1),id); g_noconfirm = ((g_argsmap.exists("NOCONFIRM")) || (Script.config.noconfirm)); log("Save individual file changes without prompting = "+g_noconfirm,id); g_noconfirmmulti = ((g_argsmap.exists("NOCONFIRMMULTI")) || (Script.config.noconfirmmulti)); log("Save multiple file changes without prompting = "+g_noconfirmmulti,id); g_toptags = ((g_argsmap.exists("TOPTAGS")) || (Script.config.toptags)); log("Show Tags panel above Usercomment panel = "+g_toptags,id); // Establish a detached dialog g_dlg = g_func.sourcetab.lister.Dlg(); g_template = (g_imagedesc) ? 'dialog2' : 'dialog1'; g_dlg.template = g_template; g_dlg.detach = true; g_dlg.LoadPosition(g_me.name); g_dlg.singleton = g_me.name; if (!g_dlg.Create()) { // Only allow one instance 'Play "'+g_sound1+'" QUIET'; log('Terminating. Instance already running..',id,g_col.white_red); return; } g_dlg.AddCustomMsg(g_me.name); // Enable receipt of custom messages DOpus.SendCustomMsg(g_me.name,1); // Trigger a custom event (initialise the detached dialog) if (Script.config.apply_key!=="") {g_dlg.AddHotKey("apply",Script.config.apply_key);log('"Apply" hotkey is '+Script.config.apply_key,id);} if (Script.config.info_key!=="") {g_dlg.AddHotKey("info",Script.config.info_key);log('"Info" hotkey is '+Script.config.info_key,id);} if (Script.config.locate_key!=="") {g_dlg.AddHotKey("locate",Script.config.locate_key);log('"Locate" hotkey is '+Script.config.locate_key,id);} if (Script.config.next_key!=="") {g_dlg.AddHotKey("next",Script.config.next_key);log('"Next" hotkey is '+Script.config.next_key,id);} if (Script.config.prefs_key!=="") {g_dlg.AddHotKey("prefs",Script.config.prefs_key);log('"Prefs" hotkey is '+Script.config.prefs_key,id);} if (Script.config.prev_key!=="") {g_dlg.AddHotKey("prev",Script.config.prev_key);log('"Prev" hotkey is '+Script.config.prev_key,id);} if (Script.config.quit_key!=="") {g_dlg.AddHotKey("quit",Script.config.quit_key);log('"Quit" hotkey is '+Script.config.quit_key,id);} if (Script.config.refresh_key!=="") {g_dlg.AddHotKey("refresh",Script.config.refresh_key);log('"Refresh" hotkey is '+Script.config.refresh_key,id);} if (Script.config.stars0_key!=="") {g_dlg.AddHotKey("stars0",Script.config.stars0_key);log('"Stars0" hotkey is '+Script.config.stars0_key,id);} if (Script.config.stars1_key!=="") {g_dlg.AddHotKey("stars1",Script.config.stars1_key);log('"Stars1" hotkey is '+Script.config.stars1_key,id);} if (Script.config.stars2_key!=="") {g_dlg.AddHotKey("stars2",Script.config.stars2_key);log('"Stars2" hotkey is '+Script.config.stars2_key,id);} if (Script.config.stars3_key!=="") {g_dlg.AddHotKey("stars3",Script.config.stars3_key);log('"Stars3" hotkey is '+Script.config.stars3_key,id);} if (Script.config.stars4_key!=="") {g_dlg.AddHotKey("stars4",Script.config.stars4_key);log('"Stars4" hotkey is '+Script.config.stars4_key,id);} if (Script.config.stars5_key!=="") {g_dlg.AddHotKey("stars5",Script.config.stars5_key);log('"Stars5" hotkey is '+Script.config.stars5_key,id);} if (Script.config.selected_key!=="") {g_dlg.AddHotKey("selected",Script.config.selected_key);log('"Selected" hotkey is '+Script.config.selected_key,id);} if (Script.config.test_key!=="") {g_dlg.AddHotKey("test",Script.config.test_key);log('"Test" hotkey is '+Script.config.test_key,id);} if (Script.config.editor1_key!=="") {g_dlg.AddHotKey("editor1",Script.config.editor1_key);log('"Image Editor #1" hotkey is '+Script.config.editor1_key,id);} if (Script.config.editor2_key!=="") {g_dlg.AddHotKey("editor2",Script.config.editor2_key);log('"Image Editor #2" hotkey is '+Script.config.editor2_key,id);} if (Script.config.view_key!=="") {g_dlg.AddHotKey("view",Script.config.view_key);log('"View" hotkey is '+Script.config.view_key,id);} var quitflag = false; do{ g_msg = g_dlg.getmsg(); // Wait for an event if (g_msg==false) break; var switchKey; if (g_msg.event=="tab") switchKey = "tab_"+g_msg.value; else switchKey = g_msg.event+"_"+g_msg.control; var str = 'switchKey = '+switchKey+', qualifiers = '+g_msg.qualifiers; if ((g_msg.event == 'focus') && (g_test)) log(str,id); else if (g_msg.event != 'focus') log(str+', had focus = '+g_msg.focus,id); if (g_msg.event=="invalid") break; if (g_msg.event=="focus") continue; switch (switchKey) { case "click_bQuit": {maybe_apply();quitflag = true;break;} case "click_bApply": {maybe_apply();break;} case "click_bNext": {maybe_move();break;} case "click_bPrev": {maybe_move(true);break;} case "hotkey_refresh": case "click_bRefresh": {(g_item.is_symlink) ? refresh_sourcetab() : refresh_meta(g_meta_delay);break;} case "click_bRate": {set_rating();break;} case "click_bLocate": {show_on_map();break;} case "click_bCollect": { var ctl = g_dlg.control("comboColl"); var collname = ctl.label; if (collname.trim(' ') == '') { collname = g_promptdlg.GetString('Specify a target collection name..',g_me.name,0,'Copy|Quit','Copy to Collection'); if (g_promptdlg.result == 0) collname = ''; } if (collname.trim(' ') != '') { g_cmd.Clearfiles(); (g_msg.qualifiers != "none") ? g_cmd.AddFiles(g_candidates) : g_cmd.AddFile(g_item); var res = ((g_cmd.filecount > 1) && (!g_noconfirmmulti)) ? g_promptdlg.Request('Copy '+g_cmd.filecount+' items to "coll://'+collname+'"?',"Yes|No","Copy multiple files?") : 1; if (res >0) { g_cmd.Clear(); var cmdstring = 'Copy CREATEFOLDER "coll://'+collname+'" WHENEXISTS=skip'; log(cmdstring,id,g_col.blue); g_cmd.AddLine(cmdstring); g_cmd.Run(); } var dli = ctl.GetItemByName(collname); if (dli) { if (dli.index >= 0) ctl.RemoveItem(dli); //ctl.RemoveItem(-1); // Developer use only } if (ctl.count == (d_max_collnames - 1)) ctl.RemoveItem(d_max_collnames - 1); ctl.InsertItemAt(0,collname); ctl.SelectItem(0); g_collnames.Clear(); for (var i = 0; i < ctl.count; i++) {g_collnames.push_back(ctl.GetItemAt(i));} } break;} case "click_bFind": {find_tags();break;} case "custom_"+g_me.name: { // Runs once to initialise things g_dlg.title = g_me.name+" "+g_me.version+" viewing folder "+g_cmd.sourcetab.path; if (g_cmd.sourcetab.selected_files.count == 0) g_candidates = g_cmd.sourcetab.files; else if (g_func.qualifiers == "shift") g_candidates = ((g_argsmap.exists('ALL')) || (Script.config.all)) ? g_cmd.sourcetab.selected_files : g_cmd.sourcetab.files; else g_candidates = ((g_argsmap.exists('ALL')) || (Script.config.all)) ? g_cmd.sourcetab.files : g_cmd.sourcetab.selected_files; g_dlg.control('groupTop').title = (g_toptags) ? "Tags" : "User Comment"; g_dlg.control('groupBottom').title = (g_toptags) ? "User Comment" : "Tags"; if (Script.config.preview_tooltip) { var sfx = d_rpreview(Script.config.rpreview + 1); if (sfx == 'Next') sfx = 'Move to next item. Qualifier+RMB to move to Previous item.'; var pfx = 'LMB: Open in viewer.'; if (Script.config.view_key !='') pfx+=' ('+Script.config.view_key+')'; pfx+='\n- Shift+LMB to open with Editor1.'; if (Script.config.editor1_key !='') pfx+=' ('+Script.config.editor1_key+')'; pfx+='\n- Ctrl+LMB to open with Editor2.'; if (Script.config.editor2_key !='') pfx+=' ('+Script.config.editor2_key+')'; g_dlg.control("sPreview").SetTooltip(pfx+'\nRMB: '+sfx); } g_dlg.control("bNext").enabled = (g_candidates.count > 1); if ((g_candidates.count > 1) && (Script.config.next_key != '')) g_dlg.control('bNext').SetTooltip('Hotkey = '+Script.config.next_key); g_dlg.control("bPrev").enabled = (g_candidates.count > 1); if ((g_candidates.count > 1) && (Script.config.prev_key != '')) g_dlg.control('bPrev').SetTooltip('Hotkey = '+Script.config.prev_key); if (Script.config.apply_key != '') g_dlg.control('bApply').SetTooltip('Hotkey = '+Script.config.apply_key); g_dlg.control("bRefresh").SetTooltip('LMB: Refresh displayed metadata for the current item.\nRMB: Reload source tab then refresh metadata for the current item.'); g_dlg.control("bRate").SetTooltip('LMB: Prompt to star rate the current item.\nRMB: Prompt for a star rating to apply to all in scope items.'); g_dlg.control("bFind").enabled = (g_ei.isrunning); g_dlg.control("bCollect").SetTooltip('LMB: Copy item to collection.\n- Qualifier+LMB to copy all items. \nRMB: Open collection in a new lister.'); if (g_dlg.control("bFind").enabled) g_dlg.control("bFind").SetTooltip('LMB: Prompt for tag(s) to search for.\nRMB: Open search results in a new lister.'); g_dlg.control("bQuit").SetTooltip('LMB: Terminate the dialog.\nRMB: Open preferences for this script.'); var ev_split = (g_ei.isrunning) ? g_ei.version.split('.') : [0,0,0,0]; var ev_valid = ((Number(ev_split[0]+ev_split[1]+ev_split[2]) > 149) && (Number(ev_split[3] > 1372))); var nearby_wanted = ((g_argsmap.exists('NEARBY')) || (Script.config.nearby) || g_argsmap.exists('PRECISION')); var tip = 'Locate where this image was taken.' if ((nearby_wanted) && (ev_valid)) { g_precision = (g_argsmap.exists('PRECISION')) ? g_argsmap.get('PRECISION') : Script.config.precision + 1; if (g_precision < 1) g_precision = d_precision; log('Nearby image location precision is '+g_precision,id); g_nearby_suffix = Script.config.nearby_suffix; log('Nearby query suffix = '+g_nearby_suffix,id); g_dlg.control('bLocate').label = 'Map | Nearby'; g_nearby_collname = (Script.config.nearby_collname.trim(' ') == '') ? d_nearby_collname : Script.config.nearby_collname.trim(' '); log('Nearby collection name = '+g_nearby_collname,id); g_nearby_collgeo = Script.config.nearby_collgeo; tip = 'LMB: '+tip+'\nRMB: Prompt for criteria to search for nearby images.'; } else if (nearby_wanted) { runcmd('Play "'+g_sound1+'" QUIET'); DOpus.Output('Everything version 1.5.0.1373 or later is required to support "Nearby" functionality',true); } g_dlg.control('bLocate').SetTooltip(tip); if (g_candidates.count == 0) {g_promptdlg.Request('Click to exit','Quit',"No Candidate Files");return;} g_ix = 0; g_infomap = DOpus.Create().Map(); g_infomap.set('anchor','bl'); g_infomap.set('multiline',true); g_infomap.set('back',Script.config.info_bg); g_infomap.set('alpha',(Script.config.transparency < 0) ? d_transparency : (Script.config.transparency > 255) ? d_transparency : Script.config.transparency); g_infomap.set('w',-1); g_infomap.set('h',-1); g_infomap.set('text',''); g_infomap_id = g_dlg.control('sPreview').AddText(g_infomap); log('g_infomap_id = '+g_infomap_id,id); log('Maximum remembered column names = '+d_max_collnames,id); var ctl = g_dlg.control("comboColl"); g_collnames = (Script.Vars.Exists('collnames')) ? Script.Vars.Get("collnames") : DOpus.Create().Vector(d_max_collnames); for (var i = 0; i < g_collnames.count; i++) ctl.AddItem(g_collnames(i)); if (g_collnames.count > 0) ctl.SelectItem(0); load_preview(); break;} case "click_sPreview": {maybe_view(g_msg.qualifiers);break;} case "hotkey_apply": {maybe_apply();break;} case "hotkey_editor1": {maybe_view('shift');break;} case "hotkey_editor2": {maybe_view('ctrl');break;} case "hotkey_info": {g_info = (!g_info);maybe_show_info();break;} case "hotkey_locate": {show_on_map();break;} case "hotkey_next": {maybe_move();break;} case "hotkey_prefs": {runcmd('Prefs PAGE=scripts:"'+g_scriptname+'"');break;} case "hotkey_prev": {maybe_move(true);break;} case "hotkey_quit": {maybe_apply();quitflag = true;break;} case "hotkey_stars0": {set_rating(0);break;} case "hotkey_stars1": {set_rating(1);break;} case "hotkey_stars2": {set_rating(2);break;} case "hotkey_stars3": {set_rating(3);break;} case "hotkey_stars4": {set_rating(4);break;} case "hotkey_stars5": {set_rating(5);break;} case "hotkey_selected": {toggle_selected();break;} case "hotkey_test": {test();break;} case "hotkey_view": {maybe_view();break;} case "editchange_comboColl": {break;} case "editchange_editTop": case "editchange_editMiddle": case "editchange_editBottom": {g_dlg.control("bApply").enabled = true;break;} case "rclick_bCollect": { var coll = 'coll://'+g_dlg.control("comboColl").label; (g_fsu.Exists(coll)) ? runcmd('Go "'+coll+'" NEW') : runcmd('Go coll:// NEW'); break;} case 'rclick_bLocate': {proximate(g_precision);break;} case "rclick_bFind": {runcmd('Go coll://evquery NEW');break;} case "rclick_bQuit": {runcmd('Prefs PAGE=scripts:"'+g_scriptname+'"');break;} case "rclick_bRefresh": {refresh_sourcetab();break;} case "rclick_sPreview": { switch (d_rpreview(Script.config.rpreview + 1)) { case "Next": {maybe_move(g_msg.qualifiers != 'none');break;} case "Editor1": {maybe_view('shift');break;} case "Editor2": {maybe_view('ctrl');break;} default: {maybe_view();break;} } break;} case "selchange_comboColl": {break;} default: {log("No handler defined for "+switchKey,id,g_col.white_red);break;} } if (quitflag) break; } while (g_msg); g_dlg.SavePosition(g_me.name); if (g_msg!=false) g_dlg.EndDlg(); Script.Vars.Set("collnames",g_collnames); Script.Vars("collnames").Persist = true; Script.Vars.Set("lastrun",DOpus.Create().Date()); Script.Vars("lastrun").Persist = true; log("Ending..",id,g_col.white_blue); } function maybe_apply() { var id = "maybe_apply"; if (!g_dlg.control("bApply").enabled) return; var multi = ((g_msg.control == 'bApply') && (g_msg.qualifiers != 'none')); g_dlg.control("bApply").enabled = false; maybe_tags_changed(multi); maybe_usercomment_changed(multi); maybe_mid_changed(multi); if (g_msg.control == 'bApply') (g_item.is_symlink) ? refresh_sourcetab() : refresh_meta(g_meta_delay); } function maybe_mid_changed(multi) { var id = "maybe_mid_changed"; if (g_template != 'dialog2') return; var metaType = String(g_item.metadata); if (metaType != 'image') return; var sMeta = g_item.metadata.image_text.imagedesc; var sCurrent = g_dlg.control('editMiddle').value.trim(); if (sMeta != sCurrent) apply_meta('imagedesc',sCurrent,multi); } function maybe_move(prev) { var id = "maybe_move"; if (g_candidates.count < 2) return; maybe_apply(); var next = (prev == undefined) ? true : (prev == false) ? true : false; var max = g_candidates.count - 1; var jump = ((g_msg.event == 'click') && (g_msg.qualifiers != 'none')); if (next) g_ix = (jump) ? max : (g_ix == max) ? 0 : g_ix + 1; else g_ix = (jump) ? 0 : (g_ix == 0) ? max : g_ix - 1; load_preview(); } function maybe_show_info() { var id = 'maybe_show_info'; var ctl = g_dlg.control('sPreview'); ctl.RemoveText(g_infomap_id); var txt = ''; if (g_info) { switch (String(g_item.metadata)) { case 'image': {txt = meta_image();break;} case 'audio': {txt = meta_audio();break;} case 'video': {txt = meta_video();break;} case 'doc': case 'none': case 'other': {txt = g_item.ext.toUpperCase().slice(1)+' document';break;} default: txt = g_item.metadata+' information'; } } g_infomap.set('text',txt); g_infomap_id = ctl.AddText(g_infomap); } function maybe_tags_changed(multi) { var id = "maybe_tags_changed"; var vTemp = DOpus.Create().Vector(); var vCurTags = DOpus.Create().Vector(); var a = g_dlg.control((g_toptags) ? "editTop" : "editBottom").value.split(/\r\n|\n|\r/); for (var i = 0; i < a.length; i++) vTemp.append(a[i].split(';')) for (var i = 0; i < vTemp.count; i++) if (vTemp(i).trim().length + 0) vCurTags.push_back(vTemp(i).trim()); vCurTags.sort(); for (var i = 0; i < vCurTags.length; i++) log(vCurTags(i),id,g_col.red); var vMetaTags = DOpus.Create().Vector(); if (g_item.metadata.tags) vMetaTags.assign(g_item.metadata.tags); vMetaTags.sort(); var changed = (vCurTags.count != vMetaTags.count); if (!changed) for (var i = 0; i < vCurTags.count; i++) {changed = (vCurTags(i) != vMetaTags(i));if (changed) break;} if (!changed) return; var tags = vCurTags(0); for (var i = 1; i < vCurTags.count; i++) tags+=';'+vCurTags(i); apply_meta('tags',tags,multi); return; } function maybe_usercomment_changed(multi) { var id = "maybe_usercomment_changed"; var sMeta = g_item.metadata.other.usercomment; var sCurrent = g_dlg.control((g_toptags) ? "editBottom" : "editTop").value.trim(); if (sMeta) {if (sCurrent != sMeta) apply_meta('usercomment',sCurrent,multi);} else if (sCurrent != '') apply_meta('usercomment',sCurrent,multi); } function maybe_view(viewer) { var id = "maybe_view"; var cmdstring = 'Show "'+g_item+'"'; if (g_item.InGroup("Archives")) cmdstring = 'Go "'+g_item+'" NEW'; else if (g_item.InGroup("Images")) { switch (viewer) { case 'shift': case 'Editor1': {cmdstring = '"'+g_editor1+'" "'+g_item+'"';break;} case 'ctrl': case 'Editor2': {cmdstring = '"'+g_editor2+'" "'+g_item+'"';break;} } } log(cmdstring,id); g_cmd.RunCommand(cmdstring); } function meta_audio() { var id = 'meta_audio'; var txt = (g_item.metadata.audio.mp3songlength) ? 'Duration: '+g_item.metadata.audio_text.mp3songlength+'\r\n' : ''; if (g_item.metadata.audio.audiocodec) txt+='Audio Codec: '+g_item.metadata.audio.audiocodec+'\r\n'; if (g_item.metadata.audio.mp3bitrate) txt+='Audio Bit Rate: '+g_item.metadata.audio_text.mp3bitrate+'\r\n'; if (g_item.metadata.audio.mp3samplerate) txt+='Sample Rate: '+g_item.metadata.audio_text.mp3samplerate+'\r\n'; if (g_item.metadata.audio.mp3artist) txt+='Artists: '+g_item.metadata.audio.mp3artist+'\r\n'; if (g_item.metadata.audio.mp3album) txt+='Album: '+g_item.metadata.audio.mp3album+'\r\n'; return txt; } function meta_image() { var id = 'meta_image'; var txt = g_item.metadata.image_text.dimensions+' image'; var camera = (g_item.metadata.image.cameramodel) ? g_item.metadata.image.cameramodel : ''; if (g_item.metadata.image.cameramake) camera = g_item.metadata.image.cameramake+' '+g_item.metadata.image.cameramodel; if (camera.trim(' ').length > 0) txt+='\r\nCamera: '+camera; if (g_item.metadata.image.datetaken) txt+='\r\nDate Taken: '+g_item.metadata.image.datetaken.Format('D#yyyy-MM-dd T#HH:mm:ss'); if (g_item.metadata.image.lensmodel) txt+='\r\nLens Model: '+g_item.metadata.image.lensmodel; if (g_item.metadata.image.apertureval) txt+='\r\nAperture: '+g_item.metadata.image_text.apertureval; if (g_item.metadata.image.shutterspeed) txt+='\r\nShutter Speed: '+g_item.metadata.image_text.shutterspeed; if (g_item.metadata.image.fnumber) txt+='\r\nF-Number: '+g_item.metadata.image_text.fnumber; if (g_item.metadata.image.exposuretime) txt+='\r\nExposure Time: '+g_item.metadata.image_text.exposuretime; if (g_item.metadata.image.isorating) txt+='\r\nISO: '+g_item.metadata.image_text.isorating.split(' ')[1]; if (g_item.metadata.image.whitebalance) txt+='\r\nWhite Balance: '+g_item.metadata.image_text.whitebalance; if (g_item.metadata.image.exposurebias) txt+='\r\nExposure Bias: '+g_item.metadata.image_text.exposurebias; if (g_item.metadata.image.focallength) txt+='\r\nFocal Length: '+g_item.metadata.image_text.focallength; if (g_item.metadata.image.focallength) txt+='\r\n35mm Focal Length: '+g_item.metadata.image_text['35mmfocallength']; if (g_item.metadata.image.exposureprogram) txt+='\r\nExposure Program: '+g_item.metadata.image_text.exposureprogram; if (g_item.metadata.image.flash) txt+='\r\nFlash: '+g_item.metadata.image_text.flash; if (g_item.metadata.image.latitude) txt+='\r\nCoordinates: '+g_item.metadata.image_text.latitude+' '+g_item.metadata.image_text.longitude; if (g_item.metadata.image.altitude) txt+='\r\nAltitude: '+g_item.metadata.image_text.altitude; return txt; } function meta_video() { var id = 'meta_video'; var txt = g_item.metadata.video_text.dimensions+' video'; if (g_item.metadata.video.duration) txt+='\r\nDuration: '+g_item.metadata.video_text.duration; if (g_item.metadata.video.videocodec) txt+='\r\nVideo Codec: '+g_item.metadata.video.videocodec; if (g_item.metadata.video.audiocodec) txt+='\r\nAudio Codec: '+g_item.metadata.video.audiocodec; if (g_item.metadata.video.mp3bitrate) txt+='\r\nAudio Bit Rate: '+g_item.metadata.video_text.mp3bitrate; if (g_item.metadata.video.framerate) txt+='\r\nFrame Rate: '+g_item.metadata.video_text.framerate; if (g_item.metadata.video.mp3samplerate) txt+='\r\nSample Rate: '+g_item.metadata.video_text.mp3samplerate; if (g_item.metadata.video.datarate) txt+='\r\nVideo Bit Rate: '+g_item.metadata.video_text.datarate; return txt; } function OnInit(initData) { initData.name = g_me.name; initData.version = g_me.version; initData.copyright = g_me.copyright; initData.default_enable = true; var cmd = initData.AddCommand(); cmd.name = g_me.name; cmd.method = g_me.method; cmd.desc = g_me.desc; cmd.label = g_me.name; cmd.template = g_me.template; initData.config_desc = DOpus.create.map(); initData.config.clearoutput = d_clearoutput; initData.config_desc("clearoutput") = 'Clear "Other" log?'; initData.config.debug = d_dbg; initData.config_desc("debug") = 'Write debug data to "Other" log?'; initData.config.editor1 = d_editor1; initData.config_desc("editor1") = 'Image editor #1'; initData.config.editor2 = d_editor2; initData.config_desc("editor2") = 'Image editor #2'; initData.config.locatewith = d_locateWith; initData.config_desc("locatewith") = 'Choose a location mapping service.'; initData.config.locatewithurl = d_locateWithURL; initData.config_desc("locatewithurl") = 'Specify location mapping service URLs.'; initData.config.meta_delay = d_meta_delay; initData.config_desc("meta_delay") = 'Millisecond delay post META write.'; initData.config.thumb_delay = d_thumb_delay; initData.config_desc("thumb_delay") = 'Max wait in milliseconds for thumbnail to load.'; initData.config.osmzoom = d_OSMzoom; initData.config_desc("osmzoom") = 'Open Street Maps zoom level.'; initData.config.test = d_test; initData.config_desc("test") = 'Enable TEST mode? This will prevent metadata changes from being applied.'; initData.config.transparency = d_transparency; initData.config_desc("transparency") = 'Transparency (0-255)'; initData.config.apply_key = d_apply_key; initData.config_desc("apply_key") = "Key combination used to apply changes."; initData.config.imagedesc = d_imagedesc; initData.config_desc("imagedesc") = "Show editable image description field?"; initData.config.info = d_info; initData.config_desc("info") = "Start with item information enabled?"; initData.config.info_bg = d_info_bg; initData.config_desc("info_bg") = 'Background colour (RGB) for item information overlay. e.g. #FFFFFF for white or "none" for transparent.'; initData.config.info_key = d_info_key; initData.config_desc("info_key") = "Key combination used to show/hide item information."; initData.config.next_key = d_next_key; initData.config_desc("next_key") = "Key combination used to move to next item."; initData.config.prefs_key = d_prefs_key; initData.config_desc("prefs") = "Key combination used to open script preferences."; initData.config.prev_key = d_prev_key; initData.config_desc("prev_key") = "Key combination used to move to previous item."; initData.config.quit_key = d_quit_key; initData.config_desc("quit_key") = "Key combination used to close dialog."; initData.config.editor1 = d_editor1; initData.config_desc("editor1") = "Image editor #1."; initData.config.editor1_key = d_editor1_key; initData.config_desc("editor1_key") = "Key combination used to open in editor1_key."; initData.config.editor2 = d_editor2; initData.config_desc("editor2") = "Image editor #2."; initData.config.editor2_key = d_editor2_key; initData.config_desc("editor2_key") = "Key combination used to open in editor2_key."; initData.config.view_key = d_view_key; initData.config_desc("view_key") = "Key combination used to open in viewer."; initData.config.stars0_key = d_stars0_key; initData.config_desc("stars0_key") = "Key combination used to set star rating to zero."; initData.config.stars1_key = d_stars1_key; initData.config_desc("stars1_key") = "Key combination used to set star rating to one."; initData.config.stars2_key = d_stars2_key; initData.config_desc("stars2_key") = "Key combination used to set star rating to two."; initData.config.stars3_key = d_stars3_key; initData.config_desc("stars3_key") = "Key combination used to set star rating to three."; initData.config.stars4_key = d_stars4_key; initData.config_desc("stars4_key") = "Key combination used to set star rating to four."; initData.config.stars5_key = d_stars5_key; initData.config_desc("stars5_key") = "Key combination used to set star rating to five."; initData.config.all = d_all; initData.config_desc("all") = "Include ALL (true) or SELECTED (false) items by default. Use shift qualifier to override."; initData.config.sound1 = d_sound1; initData.config_desc("d_sound1") = '"Alert" sound.'; initData.config.locate_key = d_locate_key; initData.config_desc("locate_key") = "Key combination used to locate current item, if location information is available."; initData.config.nearby = d_nearby; initData.config_desc('nearby') = 'Enable "Nearby" search capability?'; initData.config.nearby_collgeo = d_nearby_collgeo; initData.config_desc("nearby_collgeo") = 'Append geotag coordinates to nearby collection name?'; initData.config.nearby_collname = d_nearby_collname; initData.config_desc("nearby_collname") = '"nearby" collection name.'; initData.config.nearby_suffix = ""; initData.config_desc('nearby_suffix') = 'Optional suffix for "Nearby" query. e.g. orientation:landscape'; initData.config.precision = DOpus.Create.Vector((d_precision - 1),1,2,3,4,5,6); initData.config_desc("precision") = 'Geolocate precision. Range is 1 (wide) through 6 (tight).'; initData.config.refresh_key = d_refresh_key; initData.config_desc("refresh_key") = "Key combination used to refresh current item metadata."; initData.config.selected_key = d_selected_key; initData.config_desc("selected_key") = "Key combination used to toggle between selected items and all items."; initData.config.preview_tooltip = d_preview_tooltip; initData.config_desc("preview_tooltip") = "Show preview window tooltip?"; initData.config.rpreview = d_rpreview; initData.config_desc("rpreview") = "Right click preview action?"; initData.config.noconfirm = d_noconfirm; initData.config_desc("noconfirm") = "Save individual file changes without prompting?"; initData.config.noconfirmmulti = d_noconfirmmulti; initData.config_desc("noconfirmmulti") = "Save multiple file changes without prompting?"; initData.config.test_key = d_test_key; initData.config_desc("test_key") = "Key combination used to execute test code. Intended for developer use only."; initData.config.toptags = d_toptags; initData.config_desc("toptags") = "Show Tags panel above Usercomment panel?"; initData.config.maxcollnames = d_max_collnames; initData.config_desc("maxcollnames") = "Maximum number of remembered collection names?"; } function proximate(precision) { var id = "proximate"; if (!g_item.InGroup("Images")) return; if (typeof g_item.metadata.image.latitude != 'number') return; var decimal_places = (typeof precision == 'number') ? precision : g_precision; if (g_msg.qualifiers == 'shift') decimal_places--; else if (g_msg.qualifiers == 'ctrl') decimal_places++; var lat = g_item.metadata.image.latitude; var sLat = String(lat); sLat = sLat.slice(0,sLat.indexOf('.')+decimal_places+1); var lon = g_item.metadata.image.longitude; var sLon = String(lon); sLon = sLon.slice(0,sLon.indexOf('.')+decimal_places+1); var querystr = g_promptdlg.GetString('Edit and Enter:','latitude:'+sLat+' longitude:'+sLon+' '+g_nearby_suffix,0,"Search|Quit","Search for nearby images"); if ((g_promptdlg.result == 0) || (querystr == "")) return; var collsfx = (g_nearby_collgeo) ? '_'+sLat+'_'+sLon : ''; g_cmd.clear(); g_cmd.addline('Go "'+g_cmd.source+'" NEW'); var cmdstr = '[Find COLLNAME="'+g_nearby_collname+collsfx+'" CLEAR QUERYENGINE=everythingglobal SHOWRESULTS=dest QUERY '+querystr+']'; log(cmdstr,id); g_cmd.addline(cmdstr); g_cmd.run(); } function refresh_meta(delay) { var id = 'refresh_meta'; if (typeof delay == 'number') {DOpus.Delay(delay);log(delay+' millisecond delay',id);} var metaType = String(g_item.metadata); var vMetaTags = DOpus.Create().Vector(g_item.metadata.tags); var tags = (vMetaTags.length == 0) ? '' : vMetaTags(0)+'\r\n'; for (var i = 1; i < vMetaTags.length; i++) tags+=vMetaTags(i)+'\r\n'; g_dlg.control((g_toptags) ? "editTop" : "editBottom").value = tags; g_dlg.control((g_toptags) ? "editTop" : "editBottom").focus = true; g_dlg.control((g_toptags) ? "editBottom" : "editTop").value = ((metaType != 'none') && (g_item.metadata.other.usercomment)) ? g_item.metadata.other.usercomment : ""; g_dlg.control("bApply").enabled = false; show_rating(((metaType != 'none') && (g_item.metadata.other.rating)) ? g_item.metadata.other.rating : 0); if (g_item.InGroup('Movies')) g_dlg.control('sPreview').label = DOpus.LoadThumbnail(g_item,g_thumb_delay,0,0,"ic"); if (g_template == 'dialog2') g_dlg.control('editMiddle').value = get_meta(); } function refresh_sourcetab() { var id = 'refresh_sourcetab'; var selitems = g_cmd.sourcetab.selected; g_cmd.RunCommand('Go NOSCRIPT REFRESH=source'); g_cmd.sourcetab.Update(); g_cmd.Clearfiles(); g_cmd.AddFiles(selitems); g_cmd.Clear(); g_cmd.AddLine('Select FROMSCRIPT'); g_cmd.AddLine("Play \""+g_sound1+"\" QUIET"); g_cmd.Run(); refresh_meta(); } function runcmd(cmdstring,noclear) { var id = "runcmd"; if (g_dbg) log(cmdstring,id,g_col.blue); if (!noclear) g_cmd.ClearFiles(); g_cmd.RunCommand(cmdstring); } function set_rating(val) { var id = "set_rating"; var multi = ((g_msg.control == "bRate") && (g_msg.qualifiers == "shift") && (g_candidates.count > 1)); if (multi) g_cmd.RunCommand("Play \""+g_sound1+"\" QUIET"); var msg = "Select a rating for "+((multi) ? g_candidates.count+" selected items?" : g_item.name); var rating = (typeof val == 'number') ? (val + 1) : g_promptdlg.Request(msg,"0|1|2|3|4|5|Quit","Set Star Rating (0-5)"); if (rating == 0) return; else rating--; apply_meta('rating',rating,multi); show_rating(rating); } function show_on_map() { var id = "show_on_map"; if (!g_dlg.control("bLocate").enabled) return; var cmdstring; var lat = g_item.metadata.image.latitude; var lon = g_item.metadata.image.longitude; if (g_locateWithURL.indexOf("mlat=")<0) cmdstring = g_locateWithURL+lat+','+lon; else cmdstring = g_locateWithURL+lat+"&mlon="+lon+"#map="+g_OSMzoom+"/"+lat+"/"+lon; runcmd(cmdstring); } function show_rating(val) { var id = "show_rating"; var rating = (val) ? val : 0; for (var i = 0; i < 6; i++) g_dlg.control("sStars"+i).visible = (rating == i); } function test() { var id = 'test'; log("Just testing...",id,g_col.red); g_cmd.RunCommand("Play \""+g_sound1+"\" QUIET"); } function toggle_selected() { var id = 'toggle_selected'; g_cmd.sourcetab.Update(); if ((g_cmd.sourcetab.selected_files.count == 0) || (g_candidates.count == g_cmd.sourcetab.selected_files.count)) g_candidates = g_cmd.sourcetab.files; else g_candidates = g_cmd.sourcetab.selected_files; g_ix = 0; g_dlg.control('bNext').enabled = (g_candidates.count > 1); g_dlg.control('bPrev').enabled = (g_candidates.count > 1); load_preview(); } ==SCRIPT RESOURCES