diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 4146ca78d..2b947f279 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -42,7 +42,7 @@ BatchQueue::BatchQueue () : processing(NULL), listener(NULL) { cancel->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &BatchQueue::cancelItems), &selected)); head->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &BatchQueue::headItems), &selected)); tail->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &BatchQueue::tailItems), &selected)); - selall->signal_activate().connect (sigc::mem_fun(*this, &BatchQueue::selectAll)); + selall->signal_activate().connect (sigc::mem_fun(*this, &BatchQueue::selectAll)); } void BatchQueue::rightClicked (ThumbBrowserEntryBase* entry) { @@ -50,39 +50,137 @@ void BatchQueue::rightClicked (ThumbBrowserEntryBase* entry) { pmenu->popup (3, 0); } -void BatchQueue::addEntry (BatchQueueEntry* entry, bool head) { +void BatchQueue::addEntries ( std::vector &entries, bool head) +{ + for( std::vector::iterator entry = entries.begin(); entry != entries.end();entry++ ){ + (*entry)->setParent (this); + (*entry)->resize (options.thumbSize); + Glib::ustring tempFile = getTempFilenameForParams( (*entry)->filename ); - entry->setParent (this); - entry->resize (options.thumbSize); + // recovery save + if( !(*entry)->params.save( tempFile ) ) + (*entry)->savedParamsFile = tempFile; - entry->selected = false; - if (!head) - fd.push_back (entry); - else { - std::vector::iterator pos; - for (pos=fd.begin(); pos!=fd.end(); pos++) - if (!(*pos)->processing) { - fd.insert (pos, entry); - break; - } - if (pos==fd.end()) - fd.push_back (entry); - } - - if (entry->thumbnail) - entry->thumbnail->imageEnqueued (); - - BatchQueueButtonSet* bqbs = new BatchQueueButtonSet (entry); - bqbs->setButtonListener (this); - entry->addButtonSet (bqbs); + (*entry)->selected = false; + if (!head) + fd.push_back (*entry); + else { + std::vector::iterator pos; + for (pos=fd.begin(); pos!=fd.end(); pos++) + if (!(*pos)->processing) { + fd.insert (pos, *entry); + break; + } + if (pos==fd.end()) + fd.push_back (*entry); + } + if ((*entry)->thumbnail) + (*entry)->thumbnail->imageEnqueued (); + BatchQueueButtonSet* bqbs = new BatchQueueButtonSet (*entry); + bqbs->setButtonListener (this); + (*entry)->addButtonSet (bqbs); + } + saveBatchQueue( ); arrangeFiles (); queue_draw (); 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::iterator pos=fd.begin(); pos!=fd.end(); pos++){ + BatchQueueEntry* bqe = reinterpret_cast(*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 (); delete (BatchQueueEntry*)data; gdk_threads_leave (); @@ -108,6 +206,9 @@ void BatchQueue::cancelItems (std::vector* items) { fd[i]->selected = false; lastClicked = NULL; selected.clear (); + + saveBatchQueue( ); + redraw (); notifyListener (); } @@ -129,6 +230,7 @@ void BatchQueue::headItems (std::vector* items) { } } } + saveBatchQueue( ); redraw (); } @@ -144,6 +246,7 @@ void BatchQueue::tailItems (std::vector* items) { fd.push_back (entry); } } + saveBatchQueue( ); redraw (); } @@ -222,6 +325,8 @@ rtengine::ProcessingJob* BatchQueue::imageReady (rtengine::IImage16* img) { listener->imageProcessingReady (processing->filename); } } + // save temporary params file name: delete as last thing + Glib::ustring processedParams = processing->savedParamsFile; // delete from the queue delete processing; @@ -247,6 +352,9 @@ rtengine::ProcessingJob* BatchQueue::imageReady (rtengine::IImage16* img) { // remove button set next->removeButtonSet (); } + if( saveBatchQueue( ) ) + ::remove( safe_locale_from_utf8(processedParams).c_str () ); + redraw (); notifyListener (); gdk_threads_leave (); diff --git a/rtgui/batchqueue.h b/rtgui/batchqueue.h index 990e2f821..629b556e2 100644 --- a/rtgui/batchqueue.h +++ b/rtgui/batchqueue.h @@ -56,12 +56,13 @@ class BatchQueue : public ThumbBrowserBase, Glib::ustring obtainFileName (const Glib::ustring& origFileName); Glib::ustring autoCompleteFileName (const Glib::ustring& fileName, const Glib::ustring& format); + Glib::ustring getTempFilenameForParams( const Glib::ustring filename ); + bool saveBatchQueue( ); public: BatchQueue (); - void addEntry (BatchQueueEntry* entry, bool head=false); - + void addEntries (std::vector &entries, bool head=false); void cancelItems (std::vector* items); void headItems (std::vector* items); void tailItems (std::vector* items); @@ -79,6 +80,7 @@ class BatchQueue : public ThumbBrowserBase, void setBatchQueueListener (BatchQueueListener* l) { listener = l; } void notifyListener (); + bool loadBatchQueue (); }; #endif diff --git a/rtgui/batchqueueentry.h b/rtgui/batchqueueentry.h index 61f5ef2a4..f4703ce7d 100644 --- a/rtgui/batchqueueentry.h +++ b/rtgui/batchqueueentry.h @@ -42,6 +42,7 @@ public: Thumbnail* thumbnail; rtengine::ProcessingJob* job; rtengine::procparams::ProcParams params; + Glib::ustring savedParamsFile; double progress; Glib::ustring outFileName; SaveFormat saveFormat; diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index e73e3853b..a427b0e83 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -148,6 +148,8 @@ BatchQueuePanel::BatchQueuePanel () { batchQueue->setBatchQueueListener (this); show_all (); + batchQueue->loadBatchQueue (); + batchQueue->notifyListener (); } void BatchQueuePanel::arrangementButtonPressed () { @@ -222,9 +224,9 @@ void BatchQueuePanel::stopBatchProc () { updateTab (batchQueue->getEntries().size()); } -void BatchQueuePanel::addBatchQueueJob (BatchQueueEntry* bqe, bool head) { +void BatchQueuePanel::addBatchQueueJobs ( std::vector &entries, bool head) { - batchQueue->addEntry (bqe, head); + batchQueue->addEntries (entries, head); if (stop->get_active () && autoStart->get_active ()) startBatchProc (); diff --git a/rtgui/batchqueuepanel.h b/rtgui/batchqueuepanel.h index 4a85e0e69..9a9c6f373 100644 --- a/rtgui/batchqueuepanel.h +++ b/rtgui/batchqueuepanel.h @@ -59,7 +59,7 @@ class BatchQueuePanel : public Gtk::VBox, void setParent (RTWindow* p) { parent = p; } void arrangementButtonPressed (); - void addBatchQueueJob (BatchQueueEntry* bqe, bool head=false); + void addBatchQueueJobs (std::vector &entries , bool head=false); // batchqueuelistener interface void queueSizeChanged (int qsize); diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index 901d52070..bd5b81686 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -483,6 +483,7 @@ void FileCatalog::deleteRequested (std::vector tbe) { void FileCatalog::developRequested (std::vector tbe) { if (listener) { + std::vector entries; for (size_t i=0; ithumbnail->getProcParams(); 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 tbe) { guint8* prev = new guint8 [pw*ph*3]; memcpy (prev, img->getData (), pw*ph*3); 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 { int 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 ); } } diff --git a/rtgui/filepanel.cc b/rtgui/filepanel.cc index c59e6c716..04dfdabe6 100644 --- a/rtgui/filepanel.cc +++ b/rtgui/filepanel.cc @@ -208,10 +208,10 @@ void FilePanel::open (const Glib::ustring& d) { dirBrowser->open (Glib::path_get_dirname(d), Glib::path_get_basename(d)); } -bool FilePanel::addBatchQueueJob (BatchQueueEntry* bqe) { +bool FilePanel::addBatchQueueJobs ( std::vector &entries ) { if (parent) - parent->addBatchQueueJob (bqe); + parent->addBatchQueueJobs (entries); return true; } diff --git a/rtgui/filepanel.h b/rtgui/filepanel.h index 0cef8b289..383e4a14d 100644 --- a/rtgui/filepanel.h +++ b/rtgui/filepanel.h @@ -73,7 +73,7 @@ class FilePanel : public Gtk::HPaned, // interface fileselectionlistener bool fileSelected (Thumbnail* thm); - bool addBatchQueueJob (BatchQueueEntry* bqe); + bool addBatchQueueJobs ( std::vector &entries ); void optionsChanged (); bool imageLoaded( Thumbnail* thm, ProgressConnector * ); diff --git a/rtgui/fileselectionlistener.h b/rtgui/fileselectionlistener.h index d0a029037..1558a943d 100644 --- a/rtgui/fileselectionlistener.h +++ b/rtgui/fileselectionlistener.h @@ -26,7 +26,7 @@ class FileSelectionListener { public: virtual bool fileSelected (Thumbnail* thm) =0; - virtual bool addBatchQueueJob (BatchQueueEntry* bqe) =0; + virtual bool addBatchQueueJobs ( std::vector &entries ) =0; }; #endif diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index a627c1a2b..61aa92cfd 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -224,7 +224,15 @@ void RTWindow::imageDeveloped (Glib::ustring fname) { void RTWindow::addBatchQueueJob (BatchQueueEntry* bqe, bool head) { - bpanel->addBatchQueueJob (bqe, head); + std::vector entries; + entries.push_back(bqe); + bpanel->addBatchQueueJobs (entries, head); + fpanel->queue_draw (); +} + +void RTWindow::addBatchQueueJobs (std::vector &entries) { + + bpanel->addBatchQueueJobs (entries, false); fpanel->queue_draw (); } diff --git a/rtgui/rtwindow.h b/rtgui/rtwindow.h index afd4af067..eee579758 100644 --- a/rtgui/rtwindow.h +++ b/rtgui/rtwindow.h @@ -50,6 +50,7 @@ class RTWindow : public Gtk::Window, public rtengine::ProgressListener{ void remEditorPanel (EditorPanel* ep); void addBatchQueueJob (BatchQueueEntry* bqe, bool head=false); + void addBatchQueueJobs (std::vector &entries); bool keyPressed (GdkEventKey* event); bool on_delete_event(GdkEventAny* event);