diff -rbBud freeciv-1.10.0.orig/client/gui-gtk/dialogs.c freeciv-1.10.0/client/gui-gtk/dialogs.c --- freeciv-1.10.0.orig/client/gui-gtk/dialogs.c Thu Feb 24 19:47:51 2000 +++ freeciv-1.10.0/client/gui-gtk/dialogs.c Sat Feb 26 01:18:14 2000 @@ -1709,6 +1709,10 @@ } /* else there is no dialog shell to destroy */ } +static gint cmp_func(gconstpointer a_p,gconstpointer b_p) +{ + return strcmp(get_nation_name((int)a_p),get_nation_name((int)b_p)); +} /**************************************************************** ... *****************************************************************/ @@ -1721,6 +1725,7 @@ GSList *cgroup = NULL; GtkWidget *f, *fs, *fa; char **leaders; + GList *sorted_races_list=NULL; races_dialog_shell = gtk_dialog_new(); gtk_signal_connect( GTK_OBJECT(races_dialog_shell),"delete_event", @@ -1743,11 +1748,19 @@ races_toggles = fc_calloc( game.playable_nation_count, sizeof(GtkWidget*) ); for(i=0; ivbox ); gtk_widget_show_all( GTK_DIALOG(races_dialog_shell)->action_area ); + + /* ------- cleanup ------- */ + + g_list_free(sorted_races_list); + sorted_races_list = NULL; } + /**************************************************************** ... *****************************************************************/ @@ -1945,32 +1965,29 @@ /************************************************************************** ... **************************************************************************/ -void races_toggles_callback( GtkWidget *w, gpointer data ) +void races_toggles_callback( GtkWidget *w, gpointer race_id_p ) { - int i, j, leader_count; + int j, leader_count,race_id=(int)race_id_p; char **leaders; g_list_free(leader_strings); leader_strings = 0; - for(i=0; ientry), leaders[0]); - selected_nation = i; - selected_sex = get_nation_leader_sex(i,leaders[0]); + selected_nation = race_id; + selected_sex = get_nation_leader_sex(race_id,leaders[0]); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON( races_sex_toggles[selected_sex?0:1]), TRUE); - selected_city_style = city_style_ridx[get_nation_city_style(i)]; + selected_city_style = city_style_ridx[get_nation_city_style(race_id)]; gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON( city_style_toggles[selected_city_style] ), TRUE ); return; - } } /************************************************************************** diff -rbBud freeciv-1.10.0.orig/client/gui-gtk/repodlgs.c freeciv-1.10.0/client/gui-gtk/repodlgs.c --- freeciv-1.10.0.orig/client/gui-gtk/repodlgs.c Thu Feb 24 19:47:51 2000 +++ freeciv-1.10.0/client/gui-gtk/repodlgs.c Sat Feb 26 01:18:19 2000 @@ -344,6 +344,31 @@ } } +static gint cmp_func(gconstpointer a_p,gconstpointer b_p) +{ + gchar *a_str, *b_str; + gchar text_a[512], text_b[512]; + gint a=(gint)a_p, b=(gint)b_p; + + if(a < game.num_tech_types) + a_str=advances[a].name; + else + { + my_snprintf(text_a,sizeof(text_a), _("Researching Future Tech. %d"),a); + a_str=text_a; + } + + if(b < game.num_tech_types) + b_str=advances[b].name; + else + { + my_snprintf(text_b,sizeof(text_b), _("Researching Future Tech. %d"),b); + b_str=text_b; + } + + return strcmp(a_str,b_str); +} + /**************************************************************** ... *****************************************************************/ @@ -351,41 +376,47 @@ { if(science_dialog_shell) { char text[512]; - int i, j, hist, n; + int i, j, hist, lines; char *report_title; static char *row [4]; GtkWidget *item; + GList *sorting_list = NULL; if(delay_report_update) return; report_title=get_report_title(_("Science Advisor")); gtk_set_label(science_label, report_title); free(report_title); + /* collect all researched techs in sorting_list */ gtk_clist_freeze(GTK_CLIST(science_list)); gtk_clist_clear(GTK_CLIST(science_list)); - for(n=0, i=A_FIRST; iresearch.researching!=A_NONE) { - for(i=A_FIRST, j=0; iresearch.researching) - hist=j; - - item = gtk_menu_item_new_with_label(advances[i].name); - gtk_menu_append(GTK_MENU(popupmenu), item); - - gtk_signal_connect(GTK_OBJECT(item), "activate", - GTK_SIGNAL_FUNC(science_change_callback ), (gpointer)i); - j++; + hist=i; + sorting_list = g_list_append(sorting_list,(gpointer)i); } } else { + sorting_list = g_list_append(sorting_list, + (gpointer)(game.num_tech_types+ + (game.player_ptr->future_tech) + +1)); + } + + /* sort the list and build from it the menu */ + sorting_list = g_list_sort(sorting_list, cmp_func); + for (i = 0; i < g_list_length(sorting_list); i++) + { + gchar *data; + + if((gint)g_list_nth_data(sorting_list, i) < game.num_tech_types) + data=advances[(gint)g_list_nth_data(sorting_list, i)].name; + else + { my_snprintf(text, sizeof(text), _("Researching Future Tech. %d"), - ((game.player_ptr->future_tech)+1)); + (gint)g_list_nth_data(sorting_list, i)); + data=text; + } - item = gtk_menu_item_new_with_label(text); + item = gtk_menu_item_new_with_label(data); gtk_menu_append(GTK_MENU(popupmenu), item); + if (strlen(data) > 0) + gtk_signal_connect(GTK_OBJECT(item), "activate", + GTK_SIGNAL_FUNC(science_change_callback), + (gpointer) g_list_nth_data(sorting_list, i)); } + gtk_widget_show_all(popupmenu); - gtk_menu_set_active(GTK_MENU(popupmenu), hist); - gtk_option_menu_set_menu(GTK_OPTION_MENU(science_change_menu_button), popupmenu); + gtk_menu_set_active(GTK_MENU(popupmenu), + g_list_index(sorting_list,(gpointer)hist)); + g_list_free(sorting_list); + sorting_list = NULL; + gtk_option_menu_set_menu(GTK_OPTION_MENU(science_change_menu_button), + popupmenu); gtk_widget_destroy(goalmenu); goalmenu = gtk_menu_new(); @@ -441,29 +496,43 @@ gtk_menu_append(GTK_MENU(goalmenu), item); } + /* collect all techs which are reachable in under 11 steps + * hist will hold afterwards the techid of the current choice + */ + hist=0; - for(i=A_FIRST, j=0; iai.tech_goal) - hist=j; + hist=i; + sorting_list = g_list_append(sorting_list,(gpointer)i); + } + } + /* sort the list and build from it the menu */ + sorting_list = g_list_sort(sorting_list, cmp_func); + for (i = 0; i < g_list_length(sorting_list); i++) { + gchar *data=advances[(gint)g_list_nth_data(sorting_list, i)].name; - item = gtk_menu_item_new_with_label(advances[i].name); + item = gtk_menu_item_new_with_label(data); gtk_menu_append(GTK_MENU(goalmenu), item); - gtk_signal_connect(GTK_OBJECT(item), "activate", - GTK_SIGNAL_FUNC(science_goal_callback), (gpointer)i); - j++; - } + GTK_SIGNAL_FUNC(science_goal_callback), + (gpointer) g_list_nth_data(sorting_list, i)); } + gtk_widget_show_all(goalmenu); - gtk_menu_set_active(GTK_MENU(goalmenu), hist); - gtk_option_menu_set_menu(GTK_OPTION_MENU(science_goal_menu_button), goalmenu); - } + gtk_menu_set_active(GTK_MENU(goalmenu), + g_list_index(sorting_list,(gpointer)hist)); + g_list_free(sorting_list); + sorting_list = NULL; + gtk_option_menu_set_menu(GTK_OPTION_MENU(science_goal_menu_button), + goalmenu); + } }