From 6d166141bfac051dde94414fd78a9ef745bd5ed9 Mon Sep 17 00:00:00 2001
From: Marko Lindqvist <cazfi74@gmail.com>
Date: Wed, 9 Oct 2024 07:54:51 +0300
Subject: [PATCH 35/35] gtk4x: Implement bind() / create() for tech list item
 factory

See RM #946

Signed-off-by: Marko Lindqvist <cazfi74@gmail.com>
---
 client/gui-gtk-5.0/inteldlg.c | 44 +++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/client/gui-gtk-5.0/inteldlg.c b/client/gui-gtk-5.0/inteldlg.c
index b5d814dfd5..5025a5d855 100644
--- a/client/gui-gtk-5.0/inteldlg.c
+++ b/client/gui-gtk-5.0/inteldlg.c
@@ -153,6 +153,9 @@ struct _FcWonderRowClass
 
 G_DEFINE_TYPE(FcWonderRow, fc_wonder_row, G_TYPE_OBJECT)
 
+#define TECH_ROW_NAME  0
+#define TECH_ROW_KNOWN 1
+
 /**********************************************************************//**
   Initialization method for FcTechRow class
 **************************************************************************/
@@ -337,6 +340,40 @@ void close_intel_wonder_dialog(struct player *p)
   intel_wonder_destroy_callback(NULL, pdialog);
 }
 
+/**********************************************************************//**
+  Tech table cell bind function
+**************************************************************************/
+static void tech_factory_bind(GtkSignalListItemFactory *self,
+                              GtkListItem *list_item,
+                              gpointer user_data)
+{
+  FcTechRow *row;
+
+  row = gtk_list_item_get_item(list_item);
+
+  if (GPOINTER_TO_INT(user_data) == TECH_ROW_KNOWN) {
+    gtk_check_button_set_active(GTK_CHECK_BUTTON(gtk_list_item_get_child(list_item)),
+                                row->known);
+  } else {
+    gtk_label_set_text(GTK_LABEL(gtk_list_item_get_child(list_item)),
+                                 row->name);
+  }
+}
+
+/**********************************************************************//**
+  Tech table cell setup function
+**************************************************************************/
+static void tech_factory_setup(GtkSignalListItemFactory *self,
+                               GtkListItem *list_item,
+                               gpointer user_data)
+{
+  if (GPOINTER_TO_INT(user_data) == TECH_ROW_KNOWN) {
+    gtk_list_item_set_child(list_item, gtk_check_button_new());
+  } else {
+    gtk_list_item_set_child(list_item, gtk_label_new(""));
+  }
+}
+
 /**********************************************************************//**
   Create new intelligence dialog between client user and player
   given as parameter.
@@ -348,6 +385,7 @@ static struct intel_dialog *create_intel_dialog(struct player *p)
   GtkWidget *shell, *notebook, *label, *sw, *view, *table;
   GtkCellRenderer *rend;
   GtkTreeViewColumn *col;
+  GtkListItemFactory *factory;
   int i;
 
   pdialog = fc_malloc(sizeof(*pdialog));
@@ -443,6 +481,12 @@ static struct intel_dialog *create_intel_dialog(struct player *p)
   gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(pdialog->techs),
       1, GTK_SORT_ASCENDING);
 
+  factory = gtk_signal_list_item_factory_new();
+  g_signal_connect(factory, "bind", G_CALLBACK(tech_factory_bind),
+                   GINT_TO_POINTER(TECH_ROW_NAME));
+  g_signal_connect(factory, "setup", G_CALLBACK(tech_factory_setup),
+                   GINT_TO_POINTER(TECH_ROW_NAME));
+
   view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(pdialog->techs));
   gtk_widget_set_margin_bottom(view, 6);
   gtk_widget_set_margin_end(view, 6);
-- 
2.45.2

