diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 8a76c3d08..eff7ac1a1 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -502,28 +502,6 @@ void ImProcCoordinator::getAutoCrop (double ratio, int &x, int &y, int &w, int & mProcessing.unlock (); } -void ImProcCoordinator::fullUpdatePreviewImage () { - - if (destroying) - return; - - updaterThreadStart.lock (); - if (updaterRunning && thread) { - changeSinceLast = 0; - thread->join (); - } - - if (plistener) - plistener->setProgressState (1); - - updatePreviewImage (ALL); - - if (plistener) - plistener->setProgressState (0); - - updaterThreadStart.unlock (); -} - void ImProcCoordinator::saveInputICCReference (const Glib::ustring& fname) { diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 8803c41bd..5395955f5 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -131,7 +131,7 @@ class ImProcCoordinator : public StagedImageProcessor { void setPreviewScale (int scale) { setScale (scale); } int getPreviewScale () { return scale; } - void fullUpdatePreviewImage (); + //void fullUpdatePreviewImage (); int getFullWidth () { return fullw; } int getFullHeight () { return fullh; } diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index 09fc7957c..68694ce5e 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -257,8 +257,6 @@ namespace rtengine { /** Returns the scale of the preview image. * @return the current scale of the preview image */ virtual int getPreviewScale () =0; - /** Performs a full update on the preview image. The resulting image is passed to the listener. */ - virtual void fullUpdatePreviewImage () =0; /** Returns the full width of the resulting image (in 1:1 scale). * @return the width of the final image */ virtual int getFullWidth () =0; diff --git a/rtgui/crophandler.h b/rtgui/crophandler.h index f168a29cd..8ae97b568 100644 --- a/rtgui/crophandler.h +++ b/rtgui/crophandler.h @@ -50,9 +50,9 @@ class CropHandler : public rtengine::DetailedCropListener, public rtengine::Size CropHandlerListener* listener; - void update (); void compDim (); public: + void update (); rtengine::procparams::CropParams cropParams; Glib::RefPtr cropPixbuf; diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index be2a04032..cb7664aa2 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -187,7 +187,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) : beforePreviewHandler(NULL), be statusBox = Gtk::manage (new Gtk::HBox ()); progressLabel = Gtk::manage (new Gtk::ProgressBar()); progressLabel->set_fraction(0.0); - progressLabel->modify_bg( Gtk::STATE_NORMAL,Gdk::Color("red") ); + //progressLabel->modify_bg( Gtk::STATE_NORMAL,Gdk::Color("grey") ); // Disable, because in single mode this is may be permanent red without processing statusBox->pack_start (*progressLabel); iops->pack_start(*statusBox, Gtk::PACK_SHRINK, 2); @@ -348,7 +348,7 @@ void EditorPanel::on_realize () { void EditorPanel::open (Thumbnail* tmb, rtengine::InitialImage* isrc) { - if (ipc) close(); + close(); // initialize everything openThm = tmb; openThm->increaseRef (); @@ -419,6 +419,10 @@ void EditorPanel::open (Thumbnail* tmb, rtengine::InitialImage* isrc) { { iarea->imageArea->mainCropWindow->cropHandler.newImage(ipc); iarea->imageArea->mainCropWindow->initialImageArrived(); + + // In single tab mode, the image is not always updated between switches + // normal redraw don't work, so this is the hard way + if (!options.tabbedUI) iarea->imageArea->mainCropWindow->cropHandler.update(); } else { Gtk::Allocation alloc; iarea->imageArea->on_resized(alloc); @@ -498,7 +502,7 @@ struct spsparams { EditorPanelIdleHelper* epih; }; -int setprocstate (void* data) { +int setProgressStateUIThread (void* data) { gdk_threads_enter (); spsparams* p = (spsparams*)data; @@ -527,19 +531,20 @@ void EditorPanel::setProgressState (int state) { spsparams* p = new spsparams; p->state = state; p->epih = epih; - g_idle_add (setprocstate, p); + g_idle_add (setProgressStateUIThread, p); } struct spparams { double val; Glib::ustring str; Gtk::ProgressBar *pProgress; + bool gtkEnter; }; int _setprogressStr( void *p ) { spparams *s= (spparams*)p; - gdk_threads_enter (); + if (s->gtkEnter) gdk_threads_enter (); if( ! s->str.empty() ) s->pProgress->set_text( M(s->str) ); @@ -550,7 +555,9 @@ int _setprogressStr( void *p ) else s->pProgress->modify_bg( Gtk::STATE_NORMAL,Gdk::Color("grey") ); } - gdk_threads_leave (); + + if (s->gtkEnter) gdk_threads_leave (); + delete s; return 0; } @@ -560,6 +567,7 @@ void EditorPanel::setProgress (double p) spparams *s=new spparams; s->val = p; s->pProgress = progressLabel; + s->gtkEnter = true; g_idle_add (_setprogressStr, s); } @@ -569,27 +577,30 @@ void EditorPanel::setProgressStr (Glib::ustring str) s->str = str; s->val = -1; s->pProgress = progressLabel; + s->gtkEnter = true; g_idle_add (_setprogressStr, s); } +// This is only called from the ThreadUI, so within the gtk thread void EditorPanel::refreshProcessingState (bool inProcessing) { + spparams *s=new spparams; + s->pProgress = progressLabel; + s->gtkEnter = false; + if (inProcessing) { + if (processingStartedTime==0) processingStartedTime = ::time(NULL); + + s->str = "PROGRESSBAR_PROCESSING"; + s->val = 0.0; + } else { // Set proc params of thumbnail. It saves it into the cache and updates the file browser. - if (ipc && openThm && !inProcessing && tpc->getChangedState()) { + if (ipc && openThm && tpc->getChangedState()) { rtengine::procparams::ProcParams pparams; ipc->getParams (&pparams); openThm->setProcParams (pparams, EDITOR, false); } - if (inProcessing) { - if (processingStartedTime==0) processingStartedTime = ::time(NULL); - - spparams *s=new spparams; - s->str = "PROGRESSBAR_PROCESSING"; - s->val = 0.0; - s->pProgress = progressLabel; - g_idle_add (_setprogressStr, s); - } else { + // Ring a sound if it was a long event if (processingStartedTime!=0) { time_t curTime= ::time(NULL); if (::difftime(curTime, processingStartedTime) > options.sndLngEditProcDoneSecs) @@ -598,12 +609,12 @@ void EditorPanel::refreshProcessingState (bool inProcessing) { processingStartedTime = 0; } - spparams *s=new spparams; + // Set progress bar "done" s->str = "PROGRESSBAR_READY"; s->val = 1.0; - s->pProgress = progressLabel; - g_idle_add (_setprogressStr, s); } + + _setprogressStr(s); } struct errparams {