[gnome-control-center/gnome-3-30] power: Correctly lookup or insert new items into combobox



commit 8b8b49e92749bd256812cb968ea9009c0fc89ccc
Author: Benjamin Berg <bberg redhat com>
Date:   Mon Nov 5 12:27:12 2018 +0000

    power: Correctly lookup or insert new items into combobox
    
    The code to lookup or insert items into the combobox had a few issues.
    It would assume that the items are sorted, causing existing items to not
    be found and be inserted instead. It also would simply forget to insert
    an item if it was larger than all existing items.
    
    This code is now changed to iterate over all items, finding the best
    insertion point in the process (next item has a larger value, or the
    values are not increasing anymore). The item will only be inserted if it
    has not been found.
    
    Fixes #261
    
    
    (cherry picked from commit b5711c59eccb90a547921af6e0f11e5e3dd249f5)

 panels/power/cc-power-panel.c | 38 ++++++++++++++++++++------------------
 1 file changed, 20 insertions(+), 18 deletions(-)
---
diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
index 298c2bfc9..ea12bd593 100644
--- a/panels/power/cc-power-panel.c
+++ b/panels/power/cc-power-panel.c
@@ -1197,9 +1197,12 @@ static void
 set_value_for_combo (GtkComboBox *combo_box, gint value)
 {
   GtkTreeIter iter;
-  GtkTreeIter last;
+  g_autoptr(GtkTreeIter) insert = NULL;
+  GtkTreeIter new;
   GtkTreeModel *model;
   gint value_tmp;
+  gint value_last = 0;
+  g_autofree gchar *text = NULL;
   gboolean ret;
 
   /* get entry */
@@ -1219,25 +1222,24 @@ set_value_for_combo (GtkComboBox *combo_box, gint value)
           gtk_combo_box_set_active_iter (combo_box, &iter);
           return;
         }
-      else if (value_tmp > value)
-        {
-          GtkTreeIter new;
-          g_autofree gchar *text = NULL;
-
-          /* 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);
-          gtk_combo_box_set_active_iter (combo_box, &new);
-          return;
-        }
-      last = iter;
+
+      /* 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 = gtk_tree_iter_copy (&iter);
+
+      value_last = value_tmp;
     } while (gtk_tree_model_iter_next (model, &iter));
 
-  gtk_combo_box_set_active_iter (combo_box, &last);
+  /* The value is not listed, so add it at the best point (or the end). */
+  gtk_list_store_insert_before (GTK_LIST_STORE (model), &new, insert);
+
+  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);
+  gtk_combo_box_set_active_iter (combo_box, &new);
 }
 
 static void


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