[gnome-control-center/benzea/display-freeze-break-request: 1/2] display: Resurrect the old scale buttons



commit dc7e916e187d25c4bcde39a7f58a3b40a6263ded
Author: Benjamin Berg <bberg redhat com>
Date:   Thu Feb 7 14:43:51 2019 +0100

    display: Resurrect the old scale buttons
    
    This means we show the first 5 scales that are supported for the
    display. That is the same behaviour as 3.30 had, therefore minimizing
    the UI changes that users will see.
    
    Note that there are plans to improve the scaling UI, however, it is not
    yet clear how this will look like.

 panels/display/cc-display-settings.c  | 70 +++++++++++++++++++----------------
 panels/display/cc-display-settings.ui | 12 +++++-
 2 files changed, 49 insertions(+), 33 deletions(-)
---
diff --git a/panels/display/cc-display-settings.c b/panels/display/cc-display-settings.c
index 58a308e2b..1b8f57e44 100644
--- a/panels/display/cc-display-settings.c
+++ b/panels/display/cc-display-settings.c
@@ -32,6 +32,8 @@
 #define MINIMUM_WIDTH 740
 #define MINIMUM_HEIGHT 530
 
+#define MAX_SCALE_BUTTONS 5
+
 struct _CcDisplaySettings
 {
   GtkDrawingArea    object;
@@ -46,7 +48,6 @@ struct _CcDisplaySettings
   GListStore       *orientation_list;
   GListStore       *refresh_rate_list;
   GListStore       *resolution_list;
-  GListStore       *scale_list;
 
   GtkWidget        *orientation_row;
   GtkWidget        *refresh_rate_row;
@@ -71,6 +72,11 @@ G_DEFINE_TYPE (CcDisplaySettings, cc_display_settings, GTK_TYPE_LIST_BOX)
 
 static GParamSpec *props[PROP_LAST];
 
+static void on_scale_btn_active_changed_cb (GtkWidget         *widget,
+                                            GParamSpec        *pspec,
+                                            CcDisplaySettings *self);
+
+
 static gboolean
 should_show_rotation (CcDisplaySettings *self)
 {
@@ -204,11 +210,9 @@ round_scale_for_ui (double scale)
 }
 
 static gchar *
-get_scale_string (CcValueObject *obj)
+make_scale_string (gdouble scale)
 {
-  gdouble scale = g_value_get_double (cc_value_object_get_value (obj));
-
-  return g_strdup_printf (" %d %% ", (int) (round_scale_for_ui (scale)*100));
+  return g_strdup_printf ("%d %%", (int) (round_scale_for_ui (scale)*100));
 }
 
 static gint
@@ -258,7 +262,6 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self)
   g_object_freeze_notify ((GObject*) self->orientation_row);
   g_object_freeze_notify ((GObject*) self->refresh_rate_row);
   g_object_freeze_notify ((GObject*) self->resolution_row);
-  g_object_freeze_notify ((GObject*) self->scale_row);
   g_object_freeze_notify ((GObject*) self->underscanning_switch);
 
   cc_display_monitor_get_geometry (self->selected_output, NULL, NULL, &width, &height);
@@ -392,29 +395,45 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self)
 
 
   /* Update scale row. */
-  g_list_store_remove_all (self->scale_list);
+  gtk_container_foreach (GTK_CONTAINER (self->scale_bbox), (GtkCallback) gtk_widget_destroy, NULL);
   if (!cc_display_config_is_cloning (self->config))
     {
+      gint buttons = 0;
       const gdouble *scales, *scale;
 
       scales = cc_display_mode_get_supported_scales (current_mode);
       for (scale = scales; *scale != 0.0; scale++)
         {
-          g_autoptr(CcValueObject) obj = NULL;
+          g_autofree gchar *scale_str = NULL;
+          GtkWidget *scale_btn;
 
           if (!display_mode_supported_at_scale (current_mode, *scale) &&
               cc_display_monitor_get_scale (self->selected_output) != *scale)
             continue;
 
-          obj = cc_value_object_new_collect (G_TYPE_DOUBLE, *scale);
-          g_list_store_append (self->scale_list, obj);
+          scale_str = make_scale_string (*scale);
+
+          scale_btn = gtk_toggle_button_new_with_label (scale_str);
+          g_object_set_data_full (G_OBJECT (scale_btn),
+                                  "scale",
+                                  g_memdup (scale, sizeof (gdouble)),
+                                  g_free);
+          gtk_widget_show (scale_btn);
+          gtk_container_add (GTK_CONTAINER (self->scale_bbox), scale_btn);
+          g_signal_connect_object (scale_btn,
+                                   "notify::active",
+                                   G_CALLBACK (on_scale_btn_active_changed_cb),
+                                   self, 0);
 
           if (cc_display_monitor_get_scale (self->selected_output) == *scale)
-            hdy_combo_row_set_selected_index (HDY_COMBO_ROW (self->scale_row),
-                                              g_list_model_get_n_items (G_LIST_MODEL (self->scale_list)) - 
1);
+            gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scale_btn), TRUE);
+
+          buttons += 1;
+          if (buttons >= MAX_SCALE_BUTTONS)
+            break;
         }
 
-      gtk_widget_set_visible (self->scale_row, g_list_model_get_n_items (G_LIST_MODEL (self->scale_list)) > 
1);
+      gtk_widget_set_visible (self->scale_row, buttons > 1);
     }
   else
     {
@@ -431,7 +450,6 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self)
   g_object_thaw_notify ((GObject*) self->orientation_row);
   g_object_thaw_notify ((GObject*) self->refresh_rate_row);
   g_object_thaw_notify ((GObject*) self->resolution_row);
-  g_object_thaw_notify ((GObject*) self->scale_row);
   g_object_thaw_notify ((GObject*) self->underscanning_switch);
   self->updating = FALSE;
 
@@ -515,21 +533,17 @@ on_resolution_selection_changed_cb (GtkWidget         *widget,
 }
 
 static void
-on_scale_selection_changed_cb (GtkWidget         *widget,
-                               GParamSpec        *pspec,
-                               CcDisplaySettings *self)
+on_scale_btn_active_changed_cb (GtkWidget         *widget,
+                                GParamSpec        *pspec,
+                                CcDisplaySettings *self)
 {
-  gint idx;
-  g_autoptr(CcValueObject) obj = NULL;
-
+  gdouble scale;
   if (self->updating)
     return;
 
-  idx = hdy_combo_row_get_selected_index (HDY_COMBO_ROW (self->scale_row));
-  obj = g_list_model_get_item (G_LIST_MODEL (self->scale_list), idx);
-
+  scale = *(gdouble*) g_object_get_data (G_OBJECT (widget), "scale");
   cc_display_monitor_set_scale (self->selected_output,
-                                g_value_get_double (cc_value_object_get_value (obj)));
+                                scale);
 
   g_signal_emit_by_name (G_OBJECT (self), "updated", self->selected_output);
 }
@@ -612,7 +626,6 @@ cc_display_settings_finalize (GObject *object)
   g_clear_object (&self->orientation_list);
   g_clear_object (&self->refresh_rate_list);
   g_clear_object (&self->resolution_list);
-  g_clear_object (&self->scale_list);
 
   if (self->idle_udpate_id)
     g_source_remove (self->idle_udpate_id);
@@ -664,6 +677,7 @@ cc_display_settings_class_init (CcDisplaySettingsClass *klass)
   gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, orientation_row);
   gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, refresh_rate_row);
   gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, resolution_row);
+  gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, scale_bbox);
   gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, scale_row);
   gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, underscanning_row);
   gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, underscanning_switch);
@@ -671,7 +685,6 @@ cc_display_settings_class_init (CcDisplaySettingsClass *klass)
   gtk_widget_class_bind_template_callback (widget_class, on_orientation_selection_changed_cb);
   gtk_widget_class_bind_template_callback (widget_class, on_refresh_rate_selection_changed_cb);
   gtk_widget_class_bind_template_callback (widget_class, on_resolution_selection_changed_cb);
-  gtk_widget_class_bind_template_callback (widget_class, on_scale_selection_changed_cb);
   gtk_widget_class_bind_template_callback (widget_class, on_underscanning_switch_active_changed_cb);
 }
 
@@ -687,7 +700,6 @@ cc_display_settings_init (CcDisplaySettings *self)
   self->orientation_list = g_list_store_new (CC_TYPE_VALUE_OBJECT);
   self->refresh_rate_list = g_list_store_new (CC_TYPE_DISPLAY_MODE);
   self->resolution_list = g_list_store_new (CC_TYPE_DISPLAY_MODE);
-  self->scale_list = g_list_store_new (CC_TYPE_VALUE_OBJECT);
 
   self->updating = TRUE;
 
@@ -703,10 +715,6 @@ cc_display_settings_init (CcDisplaySettings *self)
                                  G_LIST_MODEL (self->resolution_list),
                                  (HdyComboRowGetNameFunc) make_resolution_string,
                                  NULL, NULL);
-  hdy_combo_row_bind_name_model (HDY_COMBO_ROW (self->scale_row),
-                                 G_LIST_MODEL (self->scale_list),
-                                 (HdyComboRowGetNameFunc) get_scale_string,
-                                 NULL, NULL);
 
   self->updating = FALSE;
 }
diff --git a/panels/display/cc-display-settings.ui b/panels/display/cc-display-settings.ui
index 6e04265f2..0d3b9a84b 100644
--- a/panels/display/cc-display-settings.ui
+++ b/panels/display/cc-display-settings.ui
@@ -52,12 +52,20 @@
       </object>
     </child>
     <child>
-      <object class="HdyComboRow" id="scale_row">
+      <object class="HdyActionRow" id="scale_row">
         <property name="width_request">100</property>
         <property name="visible">True</property>
         <property name="can_focus">True</property>
         <property name="title">Scale</property>
-        <signal name="notify::selected-index" handler="on_scale_selection_changed_cb" swapped="no"/>
+        <child type="action">
+          <object class="GtkButtonBox" id="scale_bbox">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="halign">end</property>
+            <property name="valign">center</property>
+            <property name="layout_style">expand</property>
+          </object>
+        </child>
       </object>
     </child>
   </template>


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