Generate time remaining text for fraction complete progress bars
As described in the previous commit "Clear progress bar text when starting the bar (#230)" progress bar data is either reporting bytes copied or fraction complete. The bytes copied case gets in progress text like this: 544.00 MiB of 1.00 GiB copied (00:00:11 remaining) But the fraction complete gets no text. Now also generate time remaining text for progress bars only reporting fraction complete. As with the bytes copied text only add the time remaining estimate after 5 seconds have passed. Looks like: (00:01:59 remaining) This is most useful for NTFS partition copy and resize operations which can take a while depending on the amount of data involved.
This commit is contained in:
parent
1718c5d2fb
commit
3cbedad693
|
@ -70,7 +70,7 @@ public:
|
||||||
std::vector<OperationDetail*> & get_childs() ;
|
std::vector<OperationDetail*> & get_childs() ;
|
||||||
const std::vector<OperationDetail*> & get_childs() const ;
|
const std::vector<OperationDetail*> & get_childs() const ;
|
||||||
OperationDetail & get_last_child() ;
|
OperationDetail & get_last_child() ;
|
||||||
void run_progressbar( double progress, double target, ProgressBar_Text text_mode = PROGRESSBAR_TEXT_NONE );
|
void run_progressbar(double progress, double target, ProgressBar_Text text_mode = PROGRESSBAR_TEXT_TIME_REMAINING);
|
||||||
void stop_progressbar();
|
void stop_progressbar();
|
||||||
|
|
||||||
sigc::signal< void, const OperationDetail & > signal_update ;
|
sigc::signal< void, const OperationDetail & > signal_update ;
|
||||||
|
|
|
@ -26,7 +26,7 @@ namespace GParted
|
||||||
|
|
||||||
enum ProgressBar_Text
|
enum ProgressBar_Text
|
||||||
{
|
{
|
||||||
PROGRESSBAR_TEXT_NONE,
|
PROGRESSBAR_TEXT_TIME_REMAINING,
|
||||||
PROGRESSBAR_TEXT_COPY_BYTES
|
PROGRESSBAR_TEXT_COPY_BYTES
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ public:
|
||||||
ProgressBar();
|
ProgressBar();
|
||||||
~ProgressBar();
|
~ProgressBar();
|
||||||
|
|
||||||
void start( double target, ProgressBar_Text text_mode = PROGRESSBAR_TEXT_NONE );
|
void start(double target, ProgressBar_Text text_mode = PROGRESSBAR_TEXT_TIME_REMAINING);
|
||||||
void update( double progress );
|
void update( double progress );
|
||||||
void stop();
|
void stop();
|
||||||
bool running() const;
|
bool running() const;
|
||||||
|
@ -53,8 +53,8 @@ private:
|
||||||
double m_target; // Progress bar target should be > 0.0
|
double m_target; // Progress bar target should be > 0.0
|
||||||
double m_progress; // Should be 0.0 <= m_progress <= m_target
|
double m_progress; // Should be 0.0 <= m_progress <= m_target
|
||||||
double m_fraction; // Always between 0.0 and 1.0 for passing to Gtk::ProgressBar.set_fraction()
|
double m_fraction; // Always between 0.0 and 1.0 for passing to Gtk::ProgressBar.set_fraction()
|
||||||
ProgressBar_Text m_text_mode; // Whether to and style of text generation
|
ProgressBar_Text m_text_mode; // Style of text generation
|
||||||
Glib::ustring m_text; // Optional text for passing to Gtk::ProgressBar.set_text()
|
Glib::ustring m_text; // Text for passing to Gtk::ProgressBar.set_text()
|
||||||
Glib::Timer m_timer; // Measures elapsed time to the microsecond for accurate estimation
|
Glib::Timer m_timer; // Measures elapsed time to the microsecond for accurate estimation
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ namespace GParted
|
||||||
{
|
{
|
||||||
|
|
||||||
ProgressBar::ProgressBar() : m_running( false ), m_target( 1.0 ), m_progress( 0.0 ), m_fraction( 0.0 ),
|
ProgressBar::ProgressBar() : m_running( false ), m_target( 1.0 ), m_progress( 0.0 ), m_fraction( 0.0 ),
|
||||||
m_text_mode( PROGRESSBAR_TEXT_NONE )
|
m_text_mode(PROGRESSBAR_TEXT_TIME_REMAINING)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,14 +84,14 @@ void ProgressBar::do_update()
|
||||||
else if ( m_fraction > 1.0 )
|
else if ( m_fraction > 1.0 )
|
||||||
m_fraction = 1.0;
|
m_fraction = 1.0;
|
||||||
|
|
||||||
|
double elapsed = m_timer.elapsed();
|
||||||
if ( m_text_mode == PROGRESSBAR_TEXT_COPY_BYTES )
|
if ( m_text_mode == PROGRESSBAR_TEXT_COPY_BYTES )
|
||||||
{
|
{
|
||||||
double elapsed = m_timer.elapsed();
|
|
||||||
if ( m_running && elapsed >= 5.0 )
|
if ( m_running && elapsed >= 5.0 )
|
||||||
{
|
{
|
||||||
/* Only show "(00:01:59 remaining)" when a progress bar has been
|
/* Only show "(00:01:59 remaining)" when a progress bar has been
|
||||||
* running for at least 5 seconds to allow the data copying rate
|
* running for at least 5 seconds to allow the data copying rate
|
||||||
* to settle down a little before estimating the remaining time.
|
* to settle down a little before estimating the time remaining.
|
||||||
*/
|
*/
|
||||||
std::time_t remaining = Utils::round( (m_target - m_progress) /
|
std::time_t remaining = Utils::round( (m_target - m_progress) /
|
||||||
(m_progress / elapsed) );
|
(m_progress / elapsed) );
|
||||||
|
@ -109,6 +109,25 @@ void ProgressBar::do_update()
|
||||||
Utils::format_size( m_target, 1 ) );
|
Utils::format_size( m_target, 1 ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else /* (m_text_mode == PROGRESSBAR_TEXT_TIME_REMAINING) */
|
||||||
|
{
|
||||||
|
if (m_running && elapsed >= 5.0)
|
||||||
|
{
|
||||||
|
/* Only show "(00:01:59 remaining)" when a progress bar has been
|
||||||
|
* running for at least 5 seconds to allow the progress rate to
|
||||||
|
* settle down a little before estimating the time remaining.
|
||||||
|
*/
|
||||||
|
std::time_t remaining = Utils::round((m_target - m_progress) /
|
||||||
|
(m_progress / elapsed) );
|
||||||
|
m_text = Glib::ustring::compose( /* TO TRANSLATORS: looks like (00:01:59 remaining) */
|
||||||
|
_("(%1 remaining)"),
|
||||||
|
Utils::format_time(remaining));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_text.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}//GParted
|
}//GParted
|
||||||
|
|
Loading…
Reference in New Issue