Batch queue saved at each operation.
This commit is contained in:
parent
4dfa49a6f0
commit
e8527f79b2
@ -50,39 +50,137 @@ void BatchQueue::rightClicked (ThumbBrowserEntryBase* entry) {
|
|||||||
pmenu->popup (3, 0);
|
pmenu->popup (3, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BatchQueue::addEntry (BatchQueueEntry* entry, bool head) {
|
void BatchQueue::addEntries ( std::vector<BatchQueueEntry*> &entries, bool head)
|
||||||
|
{
|
||||||
|
for( std::vector<BatchQueueEntry*>::iterator entry = entries.begin(); entry != entries.end();entry++ ){
|
||||||
|
(*entry)->setParent (this);
|
||||||
|
(*entry)->resize (options.thumbSize);
|
||||||
|
Glib::ustring tempFile = getTempFilenameForParams( (*entry)->filename );
|
||||||
|
|
||||||
entry->setParent (this);
|
// recovery save
|
||||||
entry->resize (options.thumbSize);
|
if( !(*entry)->params.save( tempFile ) )
|
||||||
|
(*entry)->savedParamsFile = tempFile;
|
||||||
|
|
||||||
entry->selected = false;
|
(*entry)->selected = false;
|
||||||
if (!head)
|
if (!head)
|
||||||
fd.push_back (entry);
|
fd.push_back (*entry);
|
||||||
else {
|
else {
|
||||||
std::vector<ThumbBrowserEntryBase*>::iterator pos;
|
std::vector<ThumbBrowserEntryBase*>::iterator pos;
|
||||||
for (pos=fd.begin(); pos!=fd.end(); pos++)
|
for (pos=fd.begin(); pos!=fd.end(); pos++)
|
||||||
if (!(*pos)->processing) {
|
if (!(*pos)->processing) {
|
||||||
fd.insert (pos, entry);
|
fd.insert (pos, *entry);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (pos==fd.end())
|
if (pos==fd.end())
|
||||||
fd.push_back (entry);
|
fd.push_back (*entry);
|
||||||
}
|
}
|
||||||
|
if ((*entry)->thumbnail)
|
||||||
|
(*entry)->thumbnail->imageEnqueued ();
|
||||||
|
|
||||||
if (entry->thumbnail)
|
BatchQueueButtonSet* bqbs = new BatchQueueButtonSet (*entry);
|
||||||
entry->thumbnail->imageEnqueued ();
|
|
||||||
|
|
||||||
BatchQueueButtonSet* bqbs = new BatchQueueButtonSet (entry);
|
|
||||||
bqbs->setButtonListener (this);
|
bqbs->setButtonListener (this);
|
||||||
entry->addButtonSet (bqbs);
|
(*entry)->addButtonSet (bqbs);
|
||||||
|
}
|
||||||
|
saveBatchQueue( );
|
||||||
arrangeFiles ();
|
arrangeFiles ();
|
||||||
queue_draw ();
|
queue_draw ();
|
||||||
notifyListener ();
|
notifyListener ();
|
||||||
}
|
}
|
||||||
|
|
||||||
int deleteitem (void* data) {
|
bool BatchQueue::saveBatchQueue( )
|
||||||
|
{
|
||||||
|
Glib::ustring savedQueueFile;
|
||||||
|
savedQueueFile = options.rtdir+"/batch/queue";
|
||||||
|
FILE *f = g_fopen (safe_locale_from_utf8(savedQueueFile).c_str(), "wt");
|
||||||
|
|
||||||
|
if (f==NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (std::vector<ThumbBrowserEntryBase*>::iterator pos=fd.begin(); pos!=fd.end(); pos++){
|
||||||
|
BatchQueueEntry* bqe = reinterpret_cast<BatchQueueEntry*>(*pos);
|
||||||
|
fprintf(f,"%s;%s\n", bqe->filename.c_str(),bqe->savedParamsFile.c_str() );
|
||||||
|
}
|
||||||
|
fclose (f);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BatchQueue::loadBatchQueue( )
|
||||||
|
{
|
||||||
|
Glib::ustring savedQueueFile;
|
||||||
|
savedQueueFile = options.rtdir+"/batch/queue";
|
||||||
|
FILE *f = g_fopen (safe_locale_from_utf8(savedQueueFile).c_str(), "rt");
|
||||||
|
|
||||||
|
if (f==NULL)
|
||||||
|
return false;
|
||||||
|
char buffer[1024];
|
||||||
|
unsigned numLoaded=0;
|
||||||
|
while (fgets (buffer, sizeof(buffer), f)){
|
||||||
|
char *p = strchr(buffer,';' );
|
||||||
|
if( p ){
|
||||||
|
char *le = buffer + strlen(buffer);
|
||||||
|
while( --le > buffer && (*le == '\n' || *le == '\r') );
|
||||||
|
Glib::ustring source(buffer, p-buffer );
|
||||||
|
Glib::ustring paramsFile(p+1, (le +1)- (p+1) );
|
||||||
|
|
||||||
|
rtengine::procparams::ProcParams pparams;
|
||||||
|
if( pparams.load( paramsFile ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
::Thumbnail *thumb = cacheMgr->getEntry( source );
|
||||||
|
if( thumb ){
|
||||||
|
rtengine::ProcessingJob* job = rtengine::ProcessingJob::create(source, thumb->getType() == FT_Raw, pparams);
|
||||||
|
|
||||||
|
int prevh = options.maxThumbnailHeight;
|
||||||
|
int prevw = prevh;
|
||||||
|
guint8* prev = NULL;
|
||||||
|
double tmpscale;
|
||||||
|
rtengine::IImage8* img = thumb->processThumbImage(pparams, options.maxThumbnailHeight, tmpscale);
|
||||||
|
if (img) {
|
||||||
|
prevw = img->getWidth();
|
||||||
|
prevh = img->getHeight();
|
||||||
|
prev = new guint8[prevw * prevh * 3];
|
||||||
|
memcpy(prev, img->getData(), prevw * prevh * 3);
|
||||||
|
img->free();
|
||||||
|
}
|
||||||
|
BatchQueueEntry *entry = new BatchQueueEntry(job, pparams,source, prev, prevw, prevh, thumb);
|
||||||
|
entry->setParent(this);
|
||||||
|
entry->resize(options.thumbSize);
|
||||||
|
entry->savedParamsFile = paramsFile;
|
||||||
|
entry->selected = false;
|
||||||
|
fd.push_back(entry);
|
||||||
|
|
||||||
|
BatchQueueButtonSet* bqbs = new BatchQueueButtonSet(entry);
|
||||||
|
bqbs->setButtonListener(this);
|
||||||
|
entry->addButtonSet(bqbs);
|
||||||
|
numLoaded++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
arrangeFiles ();
|
||||||
|
queue_draw ();
|
||||||
|
return numLoaded > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Glib::ustring BatchQueue::getTempFilenameForParams( const Glib::ustring filename )
|
||||||
|
{
|
||||||
|
time_t rawtime;
|
||||||
|
struct tm *timeinfo;
|
||||||
|
char stringTimestamp [80];
|
||||||
|
time ( &rawtime );
|
||||||
|
timeinfo = localtime ( &rawtime );
|
||||||
|
strftime (stringTimestamp,sizeof(stringTimestamp),"_%Y%m%d%H%M%S_",timeinfo);
|
||||||
|
Glib::ustring savedParamPath;
|
||||||
|
savedParamPath = options.rtdir+"/batch/";
|
||||||
|
g_mkdir_with_parents (savedParamPath.c_str(), 0755);
|
||||||
|
savedParamPath += Glib::path_get_basename (filename);
|
||||||
|
savedParamPath += stringTimestamp;
|
||||||
|
savedParamPath += paramFileExtension;
|
||||||
|
return savedParamPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
int deleteitem (void* data)
|
||||||
|
{
|
||||||
|
::remove( safe_locale_from_utf8( ((BatchQueueEntry*)data)->savedParamsFile).c_str () );
|
||||||
gdk_threads_enter ();
|
gdk_threads_enter ();
|
||||||
delete (BatchQueueEntry*)data;
|
delete (BatchQueueEntry*)data;
|
||||||
gdk_threads_leave ();
|
gdk_threads_leave ();
|
||||||
@ -108,6 +206,9 @@ void BatchQueue::cancelItems (std::vector<ThumbBrowserEntryBase*>* items) {
|
|||||||
fd[i]->selected = false;
|
fd[i]->selected = false;
|
||||||
lastClicked = NULL;
|
lastClicked = NULL;
|
||||||
selected.clear ();
|
selected.clear ();
|
||||||
|
|
||||||
|
saveBatchQueue( );
|
||||||
|
|
||||||
redraw ();
|
redraw ();
|
||||||
notifyListener ();
|
notifyListener ();
|
||||||
}
|
}
|
||||||
@ -129,6 +230,7 @@ void BatchQueue::headItems (std::vector<ThumbBrowserEntryBase*>* items) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
saveBatchQueue( );
|
||||||
redraw ();
|
redraw ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,6 +246,7 @@ void BatchQueue::tailItems (std::vector<ThumbBrowserEntryBase*>* items) {
|
|||||||
fd.push_back (entry);
|
fd.push_back (entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
saveBatchQueue( );
|
||||||
redraw ();
|
redraw ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -222,6 +325,8 @@ rtengine::ProcessingJob* BatchQueue::imageReady (rtengine::IImage16* img) {
|
|||||||
listener->imageProcessingReady (processing->filename);
|
listener->imageProcessingReady (processing->filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// save temporary params file name: delete as last thing
|
||||||
|
Glib::ustring processedParams = processing->savedParamsFile;
|
||||||
|
|
||||||
// delete from the queue
|
// delete from the queue
|
||||||
delete processing;
|
delete processing;
|
||||||
@ -247,6 +352,9 @@ rtengine::ProcessingJob* BatchQueue::imageReady (rtengine::IImage16* img) {
|
|||||||
// remove button set
|
// remove button set
|
||||||
next->removeButtonSet ();
|
next->removeButtonSet ();
|
||||||
}
|
}
|
||||||
|
if( saveBatchQueue( ) )
|
||||||
|
::remove( safe_locale_from_utf8(processedParams).c_str () );
|
||||||
|
|
||||||
redraw ();
|
redraw ();
|
||||||
notifyListener ();
|
notifyListener ();
|
||||||
gdk_threads_leave ();
|
gdk_threads_leave ();
|
||||||
|
@ -56,12 +56,13 @@ class BatchQueue : public ThumbBrowserBase,
|
|||||||
|
|
||||||
Glib::ustring obtainFileName (const Glib::ustring& origFileName);
|
Glib::ustring obtainFileName (const Glib::ustring& origFileName);
|
||||||
Glib::ustring autoCompleteFileName (const Glib::ustring& fileName, const Glib::ustring& format);
|
Glib::ustring autoCompleteFileName (const Glib::ustring& fileName, const Glib::ustring& format);
|
||||||
|
Glib::ustring getTempFilenameForParams( const Glib::ustring filename );
|
||||||
|
bool saveBatchQueue( );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BatchQueue ();
|
BatchQueue ();
|
||||||
|
|
||||||
void addEntry (BatchQueueEntry* entry, bool head=false);
|
void addEntries (std::vector<BatchQueueEntry*> &entries, bool head=false);
|
||||||
|
|
||||||
void cancelItems (std::vector<ThumbBrowserEntryBase*>* items);
|
void cancelItems (std::vector<ThumbBrowserEntryBase*>* items);
|
||||||
void headItems (std::vector<ThumbBrowserEntryBase*>* items);
|
void headItems (std::vector<ThumbBrowserEntryBase*>* items);
|
||||||
void tailItems (std::vector<ThumbBrowserEntryBase*>* items);
|
void tailItems (std::vector<ThumbBrowserEntryBase*>* items);
|
||||||
@ -79,6 +80,7 @@ class BatchQueue : public ThumbBrowserBase,
|
|||||||
|
|
||||||
void setBatchQueueListener (BatchQueueListener* l) { listener = l; }
|
void setBatchQueueListener (BatchQueueListener* l) { listener = l; }
|
||||||
void notifyListener ();
|
void notifyListener ();
|
||||||
|
bool loadBatchQueue ();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -42,6 +42,7 @@ public:
|
|||||||
Thumbnail* thumbnail;
|
Thumbnail* thumbnail;
|
||||||
rtengine::ProcessingJob* job;
|
rtengine::ProcessingJob* job;
|
||||||
rtengine::procparams::ProcParams params;
|
rtengine::procparams::ProcParams params;
|
||||||
|
Glib::ustring savedParamsFile;
|
||||||
double progress;
|
double progress;
|
||||||
Glib::ustring outFileName;
|
Glib::ustring outFileName;
|
||||||
SaveFormat saveFormat;
|
SaveFormat saveFormat;
|
||||||
|
@ -148,6 +148,8 @@ BatchQueuePanel::BatchQueuePanel () {
|
|||||||
batchQueue->setBatchQueueListener (this);
|
batchQueue->setBatchQueueListener (this);
|
||||||
|
|
||||||
show_all ();
|
show_all ();
|
||||||
|
batchQueue->loadBatchQueue ();
|
||||||
|
batchQueue->notifyListener ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BatchQueuePanel::arrangementButtonPressed () {
|
void BatchQueuePanel::arrangementButtonPressed () {
|
||||||
@ -222,9 +224,9 @@ void BatchQueuePanel::stopBatchProc () {
|
|||||||
updateTab (batchQueue->getEntries().size());
|
updateTab (batchQueue->getEntries().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void BatchQueuePanel::addBatchQueueJob (BatchQueueEntry* bqe, bool head) {
|
void BatchQueuePanel::addBatchQueueJobs ( std::vector<BatchQueueEntry*> &entries, bool head) {
|
||||||
|
|
||||||
batchQueue->addEntry (bqe, head);
|
batchQueue->addEntries (entries, head);
|
||||||
|
|
||||||
if (stop->get_active () && autoStart->get_active ())
|
if (stop->get_active () && autoStart->get_active ())
|
||||||
startBatchProc ();
|
startBatchProc ();
|
||||||
|
@ -59,7 +59,7 @@ class BatchQueuePanel : public Gtk::VBox,
|
|||||||
void setParent (RTWindow* p) { parent = p; }
|
void setParent (RTWindow* p) { parent = p; }
|
||||||
void arrangementButtonPressed ();
|
void arrangementButtonPressed ();
|
||||||
|
|
||||||
void addBatchQueueJob (BatchQueueEntry* bqe, bool head=false);
|
void addBatchQueueJobs (std::vector<BatchQueueEntry*> &entries , bool head=false);
|
||||||
|
|
||||||
// batchqueuelistener interface
|
// batchqueuelistener interface
|
||||||
void queueSizeChanged (int qsize);
|
void queueSizeChanged (int qsize);
|
||||||
|
@ -483,6 +483,7 @@ void FileCatalog::deleteRequested (std::vector<FileBrowserEntry*> tbe) {
|
|||||||
void FileCatalog::developRequested (std::vector<FileBrowserEntry*> tbe) {
|
void FileCatalog::developRequested (std::vector<FileBrowserEntry*> tbe) {
|
||||||
|
|
||||||
if (listener) {
|
if (listener) {
|
||||||
|
std::vector<BatchQueueEntry*> entries;
|
||||||
for (size_t i=0; i<tbe.size(); i++) {
|
for (size_t i=0; i<tbe.size(); i++) {
|
||||||
rtengine::procparams::ProcParams params = tbe[i]->thumbnail->getProcParams();
|
rtengine::procparams::ProcParams params = tbe[i]->thumbnail->getProcParams();
|
||||||
rtengine::ProcessingJob* pjob = rtengine::ProcessingJob::create (tbe[i]->filename, tbe[i]->thumbnail->getType()==FT_Raw, params);
|
rtengine::ProcessingJob* pjob = rtengine::ProcessingJob::create (tbe[i]->filename, tbe[i]->thumbnail->getType()==FT_Raw, params);
|
||||||
@ -494,14 +495,15 @@ void FileCatalog::developRequested (std::vector<FileBrowserEntry*> tbe) {
|
|||||||
guint8* prev = new guint8 [pw*ph*3];
|
guint8* prev = new guint8 [pw*ph*3];
|
||||||
memcpy (prev, img->getData (), pw*ph*3);
|
memcpy (prev, img->getData (), pw*ph*3);
|
||||||
img->free();
|
img->free();
|
||||||
listener->addBatchQueueJob (new BatchQueueEntry (pjob, params, tbe[i]->filename, prev, pw, ph, tbe[i]->thumbnail));
|
entries.push_back(new BatchQueueEntry (pjob, params, tbe[i]->filename, prev, pw, ph, tbe[i]->thumbnail));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int pw, ph;
|
int pw, ph;
|
||||||
tbe[i]->thumbnail->getThumbnailSize (pw, ph);
|
tbe[i]->thumbnail->getThumbnailSize (pw, ph);
|
||||||
listener->addBatchQueueJob (new BatchQueueEntry (pjob, params, tbe[i]->filename, NULL, pw, ph, tbe[i]->thumbnail));
|
entries.push_back(new BatchQueueEntry (pjob, params, tbe[i]->filename, NULL, pw, ph, tbe[i]->thumbnail));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
listener->addBatchQueueJobs( entries );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -208,10 +208,10 @@ void FilePanel::open (const Glib::ustring& d) {
|
|||||||
dirBrowser->open (Glib::path_get_dirname(d), Glib::path_get_basename(d));
|
dirBrowser->open (Glib::path_get_dirname(d), Glib::path_get_basename(d));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FilePanel::addBatchQueueJob (BatchQueueEntry* bqe) {
|
bool FilePanel::addBatchQueueJobs ( std::vector<BatchQueueEntry*> &entries ) {
|
||||||
|
|
||||||
if (parent)
|
if (parent)
|
||||||
parent->addBatchQueueJob (bqe);
|
parent->addBatchQueueJobs (entries);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,7 +73,7 @@ class FilePanel : public Gtk::HPaned,
|
|||||||
|
|
||||||
// interface fileselectionlistener
|
// interface fileselectionlistener
|
||||||
bool fileSelected (Thumbnail* thm);
|
bool fileSelected (Thumbnail* thm);
|
||||||
bool addBatchQueueJob (BatchQueueEntry* bqe);
|
bool addBatchQueueJobs ( std::vector<BatchQueueEntry*> &entries );
|
||||||
|
|
||||||
void optionsChanged ();
|
void optionsChanged ();
|
||||||
bool imageLoaded( Thumbnail* thm, ProgressConnector<rtengine::InitialImage*> * );
|
bool imageLoaded( Thumbnail* thm, ProgressConnector<rtengine::InitialImage*> * );
|
||||||
|
@ -26,7 +26,7 @@ class FileSelectionListener {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
virtual bool fileSelected (Thumbnail* thm) =0;
|
virtual bool fileSelected (Thumbnail* thm) =0;
|
||||||
virtual bool addBatchQueueJob (BatchQueueEntry* bqe) =0;
|
virtual bool addBatchQueueJobs ( std::vector<BatchQueueEntry*> &entries ) =0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -224,7 +224,15 @@ void RTWindow::imageDeveloped (Glib::ustring fname) {
|
|||||||
|
|
||||||
void RTWindow::addBatchQueueJob (BatchQueueEntry* bqe, bool head) {
|
void RTWindow::addBatchQueueJob (BatchQueueEntry* bqe, bool head) {
|
||||||
|
|
||||||
bpanel->addBatchQueueJob (bqe, head);
|
std::vector<BatchQueueEntry*> entries;
|
||||||
|
entries.push_back(bqe);
|
||||||
|
bpanel->addBatchQueueJobs (entries, head);
|
||||||
|
fpanel->queue_draw ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RTWindow::addBatchQueueJobs (std::vector<BatchQueueEntry*> &entries) {
|
||||||
|
|
||||||
|
bpanel->addBatchQueueJobs (entries, false);
|
||||||
fpanel->queue_draw ();
|
fpanel->queue_draw ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,6 +50,7 @@ class RTWindow : public Gtk::Window, public rtengine::ProgressListener{
|
|||||||
void remEditorPanel (EditorPanel* ep);
|
void remEditorPanel (EditorPanel* ep);
|
||||||
|
|
||||||
void addBatchQueueJob (BatchQueueEntry* bqe, bool head=false);
|
void addBatchQueueJob (BatchQueueEntry* bqe, bool head=false);
|
||||||
|
void addBatchQueueJobs (std::vector<BatchQueueEntry*> &entries);
|
||||||
|
|
||||||
bool keyPressed (GdkEventKey* event);
|
bool keyPressed (GdkEventKey* event);
|
||||||
bool on_delete_event(GdkEventAny* event);
|
bool on_delete_event(GdkEventAny* event);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user