[gnome-software/1392-unify-lozenge-styling: 75/85] gs-feature-tile: Replace GsFeatureTileLayout with GsLayoutManager




commit 59b27aec2ffef6cb0fc6d4510f2b02105d3a0c0b
Author: Milan Crha <mcrha redhat com>
Date:   Tue May 3 15:48:25 2022 +0200

    gs-feature-tile: Replace GsFeatureTileLayout with GsLayoutManager
    
    To avoid code duplication.

 src/gs-feature-tile.c | 93 +++++++++------------------------------------------
 1 file changed, 16 insertions(+), 77 deletions(-)
---
diff --git a/src/gs-feature-tile.c b/src/gs-feature-tile.c
index cff5a5067..2b47cf323 100644
--- a/src/gs-feature-tile.c
+++ b/src/gs-feature-tile.c
@@ -13,6 +13,7 @@
 #include <gtk/gtk.h>
 
 #include "gs-feature-tile.h"
+#include "gs-layout-manager.h"
 #include "gs-common.h"
 #include "gs-css.h"
 
@@ -32,54 +33,6 @@ struct _GsFeatureTile
        guint            refresh_id;
 };
 
-#define GS_TYPE_FEATURE_TILE_LAYOUT (gs_feature_tile_layout_get_type ())
-
-G_DECLARE_FINAL_TYPE (GsFeatureTileLayout, gs_feature_tile_layout, GS, FEATURE_TILE_LAYOUT, GtkLayoutManager)
-
-/* This is a copy of GtkBinLayout, because cannot derive from it */
-struct _GsFeatureTileLayout
-{
-       GtkLayoutManager parent_instance;
-};
-
-G_DEFINE_TYPE (GsFeatureTileLayout, gs_feature_tile_layout, GTK_TYPE_LAYOUT_MANAGER)
-
-static void
-gs_feature_tile_layout_measure (GtkLayoutManager *layout_manager,
-                               GtkWidget        *widget,
-                               GtkOrientation    orientation,
-                               int               for_size,
-                               int              *minimum,
-                               int              *natural,
-                               int              *minimum_baseline,
-                               int              *natural_baseline)
-{
-       GtkWidget *child;
-
-       for (child = gtk_widget_get_first_child (widget);
-            child != NULL;
-            child = gtk_widget_get_next_sibling (child)) {
-               if (gtk_widget_should_layout (child)) {
-                       int child_min = 0;
-                       int child_nat = 0;
-                       int child_min_baseline = -1;
-                       int child_nat_baseline = -1;
-
-                       gtk_widget_measure (child, orientation, for_size,
-                                           &child_min, &child_nat,
-                                           &child_min_baseline, &child_nat_baseline);
-
-                       *minimum = MAX (*minimum, child_min);
-                       *natural = MAX (*natural, child_nat);
-
-                       if (child_min_baseline > -1)
-                               *minimum_baseline = MAX (*minimum_baseline, child_min_baseline);
-                       if (child_nat_baseline > -1)
-                               *natural_baseline = MAX (*natural_baseline, child_nat_baseline);
-               }
-       }
-}
-
 static void gs_feature_tile_refresh (GsAppTile *self);
 
 static gboolean
@@ -95,23 +48,16 @@ gs_feature_tile_refresh_idle_cb (gpointer user_data)
 }
 
 static void
-gs_feature_tile_layout_allocate (GtkLayoutManager *layout_manager,
-                                GtkWidget        *widget,
-                                int               width,
-                                int               height,
-                                int               baseline)
+gs_feature_tile_layout_allocate_cb (GtkLayoutManager *layout_manager,
+                                   GtkWidget        *widget,
+                                   int               width,
+                                   int               height,
+                                   int               baseline,
+                                   gpointer          user_data)
 {
-       GsFeatureTile *tile = GS_FEATURE_TILE (widget);
-       GtkWidget *child;
+       GsFeatureTile *tile = GS_FEATURE_TILE (user_data);
        gboolean narrow_mode;
 
-       for (child = gtk_widget_get_first_child (widget);
-            child != NULL;
-            child = gtk_widget_get_next_sibling (child)) {
-               if (child && gtk_widget_should_layout (child))
-                       gtk_widget_allocate (child, width, height, baseline, NULL);
-       }
-
        /* Engage ‘narrow mode’ if the allocation becomes too narrow. The exact
         * choice of width is arbitrary here. */
        narrow_mode = (width < 600);
@@ -122,20 +68,6 @@ gs_feature_tile_layout_allocate (GtkLayoutManager *layout_manager,
        }
 }
 
-static void
-gs_feature_tile_layout_class_init (GsFeatureTileLayoutClass *klass)
-{
-       GtkLayoutManagerClass *layout_manager_class = GTK_LAYOUT_MANAGER_CLASS (klass);
-
-       layout_manager_class->measure = gs_feature_tile_layout_measure;
-       layout_manager_class->allocate = gs_feature_tile_layout_allocate;
-}
-
-static void
-gs_feature_tile_layout_init (GsFeatureTileLayout *layout)
-{
-}
-
 /* A colour represented in hue, saturation, brightness form; with an additional
  * field for its contrast calculated with respect to some external colour.
  *
@@ -588,7 +520,14 @@ gs_feature_tile_css_changed (GtkWidget         *widget,
 static void
 gs_feature_tile_init (GsFeatureTile *tile)
 {
+       GtkLayoutManager *layout_manager;
+
        gtk_widget_init_template (GTK_WIDGET (tile));
+
+       layout_manager = gtk_widget_get_layout_manager (GTK_WIDGET (tile));
+       g_warn_if_fail (layout_manager != NULL);
+       g_signal_connect_object (layout_manager, "allocate",
+               G_CALLBACK (gs_feature_tile_layout_allocate_cb), tile, 0);
 }
 
 static void
@@ -613,7 +552,7 @@ gs_feature_tile_class_init (GsFeatureTileClass *klass)
        gtk_widget_class_bind_template_child (widget_class, GsFeatureTile, subtitle);
 
        gtk_widget_class_set_css_name (widget_class, "feature-tile");
-       gtk_widget_class_set_layout_manager_type (widget_class, GS_TYPE_FEATURE_TILE_LAYOUT);
+       gtk_widget_class_set_layout_manager_type (widget_class, GS_TYPE_LAYOUT_MANAGER);
 }
 
 GtkWidget *


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