Added time-remaining support to progress bars
Introduced a --time-remaining command-line option that uses the time and percent complete to extrapolate the time remaining until progress reaches 100%.
This commit is contained in:
parent
fc76e0c19b
commit
673550b6d3
17
src/option.c
17
src/option.c
@ -98,6 +98,7 @@ static gboolean zenity_progress_pulsate;
|
|||||||
static gboolean zenity_progress_auto_close;
|
static gboolean zenity_progress_auto_close;
|
||||||
static gboolean zenity_progress_auto_kill;
|
static gboolean zenity_progress_auto_kill;
|
||||||
static gboolean zenity_progress_no_cancel;
|
static gboolean zenity_progress_no_cancel;
|
||||||
|
static gboolean zenity_progress_time_remaining;
|
||||||
|
|
||||||
/* Question Dialog Options */
|
/* Question Dialog Options */
|
||||||
static gboolean zenity_question_active;
|
static gboolean zenity_question_active;
|
||||||
@ -767,6 +768,15 @@ static GOptionEntry progress_options[] = {
|
|||||||
N_("Hide Cancel button"),
|
N_("Hide Cancel button"),
|
||||||
NULL
|
NULL
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"time-remaining",
|
||||||
|
'\0',
|
||||||
|
0,
|
||||||
|
G_OPTION_ARG_NONE,
|
||||||
|
&zenity_progress_time_remaining,
|
||||||
|
N_("Estimate when progress will reach 100%"),
|
||||||
|
NULL
|
||||||
|
},
|
||||||
{
|
{
|
||||||
NULL
|
NULL
|
||||||
}
|
}
|
||||||
@ -1551,6 +1561,7 @@ zenity_progress_pre_callback (GOptionContext *context,
|
|||||||
zenity_progress_auto_close = FALSE;
|
zenity_progress_auto_close = FALSE;
|
||||||
zenity_progress_auto_kill = FALSE;
|
zenity_progress_auto_kill = FALSE;
|
||||||
zenity_progress_no_cancel = FALSE;
|
zenity_progress_no_cancel = FALSE;
|
||||||
|
zenity_progress_time_remaining = FALSE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1935,6 +1946,7 @@ zenity_progress_post_callback (GOptionContext *context,
|
|||||||
results->progress_data->autokill = zenity_progress_auto_kill;
|
results->progress_data->autokill = zenity_progress_auto_kill;
|
||||||
results->progress_data->percentage = zenity_progress_percentage;
|
results->progress_data->percentage = zenity_progress_percentage;
|
||||||
results->progress_data->no_cancel = zenity_progress_no_cancel;
|
results->progress_data->no_cancel = zenity_progress_no_cancel;
|
||||||
|
results->progress_data->time_remaining = zenity_progress_time_remaining;
|
||||||
} else {
|
} else {
|
||||||
if (zenity_progress_pulsate)
|
if (zenity_progress_pulsate)
|
||||||
zenity_option_error (zenity_option_get_name (progress_options, &zenity_progress_pulsate),
|
zenity_option_error (zenity_option_get_name (progress_options, &zenity_progress_pulsate),
|
||||||
@ -1951,9 +1963,14 @@ zenity_progress_post_callback (GOptionContext *context,
|
|||||||
if (zenity_progress_auto_kill)
|
if (zenity_progress_auto_kill)
|
||||||
zenity_option_error (zenity_option_get_name (progress_options, &zenity_progress_auto_kill),
|
zenity_option_error (zenity_option_get_name (progress_options, &zenity_progress_auto_kill),
|
||||||
ERROR_SUPPORT);
|
ERROR_SUPPORT);
|
||||||
|
|
||||||
if (zenity_progress_no_cancel)
|
if (zenity_progress_no_cancel)
|
||||||
zenity_option_error (zenity_option_get_name (progress_options, &zenity_progress_no_cancel),
|
zenity_option_error (zenity_option_get_name (progress_options, &zenity_progress_no_cancel),
|
||||||
ERROR_SUPPORT);
|
ERROR_SUPPORT);
|
||||||
|
|
||||||
|
if (zenity_progress_time_remaining)
|
||||||
|
zenity_option_error (zenity_option_get_name (progress_options, &zenity_progress_time_remaining),
|
||||||
|
ERROR_SUPPORT);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#include <time.h>
|
||||||
#include "zenity.h"
|
#include "zenity.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
@ -72,6 +73,39 @@ zenity_progress_pulsate_start (GObject *progress_bar)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
zenity_progress_update_time_remaining (ZenityProgressData *progress_data)
|
||||||
|
{
|
||||||
|
static GObject *progress_time = NULL;
|
||||||
|
static time_t start_time = (time_t)(-1);
|
||||||
|
float percentage = progress_data->percentage;
|
||||||
|
|
||||||
|
if (progress_time == NULL)
|
||||||
|
progress_time = gtk_builder_get_object (builder, "zenity_progress_time");
|
||||||
|
if (start_time == (time_t)(-1) || percentage <= 0.0 || percentage >= 100.0) {
|
||||||
|
start_time = time(NULL);
|
||||||
|
gtk_label_set_text (GTK_LABEL (progress_time), "");
|
||||||
|
} else {
|
||||||
|
time_t current_time = time (NULL);
|
||||||
|
time_t elapsed_time = current_time - start_time;
|
||||||
|
time_t total_time = (time_t) (100.0*elapsed_time/progress_data->percentage);
|
||||||
|
time_t remaining_time = total_time - elapsed_time;
|
||||||
|
gulong hours, minutes, seconds;
|
||||||
|
gchar *remaining_message;
|
||||||
|
|
||||||
|
seconds = (gulong) (remaining_time%60);
|
||||||
|
remaining_time /= 60;
|
||||||
|
minutes = (gulong) (remaining_time%60);
|
||||||
|
remaining_time /= 60;
|
||||||
|
hours = (gulong) remaining_time;
|
||||||
|
|
||||||
|
remaining_message = g_strdup_printf (_("Time remaining: %lu:%02lu:%02lu"),
|
||||||
|
hours, minutes, seconds);
|
||||||
|
gtk_label_set_text (GTK_LABEL (progress_time), remaining_message);
|
||||||
|
g_free (remaining_message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
zenity_progress_handle_stdin (GIOChannel *channel,
|
zenity_progress_handle_stdin (GIOChannel *channel,
|
||||||
GIOCondition condition,
|
GIOCondition condition,
|
||||||
@ -160,6 +194,9 @@ zenity_progress_handle_stdin (GIOChannel *channel,
|
|||||||
|
|
||||||
progress_data->percentage = percentage;
|
progress_data->percentage = percentage;
|
||||||
|
|
||||||
|
if (progress_data->time_remaining == TRUE)
|
||||||
|
zenity_progress_update_time_remaining (progress_data);
|
||||||
|
|
||||||
if (percentage == 100) {
|
if (percentage == 100) {
|
||||||
GObject *button;
|
GObject *button;
|
||||||
|
|
||||||
|
@ -105,6 +105,7 @@ typedef struct {
|
|||||||
gboolean autokill;
|
gboolean autokill;
|
||||||
gdouble percentage;
|
gdouble percentage;
|
||||||
gboolean no_cancel;
|
gboolean no_cancel;
|
||||||
|
gboolean time_remaining;
|
||||||
} ZenityProgressData;
|
} ZenityProgressData;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -870,6 +870,18 @@
|
|||||||
<property name="position">1</property>
|
<property name="position">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="zenity_progress_time">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
|
Reference in New Issue
Block a user