External programs plugger

see issue 1323
This commit is contained in:
Oliver Duis
2012-04-16 18:15:08 +02:00
parent 364868b394
commit 0fb058ff00
10 changed files with 121 additions and 3 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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<ExtProgAction*>::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<Glib::ustring, ExtProgAction*>::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<Glib::ustring, ExtProgAction*>::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; i<mMenuExtProgs.size(); i++)
amiExtProg[i]->signal_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; j<mMenuExtProgs.size(); j++) {
if (m==amiExtProg[j]) {
ExtProgAction* pAct = mMenuExtProgs[m->get_label()];
// Build vector of all file names
std::vector<Glib::ustring> selFileNames;
for (int i=0; i<selected.size(); i++) {
Glib::ustring fn=selected[i]->thumbnail->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<Thumbnail*> entries;
for (int i=0; i<mselected.size(); i++)
@@ -616,6 +696,8 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m) {
for (int i=0; i<mselected.size(); i++)
tbl->clearFromCacheRequested (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<FileBrowserEntry*>(selected[0]))->thumbnail->openDefaultViewer(destination);
success=(static_cast<FileBrowserEntry*>(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) {

View File

@@ -20,12 +20,14 @@
#define _FILEBROWSER_
#include <gtkmm.h>
#include <map>
#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<Glib::ustring, ExtProgAction*> mMenuExtProgs; // key is menuitem label
Gtk::MenuItem* menuDF;
Gtk::MenuItem* selectDF;
Gtk::MenuItem* thisIsDF;

View File

@@ -34,6 +34,7 @@
#include "soundman.h"
#include "rtimage.h"
#include "version.h"
#include "extprog.h"
#ifndef WIN32
#include <glibmm/fileutils.h>
@@ -106,7 +107,7 @@ int main(int argc, char **argv)
Gio::init ();
Options::load ();
extProgStore->init();
SoundManager::init();
if (argc>1){

View File

@@ -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);

View File

@@ -163,6 +163,7 @@ class Options {
bool menuGroupLabel;
bool menuGroupFileOperations;
bool menuGroupProfileOperations;
bool menuGroupExtProg;
// fast export options
bool fastexport_bypass_sharpening;

View File

@@ -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);

View File

@@ -112,6 +112,7 @@ class Preferences : public Gtk::Dialog {
Gtk::CheckButton* ckbmenuGroupLabel;
Gtk::CheckButton* ckbmenuGroupFileOperations;
Gtk::CheckButton* ckbmenuGroupProfileOperations;
Gtk::CheckButton* ckbmenuGroupExtProg;
Gtk::CheckButton* chOverwriteOutputFile;