Batch queue saved at each operation.

This commit is contained in:
ffsup2 2010-11-10 23:38:19 +01:00
parent 4dfa49a6f0
commit e8527f79b2
11 changed files with 161 additions and 37 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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