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);
|
||||
}
|
||||
|
||||
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);
|
||||
entry->resize (options.thumbSize);
|
||||
// recovery save
|
||||
if( !(*entry)->params.save( tempFile ) )
|
||||
(*entry)->savedParamsFile = tempFile;
|
||||
|
||||
entry->selected = false;
|
||||
(*entry)->selected = false;
|
||||
if (!head)
|
||||
fd.push_back (entry);
|
||||
fd.push_back (*entry);
|
||||
else {
|
||||
std::vector<ThumbBrowserEntryBase*>::iterator pos;
|
||||
for (pos=fd.begin(); pos!=fd.end(); pos++)
|
||||
if (!(*pos)->processing) {
|
||||
fd.insert (pos, entry);
|
||||
fd.insert (pos, *entry);
|
||||
break;
|
||||
}
|
||||
if (pos==fd.end())
|
||||
fd.push_back (entry);
|
||||
fd.push_back (*entry);
|
||||
}
|
||||
if ((*entry)->thumbnail)
|
||||
(*entry)->thumbnail->imageEnqueued ();
|
||||
|
||||
if (entry->thumbnail)
|
||||
entry->thumbnail->imageEnqueued ();
|
||||
|
||||
BatchQueueButtonSet* bqbs = new BatchQueueButtonSet (entry);
|
||||
BatchQueueButtonSet* bqbs = new BatchQueueButtonSet (*entry);
|
||||
bqbs->setButtonListener (this);
|
||||
entry->addButtonSet (bqbs);
|
||||
|
||||
(*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<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 ();
|
||||
delete (BatchQueueEntry*)data;
|
||||
gdk_threads_leave ();
|
||||
@ -108,6 +206,9 @@ void BatchQueue::cancelItems (std::vector<ThumbBrowserEntryBase*>* items) {
|
||||
fd[i]->selected = false;
|
||||
lastClicked = NULL;
|
||||
selected.clear ();
|
||||
|
||||
saveBatchQueue( );
|
||||
|
||||
redraw ();
|
||||
notifyListener ();
|
||||
}
|
||||
@ -129,6 +230,7 @@ void BatchQueue::headItems (std::vector<ThumbBrowserEntryBase*>* items) {
|
||||
}
|
||||
}
|
||||
}
|
||||
saveBatchQueue( );
|
||||
redraw ();
|
||||
}
|
||||
|
||||
@ -144,6 +246,7 @@ void BatchQueue::tailItems (std::vector<ThumbBrowserEntryBase*>* 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 ();
|
||||
|
@ -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<BatchQueueEntry*> &entries, bool head=false);
|
||||
void cancelItems (std::vector<ThumbBrowserEntryBase*>* items);
|
||||
void headItems (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 notifyListener ();
|
||||
bool loadBatchQueue ();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -42,6 +42,7 @@ public:
|
||||
Thumbnail* thumbnail;
|
||||
rtengine::ProcessingJob* job;
|
||||
rtengine::procparams::ProcParams params;
|
||||
Glib::ustring savedParamsFile;
|
||||
double progress;
|
||||
Glib::ustring outFileName;
|
||||
SaveFormat saveFormat;
|
||||
|
@ -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<BatchQueueEntry*> &entries, bool head) {
|
||||
|
||||
batchQueue->addEntry (bqe, head);
|
||||
batchQueue->addEntries (entries, head);
|
||||
|
||||
if (stop->get_active () && autoStart->get_active ())
|
||||
startBatchProc ();
|
||||
|
@ -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<BatchQueueEntry*> &entries , bool head=false);
|
||||
|
||||
// batchqueuelistener interface
|
||||
void queueSizeChanged (int qsize);
|
||||
|
@ -483,6 +483,7 @@ void FileCatalog::deleteRequested (std::vector<FileBrowserEntry*> tbe) {
|
||||
void FileCatalog::developRequested (std::vector<FileBrowserEntry*> tbe) {
|
||||
|
||||
if (listener) {
|
||||
std::vector<BatchQueueEntry*> entries;
|
||||
for (size_t i=0; i<tbe.size(); i++) {
|
||||
rtengine::procparams::ProcParams params = tbe[i]->thumbnail->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<FileBrowserEntry*> 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 );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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<BatchQueueEntry*> &entries ) {
|
||||
|
||||
if (parent)
|
||||
parent->addBatchQueueJob (bqe);
|
||||
parent->addBatchQueueJobs (entries);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -73,7 +73,7 @@ class FilePanel : public Gtk::HPaned,
|
||||
|
||||
// interface fileselectionlistener
|
||||
bool fileSelected (Thumbnail* thm);
|
||||
bool addBatchQueueJob (BatchQueueEntry* bqe);
|
||||
bool addBatchQueueJobs ( std::vector<BatchQueueEntry*> &entries );
|
||||
|
||||
void optionsChanged ();
|
||||
bool imageLoaded( Thumbnail* thm, ProgressConnector<rtengine::InitialImage*> * );
|
||||
|
@ -26,7 +26,7 @@ class FileSelectionListener {
|
||||
|
||||
public:
|
||||
virtual bool fileSelected (Thumbnail* thm) =0;
|
||||
virtual bool addBatchQueueJob (BatchQueueEntry* bqe) =0;
|
||||
virtual bool addBatchQueueJobs ( std::vector<BatchQueueEntry*> &entries ) =0;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -224,7 +224,15 @@ void RTWindow::imageDeveloped (Glib::ustring fname) {
|
||||
|
||||
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 ();
|
||||
}
|
||||
|
||||
|
@ -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<BatchQueueEntry*> &entries);
|
||||
|
||||
bool keyPressed (GdkEventKey* event);
|
||||
bool on_delete_event(GdkEventAny* event);
|
||||
|
Loading…
x
Reference in New Issue
Block a user