summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2018-02-14 11:36:28 +0100
committerBastien Nocera <hadess@hadess.net>2018-04-19 14:59:10 +0200
commitf26d21682a4d3da63d3d71bd90f8f0d943ea4cbf (patch)
treea8b46a05e013c135827abe46091dc156e328f2af
parent6c447dc14a2a3a98d25e8a71fb3d5e08ae8b6fe6 (diff)
downloadgnome-control-center-f26d21682a4d3da63d3d71bd90f8f0d943ea4cbf.tar.gz
power: Automatically add values to drop-down when necessary
When a setting is set to a value that's not in the list of options, add that custom value to the drop-down for the duration of the run, so as to avoid the last item being selected and causing confusion. https://bugzilla.gnome.org/show_bug.cgi?id=793448
-rw-r--r--panels/power/cc-power-panel.c63
1 files changed, 62 insertions, 1 deletions
diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
index 565ee2772..7b7c4a24d 100644
--- a/panels/power/cc-power-panel.c
+++ b/panels/power/cc-power-panel.c
@@ -1188,6 +1188,51 @@ combo_time_changed_cb (GtkWidget *widget, CcPowerPanel *self)
g_settings_set_int (self->priv->gsd_settings, key, value);
}
+/* Copied from src/properties/bacon-video-widget-properties.c
+ * in totem */
+static char *
+time_to_string_text (gint64 msecs)
+{
+ char *secs, *mins, *hours, *string;
+ int sec, min, hour, _time;
+
+ _time = (int) (msecs / 1000);
+ sec = _time % 60;
+ _time = _time - sec;
+ min = (_time % (60*60)) / 60;
+ _time = _time - (min * 60);
+ hour = _time / (60*60);
+
+ hours = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "%d hour", "%d hours", hour), hour);
+
+ mins = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "%d minute",
+ "%d minutes", min), min);
+
+ secs = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "%d second",
+ "%d seconds", sec), sec);
+
+ if (hour > 0)
+ {
+ /* 5 hours 2 minutes 12 seconds */
+ string = g_strdup_printf (C_("time", "%s %s %s"), hours, mins, secs);
+ } else if (min > 0) {
+ /* 2 minutes 12 seconds */
+ string = g_strdup_printf (C_("time", "%s %s"), mins, secs);
+ } else if (sec > 0) {
+ /* 10 seconds */
+ string = g_strdup (secs);
+ } else {
+ /* 0 seconds */
+ string = g_strdup (_("0 seconds"));
+ }
+
+ g_free (hours);
+ g_free (mins);
+ g_free (secs);
+
+ return string;
+}
+
static void
set_value_for_combo (GtkComboBox *combo_box, gint value)
{
@@ -1209,11 +1254,27 @@ set_value_for_combo (GtkComboBox *combo_box, gint value)
gtk_tree_model_get (model, &iter,
ACTION_MODEL_VALUE, &value_tmp,
-1);
- if (value == value_tmp)
+ if (value_tmp == value)
{
gtk_combo_box_set_active_iter (combo_box, &iter);
return;
}
+ else if (value_tmp > value)
+ {
+ GtkTreeIter new;
+ char *text;
+
+ /* This is an unlisted value, add it to the drop-down */
+ gtk_list_store_insert_before (GTK_LIST_STORE (model), &new, &iter);
+ text = time_to_string_text (value * 1000);
+ gtk_list_store_set (GTK_LIST_STORE (model), &new,
+ ACTION_MODEL_TEXT, text,
+ ACTION_MODEL_VALUE, value,
+ -1);
+ g_free (text);
+ gtk_combo_box_set_active_iter (combo_box, &new);
+ return;
+ }
last = iter;
} while (gtk_tree_model_iter_next (model, &iter));