<URL: http://bugs.freeciv.org/Ticket/Display.html?id=40291 >

Attached patches for S2_1 and S2_2 & trunk implement
a label in the city list dialog (a.k.a. city report,
cityrep, F1/F4) that when applicable shows the sum
total production buy cost of one or more selected
city rows.

By request for some people on the forum (post contains
screenshot):
http://forum.freeciv.org/viewtopic.php?t=5342


---------------------------------------------------------------------
どきどき。わくわく。
diff --git a/client/gui-gtk-2.0/cityrep.c b/client/gui-gtk-2.0/cityrep.c
index 193595b..0970394 100644
--- a/client/gui-gtk-2.0/cityrep.c
+++ b/client/gui-gtk-2.0/cityrep.c
@@ -96,6 +96,7 @@ static void popup_next_menu(GtkMenuShell *menu, gpointer data);
 
 static GtkWidget *city_center_command, *city_popup_command, *city_buy_command;
 static GtkWidget *city_production_command;
+static GtkWidget *city_total_buy_cost_label;
 
 
 static GtkWidget *change_improvements_item;
@@ -820,6 +821,10 @@ static void create_city_report_dialog(bool make_modal)
       _("_Buy"), CITY_BUY);
   city_buy_command = w;
 
+  city_total_buy_cost_label = gtk_label_new(NULL);
+  gtk_box_pack_end(GTK_BOX(city_dialog_shell->action_area),
+                   city_total_buy_cost_label, FALSE, FALSE, 0);
+
   gui_dialog_add_button(city_dialog_shell,
 			GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
 
@@ -1579,6 +1584,7 @@ static void popup_select_menu(GtkMenuShell *menu, gpointer data)
 static void city_selection_changed_callback(GtkTreeSelection *selection)
 {
   int n;
+  int total = 0;
 
   n = gtk_tree_selection_count_selected_rows(selection);
 
@@ -1588,11 +1594,40 @@ static void city_selection_changed_callback(GtkTreeSelection *selection)
     gtk_widget_set_sensitive(city_popup_command, FALSE);
     gtk_widget_set_sensitive(city_buy_command, FALSE);
   } else {
+    GList *rows, *p;
+    GtkTreeModel *model;
+    GtkTreePath *path;
+    GtkTreeIter iter;
+    gpointer res;
+    struct city *pcity;
+
     gtk_widget_set_sensitive(city_production_command,
 			     can_client_issue_orders());
     gtk_widget_set_sensitive(city_center_command, TRUE);
     gtk_widget_set_sensitive(city_popup_command, TRUE);
     gtk_widget_set_sensitive(city_buy_command, can_client_issue_orders());
+
+    rows = gtk_tree_selection_get_selected_rows(selection, &model);
+    for (p = rows; p != NULL; p = p->next) {
+      path = p->data;
+      if (gtk_tree_model_get_iter(model, &iter, path)) {
+        gtk_tree_model_get(model, &iter, 0, &res, -1);
+        pcity = res;
+        if (pcity != NULL) {
+          total += city_production_buy_gold_cost(pcity);
+        }
+      }
+      gtk_tree_path_free(path);
+    }
+    g_list_free(rows);
+  }
+
+  if (total > 0) {
+    char buf[64];
+    my_snprintf(buf, sizeof(buf), _("Total Buy Cost: %d"), total);
+    gtk_label_set_text(GTK_LABEL(city_total_buy_cost_label), buf);
+  } else {
+    gtk_label_set_text(GTK_LABEL(city_total_buy_cost_label), NULL);
   }
 }
 
diff --git a/client/gui-gtk-2.0/cityrep.c b/client/gui-gtk-2.0/cityrep.c
index 0f8a051..fef2336 100644
--- a/client/gui-gtk-2.0/cityrep.c
+++ b/client/gui-gtk-2.0/cityrep.c
@@ -97,6 +97,7 @@ static void popup_next_menu(GtkMenuShell *menu, gpointer data);
 
 static GtkWidget *city_center_command, *city_popup_command, *city_buy_command;
 static GtkWidget *city_production_command;
+static GtkWidget *city_total_buy_cost_label;
 
 
 static GtkWidget *change_improvements_item;
@@ -820,6 +821,10 @@ static void create_city_report_dialog(bool make_modal)
       _("_Buy"), CITY_BUY);
   city_buy_command = w;
 
+  city_total_buy_cost_label = gtk_label_new(NULL);
+  gtk_box_pack_end(GTK_BOX(city_dialog_shell->action_area),
+                   city_total_buy_cost_label, FALSE, FALSE, 0);
+
   gui_dialog_add_button(city_dialog_shell,
 			GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
 
@@ -1577,6 +1582,7 @@ static void popup_select_menu(GtkMenuShell *menu, gpointer data)
 static void city_selection_changed_callback(GtkTreeSelection *selection)
 {
   int n;
+  int total = 0;
 
   n = gtk_tree_selection_count_selected_rows(selection);
 
@@ -1586,11 +1592,40 @@ static void city_selection_changed_callback(GtkTreeSelection *selection)
     gtk_widget_set_sensitive(city_popup_command, FALSE);
     gtk_widget_set_sensitive(city_buy_command, FALSE);
   } else {
+    GList *rows, *p;
+    GtkTreeModel *model;
+    GtkTreePath *path;
+    GtkTreeIter iter;
+    gpointer res;
+    struct city *pcity;
+
     gtk_widget_set_sensitive(city_production_command,
 			     can_client_issue_orders());
     gtk_widget_set_sensitive(city_center_command, TRUE);
     gtk_widget_set_sensitive(city_popup_command, TRUE);
     gtk_widget_set_sensitive(city_buy_command, can_client_issue_orders());
+
+    rows = gtk_tree_selection_get_selected_rows(selection, &model);
+    for (p = rows; p != NULL; p = p->next) {
+      path = p->data;
+      if (gtk_tree_model_get_iter(model, &iter, path)) {
+        gtk_tree_model_get(model, &iter, 0, &res, -1);
+        pcity = res;
+        if (pcity != NULL) {
+          total += city_buy_cost(pcity);
+        }
+      }
+      gtk_tree_path_free(path);
+    }
+    g_list_free(rows);
+  }
+
+  if (total > 0) {
+    char buf[64];
+    my_snprintf(buf, sizeof(buf), _("Total Buy Cost: %d"), total);
+    gtk_label_set_text(GTK_LABEL(city_total_buy_cost_label), buf);
+  } else {
+    gtk_label_set_text(GTK_LABEL(city_total_buy_cost_label), NULL);
   }
 }
 
_______________________________________________
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev

Reply via email to