[gnome-logs] categorylist: Subclass from GtkWidget



commit c1fa528be74d57429b4892017f2ec2432e042df6
Author: Maximiliano Sandoval R <msandova gnome org>
Date:   Mon Oct 11 00:38:36 2021 +0200

    categorylist: Subclass from GtkWidget
    
    ListBox is a final class in GTK 4.

 data/gl-categorylist.ui |  1 -
 src/gl-categorylist.c   | 44 +++++++++++++++++++++++++++++++++-----------
 src/gl-categorylist.h   |  4 ++--
 3 files changed, 35 insertions(+), 14 deletions(-)
---
diff --git a/data/gl-categorylist.ui b/data/gl-categorylist.ui
index 1790bb5..9c79dde 100644
--- a/data/gl-categorylist.ui
+++ b/data/gl-categorylist.ui
@@ -5,7 +5,6 @@
             <object class="GtkListBox" id="list_box">
                 <property name="selection-mode">browse</property>
                 <property name="visible">True</property>
-                <signal name="row-selected" handler="on_gl_category_list_row_selected" />
                 <child>
                     <object class="GtkListBoxRow" id="important">
                         <property name="visible">True</property>
diff --git a/src/gl-categorylist.c b/src/gl-categorylist.c
index d17bb08..9a88514 100644
--- a/src/gl-categorylist.c
+++ b/src/gl-categorylist.c
@@ -42,21 +42,24 @@ typedef struct
     GtkWidget *hardware;
     GtkWidget *updates;
     GtkWidget *usage;
+    GtkWidget *list_box;
     GlCategoryListFilter category;
 } GlCategoryListPrivate;
 
-G_DEFINE_TYPE_WITH_PRIVATE (GlCategoryList, gl_category_list, GTK_TYPE_LIST_BOX)
+G_DEFINE_TYPE_WITH_PRIVATE (GlCategoryList, gl_category_list, GTK_TYPE_WIDGET)
 
 static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, };
 
 static gboolean
-gl_category_list_focus (GtkWidget *listbox, GtkDirectionType direction)
+gl_category_list_focus (GtkWidget *list, GtkDirectionType direction)
 {
+    GlCategoryListPrivate *priv = gl_category_list_get_instance_private (GL_CATEGORY_LIST (list));
+
     switch (direction)
     {
         case GTK_DIR_TAB_BACKWARD:
         case GTK_DIR_TAB_FORWARD:
-            if (gtk_container_get_focus_child (GTK_CONTAINER (listbox)))
+            if (gtk_widget_get_focus_child (GTK_WIDGET (priv->list_box)))
             {
                 /* Force tab events which jump to another child to jump out of
                  * the category list. */
@@ -65,14 +68,14 @@ gl_category_list_focus (GtkWidget *listbox, GtkDirectionType direction)
             else
             {
                 /* Allow tab events to focus into the widget. */
-                GTK_WIDGET_CLASS (gl_category_list_parent_class)->focus (listbox,
+                GTK_WIDGET_CLASS (gl_category_list_parent_class)->focus (priv->list_box,
                                                                          direction);
                 return TRUE;
             }
             break;
         /* Allow the widget to handle all other focus events. */
         default:
-            GTK_WIDGET_CLASS (gl_category_list_parent_class)->focus (listbox,
+            GTK_WIDGET_CLASS (gl_category_list_parent_class)->focus (priv->list_box,
                                                                      direction);
             return TRUE;
             break;
@@ -80,15 +83,15 @@ gl_category_list_focus (GtkWidget *listbox, GtkDirectionType direction)
 }
 
 static void
-on_gl_category_list_row_selected (GlCategoryList *listbox,
-                                  GtkListBoxRow *row,
-                                  gpointer user_data)
+on_gl_category_list_row_selected (GtkListBox     *listbox,
+                                  GtkListBoxRow  *row,
+                                  GlCategoryList *list)
 {
     GlCategoryListPrivate *priv;
     GEnumClass *eclass;
     GEnumValue *evalue;
 
-    priv = gl_category_list_get_instance_private (listbox);
+    priv = gl_category_list_get_instance_private (list);
     eclass = g_type_class_ref (GL_TYPE_CATEGORY_LIST_FILTER);
 
     if (row == GTK_LIST_BOX_ROW (priv->important))
@@ -140,7 +143,7 @@ on_gl_category_list_row_selected (GlCategoryList *listbox,
 
     priv->category = evalue->value;
 
-    g_object_notify_by_pspec (G_OBJECT (listbox),
+    g_object_notify_by_pspec (G_OBJECT (list),
                               obj_properties[PROP_CATEGORY]);
 
     g_type_class_unref (eclass);
@@ -196,6 +199,17 @@ gl_category_list_set_property (GObject *object,
     }
 }
 
+static void
+gl_category_list_dispose (GObject *object)
+{
+    GlCategoryList *list = GL_CATEGORY_LIST (object);
+    GlCategoryListPrivate *priv = gl_category_list_get_instance_private (list);
+
+    gtk_widget_unparent (priv->list_box);
+
+    G_OBJECT_CLASS (gl_category_list_parent_class)->dispose (object);
+}
+
 static void
 gl_category_list_class_init (GlCategoryListClass *klass)
 {
@@ -204,8 +218,11 @@ gl_category_list_class_init (GlCategoryListClass *klass)
 
     gobject_class->get_property = gl_category_list_get_property;
     gobject_class->set_property = gl_category_list_set_property;
+    gobject_class->dispose = gl_category_list_dispose;
     widget_class->focus = gl_category_list_focus;
 
+    gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
+
     obj_properties[PROP_CATEGORY] = g_param_spec_enum ("category", "Category",
                                                        "Filter events by",
                                                        GL_TYPE_CATEGORY_LIST_FILTER,
@@ -238,6 +255,8 @@ gl_category_list_class_init (GlCategoryListClass *klass)
                                                   updates);
     gtk_widget_class_bind_template_child_private (widget_class, GlCategoryList,
                                                   usage);
+    gtk_widget_class_bind_template_child_private (widget_class, GlCategoryList,
+                                                  list_box);
 
     gtk_widget_class_bind_template_callback (widget_class,
                                              on_gl_category_list_row_selected);
@@ -264,9 +283,12 @@ gl_category_list_init (GlCategoryList *list)
     gtk_widget_init_template (GTK_WIDGET (list));
 
     priv = gl_category_list_get_instance_private (list);
-    gtk_list_box_set_header_func (GTK_LIST_BOX (list),
+    gtk_list_box_set_header_func (GTK_LIST_BOX (priv->list_box),
                                   (GtkListBoxUpdateHeaderFunc)gl_category_list_header_func,
                                   priv->applications, NULL);
+
+    g_signal_connect (priv->list_box, "row-selected",
+                      G_CALLBACK (on_gl_category_list_row_selected), list);
 }
 
 GtkWidget *
diff --git a/src/gl-categorylist.h b/src/gl-categorylist.h
index 32f3b79..a180861 100644
--- a/src/gl-categorylist.h
+++ b/src/gl-categorylist.h
@@ -26,13 +26,13 @@ G_BEGIN_DECLS
 typedef struct
 {
     /*< private >*/
-    GtkListBox parent_instance;
+    GtkWidget parent_instance;
 } GlCategoryList;
 
 typedef struct
 {
     /*< private >*/
-    GtkListBoxClass parent_class;
+    GtkWidgetClass parent_class;
 } GlCategoryListClass;
 
 /*


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