? a.gz ? civscore.log ? diff Index: client/gui-gtk/cityrep.c =================================================================== RCS file: /home/freeciv/CVS/freeciv/client/gui-gtk/cityrep.c,v retrieving revision 1.40 diff -u -r1.40 cityrep.c --- client/gui-gtk/cityrep.c 2001/08/25 10:34:02 1.40 +++ client/gui-gtk/cityrep.c 2001/09/13 16:34:18 @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -192,6 +193,26 @@ else return can_build_improvement(pcity, number); } + +struct item { + int id, is_special_unit; + char descr[MAX_LEN_NAME + 10]; +}; + +static int my_cmp(const void *p1, const void *p2) +{ + const struct item *i1 = (const struct item *) p1; + const struct item *i2 = (const struct item *) p2; + + if (i1->is_special_unit == i2->is_special_unit) + return mystrcasecmp(i1->descr, i2->descr); + if (i1->is_special_unit) + return -1; + if (i2->is_special_unit) + return 1; + assert(0); +} + /**************************************************************** ... *****************************************************************/ @@ -202,89 +223,89 @@ gboolean change_prod, TestCityFunc test_func, GtkSignalFunc callback) -{ +{ gint i; gint first = append_units ? B_LAST : 0; gint last = append_units ? game.num_unit_types + B_LAST : B_LAST; - gboolean something_appended = FALSE; - GtkWidget *item; + struct item items[U_LAST + B_LAST]; + gint items_used = 0; + GtkWidget *item; + + for (i = first; i < last; i++) { + gboolean append = FALSE; + + if (!append_units && (append_wonders != is_wonder(i))) + continue; + + if (!change_prod) { + city_list_iterate(game.player_ptr->cities, pcity) { + append |= test_func(pcity, i); + } + city_list_iterate_end; + } else { + GList *selection; + + g_assert(GTK_CLIST(city_list)->selection); + selection = GTK_CLIST(city_list)->selection; + for (; selection; selection = g_list_next(selection)) + append |= test_func(city_from_glist(selection), i); + } - for(i=first; icities, pcity) - { - append |= test_func(pcity, i); - } city_list_iterate_end; + if (append) { + gint cost, is_special_unit; + gchar *name; + + if (append_units) { + cost = get_unit_type(i - B_LAST)->build_cost; + name = get_unit_name(i - B_LAST); + is_special_unit = unit_flag(i - B_LAST, F_NONMIL); + } else { + cost = (i == B_CAPITAL) ? -1 : get_improvement_type(i)->build_cost; + if (append_wonders) { + /* We need a city to get the right name for wonders */ + struct city *pcity = GTK_CLIST(city_list)->row_list->data; + name = get_impr_name_ex(pcity, i); + } else { + name = get_improvement_name(i); } - else - { - GList *selection; - - g_assert (GTK_CLIST(city_list)->selection); - selection = GTK_CLIST(city_list)->selection; - for(; selection; selection = g_list_next(selection)) - append |= test_func(city_from_glist(selection), i); - } - - if(append) - { - gint cost; - gchar* name; - - if(append_units) - { - cost = get_unit_type(i-B_LAST)->build_cost; - name = get_unit_name(i-B_LAST); - } - else - { - cost = (i==B_CAPITAL) ? -1 : get_improvement_type(i)->build_cost; - if(append_wonders) - { - /* We need a city to get the right name for wonders */ - struct city *pcity = GTK_CLIST(city_list)->row_list->data; - name = get_impr_name_ex(pcity, i); - } - else - name = get_improvement_name(i); - } - something_appended = TRUE; - - if (change_prod) - { - gchar *label; - if (cost < 0) { - label = g_strdup_printf("%s (XX)",name); - } else { - label = g_strdup_printf("%s (%d)",name, cost); - } - item=gtk_menu_item_new_with_label( label ); - g_free (label); - } - else - item=gtk_menu_item_new_with_label(name); - - gtk_menu_append(GTK_MENU(menu),item); - - gtk_signal_connect(GTK_OBJECT(item),"activate", callback, - GINT_TO_POINTER(i)); + is_special_unit = 0; + } + + if (change_prod) { + if (cost < 0) { + snprintf(items[items_used].descr, sizeof(items[items_used].descr), + "%s (XX)", name); + } else { + snprintf(items[items_used].descr, sizeof(items[items_used].descr), + "%s (%d)", name, cost); } + } else { + mystrlcpy(items[items_used].descr, name, + sizeof(items[items_used].descr)); + } + items[items_used].id = i; + items[items_used].is_special_unit = is_special_unit; + items_used++; + assert(items_used < ARRAY_SIZE(items)); } + } - if(!something_appended) - { - item=gtk_menu_item_new_with_label( nothing_appended_text ); - gtk_widget_set_sensitive(item, FALSE); - gtk_menu_append(GTK_MENU(menu),item); - } + qsort(items, items_used, sizeof(struct item), my_cmp); + + for (i = 0; i < items_used; i++) { + item = gtk_menu_item_new_with_label(items[i].descr); + + gtk_menu_append(GTK_MENU(menu), item); + + gtk_signal_connect(GTK_OBJECT(item), "activate", callback, + GINT_TO_POINTER(items[i].id)); + } + + if (items_used == 0) { + item = gtk_menu_item_new_with_label(nothing_appended_text); + gtk_widget_set_sensitive(item, FALSE); + gtk_menu_append(GTK_MENU(menu), item); + } } /****************************************************************