Changes to progress bars

This commit is contained in:
ffsup2
2011-03-17 17:18:13 +01:00
parent 538bcc601b
commit 910bcc688c
23 changed files with 255 additions and 293 deletions

View File

@@ -185,13 +185,11 @@ EditorPanel::EditorPanel (FilePanel* filePanel) : beforePreviewHandler(NULL), be
// Status box
statusBox = Gtk::manage (new Gtk::HBox ());
progressLabel = Gtk::manage (new Gtk::Label(""));
progressLabel = Gtk::manage (new Gtk::ProgressBar());
progressLabel->set_fraction(0.0);
progressLabel->modify_bg( Gtk::STATE_NORMAL,Gdk::Color("red") );
statusBox->pack_start (*progressLabel);
red = new Gtk::Image (argv0+"/images/red.png");
green = new Gtk::Image (argv0+"/images/green.png");
red->show ();
green->show ();
statusBox->pack_end (*green, Gtk::PACK_SHRINK, 2);
iops->pack_start(*statusBox, Gtk::PACK_SHRINK, 2);
// tbRightPanel_1
@@ -304,8 +302,6 @@ EditorPanel::~EditorPanel () {
delete tpc;
delete red;
delete green;
delete leftbox;
delete vboxright;
delete saveAsDialog;
@@ -537,24 +533,23 @@ void EditorPanel::setProgressState (int state) {
struct spparams {
double val;
Glib::ustring str;
rtengine::ProgressListener* progListener;
Gtk::ProgressBar *pProgress;
};
int _setprogress( void *p )
{
spparams *s= (spparams*)p;
gdk_threads_enter ();
s->progListener->setProgress( s->val );
gdk_threads_leave ();
delete s;
return 0;
}
int _setprogressStr( void *p )
{
spparams *s= (spparams*)p;
gdk_threads_enter ();
s->progListener->setProgressStr( s->str );
if( ! s->str.empty() )
s->pProgress->set_text( M(s->str) );
if( s->val >=0 ){
s->pProgress->set_fraction( s->val );
if( s->val <1.0 )
s->pProgress->modify_bg( Gtk::STATE_NORMAL,Gdk::Color("red") );
else
s->pProgress->modify_bg( Gtk::STATE_NORMAL,Gdk::Color("grey") );
}
gdk_threads_leave ();
delete s;
return 0;
@@ -564,15 +559,16 @@ void EditorPanel::setProgress (double p)
{
spparams *s=new spparams;
s->val = p;
s->progListener = parent;
g_idle_add (_setprogress, s);
s->pProgress = progressLabel;
g_idle_add (_setprogressStr, s);
}
void EditorPanel::setProgressStr (Glib::ustring str)
{
spparams *s=new spparams;
s->str = str;
s->progListener = parent;
s->val = -1;
s->pProgress = progressLabel;
g_idle_add (_setprogressStr, s);
}
@@ -585,19 +581,14 @@ void EditorPanel::refreshProcessingState (bool inProcessing) {
openThm->setProcParams (pparams, EDITOR, false);
}
// change state of the led
std::vector<Widget*> children = (std::vector<Widget*>) statusBox->get_children();
if (children.size()>=1) {
Gtk::Widget* wlast = children[children.size()-1];
if (wlast)
statusBox->remove (*wlast);
}
if (inProcessing) {
if (processingStartedTime==0) processingStartedTime = ::time(NULL);
statusBox->pack_end (*red, Gtk::PACK_SHRINK, 2);
spparams *s=new spparams;
s->str = "PROGRESSBAR_PROCESSING";
s->val = 0.0;
s->pProgress = progressLabel;
g_idle_add (_setprogressStr, s);
} else {
if (processingStartedTime!=0) {
time_t curTime= ::time(NULL);
@@ -607,7 +598,11 @@ void EditorPanel::refreshProcessingState (bool inProcessing) {
processingStartedTime = 0;
}
statusBox->pack_end (*green, Gtk::PACK_SHRINK, 2);
spparams *s=new spparams;
s->str = "PROGRESSBAR_READY";
s->val = 1.0;
s->pProgress = progressLabel;
g_idle_add (_setprogressStr, s);
}
}
@@ -893,6 +888,8 @@ bool EditorPanel::idle_saveImage (ProgressConnector<rtengine::IImage16*> *pc, Gl
sendtogimp->set_sensitive(true);
}
rtengine::ImageSource* imgsrc = isrc->getImageSource ();
imgsrc->setProgressListener(this);
return false;
}

View File

@@ -51,7 +51,7 @@ class EditorPanel : public Gtk::VBox,
public rtengine::HistogramListener {
protected:
Gtk::Label *progressLabel;
Gtk::ProgressBar *progressLabel;
Gtk::ToggleButton* info;
Gtk::ToggleButton* hidehp;
Gtk::ToggleButton* tbShowHideSidePanels;
@@ -64,8 +64,6 @@ class EditorPanel : public Gtk::VBox,
Gtk::HPaned* hpanedl;
Gtk::HPaned* hpanedr;
Gtk::HBox* statusBox;
Gtk::Image* red;
Gtk::Image* green;
Gtk::Image *iHistoryShow, *iHistoryHide;
Gtk::Image *iTopPanel_1_Show, *iTopPanel_1_Hide;
Gtk::Image *iRightPanel_1_Show, *iRightPanel_1_Hide;

View File

@@ -31,7 +31,7 @@
extern Options options;
FileBrowser::FileBrowser ()
: tbl(NULL) {
: tbl(NULL),numFiltered(0) {
fbih = new FileBrowserIdleHelper;
fbih->fbrowser = this;
@@ -568,8 +568,11 @@ void FileBrowser::applyFilter (const BrowserFilter& filter) {
// remove items not complying the filter from the selection
bool selchanged = false;
for (int i=0; i<fd.size(); i++)
if (fd[i]->selected && !checkFilter (fd[i])) {
numFiltered=0;
for (int i=0; i<fd.size(); i++)
if(checkFilter (fd[i]))
numFiltered++;
else if (fd[i]->selected ) {
fd[i]->selected = false;
std::vector<ThumbBrowserEntryBase*>::iterator j = std::find (selected.begin(), selected.end(), fd[i]);
selected.erase (j);

View File

@@ -89,7 +89,7 @@ class FileBrowser : public ThumbBrowserBase, public LWButtonListener {
FileBrowserListener* tbl;
BrowserFilter filter;
PartialPasteDlg partialPasteDlg;
int numFiltered;
FileBrowserIdleHelper* fbih;
void toTrashRequested (std::vector<FileBrowserEntry*> tbe);
@@ -115,6 +115,7 @@ class FileBrowser : public ThumbBrowserBase, public LWButtonListener {
void applyMenuItemActivated (Glib::ustring ppname);
void applyFilter (const BrowserFilter& filter);
int getNumFiltered(){ return numFiltered;}
void buttonPressed (LWButton* button, int actionCode, void* actionData);
void redrawNeeded (LWButton* button);

View File

@@ -25,6 +25,7 @@
#include <guiutils.h>
#include <glib/gstdio.h>
#include <iostream>
#include <iomanip>
#include <renamedlg.h>
#include <thumbimageupdater.h>
#include <safegtk.h>
@@ -57,7 +58,10 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) :
filterPanel(NULL),
coarsePanel(cp),
toolBar(tb),
filepanel(filepanel) {
filepanel(filepanel),
previewsToLoad(0),
previewsLoaded(0)
{
inTabMode=false;
@@ -183,12 +187,6 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) :
fileBrowser->applyFilter (getFilter());
pack_start (*hBox);
buttonBar2 = new Gtk::HBox ();
pack_end (*buttonBar2, Gtk::PACK_SHRINK);
progressBar = new Gtk::ProgressBar ();
buttonBar2->pack_start (*progressBar, Gtk::PACK_SHRINK, 4);
progressBar->set_size_request (-1, 16);
buttonBar->pack_start (*zoomBox, Gtk::PACK_SHRINK);
// add browserPath
@@ -330,6 +328,7 @@ void FileCatalog::dirSelected (const Glib::ustring& dirname, const Glib::ustring
}
_refreshProgressBar ();
filepanel->loadingThumbs(M("PROGRESSBAR_LOADINGTHUMBS"),0);
#ifdef _WIN32
wdMonitor = new WinDirMonitor (selectedDirectory, this);
@@ -348,8 +347,6 @@ void FileCatalog::dirSelected (const Glib::ustring& dirname, const Glib::ustring
void FileCatalog::enableTabMode(bool enable) {
inTabMode = enable;
if (!inTabMode) progressBar->hide (); // just needed once
fileBrowser->enableTabMode(inTabMode);
redrawAll();
@@ -360,13 +357,29 @@ void FileCatalog::_refreshProgressBar () {
// Also mention that this progress bar only measures the FIRST pass (quick thumbnails)
// The second, usually longer pass is done multithreaded down in the single entries and is NOT measured by this
if (!inTabMode) {
if (previewsToLoad>0) {
progressBar->set_fraction ((double)previewsLoaded / previewsToLoad);
progressBar->show ();
Gtk::Notebook *nb =(Gtk::Notebook *)(filepanel->get_parent());
Gtk::Box* hbb=NULL;
Gtk::Label *label=NULL;
if( options.mainNBVertical )
hbb = Gtk::manage (new Gtk::VBox ());
else
hbb = Gtk::manage (new Gtk::HBox ());
if (!previewsToLoad ) {
hbb->pack_start (*Gtk::manage (new Gtk::Image (Gtk::Stock::DIRECTORY, Gtk::ICON_SIZE_MENU)));
label = Gtk::manage (new Gtk::Label (M("MAIN_FRAME_FILEBROWSER")+" ("+Glib::ustring::format(fileBrowser->getNumFiltered())+"/"+Glib::ustring::format(previewsLoaded)+")"));
} else {
progressBar->set_fraction (1.0);
progressBar->hide ();
hbb->pack_start (*Gtk::manage (new Gtk::Image (Gtk::Stock::FIND, Gtk::ICON_SIZE_MENU)));
label = Gtk::manage (new Gtk::Label (M("MAIN_FRAME_FILEBROWSER")+" [" +Glib::ustring::format(std::fixed, std::setprecision(0), std::setw(3), (double)previewsLoaded / previewsToLoad*100 )+"%]" ));
filepanel->loadingThumbs("",(double)previewsLoaded / previewsToLoad);
}
if( options.mainNBVertical )
label->set_angle(90);
hbb->pack_start (*label);
hbb->set_spacing (2);
hbb->set_tooltip_markup (M("MAIN_FRAME_FILEBROWSER_TOOLTIP"));
hbb->show_all ();
nb->set_tab_label(*filepanel,*hbb);
}
}
@@ -432,8 +445,6 @@ void FileCatalog::_previewsFinished () {
redrawAll ();
previewsToLoad = 0;
previewsLoaded = 0;
progressBar->hide ();
if (filterPanel) {
filterPanel->set_sensitive (true);
@@ -446,6 +457,9 @@ void FileCatalog::_previewsFinished () {
}
// restart anything that might have been loaded low quality
fileBrowser->refreshQuickThumbImages();
fileBrowser->applyFilter (getFilter());
_refreshProgressBar();
filepanel->loadingThumbs(M("PROGRESSBAR_READY"),0);
}
void FileCatalog::previewsFinished (int dir_id) {
@@ -459,6 +473,7 @@ void FileCatalog::previewsFinished (int dir_id) {
if (!hasValidCurrentEFS)
currentEFS = dirEFS;
g_idle_add (prevfinished, this);
}
@@ -860,6 +875,7 @@ void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b) {
}
fileBrowser->applyFilter (getFilter ());
_refreshProgressBar();
//rearrange panels according to the selected filter
removeIfThere (hBox, trashButtonBox);
@@ -896,7 +912,8 @@ BrowserFilter FileCatalog::getFilter () {
void FileCatalog::filterChanged () {
fileBrowser->applyFilter (getFilter());
fileBrowser->applyFilter (getFilter());
_refreshProgressBar();
}
int FileCatalog::reparseDirectory () {
@@ -1051,6 +1068,7 @@ void FileCatalog::exifFilterChanged () {
currentEFS = filterPanel->getFilter ();
hasValidCurrentEFS = true;
fileBrowser->applyFilter (getFilter ());
_refreshProgressBar();
}
void FileCatalog::setFilterPanel (FilterPanel* fpanel) {

View File

@@ -108,7 +108,6 @@ class FileCatalog : public Gtk::VBox,
Glib::RefPtr<Gio::FileMonitor> dirMonitor;
Gtk::ProgressBar* progressBar;
int previewsToLoad;
int previewsLoaded;

View File

@@ -246,3 +246,10 @@ bool FilePanel::handleShortcutKey (GdkEventKey* event) {
return false;
}
void FilePanel::loadingThumbs(Glib::ustring str, double rate)
{
if( !str.empty())
parent->setProgressStr(str);
parent->setProgress( rate );
}

View File

@@ -70,6 +70,7 @@ class FilePanel : public Gtk::HPaned,
void setAspect();
void open (const Glib::ustring& d); // open a file or a directory
void refreshEditedState (const std::set<Glib::ustring>& efiles) { fileCatalog->refreshEditedState (efiles); }
void loadingThumbs(Glib::ustring str, double rate);
// call this before closeing rt: it saves file browser relating things into options
void saveOptions ();

View File

@@ -26,7 +26,7 @@
#include <omp.h>
#endif
#define DEBUG(format,args...)
#define DEBUG(format,args...)
//#define DEBUG(format,args...) printf("PreviewLoader::%s: " format "\n", __FUNCTION__, ## args)
class PreviewLoader::Impl
@@ -64,7 +64,7 @@ public:
typedef std::set<Job,JobCompare> JobSet;
Impl()
Impl():nConcurrentThreads(0)
{
int threadCount=2;
#ifdef _OPENMP
@@ -80,6 +80,8 @@ public:
JobSet jobs_;
gint nConcurrentThreads;
void
processNextJob(void)
{
@@ -100,27 +102,33 @@ public:
DEBUG("processing %s",j.dir_entry_.c_str());
DEBUG("%d job(s) remaining",jobs_.size());
}
g_atomic_int_inc (&nConcurrentThreads);
// unlock and do processing; will relock on block exit, then call listener
// if something got
Thumbnail* tmb = 0;
{
if (safe_file_test(j.dir_entry_, Glib::FILE_TEST_EXISTS))
try{
Thumbnail* tmb = 0;
{
tmb = cacheMgr->getEntry(j.dir_entry_);
if (safe_file_test(j.dir_entry_, Glib::FILE_TEST_EXISTS))
{
tmb = cacheMgr->getEntry(j.dir_entry_);
}
}
}
// we got something so notify listener
if ( tmb )
{
j.listener_->previewReady(j.dir_id_,new FileBrowserEntry(tmb,j.dir_entry_));
}
// we got something so notify listener
if ( tmb )
{
j.listener_->previewReady(j.dir_id_,new FileBrowserEntry(tmb,j.dir_entry_));
}
}catch(Glib::Error){
}catch(...){}
bool last = g_atomic_int_dec_and_test(& nConcurrentThreads);
// signal at end
if ( jobs_.empty() )
{
j.listener_->previewsFinished(j.dir_id_);
if(last)
j.listener_->previewsFinished(j.dir_id_);
}
}
};
@@ -163,8 +171,8 @@ PreviewLoader::add(int dir_id, const Glib::ustring& dir_entry, PreviewLoaderList
void
PreviewLoader::removeAllJobs(void)
{
DEBUG("stop");
DEBUG("stop %d",impl_->nConcurrentThreads);
Glib::Mutex::Lock lock(impl_->mutex_);
impl_->jobs_.clear();
}

View File

@@ -27,48 +27,35 @@
class PLDBridge : public rtengine::ProgressListener {
Gtk::Label* label;
Gtk::ProgressBar* progBar;
rtengine::ProgressListener* pl;
public:
PLDBridge ( Gtk::Label* l, Gtk::ProgressBar* pb)
: label(l), progBar(pb) {}
PLDBridge ( rtengine::ProgressListener* pb)
: pl(pb) {}
// ProgressListener interface
void setProgress (double p) {
gdk_threads_enter ();
progBar->set_fraction (p);
pl->setProgress(p);
gdk_threads_leave ();
}
void setProgressStr (Glib::ustring str) {
gdk_threads_enter ();
Glib::ustring progrstr;
if (str=="Decoding...")
progrstr = M("PROGRESSBAR_DECODING");
else if (str=="Ready.")
progrstr = M("PROGRESSBAR_READY");
else if (str=="Demosaicing...")
progrstr = M("PROGRESSBAR_DEMOSAICING");
else if (str=="Loading...")
progrstr = M("PROGRESSBAR_LOADING");
else if (str=="Loading PNG file...")
progrstr = M("PROGRESSBAR_LOADPNG");
else if (str=="Loading JPEG file...")
progrstr = M("PROGRESSBAR_LOADJPEG");
else if (str=="Loading TIFF file...")
progrstr = M("PROGRESSBAR_LOADTIFF");
else if (str=="Saving PNG file...")
progrstr = M("PROGRESSBAR_SAVEPNG");
else if (str=="Saving JPEG file...")
progrstr = M("PROGRESSBAR_SAVEJPEG");
else if (str=="Saving TIFF file...")
progrstr = M("PROGRESSBAR_SAVETIFF");
else if (str=="Processing...")
progrstr = M("PROGRESSBAR_PROCESSING");
else
progrstr = str;
progrstr = M(str);
pl->setProgressStr(progrstr);
gdk_threads_leave ();
}
label->set_text (progrstr);
void setProgressState (int state){
gdk_threads_enter ();
pl->setProgressState(state);
gdk_threads_leave ();
}
void error (Glib::ustring descr){
gdk_threads_enter ();
pl->error(descr);
gdk_threads_leave ();
}
};

View File

@@ -138,8 +138,6 @@ RTWindow::RTWindow ()
Gtk::VBox* mainBox = Gtk::manage (new Gtk::VBox ());
mainBox->pack_start (*mainNB);
Gtk::HBox* bottomBox = Gtk::manage (new Gtk::HBox ());
mainBox->pack_start (*bottomBox, Gtk::PACK_SHRINK, 1);
// filling bottom box
iFullScreen = new Gtk::Image(argv0+"/images/fullscreen.png");
@@ -157,14 +155,32 @@ RTWindow::RTWindow ()
btn_fullscreen->set_tooltip_markup (M("MAIN_BUTTON_FULLSCREEN"));
btn_fullscreen->set_image (*iFullScreen);
btn_fullscreen->signal_clicked().connect( sigc::mem_fun(*this, &RTWindow::toggle_fullscreen) );
bottomBox->pack_start (*preferences, Gtk::PACK_SHRINK, 0);
#if GTKMM_MINOR_VERSION >= 20
if (options.mainNBVertical) {
Gtk::VBox* bottomVBox = Gtk::manage (new Gtk::VBox ());
bottomVBox->pack_start (prProgBar, Gtk::PACK_SHRINK, 1);
bottomVBox->pack_end (*preferences, Gtk::PACK_SHRINK, 0);
bottomVBox->pack_end (*btn_fullscreen, Gtk::PACK_EXPAND_WIDGET, 1);
prProgBar.set_orientation(Gtk::PROGRESS_BOTTOM_TO_TOP);
mainNB->set_action_widget( bottomVBox,Gtk::PACK_END);
bottomVBox->show_all();
}else{
Gtk::HBox* bottomHBox = Gtk::manage (new Gtk::HBox ());
bottomHBox->pack_end (*btn_fullscreen, Gtk::PACK_SHRINK, 1);
bottomHBox->pack_end (*preferences, Gtk::PACK_SHRINK, 0);
bottomHBox->pack_start (prProgBar, Gtk::PACK_EXPAND_WIDGET, 1);
mainNB->set_action_widget( bottomHBox,Gtk::PACK_END);
bottomHBox->show_all();
}
#else
Gtk::HBox* bottomBox = Gtk::manage (new Gtk::HBox ());
bottomBox->pack_end (*btn_fullscreen, Gtk::PACK_SHRINK, 1);
bottomBox->pack_start (*rtWeb, Gtk::PACK_SHRINK, 1);
bottomBox->pack_start (prLabel );
prLabel.set_alignment(Gtk::ALIGN_RIGHT);
bottomBox->pack_start (prProgBar, Gtk::PACK_SHRINK, 1);
bottomBox->pack_end (*preferences, Gtk::PACK_SHRINK, 0);
bottomBox->pack_start (prProgBar, Gtk::PACK_EXPAND_WIDGET, 1);
mainBox->pack_start (*bottomBox, Gtk::PACK_SHRINK, 1);
#endif
pldBridge = new PLDBridge(&prLabel,&prProgBar);
pldBridge = new PLDBridge(static_cast<rtengine::ProgressListener*>(this));
Glib::RefPtr<Gtk::RcStyle> style = Gtk::RcStyle::create ();
style->set_xthickness (0);
@@ -365,16 +381,15 @@ void RTWindow::setProgress (double p) {
}
void RTWindow::setProgressStr (Glib::ustring str) {
prLabel.set_text ( str );
if (!options.mainNBVertical)
prProgBar.set_text ( str );
}
void RTWindow::setProgressState (int state) {
if (state) {
prProgBar.show();
prLabel.show();
} else {
prProgBar.hide();
prLabel.hide();
}
}
@@ -395,7 +410,7 @@ void RTWindow::toggle_fullscreen () {
}
void RTWindow::error (Glib::ustring descr){
prLabel.set_text ( descr );
prProgBar.set_text ( descr );
}
void RTWindow::SetEditorCurrent()

View File

@@ -34,7 +34,6 @@ class RTWindow : public Gtk::Window, public rtengine::ProgressListener{
std::set<Glib::ustring> filesEdited;
std::map<Glib::ustring, EditorPanel*> epanels;
Gtk::Label prLabel;
Gtk::ProgressBar prProgBar;
PLDBridge* pldBridge;
bool is_fullscreen;

View File

@@ -24,11 +24,6 @@ ZoomPanel::ZoomPanel (ImageArea* iarea) : iarea(iarea) {
set_border_width (0);
Gtk::Label* label = Gtk::manage (new Gtk::Label (Glib::ustring("<b>") + "Zoom" + ":</b> "));
label->set_use_markup (true);
pack_start (*label, Gtk::PACK_SHRINK, 4);
Gtk::Image* imageOut = Gtk::manage (new Gtk::Image (Gtk::StockID ("gtk-zoom-out"), Gtk::ICON_SIZE_SMALL_TOOLBAR));
imageOut->set_padding(0,0);
Gtk::Image* imageIn = Gtk::manage (new Gtk::Image (Gtk::StockID ("gtk-zoom-in"), Gtk::ICON_SIZE_SMALL_TOOLBAR));