From 85cd9a2b18a4b2c1b81ff99f89b175840ebcfbab Mon Sep 17 00:00:00 2001
From: Marko Lindqvist <cazfi74@gmail.com>
Date: Fri, 23 Sep 2022 23:40:08 +0300
Subject: [PATCH 32/32] gtk4: Add initial city report menu

See osdn #45681

Signed-off-by: Marko Lindqvist <cazfi74@gmail.com>
---
 client/gui-gtk-4.0/cityrep.c | 58 +++++++++++++++++++-----------------
 1 file changed, 31 insertions(+), 27 deletions(-)

diff --git a/client/gui-gtk-4.0/cityrep.c b/client/gui-gtk-4.0/cityrep.c
index c3924afbf2..f977c89547 100644
--- a/client/gui-gtk-4.0/cityrep.c
+++ b/client/gui-gtk-4.0/cityrep.c
@@ -84,9 +84,8 @@ static void city_command_callback(struct gui_dialog *dlg, int response,
                                   gpointer data);
 
 static void city_selection_changed_callback(GtkTreeSelection *selection);
-#ifdef MENUS_GTK3
-static void city_clear_worklist_callback(GtkMenuItem *item, gpointer data);
-#endif /* MENUS_GTK3 */
+static void city_clear_worklist_callback(GSimpleAction *action, GVariant *parameter,
+                                         gpointer data);
 static void update_total_buy_cost(void);
 
 #ifdef MENUS_GTK3
@@ -125,7 +124,6 @@ static GtkWidget *city_center_command;
 static GtkWidget *city_popup_command;
 static GtkWidget *city_buy_command;
 #ifdef MENUS_GTK3
-static GtkWidget *city_production_command;
 static GtkWidget *city_governor_command;
 static GtkWidget *city_sell_command;
 #endif /* MENUS_GTK3 */
@@ -1051,26 +1049,35 @@ static void update_view_menu(GtkWidget *show_item)
 ****************************************************************************/
 static GtkWidget *create_city_report_menu(void)
 {
-  GtkWidget *vgrid, *sep;
+  GtkWidget *vbox, *sep;
   GtkWidget *aux_menu;
-  int grid_row = 0;
+  GMenu *menu;
+  GActionGroup *group;
+  GMenu *submenu;
+  GSimpleAction *act;
+  GMenuItem *item;
 
-  vgrid = gtk_grid_new();
-  gtk_orientable_set_orientation(GTK_ORIENTABLE(vgrid),
-                                 GTK_ORIENTATION_VERTICAL);
+  vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
   sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
-  gtk_grid_attach(GTK_GRID(vgrid), sep, 0, grid_row++, 1, 1);
+  gtk_box_append(GTK_BOX(vbox), sep);
 
   aux_menu = aux_menu_new();
-  gtk_grid_attach(GTK_GRID(vgrid), aux_menu, 0, grid_row++, 1, 1);
+  group = G_ACTION_GROUP(g_simple_action_group_new());
 
-#ifdef MENUS_GTK3
-  GtkWidget *menu, *item;
+  menu = g_menu_new();
 
-  item = gtk_menu_item_new_with_mnemonic(_("_Production"));
-  city_production_command = item;
-  gtk_menu_shell_append(GTK_MENU_SHELL(aux_menu), item);
+  submenu = g_menu_new();
+
+  act = g_simple_action_new("clear_worklist", NULL);
+  g_action_map_add_action(G_ACTION_MAP(group), G_ACTION(act));
+  g_signal_connect(act, "activate", G_CALLBACK(city_clear_worklist_callback),
+                   NULL);
+  item = g_menu_item_new(_("Clear _Worklist"), "win.clear_worklist");
+  g_menu_append_item(submenu, item);
+
+  g_menu_append_submenu(menu, _("_Production"), G_MENU_MODEL(submenu));
 
+#ifdef MENUS_GTK3
   menu = gtk_menu_button_new();
   gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), menu);
 
@@ -1109,11 +1116,6 @@ static GtkWidget *create_city_report_menu(void)
                     append_worklist_callback);
   g_signal_connect(menu, "show", G_CALLBACK(production_menu_shown), item);
 
-  item = gtk_menu_item_new_with_mnemonic(_("Clear _Worklist"));
-  gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
-  g_signal_connect(item, "activate",
-                   G_CALLBACK(city_clear_worklist_callback), NULL);
-
   item = gtk_menu_item_new_with_mnemonic(_("Gover_nor"));
   city_governor_command = item;
   gtk_menu_shell_append(GTK_MENU_SHELL(aux_menu), item);
@@ -1133,7 +1135,11 @@ static GtkWidget *create_city_report_menu(void)
   update_view_menu(item);
 #endif /* MENUS_GTK3 */
 
-  return vgrid;
+  gtk_widget_insert_action_group(aux_menu, "win", group);
+  gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(aux_menu), G_MENU_MODEL(menu));
+  gtk_box_append(GTK_BOX(vbox), aux_menu);
+
+  return vbox;
 }
 
 /************************************************************************//**
@@ -1175,7 +1181,7 @@ static void create_city_report_dialog(bool make_modal)
   aux_menu = create_city_report_menu();
   gui_dialog_add_action_widget(city_dialog_shell, aux_menu);
 
-  /* buttons */
+  /* Buttons */
   city_total_buy_cost_label = gtk_label_new(NULL);
   gtk_widget_set_hexpand(city_total_buy_cost_label, TRUE);
   gtk_label_set_ellipsize(GTK_LABEL(city_total_buy_cost_label),
@@ -2031,7 +2037,6 @@ static void city_selection_changed_callback(GtkTreeSelection *selection)
   obs_may = n > 0;
   plr_may = obs_may && can_client_issue_orders();
 
-  gtk_widget_set_sensitive(city_production_command, plr_may);
   gtk_widget_set_sensitive(city_governor_command, plr_may);
   gtk_widget_set_sensitive(city_center_command, obs_may);
   gtk_widget_set_sensitive(city_popup_command, obs_may);
@@ -2046,7 +2051,6 @@ static void city_selection_changed_callback(GtkTreeSelection *selection)
   update_total_buy_cost();
 }
 
-#ifdef MENUS_GTK3
 /************************************************************************//**
   Clear the worklist in one selected city in the city report.
 ****************************************************************************/
@@ -2068,7 +2072,8 @@ static void clear_worklist_foreach_func(GtkTreeModel *model,
 /************************************************************************//**
   Called when the "clear worklist" menu item is activated.
 ****************************************************************************/
-static void city_clear_worklist_callback(GtkMenuItem *item, gpointer data)
+static void city_clear_worklist_callback(GSimpleAction *action, GVariant *parameter,
+                                         gpointer data)
 {
   struct connection *pconn = &client.conn;
 
@@ -2079,7 +2084,6 @@ static void city_clear_worklist_callback(GtkMenuItem *item, gpointer data)
                                       clear_worklist_foreach_func, NULL);
   connection_do_unbuffer(pconn);
 }
-#endif /* MENUS_GTK3 */
 
 /************************************************************************//**
   After a selection rectangle is defined, make the cities that
-- 
2.35.1