diff -Nur -X/data/freeciv-dev/freeciv/diff_ignore freeciv/client/gui-gtk/citydlg.c people/client/gui-gtk/citydlg.c --- freeciv/client/gui-gtk/citydlg.c Sat Jan 27 22:39:16 2001 +++ people/client/gui-gtk/citydlg.c Sun Jan 28 00:51:01 2001 @@ -68,8 +68,8 @@ GtkWidget *shell; GtkWidget *main_form; GtkWidget *cityname_label; - GtkWidget *citizen_boxes [NUM_CITIZENS_SHOWN]; - GtkWidget *citizen_pixmaps [NUM_CITIZENS_SHOWN]; + GtkWidget *citizen_box; + GtkWidget *citizen_pixmap; GtkWidget *production_label; GtkWidget *output_label; GtkWidget *storage_label; @@ -97,7 +97,7 @@ Impr_Type_id sell_id; - int citizen_type[NUM_CITIZENS_SHOWN]; + int first_elvis, first_scientist, first_taxman; int support_unit_ids[NUM_UNITS_SHOWN]; int support_unit_pos; int present_unit_ids[NUM_UNITS_SHOWN]; @@ -118,6 +118,7 @@ struct city_dialog *create_city_dialog(struct city *pcity, int make_modal); void close_city_dialog(struct city_dialog *pdialog); +static void citizens_callback(GtkWidget *w, GdkEventButton *ev, gpointer data); void city_dialog_update_improvement_list(struct city_dialog *pdialog); void city_dialog_update_title(struct city_dialog *pdialog); void city_dialog_update_supported_units(struct city_dialog *pdialog, int id); @@ -390,20 +391,23 @@ /* "citizens" box */ box=gtk_hbox_new(FALSE, 1); gtk_box_pack_start(GTK_BOX(vbox), box, FALSE, FALSE, 0); - - for(i=0; icitizen_boxes[i]=gtk_event_box_new(); - gtk_widget_set_events(pdialog->citizen_boxes[i], GDK_BUTTON_PRESS_MASK); - gtk_box_pack_start(GTK_BOX(box), pdialog->citizen_boxes[i], FALSE, FALSE,0); - - pdialog->citizen_pixmaps[i]= gtk_pixcomm_new (root_window, - SMALL_TILE_WIDTH, SMALL_TILE_HEIGHT); - gtk_container_add(GTK_CONTAINER(pdialog->citizen_boxes[i]), - pdialog->citizen_pixmaps[i]); - } + + pdialog->citizen_box = gtk_event_box_new(); + gtk_widget_set_events(pdialog->citizen_box, GDK_BUTTON_PRESS_MASK); + gtk_box_pack_start(GTK_BOX(box), pdialog->citizen_box, FALSE, FALSE, 0); + pdialog->citizen_pixmap = gtk_pixcomm_new(root_window, + SMALL_TILE_WIDTH * NUM_CITIZENS_SHOWN, + SMALL_TILE_HEIGHT); + gtk_container_add(GTK_CONTAINER(pdialog->citizen_box), + pdialog->citizen_pixmap); + gtk_signal_connect(GTK_OBJECT(pdialog->citizen_box), + "button_press_event", GTK_SIGNAL_FUNC(citizens_callback), pdialog); + + pdialog->sub_form=gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), pdialog->sub_form, TRUE, TRUE, 0); + /* "city status" vbox */ box=gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(pdialog->sub_form), box, FALSE, FALSE, 15); @@ -670,9 +674,6 @@ for(i=0; iimprovlist_names_ptrs[i]=0; - for(i=0; icitizen_type[i]=-1; - refresh_city_dialog(pdialog->pcity); if(make_modal) @@ -1371,92 +1372,53 @@ void city_dialog_update_citizens(struct city_dialog *pdialog) { int i, n; - struct city *pcity=pdialog->pcity; - - for(i=0, n=0; nppl_happy[4] && icitizen_type[i]!=5 && pdialog->citizen_type[i]!=6) { - pdialog->citizen_type[i]=5+i%2; - - gtk_pixcomm_copyto(GTK_PIXCOMM(pdialog->citizen_pixmaps[i]), - get_citizen_sprite(pdialog->citizen_type[i]), 0, 0, TRUE); - - gtk_signal_handlers_destroy(GTK_OBJECT(pdialog->citizen_boxes[i])); - - gtk_widget_set_sensitive(pdialog->citizen_boxes[i], TRUE); - } - - for(n=0; nppl_content[4] && icitizen_type[i]!=3 && pdialog->citizen_type[i]!=4) { - pdialog->citizen_type[i]=3+i%2; - - gtk_pixcomm_copyto(GTK_PIXCOMM(pdialog->citizen_pixmaps[i]), - get_citizen_sprite(pdialog->citizen_type[i]), 0, 0, TRUE); - - gtk_signal_handlers_destroy(GTK_OBJECT(pdialog->citizen_boxes[i])); - - gtk_widget_set_sensitive(pdialog->citizen_boxes[i], TRUE); - } - - for(n=0; nppl_unhappy[4] && icitizen_type[i]!=7 && pdialog->citizen_type[i]!=8) { - pdialog->citizen_type[i]=7+i%2; + struct city *pcity = pdialog->pcity; + /* If there is not enough space we stack the icons. We draw from left to right. + width is how far we go to the right for each drawn pixmap. The last icons is + always drawn in full, ans so has reserved SMALL_TILE_WIDTH pixels. */ + int width = MIN(SMALL_TILE_WIDTH, + ((NUM_CITIZENS_SHOWN-1) * SMALL_TILE_WIDTH)/(pcity->size-1)); - gtk_pixcomm_copyto(GTK_PIXCOMM(pdialog->citizen_pixmaps[i]), - get_citizen_sprite(pdialog->citizen_type[i]), 0, 0, TRUE); + gtk_pixcomm_clear(GTK_PIXCOMM(pdialog->citizen_pixmap), TRUE); - gtk_signal_handlers_destroy(GTK_OBJECT(pdialog->citizen_boxes[i])); - - gtk_widget_set_sensitive(pdialog->citizen_boxes[i], TRUE); - } - - for(n=0; nppl_elvis && icitizen_type[i]!=0) { - pdialog->citizen_type[i]=0; - - gtk_pixcomm_copyto(GTK_PIXCOMM(pdialog->citizen_pixmaps[i]), - get_citizen_sprite(0), 0, 0, TRUE); - - gtk_signal_handlers_destroy(GTK_OBJECT(pdialog->citizen_boxes[i])); - gtk_signal_connect(GTK_OBJECT(pdialog->citizen_boxes[i]), - "button_press_event", GTK_SIGNAL_FUNC(elvis_callback), pdialog); - - gtk_widget_set_sensitive(pdialog->citizen_boxes[i], TRUE); - } - - for(n=0; nppl_scientist && icitizen_type[i]!=1) { - pdialog->citizen_type[i]=1; - - gtk_pixcomm_copyto(GTK_PIXCOMM(pdialog->citizen_pixmaps[i]), - get_citizen_sprite(1), 0, 0, TRUE); - - gtk_signal_handlers_destroy(GTK_OBJECT(pdialog->citizen_boxes[i])); - gtk_signal_connect(GTK_OBJECT(pdialog->citizen_boxes[i]), - "button_press_event", GTK_SIGNAL_FUNC(scientist_callback), pdialog); - - gtk_widget_set_sensitive(pdialog->citizen_boxes[i], TRUE); - } + i = 0; /* tracks the number of the citizen we are currently placing. */ + for (n=0; nppl_happy[4]; n++, i++) { + gtk_pixcomm_copyto(GTK_PIXCOMM(pdialog->citizen_pixmap), + get_citizen_sprite(5 + i%2), + i*width, 0, TRUE); + } - for(n=0; nppl_taxman && icitizen_type[i]!=2) { - pdialog->citizen_type[i]=2; - - gtk_pixcomm_copyto(GTK_PIXCOMM(pdialog->citizen_pixmaps[i]), - get_citizen_sprite(2), 0, 0, TRUE); - - gtk_signal_handlers_destroy(GTK_OBJECT(pdialog->citizen_boxes[i])); - gtk_signal_connect(GTK_OBJECT(pdialog->citizen_boxes[i]), - "button_press_event", GTK_SIGNAL_FUNC(taxman_callback), pdialog); + for (n=0; nppl_content[4]; n++, i++) { + gtk_pixcomm_copyto(GTK_PIXCOMM(pdialog->citizen_pixmap), + get_citizen_sprite(3 + i%2), + i*width, 0, TRUE); + } - gtk_widget_set_sensitive(pdialog->citizen_boxes[i], TRUE); - } + for (n=0; nppl_unhappy[4]; n++, i++) { + gtk_pixcomm_copyto(GTK_PIXCOMM(pdialog->citizen_pixmap), + get_citizen_sprite(7 + i%2), + i*width, 0, TRUE); + } - for(; icitizen_pixmaps[i]), TRUE); + pdialog->first_elvis = i; + for (n=0; nppl_elvis; n++, i++) { + gtk_pixcomm_copyto(GTK_PIXCOMM(pdialog->citizen_pixmap), + get_citizen_sprite(0), + i*width, 0, TRUE); + } - gtk_signal_handlers_destroy(GTK_OBJECT(pdialog->citizen_boxes[i])); + pdialog->first_scientist = i; + for (n=0; nppl_scientist; n++, i++) { + gtk_pixcomm_copyto(GTK_PIXCOMM(pdialog->citizen_pixmap), + get_citizen_sprite(1), + i*width, 0, TRUE); + } - gtk_widget_set_sensitive(pdialog->citizen_boxes[i], FALSE); + pdialog->first_taxman = i; + for (n=0; nppl_taxman; n++, i++) { + gtk_pixcomm_copyto(GTK_PIXCOMM(pdialog->citizen_pixmap), + get_citizen_sprite(2), + i*width, 0, TRUE); } } @@ -1726,68 +1688,55 @@ } /**************************************************************** -... -*****************************************************************/ -gint elvis_callback(GtkWidget *w, GdkEventButton *ev, gpointer data) -{ - struct city_dialog *pdialog; - struct packet_city_request packet; - - pdialog=(struct city_dialog *)data; - - packet.city_id=pdialog->pcity->id; - packet.name[0]='\0'; - packet.specialist_from=SP_ELVIS; - packet.specialist_to=SP_SCIENTIST; - packet.worklist.name[0] = '\0'; - - send_packet_city_request(&aconnection, &packet, - PACKET_CITY_CHANGE_SPECIALIST); - return TRUE; -} - -/**************************************************************** -... +Somebody clicked our list of citizens. If they clicked a specialist +then change the type of him, else do nothing. *****************************************************************/ -gint scientist_callback(GtkWidget *w, GdkEventButton *ev, gpointer data) +static void citizens_callback(GtkWidget *w, GdkEventButton *ev, gpointer data) { - struct city_dialog *pdialog; - struct packet_city_request packet; - - pdialog=(struct city_dialog *)data; + struct city_dialog *pdialog = (struct city_dialog *)data; + struct city *pcity = pdialog->pcity; + struct packet_city_request packet; + int citnum; + enum specialist_type type; + /* See city_dialog_update_citizens() for an explanation of width. */ + int width = MIN(SMALL_TILE_WIDTH, + ((NUM_CITIZENS_SHOWN-1) * SMALL_TILE_WIDTH)/(pcity->size-1)); + + if (ev->x > (pcity->size-1) * width + SMALL_TILE_WIDTH) + return; /* no citizen that far to the right */ + + citnum = MIN(pcity->size-1, ev->x/width); + + if (citnum >= pdialog->first_taxman) { + type = SP_TAXMAN; + } else if (citnum >= pdialog->first_scientist) { + type = SP_SCIENTIST; + } else if (citnum >= pdialog->first_elvis) { + type = SP_ELVIS; + } else { + return; + } - packet.city_id=pdialog->pcity->id; - packet.name[0]='\0'; - packet.specialist_from=SP_SCIENTIST; - packet.specialist_to=SP_TAXMAN; + packet.city_id = pdialog->pcity->id; + packet.name[0] = '\0'; packet.worklist.name[0] = '\0'; - - send_packet_city_request(&aconnection, &packet, - PACKET_CITY_CHANGE_SPECIALIST); - return TRUE; -} + packet.specialist_from = type; -/**************************************************************** -... -*****************************************************************/ -gint taxman_callback(GtkWidget *w, GdkEventButton *ev, gpointer data) -{ - struct city_dialog *pdialog; - struct packet_city_request packet; - - pdialog=(struct city_dialog *)data; + switch (type) { + case SP_ELVIS: + packet.specialist_to = SP_SCIENTIST; + break; + case SP_SCIENTIST: + packet.specialist_to = SP_TAXMAN; + break; + case SP_TAXMAN: + packet.specialist_to = SP_ELVIS; + break; + } - packet.city_id=pdialog->pcity->id; - packet.name[0]='\0'; - packet.specialist_from=SP_TAXMAN; - packet.specialist_to=SP_ELVIS; - packet.worklist.name[0] = '\0'; - - send_packet_city_request(&aconnection, &packet, + send_packet_city_request(&aconnection, &packet, PACKET_CITY_CHANGE_SPECIALIST); - return TRUE; } - /**************************************************************** ...