[gnome-software/wip/hughsie/non-free: 3/6] trivial: Add the ability to add a GtkSwitch to the source row widget



commit 576439edf386092bc9af7e3cf52a29260f54af4e
Author: Richard Hughes <richard hughsie com>
Date:   Mon Aug 29 17:13:50 2016 +0100

    trivial: Add the ability to add a GtkSwitch to the source row widget
    
    Also, allow an extra line of text for future functionality.

 src/gs-sources-dialog-row.c  |   92 +++++++++++++++++++++++++++++++++++++++--
 src/gs-sources-dialog-row.h  |    7 +++
 src/gs-sources-dialog-row.ui |   67 +++++++++++++++++++++++-------
 3 files changed, 146 insertions(+), 20 deletions(-)
---
diff --git a/src/gs-sources-dialog-row.c b/src/gs-sources-dialog-row.c
index 29b88d4..6b41d3b 100644
--- a/src/gs-sources-dialog-row.c
+++ b/src/gs-sources-dialog-row.c
@@ -27,40 +27,122 @@ struct _GsSourcesDialogRow
 {
        GtkListBoxRow    parent_instance;
 
+       GtkWidget       *active_switch;
        GtkWidget       *name_label;
+       GtkWidget       *comment_label;
        GtkWidget       *description_label;
 };
 
+enum {
+       PROP_0,
+       PROP_SWITCH_ACTIVE,
+       PROP_LAST
+};
+
 G_DEFINE_TYPE (GsSourcesDialogRow, gs_sources_dialog_row, GTK_TYPE_LIST_BOX_ROW)
 
 void
-gs_sources_dialog_row_set_name (GsSourcesDialogRow *row,
-                                const gchar        *name)
+gs_sources_dialog_row_set_switch_enabled (GsSourcesDialogRow *row,
+                                      gboolean switch_enabled)
+{
+       gtk_widget_set_visible (row->active_switch, switch_enabled);
+}
+
+void
+gs_sources_dialog_row_set_switch_active (GsSourcesDialogRow *row,
+                                        gboolean switch_active)
+{
+       gtk_switch_set_active (GTK_SWITCH (row->active_switch), switch_active);
+}
+
+void
+gs_sources_dialog_row_set_name (GsSourcesDialogRow *row, const gchar *name)
 {
        gtk_label_set_text (GTK_LABEL (row->name_label), name);
+       gtk_widget_set_visible (row->name_label, name != NULL);
+}
+
+void
+gs_sources_dialog_row_set_comment (GsSourcesDialogRow *row, const gchar *comment)
+{
+       gtk_label_set_markup (GTK_LABEL (row->comment_label), comment);
+       gtk_widget_set_visible (row->comment_label, comment != NULL);
+
+       /* make the name bold */
+       if (comment != NULL) {
+               PangoAttrList *attr_list = pango_attr_list_new ();
+               pango_attr_list_insert (attr_list,
+                                       pango_attr_weight_new (PANGO_WEIGHT_BOLD));
+               gtk_label_set_attributes (GTK_LABEL (row->name_label), attr_list);
+               pango_attr_list_unref (attr_list);
+       }
 }
 
 void
-gs_sources_dialog_row_set_description (GsSourcesDialogRow *row,
-                                       const gchar        *description)
+gs_sources_dialog_row_set_description (GsSourcesDialogRow *row, const gchar *description)
+{
+       gtk_label_set_markup (GTK_LABEL (row->description_label), description);
+       gtk_widget_set_visible (row->description_label, description != NULL);
+}
+
+static void
+gs_sources_dialog_switch_active_cb (GtkSwitch *active_switch,
+                                   GParamSpec *pspec,
+                                   GsSourcesDialogRow *row)
+{
+       g_object_notify (G_OBJECT (row), "switch-active");
+}
+
+gboolean
+gs_sources_dialog_row_get_switch_active (GsSourcesDialogRow *row)
 {
-       gtk_label_set_text (GTK_LABEL (row->description_label), description);
+       return gtk_switch_get_active (GTK_SWITCH (row->active_switch));
+}
+
+static void
+gs_sources_dialog_row_get_property (GObject *object,
+                                   guint prop_id,
+                                   GValue *value,
+                                   GParamSpec *pspec)
+{
+       GsSourcesDialogRow *row = GS_SOURCES_DIALOG_ROW (object);
+       switch (prop_id) {
+       case PROP_SWITCH_ACTIVE:
+               g_value_set_boolean (value,
+                                    gs_sources_dialog_row_get_switch_active (row));
+               break;
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+               break;
+       }
 }
 
 static void
 gs_sources_dialog_row_init (GsSourcesDialogRow *row)
 {
        gtk_widget_init_template (GTK_WIDGET (row));
+       g_signal_connect (row->active_switch, "notify::active",
+                         G_CALLBACK (gs_sources_dialog_switch_active_cb), row);
 }
 
 static void
 gs_sources_dialog_row_class_init (GsSourcesDialogRowClass *klass)
 {
+       GParamSpec *pspec;
        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+       object_class->get_property = gs_sources_dialog_row_get_property;
+
+       pspec = g_param_spec_string ("switch-active", NULL, NULL, FALSE,
+                                    G_PARAM_READABLE);
+       g_object_class_install_property (object_class, PROP_SWITCH_ACTIVE, pspec);
 
        gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/Software/gs-sources-dialog-row.ui");
 
+       gtk_widget_class_bind_template_child (widget_class, GsSourcesDialogRow, active_switch);
        gtk_widget_class_bind_template_child (widget_class, GsSourcesDialogRow, name_label);
+       gtk_widget_class_bind_template_child (widget_class, GsSourcesDialogRow, comment_label);
        gtk_widget_class_bind_template_child (widget_class, GsSourcesDialogRow, description_label);
 }
 
diff --git a/src/gs-sources-dialog-row.h b/src/gs-sources-dialog-row.h
index 0d0f00c..9ee7eb1 100644
--- a/src/gs-sources-dialog-row.h
+++ b/src/gs-sources-dialog-row.h
@@ -31,8 +31,15 @@ G_BEGIN_DECLS
 G_DECLARE_FINAL_TYPE (GsSourcesDialogRow, gs_sources_dialog_row, GS, SOURCES_DIALOG_ROW, GtkListBoxRow)
 
 GtkWidget      *gs_sources_dialog_row_new              (void);
+void            gs_sources_dialog_row_set_switch_enabled (GsSourcesDialogRow   *row,
+                                                        gboolean                switch_enabled);
+void            gs_sources_dialog_row_set_switch_active (GsSourcesDialogRow    *row,
+                                                        gboolean                switch_active);
+gboolean        gs_sources_dialog_row_get_switch_active (GsSourcesDialogRow    *row);
 void            gs_sources_dialog_row_set_name         (GsSourcesDialogRow     *row,
                                                         const gchar            *name);
+void            gs_sources_dialog_row_set_comment      (GsSourcesDialogRow     *row,
+                                                        const gchar            *comment);
 void            gs_sources_dialog_row_set_description  (GsSourcesDialogRow     *row,
                                                         const gchar            *description);
 
diff --git a/src/gs-sources-dialog-row.ui b/src/gs-sources-dialog-row.ui
index fc30790..67ba900 100644
--- a/src/gs-sources-dialog-row.ui
+++ b/src/gs-sources-dialog-row.ui
@@ -3,33 +3,70 @@
   <!-- interface-requires gtk+ 3.10 -->
   <template class="GsSourcesDialogRow" parent="GtkListBoxRow">
     <child>
-      <object class="GtkBox" id="vbox">
+      <object class="GtkBox">
         <property name="visible">True</property>
         <property name="margin-top">12</property>
         <property name="margin-bottom">12</property>
         <property name="margin-start">12</property>
         <property name="margin-end">12</property>
-        <property name="orientation">vertical</property>
+        <property name="can_focus">False</property>
+        <property name="orientation">horizontal</property>
+        <property name="spacing">16</property>
         <child>
-          <object class="GtkLabel" id="name_label">
+          <object class="GtkBox" id="vbox">
             <property name="visible">True</property>
-            <property name="halign">start</property>
-            <property name="ellipsize">end</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">4</property>
+            <child>
+              <object class="GtkLabel" id="name_label">
+                <property name="visible">True</property>
+                <property name="halign">start</property>
+                <property name="ellipsize">end</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="comment_label">
+                <property name="visible">False</property>
+                <property name="halign">start</property>
+                <property name="xalign">0</property>
+                <property name="wrap">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="description_label">
+                <property name="visible">True</property>
+                <property name="halign">start</property>
+                <property name="xalign">0</property>
+                <property name="wrap">True</property>
+                <style>
+                  <class name="dim-label"/>
+                </style>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+              </packing>
+            </child>
           </object>
           <packing>
-            <property name="expand">False</property>
-            <property name="fill">False</property>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
           </packing>
         </child>
         <child>
-          <object class="GtkLabel" id="description_label">
-            <property name="visible">True</property>
-            <property name="halign">start</property>
-            <property name="xalign">0</property>
-            <property name="wrap">True</property>
-            <style>
-              <class name="dim-label"/>
-            </style>
+          <object class="GtkSwitch" id="active_switch">
+            <property name="visible">False</property>
+            <property name="can_focus">True</property>
+            <property name="halign">end</property>
+            <property name="valign">start</property>
           </object>
           <packing>
             <property name="expand">False</property>


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