diff -ru -X /home/jjm/cvs/no.freeciv FreecivCVS/client/gui-gtk/dialogs.c freeciv/client/gui-gtk/dialogs.c --- FreecivCVS/client/gui-gtk/dialogs.c Sat Mar 4 16:24:15 2000 +++ freeciv/client/gui-gtk/dialogs.c Tue Mar 14 11:43:56 2000 @@ -1713,6 +1713,14 @@ /**************************************************************** ... *****************************************************************/ +static gint cmp_func(gconstpointer a_p, gconstpointer b_p) +{ + return strcmp(get_nation_name((int)a_p),get_nation_name((int)b_p)); +} + +/**************************************************************** +... +*****************************************************************/ void create_races_dialog(void) { int per_row = 4; @@ -1722,6 +1730,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", @@ -1744,11 +1753,17 @@ 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; } + /**************************************************************** ... *****************************************************************/ @@ -1946,32 +1968,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 -ru -X /home/jjm/cvs/no.freeciv FreecivCVS/client/gui-gtk/repodlgs.c freeciv/client/gui-gtk/repodlgs.c --- FreecivCVS/client/gui-gtk/repodlgs.c Mon Feb 28 14:31:26 2000 +++ freeciv/client/gui-gtk/repodlgs.c Tue Mar 14 11:43:51 2000 @@ -330,7 +330,6 @@ /**************************************************************** ... *****************************************************************/ - void science_help_callback(GtkWidget *w, gint row, gint column) { gtk_clist_unselect_row(GTK_CLIST(w), row, column); @@ -350,6 +349,32 @@ /**************************************************************** ... *****************************************************************/ +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); +} + +/**************************************************************** +... +*****************************************************************/ void science_dialog_update(void) { if(science_dialog_shell) { @@ -358,7 +383,8 @@ char *report_title; static char *row [1]; 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); @@ -369,15 +395,23 @@ gtk_clist_clear(GTK_CLIST(science_list[i])); } - for(j=0, i=A_FIRST; iresearch.researching!=A_NONE) - { - for(i=A_FIRST, j=0; iresearch.researching!=A_NONE) { + for(i=A_FIRST; 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"), + (gint)g_list_nth_data(sorting_list, i)); + data=text; } - } - else - { - my_snprintf(text, sizeof(text), _("Researching Future Tech. %d"), - ((game.player_ptr->future_tech)+1)); - 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(); @@ -429,35 +481,46 @@ tech_goal_turns(game.player_ptr, game.player_ptr->ai.tech_goal)); gtk_set_label(science_goal_label,text); - if (game.player_ptr->ai.tech_goal==A_NONE) - { + if (game.player_ptr->ai.tech_goal==A_NONE) { item = gtk_menu_item_new_with_label(advances[A_NONE].name); 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); + } + } - item = gtk_menu_item_new_with_label(advances[i].name); - gtk_menu_append(GTK_MENU(goalmenu), item); + /* 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; - gtk_signal_connect(GTK_OBJECT(item), "activate", - GTK_SIGNAL_FUNC(science_goal_callback), (gpointer)i); - j++; - } + 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) 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); } - }