diff -ur freeciv-cvs-Sep-12-orig/client/gui-gtk/dialogs.c freeciv-cvs-Sep-12/client/gui-gtk/dialogs.c --- freeciv-cvs-Sep-12-orig/client/gui-gtk/dialogs.c Thu Aug 8 02:41:32 2002 +++ freeciv-cvs-Sep-12/client/gui-gtk/dialogs.c Sat Sep 14 21:38:59 2002 @@ -53,6 +53,7 @@ /******************************************************************/ static GtkWidget *races_dialog_shell=NULL; static GtkWidget *races_toggles_form; +static GtkWidget *races_by_name; static GtkWidget *races_sex_toggles_form; static GtkWidget *city_style_toggles_form; static GtkWidget *races_ok_command; /* ok button */ @@ -62,6 +63,7 @@ *races_sex_toggles[2], /* Male/Female */ **city_style_toggles = NULL, *races_name; /* leader name */ +GtkWidget *flags_group; static GList *leader_strings = NULL; static GList *sorted_races_list = NULL; /* contains a list of race ids sorted by the race @@ -103,6 +105,7 @@ static void races_buttons_callback ( GtkWidget *w, gpointer data ); static void races_toggles_callback(GtkWidget * w, gpointer race_id_p); static void races_sex_toggles_callback ( GtkWidget *w, gpointer data ); +static void races_by_name_callback ( GtkWidget *w, gpointer data ); static void races_name_callback ( GtkWidget *w, gpointer data ); static void city_style_toggles_callback ( GtkWidget *w, gpointer data ); @@ -1785,8 +1788,16 @@ *****************************************************************/ void popdown_races_dialog(void) { - if (races_dialog_shell) { + if (races_dialog_shell) + { + int i; gtk_widget_set_sensitive (top_vbox, TRUE); + for (i=0; ientry), + get_nation_by_idx(selected_nation)->name); + select_random_leader(); + + /* initialize city style */ selected_city_style = @@ -1879,23 +1902,37 @@ *****************************************************************/ void create_races_dialog(void) { - int per_row = 5; + int per_row; int i; - GSList *group = NULL; + /* GSList *group = NULL;*/ GSList *sgroup = NULL; GSList *cgroup = NULL; GtkWidget *f, *fs, *fa; + GtkWidget *pop_downs_box, *pop_downs_label; + GList *race_names; + + /* GtkWidget **group = malloc(sizeof(GtkWidget*)); + *group = NULL;*/ + + /*Makes the flag box a nicely proportioned rectangle, + *whatever the total size may be*/ + if (game.playable_nation_count > 8){ + per_row=sqrt(game.playable_nation_count)*18/15; + }else{ + /*Multiple rows would look silly here*/ + per_row=game.playable_nation_count; + } races_dialog_shell = gtk_dialog_new(); - gtk_signal_connect( GTK_OBJECT(races_dialog_shell),"delete_event", - GTK_SIGNAL_FUNC(deleted_callback),NULL ); + gtk_signal_connect(GTK_OBJECT(races_dialog_shell), "delete_event", + GTK_SIGNAL_FUNC(deleted_callback), NULL); - gtk_window_set_title( GTK_WINDOW( races_dialog_shell ), - _(" What Nation Will You Be?") ); + gtk_window_set_title(GTK_WINDOW(races_dialog_shell), + _(" What Nation Will You Be?")); f = gtk_frame_new(_("Select nation and name")); gtk_box_pack_start( GTK_BOX( GTK_DIALOG( races_dialog_shell )->vbox ), - f, FALSE, FALSE, 0 ); + f, FALSE, FALSE, 0 ); /* ------- nation name toggles ------- */ @@ -1910,22 +1947,49 @@ sorted_races_list=g_list_append(sorted_races_list,GINT_TO_POINTER(i)); } sorted_races_list=g_list_sort(sorted_races_list,cmp_func); - for(i=0; iflag_sprite); + flag = gtk_pixmap_new(s->pixmap, s->mask); + /* gtk_misc_set_alignment(GTK_MISC(flag), 0, 0.5);*/ + gtk_misc_set_padding(GTK_MISC(flag), 2, 3); + gtk_container_add(GTK_CONTAINER(races_toggles[i]), flag); + /* gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(races_toggles[i]), FALSE); + group = gtk_radio_button_group( GTK_RADIO_BUTTON( races_toggles[i] ) );*/ + gtk_table_attach_defaults(GTK_TABLE(races_toggles_form), races_toggles[i], i%per_row, i%per_row+1, i/per_row, i/per_row+1); - } + } - /* ------- nation leader combo ------- */ + /* ------ choose nation by name -- and choose leader ------ */ + + pop_downs_box = gtk_hbox_new(0, 0); + gtk_box_pack_start( GTK_BOX( GTK_DIALOG( races_dialog_shell )->vbox ), + pop_downs_box, FALSE, FALSE, 0 ); + + pop_downs_label = gtk_label_new(_("Nation:")); + races_by_name = gtk_combo_new(); + race_names = NULL; + for(i=0; iname); + } + gtk_combo_set_popdown_strings(GTK_COMBO(races_by_name), race_names); + gtk_combo_set_value_in_list(GTK_COMBO(races_by_name), TRUE, FALSE); + gtk_box_pack_start( GTK_BOX( pop_downs_box ), pop_downs_label, FALSE, FALSE, 0); + gtk_box_pack_start( GTK_BOX( pop_downs_box ), races_by_name, FALSE, FALSE, 0); + races_name = gtk_combo_new(); - gtk_box_pack_start( GTK_BOX( GTK_DIALOG( races_dialog_shell )->vbox ), - races_name, FALSE, FALSE, 0 ); + pop_downs_label=gtk_label_new(_(" Leader:")); + gtk_box_pack_end( GTK_BOX( pop_downs_box ), races_name, FALSE, FALSE, 0); + gtk_box_pack_end( GTK_BOX( pop_downs_box ), pop_downs_label, FALSE, FALSE, 0); + GTK_WIDGET_SET_FLAGS( races_name, GTK_CAN_DEFAULT ); gtk_widget_grab_default( races_name ); @@ -1938,18 +2002,18 @@ races_sex_toggles_form = gtk_table_new( 1, 2, FALSE ); gtk_container_add( GTK_CONTAINER( fs ), races_sex_toggles_form ); - races_sex_toggles[0]= gtk_radio_button_new_with_label( sgroup, _("Male") ); + races_sex_toggles[0] = gtk_radio_button_new_with_label( sgroup, _("Male") ); gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON( races_sex_toggles[0] ), FALSE ); sgroup = gtk_radio_button_group( GTK_RADIO_BUTTON( races_sex_toggles[0] ) ); gtk_table_attach_defaults( GTK_TABLE(races_sex_toggles_form), - races_sex_toggles[0],0,1,0,1); + races_sex_toggles[0], 0, 1, 0, 1); races_sex_toggles[1]= gtk_radio_button_new_with_label( sgroup, _("Female") ); gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON( races_sex_toggles[1] ), FALSE ); sgroup = gtk_radio_button_group( GTK_RADIO_BUTTON( races_sex_toggles[1] ) ); gtk_table_attach_defaults( GTK_TABLE(races_sex_toggles_form), - races_sex_toggles[1],1,2,0,1); + races_sex_toggles[1], 1, 2, 0, 1); /* ------- city style toggles ------- */ @@ -1964,27 +2028,48 @@ } free(city_style_toggles); city_style_toggles = fc_calloc( b_s_num, sizeof(struct GtkWidget*) ); - + fa = gtk_frame_new( _("Select your city style") ); - + gtk_box_pack_start( GTK_BOX( GTK_DIALOG( races_dialog_shell )->vbox ), fa, FALSE, FALSE, 0 ); city_style_toggles_form = gtk_table_new( per_row, ((b_s_num-1)/per_row)+1, FALSE ); gtk_container_add( GTK_CONTAINER( fa ), city_style_toggles_form ); + per_row/=2; + for(i=0; ipixmap, s->mask), + 0, 0, 4); + if ((s->width < 80) && (city_styles[i].tiles_num>1)){ + s=crop_blankspace(sprites.city.tile[i][1]); + gtk_box_pack_start(GTK_BOX(box), + gtk_pixmap_new(s->pixmap, s->mask), + 0, 0, 4); + } + if ((s->width < 40) && (city_styles[i].tiles_num > 2)){ + s=crop_blankspace(sprites.city.tile[i][2]); + gtk_box_pack_start(GTK_BOX(box), + gtk_pixmap_new(s->pixmap, s->mask), + 0, 0, 4); + } + gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON( city_style_toggles[i] ), + FALSE ); + cgroup = gtk_radio_button_group( GTK_RADIO_BUTTON( city_style_toggles[i] ) ); + gtk_table_attach_defaults( GTK_TABLE(city_style_toggles_form), + city_style_toggles[i], + i%per_row, i%per_row+1, i/per_row, i/per_row+1 ); + } + /* ------- OK/Disc/Quit buttons ------- */ races_ok_command = gtk_button_new_with_label( _("Ok") ); @@ -2005,7 +2090,7 @@ /* ------- connect callback functions ------- */ for(i=0; ilist ), + "selection_changed", + GTK_SIGNAL_FUNC( races_by_name_callback ), NULL ); + /* ------- set initial selections ------- */ select_random_race(); @@ -2044,6 +2133,39 @@ /************************************************************************** ... **************************************************************************/ + +static void races_by_name_callback( GtkWidget *w, gpointer data ) +{ + int i; + for(i=0; ientry )), + get_nation_by_idx((int)g_list_nth_data(sorted_races_list,i))->name)==0) { + if (GTK_WIDGET_SENSITIVE(races_toggles[i])) { + selected_nation=(gint)g_list_nth_data(sorted_races_list,i); + /*gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(races_toggles[i]), TRUE);*/ + gtk_button_set_relief(GTK_BUTTON(flags_group), GTK_RELIEF_NONE); + flags_group=races_toggles[i]; + gtk_button_set_relief(GTK_BUTTON(races_toggles[i]), GTK_RELIEF_NORMAL); + select_random_leader(); + + selected_city_style = + city_style_ridx[get_nation_city_style(selected_nation)]; + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON( + city_style_toggles[selected_city_style]), TRUE); + + break; + } else { + /*That one's taken*/ + select_random_race(); + } + } + } +} + + +/************************************************************************** +... +**************************************************************************/ void races_toggles_set_sensitive(struct packet_nations_used *packet) { int i; @@ -2098,15 +2220,22 @@ static void races_toggles_callback( GtkWidget *w, gpointer race_id_p ) { /* don't do anything if signal is untoggling the button */ - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) { + /* if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) {*/ selected_nation = GPOINTER_TO_INT(race_id_p); + gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(races_by_name)->entry), + get_nation_by_idx(selected_nation)->name); select_random_leader(); selected_city_style = city_style_ridx[get_nation_city_style(selected_nation)]; gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON( city_style_toggles[selected_city_style]), TRUE); + /* }*/ + if (flags_group) { + gtk_button_set_relief(GTK_BUTTON(flags_group), GTK_RELIEF_NONE); } + gtk_button_set_relief(GTK_BUTTON(w), GTK_RELIEF_NORMAL); + flags_group=w; } /************************************************************************** diff -ur freeciv-cvs-Sep-12-orig/client/gui-gtk/graphics.h freeciv-cvs-Sep-12/client/gui-gtk/graphics.h --- freeciv-cvs-Sep-12-orig/client/gui-gtk/graphics.h Sun Jul 7 02:30:17 2002 +++ freeciv-cvs-Sep-12/client/gui-gtk/graphics.h Sat Sep 14 12:05:45 2002 @@ -49,5 +49,6 @@ SPRITE* sprite_scale(SPRITE *src, int new_w, int new_h); void sprite_get_bounding_box(SPRITE * sprite, int *start_x, int *start_y, int *end_x, int *end_y); +SPRITE* crop_blankspace(SPRITE* s); #endif /* FC__GRAPHICS_H */ diff -ur freeciv-cvs-Sep-12-orig/client/gui-gtk/graphics.c freeciv-cvs-Sep-12/client/gui-gtk/graphics.c --- freeciv-cvs-Sep-12-orig/client/gui-gtk/graphics.c Thu Aug 8 02:41:32 2002 +++ freeciv-cvs-Sep-12/client/gui-gtk/graphics.c Sat Sep 14 12:30:52 2002 @@ -622,3 +622,13 @@ gdk_image_destroy(mask_image); } + +/********************************************************************* +Crops all blankspace from a sprite (insofar as is possible as a rectangle) +*********************************************************************/ +SPRITE* crop_blankspace(SPRITE* s) +{ + int x1, y1, x2, y2; + sprite_get_bounding_box(s, &x1, &y1, &x2, &y2); + return(crop_sprite(s, x1, y1, x2-x1+1, y2-y1+1)); +}