Complete.Org: Mailing Lists: Archives: freeciv-dev: September 2004:
[Freeciv-Dev] (PR#10037) cityrep "add next" changes selection
Home

[Freeciv-Dev] (PR#10037) cityrep "add next" changes selection

[Top] [All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
To: jdorje@xxxxxxxxxxxxxxxxxxxxx
Subject: [Freeciv-Dev] (PR#10037) cityrep "add next" changes selection
From: "Vasco Alexandre da Silva Costa via RT" <vasc@xxxxxxxxxxxxxx>
Date: Fri, 24 Sep 2004 09:17:42 -0700
Reply-to: RT_CorrespondAddressNotSet@xxxxxxxxxxxxxx

<URL: http://RT::WebBaseURL.not.configured:80/Ticket/Display.html?id=10037 >

While trying to track a similar bug in Change -> CMA, I think I found
the cause for this bug. Here is a patch, that also should make the city
report update faster on large lists.

Index: client/gui-gtk-2.0/cityrep.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-gtk-2.0/cityrep.c,v
retrieving revision 1.61
diff -u -r1.61 cityrep.c
--- client/gui-gtk-2.0/cityrep.c        24 Sep 2004 13:51:02 -0000      1.61
+++ client/gui-gtk-2.0/cityrep.c        24 Sep 2004 16:16:36 -0000
@@ -1120,32 +1120,20 @@
 {
   if (city_dialog_shell && !is_report_dialogs_frozen()) {
     GtkTreeModel *model;
-    GtkTreeIter it, it2;
-    GtkTreePath *path;
-    GList *copy;
-    struct city *cursor;
-    bool found;
+    GtkTreeIter it;
+    GHashTable *copy;
 
     model = GTK_TREE_MODEL(city_model);
 
-    gtk_tree_view_get_cursor(GTK_TREE_VIEW(city_view), &path, NULL);
-    cursor = NULL;
-    if (path) {
-      if (gtk_tree_model_get_iter(model, &it, path)) {
-       gtk_tree_model_get(model, &it, 0, &cursor, -1);
-      }
-      gtk_tree_path_free(path);
-    }
-
     /* copy the selection. */
-    copy = NULL;
+    copy = g_hash_table_new(g_direct_hash, g_direct_equal);
     if (gtk_tree_model_get_iter_first(model, &it)) {
       do {
        if (gtk_tree_selection_iter_is_selected(city_selection, &it)) {
          gpointer pcity;
 
          gtk_tree_model_get(model, &it, 0, &pcity, -1);
-         copy = g_list_append(copy, pcity);
+         g_hash_table_insert(copy, pcity, NULL);
        }
       } while (gtk_tree_model_iter_next(model, &it));
     }
@@ -1153,29 +1141,17 @@
     /* update. */
     gtk_list_store_clear(city_model);
 
-    found = FALSE;
     city_list_iterate(game.player_ptr->cities, pcity) {
       gtk_list_store_append(city_model, &it);
       update_row(&it, pcity);
 
-      if (g_list_find(copy, pcity)) {
+      if (g_hash_table_remove(copy, pcity)) {
        gtk_tree_selection_select_iter(city_selection, &it);
       }
-
-      if (pcity == cursor) {
-       it2 = it;
-       found = TRUE;
-      }
     } city_list_iterate_end;
 
-    if (found) {
-      path = gtk_tree_model_get_path(model, &it2);
-      gtk_tree_view_set_cursor(GTK_TREE_VIEW(city_view), path, NULL, FALSE);
-      gtk_tree_path_free(path);
-    }
-       
     /* free the selection. */
-    g_list_free(copy);
+    g_hash_table_destroy(copy);
 
     city_selection_changed_callback(city_selection);
 

[Prev in Thread] Current Thread [Next in Thread]