From 0fb058ff007a5c96e2798d7accd016f82b6157a7 Mon Sep 17 00:00:00 2001 From: Oliver Duis Date: Mon, 16 Apr 2012 18:15:08 +0200 Subject: [PATCH] External programs plugger see issue 1323 --- rtdata/languages/Deutsch | 6 +++ rtdata/languages/default | 6 +++ rtgui/CMakeLists.txt | 2 +- rtgui/filebrowser.cc | 90 +++++++++++++++++++++++++++++++++++++++- rtgui/filebrowser.h | 7 ++++ rtgui/main.cc | 3 +- rtgui/options.cc | 3 ++ rtgui/options.h | 1 + rtgui/preferences.cc | 5 +++ rtgui/preferences.h | 1 + 10 files changed, 121 insertions(+), 3 deletions(-) diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 3f98e7261..5b0328878 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -51,6 +51,8 @@ EXIFPANEL_RESETALL;Alle zurücksetzen EXIFPANEL_RESETHINT;Gewählte Attribute zu den ursprünglichen Werten zurücksetzen EXIFPANEL_RESET;Zurücksetzen EXIFPANEL_SUBDIRECTORY;Unterverzeichnis +EXTPROGTARGET_1;Raw +EXTPROGTARGET_2;stapelverarbeitet FILEBROWSER_ADDDELTEMPLATE;Vorlagen hinzu/entfernen... FILEBROWSER_APPLYPROFILE;Profil anwenden FILEBROWSER_APPLYPROFILE_PARTIAL;Profil selektiv anwenden @@ -77,10 +79,12 @@ FILEBROWSER_EXIFFILTERAPPLY;Anwenden FILEBROWSER_EXIFFILTERLABEL;Exif Filter FILEBROWSER_EXIFFILTERSETTINGSHINT;Ändern der Einstellungen des Exif Filters FILEBROWSER_EXIFFILTERSETTINGS;Einstellungen +FILEBROWSER_EXTPROGMENU;Öffnen mit FILEBROWSER_FLATFIELD;Weißbild FILEBROWSER_MOVETODARKFDIR;In Dunkelbild-Verzeichnis verschieben FILEBROWSER_MOVETOFLATFIELDDIR;In Weißbild-Verzeichnis verschieben FILEBROWSER_NEW_NAME;Neuer Name: +FILEBROWSER_OPENDEFAULTVIEWER;Windows Standard Betracher (stapelverarbeitet) FILEBROWSER_PARTIALPASTEPROFILE;Profil selektiv einfügen FILEBROWSER_PASTEPROFILE;Profil einfügen FILEBROWSER_POPUPCANCELJOB;Job abbrechen @@ -446,6 +450,7 @@ MAIN_MSG_EMPTYFILENAME;Dateiname fehlt! MAIN_MSG_ERRORDURINGIMAGESAVING;Fehler beim Speichern des Bildes MAIN_MSG_EXITJOBSINQUEUEINFO;Unverarbeitete Bilder in der Warteschlange gehen beim Verlassen der Anwendung verloren. MAIN_MSG_EXITJOBSINQUEUEQUEST;Wollen Sie die Anwendung wirklich schließen? Es sind noch unverarbeitete Bilder in der Warteschlange. +MAIN_MSG_IMAGEUNPROCESSED;Für diese Funktion müssen erst alle Bilder stapelverarbeitet sein. MAIN_MSG_JOBSINQUEUE;Job in Bearbeitung MAIN_MSG_NAVIGATOR;Navigator MAIN_MSG_PLACES;Orte @@ -638,6 +643,7 @@ PREFERENCES_INTENT_SATURATION;Sättigung PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Voransicht aus RAW, wenn noch nicht editiert PREFERENCES_LANGAUTODETECT;Betriebssystem-Einstellung verwenden PREFERENCES_LIVETHUMBNAILS;Live Voransichten (langsamer) +PREFERENCES_MENUGROUPEXTPROGS;Untermenü "Öffnen mit" PREFERENCES_MENUGROUPFILEOPERATIONS;Untermenü Dateioperationen PREFERENCES_MENUGROUPLABEL;Untermenü Farbmarkierung PREFERENCES_MENUGROUPPROFILEOPERATIONS;Untermenü Profiloperationen diff --git a/rtdata/languages/default b/rtdata/languages/default index 9165c1a1e..a31b64c02 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -78,6 +78,8 @@ EXPORT_MAXWIDTH;Maximum Width: EXPORT_PUTTOQUEUEFAST; Put to Queue for Fast Export EXPORT_RAW_DMETHOD;Demosaic Method EXPORT_RESIZEMETHOD;Resize Method +EXTPROGTARGET_1;raw +EXTPROGTARGET_2;queue-processed FILEBROWSER_ADDDELTEMPLATE;Add/Del templates... FILEBROWSER_APPLYPROFILE;Apply profile FILEBROWSER_APPLYPROFILE_PARTIAL;Apply profile (partial) @@ -104,10 +106,12 @@ FILEBROWSER_EXIFFILTERAPPLY;Apply FILEBROWSER_EXIFFILTERLABEL;Exif Filter FILEBROWSER_EXIFFILTERSETTINGSHINT;Change settings of the Exif Filter FILEBROWSER_EXIFFILTERSETTINGS;Setup +FILEBROWSER_EXTPROGMENU;Open with FILEBROWSER_FLATFIELD;Flat Field FILEBROWSER_MOVETODARKFDIR;Move to dark frames directory FILEBROWSER_MOVETOFLATFIELDDIR;Move to flat fields directory FILEBROWSER_NEW_NAME;New name: +FILEBROWSER_OPENDEFAULTVIEWER;Windows Default Viewer (queue-processed) FILEBROWSER_PARTIALPASTEPROFILE;Partial paste FILEBROWSER_PASTEPROFILE;Paste profile FILEBROWSER_POPUPCANCELJOB;Cancel job @@ -474,6 +478,7 @@ MAIN_MSG_EMPTYFILENAME;Filename unspecified! MAIN_MSG_ERRORDURINGIMAGESAVING;Error during image saving MAIN_MSG_EXITJOBSINQUEUEINFO;Unprocessed images in the queue will be lost on exit. MAIN_MSG_EXITJOBSINQUEUEQUEST;Are you sure you want to exit? There are unprocessed images waiting in the queue. +MAIN_MSG_IMAGEUNPROCESSED;This command requires all selected images to be queue process first. MAIN_MSG_JOBSINQUEUE;job(s) in the queue MAIN_MSG_NAVIGATOR;Navigator MAIN_MSG_PLACES;Places @@ -673,6 +678,7 @@ PREFERENCES_INTENT_SATURATION;Saturation PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show raw internal thumbnail if unedited PREFERENCES_LANGAUTODETECT;Use OS language setting PREFERENCES_LIVETHUMBNAILS;Live Thumbnails (slower) +PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" PREFERENCES_MENUGROUPFILEOPERATIONS;Group File Operations PREFERENCES_MENUGROUPLABEL;Group Labeling PREFERENCES_MENUGROUPPROFILEOPERATIONS;Group Profile Operations diff --git a/rtgui/CMakeLists.txt b/rtgui/CMakeLists.txt index 97ef4fc1a..a613cb47c 100644 --- a/rtgui/CMakeLists.txt +++ b/rtgui/CMakeLists.txt @@ -13,7 +13,7 @@ set (BASESOURCEFILES whitebalance.cc vignetting.cc rotate.cc distortion.cc crophandler.cc dirbrowser.cc curveeditor.cc curveeditorgroup.cc diagonalcurveeditorsubgroup.cc flatcurveeditorsubgroup.cc - filecatalog.cc + filecatalog.cc extprog.cc previewloader.cc rtimage.cc histogrampanel.cc history.cc imagearea.cc imageareapanel.cc iptcpanel.cc labcurve.cc main.cc diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index 0c8c7a8d3..491666c5c 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -25,6 +25,7 @@ #include "clipboard.h" #include "profilestore.h" #include "procparamchangers.h" +#include "batchqueue.h" #include "../rtengine/dfmanager.h" #include "../rtengine/ffmanager.h" #include "rtimage.h" @@ -101,6 +102,55 @@ FileBrowser::FileBrowser () pmenu->attach (*Gtk::manage(new Gtk::SeparatorMenuItem ()), 0, 1, p, p+1); p++; + /*********************** + * external programs + * *********************/ +#ifdef WIN32 + Gtk::manage(miOpenDefaultViewer=new Gtk::MenuItem (M("FILEBROWSER_OPENDEFAULTVIEWER"))); +#else + miOpenDefaultViewer=NULL; +#endif + + // Build a list of menu items + mMenuExtProgs.clear(); amiExtProg=NULL; + for (std::list::iterator it=extProgStore->lActions.begin();it!=extProgStore->lActions.end();it++) { + ExtProgAction* pAct=*it; + + if (pAct->target==1 || pAct->target==2) mMenuExtProgs[pAct->GetFullName()]=pAct; + } + + // Attach them to menu + if (!mMenuExtProgs.empty() || miOpenDefaultViewer!=NULL) { + amiExtProg=new Gtk::MenuItem*[mMenuExtProgs.size()]; + int itemNo=0; + + if (options.menuGroupExtProg) { + pmenu->attach (*Gtk::manage(menuExtProg = new Gtk::MenuItem (M("FILEBROWSER_EXTPROGMENU"))), 0, 1, p, p+1); p++; + Gtk::Menu* submenuExtProg = Gtk::manage (new Gtk::Menu()); + + if (miOpenDefaultViewer!=NULL) { + submenuExtProg->attach (*miOpenDefaultViewer, 0, 1, p, p+1); p++; + } + + for (std::map::iterator it=mMenuExtProgs.begin();it!=mMenuExtProgs.end();it++,itemNo++) { + submenuExtProg->attach (*Gtk::manage(amiExtProg[itemNo] = new Gtk::MenuItem ((*it).first)), 0, 1, p, p+1); p++; + } + + submenuExtProg->show_all (); + menuExtProg->set_submenu (*submenuExtProg); + } else { + if (miOpenDefaultViewer!=NULL) { + pmenu->attach (*miOpenDefaultViewer, 0, 1, p, p+1); p++; + } + + for (std::map::iterator it=mMenuExtProgs.begin();it!=mMenuExtProgs.end();it++,itemNo++) { + pmenu->attach (*Gtk::manage(amiExtProg[itemNo] = new Gtk::MenuItem ((*it).first)), 0, 1, p, p+1); p++; + } + } + + pmenu->attach (*Gtk::manage(new Gtk::SeparatorMenuItem ()), 0, 1, p, p+1); p++; + } + /*********************** * File Operations * *********************/ @@ -188,12 +238,20 @@ FileBrowser::FileBrowser () pasteprof->add_accelerator ("activate", pmenu->get_accel_group(), GDK_V, Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE); partpasteprof->add_accelerator ("activate", pmenu->get_accel_group(), GDK_V, Gdk::CONTROL_MASK | Gdk::SHIFT_MASK, Gtk::ACCEL_VISIBLE); + // Bind to event handlers open->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), open)); for (int i=0; i<6; i++) rank[i]->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), rank[i])); for (int i=0; i<6; i++) colorlabel[i]->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), colorlabel[i])); + for (int i=0; isignal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), amiExtProg[i])); + + if (miOpenDefaultViewer!=NULL) { + miOpenDefaultViewer->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), miOpenDefaultViewer)); + } + trash->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), trash)); untrash->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), untrash)); develop->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), develop)); @@ -217,6 +275,7 @@ FileBrowser::FileBrowser () FileBrowser::~FileBrowser () { delete pmenu; + delete[] amiExtProg; } void FileBrowser::rightClicked (ThumbBrowserEntryBase* entry) { @@ -461,6 +520,27 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m) { colorlabelRequested (mselected, i); return; } + + for (int j=0; jget_label()]; + + // Build vector of all file names + std::vector selFileNames; + for (int i=0; ithumbnail->getFileName(); + + // Maybe batch processed version + if (pAct->target==2) fn = Glib::ustring::compose ("%1.%2", BatchQueue::calcAutoFileNameBase(fn), options.saveFormatBatch.format); + + selFileNames.push_back(fn); + } + + pAct->Execute(selFileNames); + return; + } + } + if (m==open) { std::vector entries; for (int i=0; iclearFromCacheRequested (mselected, true); //queue_draw (); + } else if (miOpenDefaultViewer!=NULL && m==miOpenDefaultViewer) { + openDefaultViewer(1); } } @@ -684,8 +766,14 @@ void FileBrowser::partPasteProfile () { } void FileBrowser::openDefaultViewer (int destination) { + bool success=true; if (selected.size()==1) - (static_cast(selected[0]))->thumbnail->openDefaultViewer(destination); + success=(static_cast(selected[0]))->thumbnail->openDefaultViewer(destination); + + if (!success) { + Gtk::MessageDialog msgd (M("MAIN_MSG_IMAGEUNPROCESSED"), true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); + msgd.run (); + } } bool FileBrowser::keyPressed (GdkEventKey* event) { diff --git a/rtgui/filebrowser.h b/rtgui/filebrowser.h index 6aba267cd..529b1f4a6 100644 --- a/rtgui/filebrowser.h +++ b/rtgui/filebrowser.h @@ -20,12 +20,14 @@ #define _FILEBROWSER_ #include +#include #include "thumbbrowserbase.h" #include "exiffiltersettings.h" #include "filebrowserentry.h" #include "browserfilter.h" #include "partialpastedlg.h" #include "exportpanel.h" +#include "extprog.h" class FileBrowser; class FileBrowserEntry; @@ -76,6 +78,11 @@ class FileBrowser : public ThumbBrowserBase, Gtk::MenuItem* menuLabel; Gtk::MenuItem* menuFileOperations; Gtk::ImageMenuItem* menuProfileOperations; + Gtk::MenuItem* menuExtProg; + Gtk::MenuItem** amiExtProg; + Gtk::MenuItem* miOpenDefaultViewer; + std::map mMenuExtProgs; // key is menuitem label + Gtk::MenuItem* menuDF; Gtk::MenuItem* selectDF; Gtk::MenuItem* thisIsDF; diff --git a/rtgui/main.cc b/rtgui/main.cc index f8c0838cc..174a9aa3d 100644 --- a/rtgui/main.cc +++ b/rtgui/main.cc @@ -34,6 +34,7 @@ #include "soundman.h" #include "rtimage.h" #include "version.h" +#include "extprog.h" #ifndef WIN32 #include @@ -106,7 +107,7 @@ int main(int argc, char **argv) Gio::init (); Options::load (); - + extProgStore->init(); SoundManager::init(); if (argc>1){ diff --git a/rtgui/options.cc b/rtgui/options.cc index 1e23c4966..d530c6936 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -162,6 +162,7 @@ void Options::setDefaults () { menuGroupLabel = true; menuGroupFileOperations = true; menuGroupProfileOperations = true; + menuGroupExtProg = true; fastexport_bypass_sharpening = true; fastexport_bypass_sharpenEdge = true; @@ -405,6 +406,7 @@ if (keyFile.has_group ("File Browser")) { if (keyFile.has_key ("File Browser", "menuGroupLabel")) menuGroupLabel = keyFile.get_boolean ("File Browser", "menuGroupLabel"); if (keyFile.has_key ("File Browser", "menuGroupFileOperations")) menuGroupFileOperations = keyFile.get_boolean ("File Browser", "menuGroupFileOperations"); if (keyFile.has_key ("File Browser", "menuGroupProfileOperations")) menuGroupProfileOperations = keyFile.get_boolean ("File Browser", "menuGroupProfileOperations"); + if (keyFile.has_key ("File Browser", "menuGroupExtProg")) menuGroupExtProg = keyFile.get_boolean ("File Browser", "menuGroupExtProg"); } if (keyFile.has_group ("Clipping Indication")) { @@ -594,6 +596,7 @@ int Options::saveToFile (Glib::ustring fname) { keyFile.set_boolean ("File Browser", "menuGroupLabel", menuGroupLabel); keyFile.set_boolean ("File Browser", "menuGroupFileOperations", menuGroupFileOperations); keyFile.set_boolean ("File Browser", "menuGroupProfileOperations", menuGroupProfileOperations); + keyFile.set_boolean ("File Browser", "menuGroupExtProg", menuGroupExtProg); keyFile.set_integer ("Clipping Indication", "HighlightThreshold", highlightThreshold); keyFile.set_integer ("Clipping Indication", "ShadowThreshold", shadowThreshold); diff --git a/rtgui/options.h b/rtgui/options.h index eb5964936..5bf6e134d 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -163,6 +163,7 @@ class Options { bool menuGroupLabel; bool menuGroupFileOperations; bool menuGroupProfileOperations; + bool menuGroupExtProg; // fast export options bool fastexport_bypass_sharpening; diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index f155cf515..cb2da8f4b 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -773,6 +773,7 @@ Gtk::Widget* Preferences::getFileBrowserPanel () { ckbmenuGroupLabel = Gtk::manage( new Gtk::CheckButton (M("PREFERENCES_MENUGROUPLABEL")) ); ckbmenuGroupFileOperations = Gtk::manage( new Gtk::CheckButton (M("PREFERENCES_MENUGROUPFILEOPERATIONS")) ); ckbmenuGroupProfileOperations = Gtk::manage( new Gtk::CheckButton (M("PREFERENCES_MENUGROUPPROFILEOPERATIONS")) ); + ckbmenuGroupExtProg = Gtk::manage( new Gtk::CheckButton (M("PREFERENCES_MENUGROUPEXTPROGS")) ); Gtk::VBox* vbmnu = Gtk::manage( new Gtk::VBox () ); vbmnu->set_border_width (4); @@ -780,6 +781,7 @@ Gtk::Widget* Preferences::getFileBrowserPanel () { vbmnu->pack_start (*ckbmenuGroupLabel, Gtk::PACK_SHRINK, 0); vbmnu->pack_start (*ckbmenuGroupFileOperations, Gtk::PACK_SHRINK, 0); vbmnu->pack_start (*ckbmenuGroupProfileOperations, Gtk::PACK_SHRINK, 0); + vbmnu->pack_start (*ckbmenuGroupExtProg, Gtk::PACK_SHRINK, 0); frmnu->add (*vbmnu); @@ -974,6 +976,7 @@ void Preferences::storePreferences () { moptions.menuGroupLabel = ckbmenuGroupLabel->get_active(); moptions.menuGroupFileOperations = ckbmenuGroupFileOperations->get_active(); moptions.menuGroupProfileOperations = ckbmenuGroupProfileOperations->get_active(); + moptions.menuGroupExtProg = ckbmenuGroupExtProg->get_active(); moptions.blinkClipped = blinkClipped->get_active (); moptions.highlightThreshold = (int)hlThresh->get_value (); moptions.shadowThreshold = (int)shThresh->get_value (); @@ -1120,6 +1123,8 @@ void Preferences::fillPreferences () { ckbmenuGroupLabel->set_active(moptions.menuGroupLabel); ckbmenuGroupFileOperations->set_active(moptions.menuGroupFileOperations); ckbmenuGroupProfileOperations->set_active(moptions.menuGroupProfileOperations); + ckbmenuGroupExtProg->set_active(moptions.menuGroupExtProg); + blinkClipped->set_active (moptions.blinkClipped); hlThresh->set_value (moptions.highlightThreshold); shThresh->set_value (moptions.shadowThreshold); diff --git a/rtgui/preferences.h b/rtgui/preferences.h index 1b6c7655b..4047c812c 100644 --- a/rtgui/preferences.h +++ b/rtgui/preferences.h @@ -112,6 +112,7 @@ class Preferences : public Gtk::Dialog { Gtk::CheckButton* ckbmenuGroupLabel; Gtk::CheckButton* ckbmenuGroupFileOperations; Gtk::CheckButton* ckbmenuGroupProfileOperations; + Gtk::CheckButton* ckbmenuGroupExtProg; Gtk::CheckButton* chOverwriteOutputFile;