[gnome-control-center] power: Use HdyComboRow for the Blank Screen row



commit 3069dc84c80ecd927f66c0f0fa7be14ad7d3895f
Author: Adrien Plazas <kekun plazas laposte net>
Date:   Fri Jan 8 16:12:56 2021 +0100

    power: Use HdyComboRow for the Blank Screen row
    
    This simplifies the code a bit and modernizes the UI.

 panels/power/cc-power-panel.c  | 110 ++++++++++++++++++++++++++++++++---------
 panels/power/cc-power-panel.ui |  88 ++-------------------------------
 2 files changed, 92 insertions(+), 106 deletions(-)
---
diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
index 1a8cfa969..b046b2589 100644
--- a/panels/power/cc-power-panel.c
+++ b/panels/power/cc-power-panel.c
@@ -73,7 +73,7 @@ struct _CcPowerPanel
   GtkSizeGroup      *battery_row_sizegroup;
   GtkBox            *battery_section;
   GtkSizeGroup      *battery_sizegroup;
-  GtkListBoxRow     *blank_screen_row;
+  HdyComboRow       *blank_screen_row;
   GtkListBoxRow     *brightness_row;
   CcBrightnessScale *brightness_scale;
   GtkListBoxRow     *bt_row;
@@ -87,7 +87,6 @@ struct _CcPowerPanel
   GtkLabel          *general_heading;
   GtkListBox        *general_listbox;
   GtkBox            *general_section;
-  GtkComboBox       *idle_delay_combo;
   GtkListBoxRow     *kbd_brightness_row;
   CcBrightnessScale *kbd_brightness_scale;
   GtkSizeGroup      *level_sizegroup;
@@ -577,6 +576,49 @@ set_value_for_combo (GtkComboBox *combo_box, gint value)
   gtk_combo_box_set_active_iter (combo_box, &new);
 }
 
+static void
+set_value_for_combo_row (HdyComboRow *combo_row, gint value)
+{
+  gboolean insert = FALSE;
+  guint insert_before = 0;
+  guint i;
+  HdyValueObject *new;
+  GListModel *model;
+  gint value_last = 0;
+  g_autofree gchar *text = NULL;
+
+  /* try to make the UI match the setting */
+  model = hdy_combo_row_get_model (combo_row);
+  for (i = 0; i < g_list_model_get_n_items (model); i++)
+    {
+      HdyValueObject *value_object = g_list_model_get_item (model, i);
+      gint value_tmp = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (value_object), "value"));
+      if (value_tmp == value)
+        {
+          hdy_combo_row_set_selected_index (combo_row, i);
+          return;
+        }
+
+      /* Insert before if the next value is larger or the value is lower
+       * again (i.e. "Never" is zero and last). */
+      if (!insert && (value_tmp > value || value_last > value_tmp))
+        {
+          insert = TRUE;
+          insert_before = i;
+        }
+
+      value_last = value_tmp;
+    }
+
+  /* The value is not listed, so add it at the best point (or the end). */
+  text = cc_util_time_to_string_text (value * 1000);
+  new = hdy_value_object_new_string (text);
+  g_object_set_data (G_OBJECT (new), "value",
+                     GUINT_TO_POINTER (value));
+  g_list_store_insert (G_LIST_STORE (model), insert_before, new);
+  hdy_combo_row_set_selected_index (combo_row, insert_before);
+}
+
 static void
 set_ac_battery_ui_mode (CcPowerPanel *self)
 {
@@ -869,25 +911,18 @@ keynav_failed_cb (CcPowerPanel *self, GtkDirectionType direction, GtkWidget *lis
 }
 
 static void
-idle_delay_combo_changed_cb (CcPowerPanel *self)
+blank_screen_row_changed_cb (CcPowerPanel *self)
 {
-  GtkTreeIter iter;
-  GtkTreeModel *model;
+  GListModel *model;
+  gint selected_index;
+  HdyValueObject *value_object;
   gint value;
-  gboolean ret;
 
-  /* no selection */
-  ret = gtk_combo_box_get_active_iter (self->idle_delay_combo, &iter);
-  if (!ret)
-    return;
+  model = hdy_combo_row_get_model (self->blank_screen_row);
+  selected_index = hdy_combo_row_get_selected_index (self->blank_screen_row);
+  value_object = g_list_model_get_item (model, selected_index);
+  value = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (value_object), "value"));
 
-  /* get entry */
-  model = gtk_combo_box_get_model (self->idle_delay_combo);
-  gtk_tree_model_get (model, &iter,
-                      1, &value,
-                      -1);
-
-  /* set both keys */
   g_settings_set_uint (self->session_settings, "idle-delay", value);
 }
 
@@ -1171,6 +1206,37 @@ has_kbd_brightness_cb (CcPowerPanel *self,
   gtk_widget_set_visible (GTK_WIDGET (self->kbd_brightness_row), has_brightness);
 }
 
+static void
+populate_blank_screen_row (HdyComboRow *combo_row)
+{
+  g_autoptr (GListStore) list_store = g_list_store_new (HDY_TYPE_VALUE_OBJECT);
+  gint minutes[] = { 1, 2, 3, 4, 5, 8, 10, 12, 15 };
+  guint i;
+  g_autoptr (HdyValueObject) never_value_object = NULL;
+
+  for (i = 0; i < G_N_ELEMENTS (minutes); i++)
+    {
+      gchar *text = NULL;
+      g_autoptr (HdyValueObject) value_object = NULL;
+
+      /* Translators: Option for "Blank Screen" in "Power" panel */
+      text = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "%d minute", "%d minutes", minutes[i]), 
minutes[i]);
+      value_object = hdy_value_object_new_take_string (text);
+
+      g_object_set_data (G_OBJECT (value_object), "value", GUINT_TO_POINTER (minutes[i] * 60));
+      g_list_store_append (list_store, value_object);
+    }
+
+  never_value_object = hdy_value_object_new_string (C_("Idle time", "Never"));
+  g_object_set_data (G_OBJECT (never_value_object), "value", GUINT_TO_POINTER (0));
+  g_list_store_append (list_store, never_value_object);
+
+  hdy_combo_row_bind_name_model (combo_row,
+                                 G_LIST_MODEL (list_store),
+                                 (HdyComboRowGetNameFunc) hdy_value_object_dup_string,
+                                 NULL, NULL);
+}
+
 static void
 setup_power_saving (CcPowerPanel *self)
 {
@@ -1191,10 +1257,11 @@ setup_power_saving (CcPowerPanel *self)
                    self->dim_screen_switch, "active",
                    G_SETTINGS_BIND_DEFAULT);
 
+  g_signal_handlers_block_by_func (self->blank_screen_row, blank_screen_row_changed_cb, self);
+  populate_blank_screen_row (self->blank_screen_row);
   value = g_settings_get_uint (self->session_settings, "idle-delay");
-  g_signal_handlers_block_by_func (self->idle_delay_combo, idle_delay_combo_changed_cb, self);
-  set_value_for_combo (self->idle_delay_combo, value);
-  g_signal_handlers_unblock_by_func (self->idle_delay_combo, idle_delay_combo_changed_cb, self);
+  set_value_for_combo_row (self->blank_screen_row, value);
+  g_signal_handlers_unblock_by_func (self->blank_screen_row, blank_screen_row_changed_cb, self);
 
   /* The default values for these settings are unfortunate for us;
    * timeout == 0, action == suspend means 'do nothing' - just
@@ -1653,7 +1720,6 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
   gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, general_heading);
   gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, general_listbox);
   gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, general_section);
-  gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, idle_delay_combo);
   gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, kbd_brightness_row);
   gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, kbd_brightness_scale);
   gtk_widget_class_bind_template_child (widget_class, CcPowerPanel, level_sizegroup);
@@ -1683,7 +1749,7 @@ cc_power_panel_class_init (CcPowerPanelClass *klass)
   gtk_widget_class_bind_template_callback (widget_class, bt_switch_changed_cb);
   gtk_widget_class_bind_template_callback (widget_class, has_brightness_cb);
   gtk_widget_class_bind_template_callback (widget_class, has_kbd_brightness_cb);
-  gtk_widget_class_bind_template_callback (widget_class, idle_delay_combo_changed_cb);
+  gtk_widget_class_bind_template_callback (widget_class, blank_screen_row_changed_cb);
   gtk_widget_class_bind_template_callback (widget_class, keynav_failed_cb);
   gtk_widget_class_bind_template_callback (widget_class, mobile_switch_changed_cb);
   gtk_widget_class_bind_template_callback (widget_class, power_button_combo_changed_cb);
diff --git a/panels/power/cc-power-panel.ui b/panels/power/cc-power-panel.ui
index d3e200d93..a9bb39b77 100644
--- a/panels/power/cc-power-panel.ui
+++ b/panels/power/cc-power-panel.ui
@@ -51,56 +51,6 @@
       </row>
     </data>
   </object>
-  <object class="GtkListStore" id="idle_time_liststore">
-    <columns>
-      <!-- column-name name -->
-      <column type="gchararray"/>
-      <!-- column-name value -->
-      <column type="gint"/>
-    </columns>
-    <data>
-      <row>
-        <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank 
screen&quot; in &quot;Power&quot; panel.">1 minute</col>
-        <col id="1">60</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank 
screen&quot; in &quot;Power&quot; panel.">2 minutes</col>
-        <col id="1">120</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank 
screen&quot; in &quot;Power&quot; panel.">3 minutes</col>
-        <col id="1">180</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank 
screen&quot; in &quot;Power&quot; panel.">4 minutes</col>
-        <col id="1">240</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank 
screen&quot; in &quot;Power&quot; panel.">5 minutes</col>
-        <col id="1">300</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank 
screen&quot; in &quot;Power&quot; panel.">8 minutes</col>
-        <col id="1">480</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank 
screen&quot; in &quot;Power&quot; panel.">10 minutes</col>
-        <col id="1">600</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank 
screen&quot; in &quot;Power&quot; panel.">12 minutes</col>
-        <col id="1">720</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank 
screen&quot; in &quot;Power&quot; panel.">15 minutes</col>
-        <col id="1">900</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="blank_screen" comments="Translators: Option for &quot;Blank 
screen&quot; in &quot;Power&quot; panel.">Never</col>
-        <col id="1">0</col>
-      </row>
-    </data>
-  </object>
   <object class="GtkListStore" id="power_button_liststore">
     <columns>
       <!-- column-name name -->
@@ -447,41 +397,11 @@
                               </object>
                             </child>
                             <child>
-                              <object class="GtkListBoxRow" id="blank_screen_row">
+                              <object class="HdyComboRow" id="blank_screen_row">
                                 <property name="visible">True</property>
-                                <property name="selectable">False</property>
-                                <property name="activatable">False</property>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">True</property>
-                                    <property name="margin-start">12</property>
-                                    <property name="margin-end">12</property>
-                                    <property name="spacing">12</property>
-                                    <child>
-                                      <object class="GtkLabel">
-                                        <property name="visible">True</property>
-                                        <property name="use-markup">True</property>
-                                        <property name="use-underline">True</property>
-                                        <property name="ellipsize">end</property>
-                                        <property name="label" translatable="yes">_Blank Screen</property>
-                                        <property name="margin-top">6</property>
-                                        <property name="margin-bottom">6</property>
-                                        <property name="expand">True</property>
-                                        <property name="xalign">0</property>
-                                        <property name="mnemonic_widget">idle_delay_combo</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkComboBoxText" id="idle_delay_combo">
-                                        <property name="visible">True</property>
-                                        <property name="valign">center</property>
-                                        <property name="entry-text-column">0</property>
-                                        <property name="model">idle_time_liststore</property>
-                                        <signal name="changed" handler="idle_delay_combo_changed_cb" 
object="CcPowerPanel" swapped="yes"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
+                                <property name="title" translatable="yes">_Blank Screen</property>
+                                <property name="use_underline">True</property>
+                                <signal name="notify::selected-index" handler="blank_screen_row_changed_cb" 
object="CcPowerPanel" swapped="yes"/>
                               </object>
                             </child>
                             <child>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]