Pipette and "On Preview Widgets" branch. See issue 227
The pipette part is already working quite nice but need to be finished. The widgets part needs more work...
This commit is contained in:
174
rtgui/extprog.cc
Normal file
174
rtgui/extprog.cc
Normal file
@@ -0,0 +1,174 @@
|
||||
/*
|
||||
* This file is part of RawTherapee.
|
||||
*
|
||||
* Copyright (c) 2012 Oliver Duis <www.oliverduis.de>
|
||||
*
|
||||
* RawTherapee is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* RawTherapee is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <cstring>
|
||||
|
||||
#include "extprog.h"
|
||||
#include "multilangmgr.h"
|
||||
#include "../rtengine/safegtk.h"
|
||||
#ifdef WIN32
|
||||
#include <windows.h>
|
||||
// for GCC32
|
||||
#ifndef _WIN32_IE
|
||||
#define _WIN32_IE 0x0600
|
||||
#endif
|
||||
#include <shlobj.h>
|
||||
#endif
|
||||
using namespace std;
|
||||
|
||||
|
||||
ExtProgAction::ExtProgAction() {}
|
||||
|
||||
ExtProgAction::ExtProgAction(const ExtProgAction* other, int target)
|
||||
: target(target), filePathEXE(other->filePathEXE), preparams(other->preparams), name(other->name) { }
|
||||
|
||||
Glib::ustring ExtProgAction::GetFullName() {
|
||||
return name+ " [" + M(Glib::ustring::compose("EXTPROGTARGET_%1", target)) + "]";
|
||||
}
|
||||
|
||||
bool ExtProgAction::Execute(std::vector<Glib::ustring> fileNames) {
|
||||
if (fileNames.empty()) return false;
|
||||
|
||||
// Check if they all exists (maybe not precessed yet)
|
||||
for (int i=0;i<fileNames.size();i++) {
|
||||
if (!safe_file_test(fileNames[i], Glib::FILE_TEST_EXISTS)) {
|
||||
Gtk::MessageDialog msgd (M("MAIN_MSG_IMAGEUNPROCESSED"), true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true);
|
||||
msgd.run ();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Glib::ustring cmdLine="\"" + filePathEXE + "\"";
|
||||
if (preparams.length()>0) cmdLine += " " + preparams;
|
||||
|
||||
for (int i=0;i<fileNames.size();i++) cmdLine += " \"" + fileNames[i] + "\"";
|
||||
|
||||
return safe_spawn_command_line_async (cmdLine);
|
||||
}
|
||||
|
||||
|
||||
// Generates as singleton
|
||||
ExtProgStore* ExtProgStore::getInstance()
|
||||
{
|
||||
static ExtProgStore* instance_ = 0;
|
||||
if ( instance_ == 0 )
|
||||
{
|
||||
static MyMutex smutex_;
|
||||
MyMutex::MyLock lock(smutex_);
|
||||
if ( instance_ == 0 )
|
||||
{
|
||||
instance_ = new ExtProgStore();
|
||||
}
|
||||
}
|
||||
return instance_;
|
||||
}
|
||||
|
||||
ExtProgStore::~ExtProgStore() {
|
||||
for (list<ExtProgAction*>::iterator it=lActions.begin();it!=lActions.end();it++) delete *it;
|
||||
}
|
||||
|
||||
// Reads all profiles from the given profiles dir
|
||||
void ExtProgStore::init () {
|
||||
MyMutex::MyLock lock(mtx);
|
||||
|
||||
lActions.clear();
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
SearchProg("Photoshop", "Adobe\\Adobe Photoshop CS%1 (64 Bit)\\Photoshop.exe", "Adobe\\Adobe Photoshop CS%1\\Photoshop.exe", 9, false, true);
|
||||
SearchProg("Photomatix Pro", "PhotomatixPro%1\\PhotomatixPro.exe", "", 9, true, true);
|
||||
SearchProg("Paint.NET", "Paint.NET\\PaintDotNet.exe", "", 0, false, true);
|
||||
SearchProg("MS Image Composition Editor", "Microsoft Research\\Image Composite Editor\\ICE.exe", "", 0, false, true);
|
||||
SearchProg("PTGui", "PTGui\\PTGui.exe", "", 0, false, true);
|
||||
SearchProg("GeoSetter", "GeoSetter\\GeoSetter.exe", "", 0, true, true);
|
||||
SearchProg("FastStone Image Viewer", "FastStone Image Viewer\\FSViewer.exe", "", 0, true, true);
|
||||
SearchProg("FastPictureViewer", "FastPictureViewer\\FastPictureViewer.exe", "", 0, true, true);
|
||||
|
||||
if (!SearchProg("Autopano Giga 3", "Kolor\\Autopano Giga 3.%1\\AutopanoGiga_x64.exe", "Kolor\\Autopano Giga 3.%1\\AutopanoGiga.exe", 15, true, true)){
|
||||
if ( !SearchProg("Autopano Pro 3", "Kolor\\Autopano Pro 3.%1\\AutopanoPro_x64.exe", "Kolor\\Autopano Pro 3.%1\\AutopanoPro.exe", 15, true, true)) {
|
||||
if (!SearchProg("Autopano Giga 2", "Kolor\\Autopano Giga 2.%1\\AutopanoGiga_x64.exe", "Kolor\\Autopano Giga 2.%1\\AutopanoGiga.exe", 6, true, true))
|
||||
SearchProg("Autopano Pro 2", "Kolor\\Autopano Pro 2.%1\\AutopanoPro_x64.exe", "Kolor\\Autopano Pro 2.%1\\AutopanoPro.exe", 6, true, true);
|
||||
}
|
||||
}
|
||||
|
||||
// DO NOT add obscure little tools here, only widely used programs with proper setup program to have a standard path
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
bool ExtProgStore::SearchProg(Glib::ustring name, Glib::ustring exePath, Glib::ustring exePath86, int maxVer, bool allowRaw, bool allowQueueProcess) {
|
||||
bool found=false;
|
||||
|
||||
#ifdef WIN32
|
||||
// get_user_special_dir crashes on some Windows configurations.
|
||||
// so we use the safe native functions here
|
||||
static Glib::ustring progFilesDir,progFilesDirx86;
|
||||
|
||||
if (progFilesDir.empty()) {
|
||||
WCHAR pathW[MAX_PATH]={0}; char pathA[MAX_PATH];
|
||||
|
||||
// First prio folder (64bit, otherwise 32bit)
|
||||
if (SHGetSpecialFolderPathW(NULL,pathW,CSIDL_PROGRAM_FILES,false)) {
|
||||
char pathA[MAX_PATH];
|
||||
WideCharToMultiByte(CP_UTF8,0,pathW,-1,pathA,MAX_PATH,0,0);
|
||||
progFilesDir=Glib::ustring(pathA);
|
||||
}
|
||||
|
||||
if (SHGetSpecialFolderPathW(NULL,pathW,CSIDL_PROGRAM_FILESX86,false)) {
|
||||
WideCharToMultiByte(CP_UTF8,0,pathW,-1,pathA,MAX_PATH,0,0);
|
||||
progFilesDirx86=Glib::ustring(pathA);
|
||||
}
|
||||
}
|
||||
|
||||
if (exePath86.empty()) exePath86=exePath;
|
||||
|
||||
ExtProgAction *pAct=new ExtProgAction();
|
||||
pAct->name=name;
|
||||
pAct->target= (allowRaw?1:2);
|
||||
|
||||
if (maxVer>0) {
|
||||
for (int verNo=maxVer;verNo>=0;verNo--) {
|
||||
pAct->filePathEXE=progFilesDir+"\\"+Glib::ustring::compose(exePath,verNo);
|
||||
if (safe_file_test(pAct->filePathEXE, Glib::FILE_TEST_EXISTS)) break;
|
||||
|
||||
pAct->filePathEXE=progFilesDirx86+"\\"+Glib::ustring::compose(exePath86,verNo);
|
||||
if (safe_file_test(pAct->filePathEXE, Glib::FILE_TEST_EXISTS)) break;
|
||||
|
||||
pAct->filePathEXE="";
|
||||
}
|
||||
} else {
|
||||
pAct->filePathEXE=progFilesDir+"\\"+exePath;
|
||||
if (!safe_file_test(pAct->filePathEXE, Glib::FILE_TEST_EXISTS)) {
|
||||
|
||||
pAct->filePathEXE=progFilesDirx86+"\\"+exePath86;
|
||||
if (!safe_file_test(pAct->filePathEXE, Glib::FILE_TEST_EXISTS)) pAct->filePathEXE="";
|
||||
}
|
||||
}
|
||||
|
||||
if (pAct->filePathEXE.length()>0){
|
||||
lActions.push_back(pAct);
|
||||
|
||||
// Copy for second target
|
||||
if (allowRaw && allowQueueProcess) lActions.push_back(new ExtProgAction(pAct,2));
|
||||
|
||||
found=true;
|
||||
} else delete pAct;
|
||||
#endif
|
||||
|
||||
return found;
|
||||
}
|
Reference in New Issue
Block a user