diff -Nur -Xfreeciv/diff_ignore freeciv/client/gui-gtk/citydlg.c testing-buy/client/gui-gtk/citydlg.c --- freeciv/client/gui-gtk/citydlg.c Tue Feb 12 21:15:57 2002 +++ testing-buy/client/gui-gtk/citydlg.c Fri Feb 15 23:23:59 2002 @@ -107,9 +107,13 @@ GtkWidget *currently_building_frame; GtkWidget *progress_label; GtkWidget *improvement_list; + GtkWidget *gold_label; + GtkWidget *cost_label; GtkWidget *buy_command; + GtkWidget *buyno_command; GtkWidget *change_command; GtkWidget *sell_command; + GtkWidget *sellno_command; GtkWidget *production_label; GtkWidget *output_label; @@ -174,13 +178,14 @@ short block_signal; } misc; - GtkWidget *buy_shell, *sell_shell; GtkWidget *change_shell, *change_list; GtkWidget *rename_shell, *rename_input; GtkWidget *prev_command, *next_command; Impr_Type_id sell_id; + int really_sell; + int really_buy; int first_elvis, first_scientist, first_taxman; int cwidth; @@ -288,16 +293,10 @@ static void change_help_callback(GtkWidget * w, gpointer data); static void buy_callback(GtkWidget * w, gpointer data); -static gint buy_callback_delete(GtkWidget * w, GdkEvent * ev, - gpointer data); static void buy_callback_no(GtkWidget * w, gpointer data); -static void buy_callback_yes(GtkWidget * w, gpointer data); static void sell_callback(GtkWidget * w, gpointer data); -static gint sell_callback_delete(GtkWidget * w, GdkEvent * ev, - gpointer data); static void sell_callback_no(GtkWidget * w, gpointer data); -static void sell_callback_yes(GtkWidget * w, gpointer data); static void select_impr_list_callback(GtkWidget * w, gint row, gint column, GdkEventButton * event, gpointer data); @@ -803,19 +802,18 @@ /* stuff that's being currently built */ - /* The label is set in city_dialog_update_building() */ + /* These labels are set in city_dialog_update_building() */ pdialog->overview.currently_building_frame = gtk_frame_new(""); - gtk_box_pack_start(GTK_BOX(vbox), - pdialog->overview.currently_building_frame, FALSE, - FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), pdialog->overview.currently_building_frame, + FALSE, FALSE, 0); - hbox = gtk_hbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER - (pdialog->overview.currently_building_frame), hbox); + table = gtk_table_new(3, 2, FALSE); + gtk_container_add(GTK_CONTAINER(pdialog->overview.currently_building_frame), + table); pdialog->overview.progress_label = gtk_progress_bar_new(); - gtk_box_pack_start(GTK_BOX(hbox), pdialog->overview.progress_label, - TRUE, TRUE, 0); + gtk_table_attach_defaults(GTK_TABLE(table), pdialog->overview.progress_label, + 0, 2, 0, 1); gtk_progress_configure(GTK_PROGRESS(pdialog->overview.progress_label), 50, 0, 100); gtk_progress_set_show_text(GTK_PROGRESS @@ -824,15 +822,28 @@ (pdialog->overview.progress_label), _("%d/%d %d turns")); - pdialog->overview.buy_command = - gtk_accelbutton_new(_("_Buy"), pdialog->accel); - gtk_box_pack_start(GTK_BOX(hbox), pdialog->overview.buy_command, - TRUE, TRUE, 0); + pdialog->overview.change_command = gtk_accelbutton_new(_("_Change"), + pdialog->accel); + gtk_table_attach_defaults(GTK_TABLE(table), pdialog->overview.change_command, + 2, 3, 0, 1); + + pdialog->overview.gold_label = gtk_label_new(_("Gold: 0000")); + gtk_table_attach_defaults(GTK_TABLE(table), pdialog->overview.gold_label, + 0, 1, 1, 2); - pdialog->overview.change_command = - gtk_accelbutton_new(_("_Change"), pdialog->accel); - gtk_box_pack_start(GTK_BOX(hbox), pdialog->overview.change_command, - TRUE, TRUE, 0); + hbox = gtk_hbox_new(FALSE, 0); + gtk_table_attach_defaults(GTK_TABLE(table), hbox, 1, 2, 1, 2); + + pdialog->overview.cost_label = gtk_label_new(_("Cost: 0000")); + gtk_container_add(GTK_CONTAINER(hbox), pdialog->overview.cost_label); + + pdialog->overview.buyno_command = gtk_button_new_with_label(_("Don't Buy")); + gtk_container_add(GTK_CONTAINER(hbox), pdialog->overview.buyno_command); + + pdialog->overview.buy_command = gtk_accelbutton_new(_("_Buy"), + pdialog->accel); + gtk_table_attach_defaults(GTK_TABLE(table), pdialog->overview.buy_command, + 2, 3, 1, 2); /* city improvements */ @@ -872,20 +883,33 @@ /* and the sell button */ - pdialog->overview.sell_command = gtk_button_new_with_label(_("Sell")); - gtk_box_pack_start(GTK_BOX(vbox), pdialog->overview.sell_command, + hbox = gtk_hbox_new(FALSE,0); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + + pdialog->overview.sellno_command = gtk_button_new_with_label(_("Don't Sell")); + gtk_box_pack_start(GTK_BOX(hbox), pdialog->overview.sellno_command, FALSE, FALSE, 0); + pdialog->overview.sell_command = gtk_button_new_with_label(_("Sell")); + gtk_box_pack_start(GTK_BOX(hbox), pdialog->overview.sell_command, + TRUE, TRUE, 0); + + gtk_signal_connect(GTK_OBJECT(pdialog->overview.sellno_command), "clicked", + GTK_SIGNAL_FUNC(sell_callback_no), pdialog); + gtk_signal_connect(GTK_OBJECT(pdialog->overview.sell_command), "clicked", GTK_SIGNAL_FUNC(sell_callback), pdialog); gtk_signal_connect(GTK_OBJECT(pdialog->overview.buy_command), "clicked", GTK_SIGNAL_FUNC(buy_callback), pdialog); + gtk_signal_connect(GTK_OBJECT(pdialog->overview.buyno_command), "clicked", + GTK_SIGNAL_FUNC(buy_callback_no), pdialog); + gtk_signal_connect(GTK_OBJECT(pdialog->overview.change_command), "clicked", GTK_SIGNAL_FUNC(change_callback), pdialog); - /* in terms of structural flow, should be put these above? */ + /* in terms of structural flow, should we put these above? */ gtk_signal_connect(GTK_OBJECT(pdialog->overview.map_canvas), "expose_event", @@ -1434,12 +1458,11 @@ pdialog = fc_malloc(sizeof(struct city_dialog)); pdialog->pcity = pcity; pdialog->change_shell = NULL; - pdialog->buy_shell = NULL; - pdialog->sell_shell = NULL; pdialog->rename_shell = NULL; pdialog->happiness.map_canvas = NULL; /* make sure NULL if spy */ pdialog->happiness.map_canvas_pixmap = NULL; /* ditto */ - + pdialog->really_buy = 0; + pdialog->really_sell = 0; pdialog->shell = gtk_dialog_new(); pdialog->accel = gtk_accel_group_new(); @@ -1590,6 +1613,9 @@ gtk_widget_show_all(GTK_DIALOG(pdialog->shell)->vbox); gtk_widget_show_all(GTK_DIALOG(pdialog->shell)->action_area); + gtk_widget_hide(pdialog->overview.buyno_command); + gtk_widget_hide(pdialog->overview.sellno_command); + return pdialog; } @@ -1890,27 +1916,36 @@ static void city_dialog_update_building(struct city_dialog *pdialog) { char buf[32], buf2[200], *descr; - int turns; struct city *pcity = pdialog->pcity; + int turns, cost = city_buy_cost(pdialog->pcity); gfloat pct; - gtk_widget_set_sensitive(pdialog->overview.buy_command, !pcity->did_buy); - gtk_widget_set_sensitive(pdialog->overview.sell_command, - !pcity->did_sell); + if (!pdialog->really_buy) { + gtk_widget_hide(pdialog->overview.buyno_command); + gtk_widget_show(pdialog->overview.cost_label); + gtk_set_label(GTK_BUTTON(pdialog->overview.buy_command)->child, _("Buy")); + } + + gtk_widget_set_sensitive(pdialog->overview.buy_command, (!pcity->did_buy + && game.player_ptr->economic.gold >= cost)); + gtk_widget_set_sensitive(pdialog->overview.sell_command, !pcity->did_sell); + + my_snprintf(buf, sizeof(buf), _("Cost: %d"), cost); + gtk_label_set_text(GTK_LABEL(pdialog->overview.cost_label), buf); + + my_snprintf(buf, sizeof(buf), _("Gold: %d"), game.player_ptr->economic.gold); + gtk_label_set_text(GTK_LABEL(pdialog->overview.gold_label), buf); if (pcity->is_building_unit) { - turns = - city_turns_to_build(pcity, pcity->currently_building, TRUE, TRUE); + turns = city_turns_to_build(pcity, pcity->currently_building, TRUE, TRUE); my_snprintf(buf, sizeof(buf), concise_city_production ? "%3d/%3d:%3d" : PL_("%3d/%3d %3d turn", "%3d/%3d %3d turns", turns), pcity->shield_stock, - get_unit_type(pcity->currently_building)->build_cost, - turns); + get_unit_type(pcity->currently_building)->build_cost, turns); descr = get_unit_type(pcity->currently_building)->name; - pct = - (gfloat) pcity->shield_stock / - (get_unit_type(pcity->currently_building)->build_cost + 0.1); + pct = (gfloat) pcity->shield_stock / + (get_unit_type(pcity->currently_building)->build_cost + 0.1); pct = CLAMP(pct, 0.0, 1.0); } else { if (pcity->currently_building == B_CAPITAL) { @@ -2936,54 +2971,29 @@ *****************************************************************/ static void buy_callback(GtkWidget * w, gpointer data) { - struct city_dialog *pdialog; - int value; - char *name; - char buf[512]; + struct city_dialog *pdialog = (struct city_dialog *) data; - pdialog = (struct city_dialog *) data; + if (!pdialog->really_buy) { + assert(game.player_ptr->economic.gold >= city_buy_cost(pdialog->pcity)); - if (pdialog->pcity->is_building_unit) { - name = get_unit_type(pdialog->pcity->currently_building)->name; - } else { - name = - get_impr_name_ex(pdialog->pcity, - pdialog->pcity->currently_building); - } - value = city_buy_cost(pdialog->pcity); - - if (game.player_ptr->economic.gold >= value) { - my_snprintf(buf, sizeof(buf), - _("Buy %s for %d gold?\nTreasury contains %d gold."), - name, value, game.player_ptr->economic.gold); + gtk_set_label(GTK_BUTTON(pdialog->overview.buy_command)->child, + _("Buy it?")); - pdialog->buy_shell = - popup_message_dialog(pdialog->shell, /*"buydialog" */ _("Buy It!"), - buf, _("_Yes"), buy_callback_yes, pdialog, - _("_No"), buy_callback_no, pdialog, 0); + gtk_widget_hide(pdialog->overview.cost_label); + gtk_widget_show(pdialog->overview.buyno_command); + pdialog->really_buy = 1; } else { - my_snprintf(buf, sizeof(buf), - _("%s costs %d gold.\nTreasury contains %d gold."), - name, value, game.player_ptr->economic.gold); - - pdialog->buy_shell = popup_message_dialog(pdialog->shell, - _("Buy It!"), buf, _("Darn"), - buy_callback_no, pdialog, 0); - } + struct packet_city_request packet; - gtk_signal_connect(GTK_OBJECT(pdialog->buy_shell), "delete_event", - GTK_SIGNAL_FUNC(buy_callback_delete), data); -} + packet.city_id = pdialog->pcity->id; + packet.name[0] = '\0'; + packet.worklist.name[0] = '\0'; + send_packet_city_request(&aconnection, &packet, PACKET_CITY_BUY); -/**************************************************************** -... -*****************************************************************/ -static gint buy_callback_delete(GtkWidget * w, GdkEvent * ev, - gpointer data) -{ - struct city_dialog *pdialog = (struct city_dialog *) data; - pdialog->buy_shell = NULL; - return FALSE; + gtk_widget_hide(pdialog->overview.buyno_command); + gtk_widget_show(pdialog->overview.cost_label); + pdialog->really_buy = 0; + } } /**************************************************************** @@ -2992,27 +3002,13 @@ static void buy_callback_no(GtkWidget * w, gpointer data) { struct city_dialog *pdialog = (struct city_dialog *) data; - destroy_message_dialog(w); - pdialog->buy_shell = NULL; -} - -/**************************************************************** -... -*****************************************************************/ -static void buy_callback_yes(GtkWidget * w, 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.worklist.name[0] = '\0'; - send_packet_city_request(&aconnection, &packet, PACKET_CITY_BUY); + gtk_widget_hide(pdialog->overview.buyno_command); + gtk_widget_show(pdialog->overview.cost_label); + + gtk_set_label(GTK_BUTTON(pdialog->overview.buy_command)->child, _("Buy")); - destroy_message_dialog(w); - pdialog->buy_shell = NULL; + pdialog->really_buy = 0; } /**************************************************************** @@ -3222,44 +3218,43 @@ static void sell_callback(GtkWidget * w, gpointer data) { struct city_dialog *pdialog = (struct city_dialog *) data; - GList *selection; - int id; - char buf[512]; - selection = GTK_CLIST(pdialog->overview.improvement_list)->selection; - if (!selection) - return; + if(!pdialog->really_sell) { + int id; + GList *selection; + + selection = GTK_CLIST(pdialog->overview.improvement_list)->selection; + + if (!selection) + return; + + id = (int) gtk_clist_get_row_data(GTK_CLIST + (pdialog->overview.improvement_list), + (int) selection->data); - id = (int) gtk_clist_get_row_data(GTK_CLIST - (pdialog->overview.improvement_list), - (int) selection->data); - assert(pdialog->pcity->improvements[id]); - if (is_wonder(id)) - return; + assert(pdialog->pcity->improvements[id]); + + if (is_wonder(id)) + return; - pdialog->sell_id = id; - my_snprintf(buf, sizeof(buf), _("Sell %s for %d gold?"), - get_impr_name_ex(pdialog->pcity, id), improvement_value(id)); + gtk_widget_show(pdialog->overview.sellno_command); + gtk_set_label(GTK_BUTTON(pdialog->overview.sell_command)->child, + _("Sell it?")); - pdialog->sell_shell = popup_message_dialog(pdialog->shell, - _("Sell It!"), buf, - _("_Yes"), sell_callback_yes, - pdialog, _("_No"), - sell_callback_no, pdialog, 0); + pdialog->sell_id = id; + pdialog->really_sell = 1; + } else { + struct packet_city_request packet; - gtk_signal_connect(GTK_OBJECT(pdialog->sell_shell), "delete_event", - GTK_SIGNAL_FUNC(sell_callback_delete), data); -} + packet.city_id = pdialog->pcity->id; + packet.build_id = pdialog->sell_id; + packet.name[0] = '\0'; + packet.worklist.name[0] = '\0'; + send_packet_city_request(&aconnection, &packet, PACKET_CITY_SELL); -/**************************************************************** -... -*****************************************************************/ -static gint sell_callback_delete(GtkWidget * w, GdkEvent * ev, - gpointer data) -{ - struct city_dialog *pdialog = (struct city_dialog *) data; - pdialog->sell_shell = NULL; - return FALSE; + gtk_widget_hide(pdialog->overview.sellno_command); + pdialog->really_sell = 0; + } } /**************************************************************** @@ -3268,28 +3263,10 @@ static void sell_callback_no(GtkWidget * w, gpointer data) { struct city_dialog *pdialog = (struct city_dialog *) data; - destroy_message_dialog(w); - pdialog->sell_shell = NULL; -} -/**************************************************************** -... -*****************************************************************/ -static void sell_callback_yes(GtkWidget * w, gpointer data) -{ - struct city_dialog *pdialog; - struct packet_city_request packet; - - pdialog = (struct city_dialog *) data; - - packet.city_id = pdialog->pcity->id; - packet.build_id = pdialog->sell_id; - packet.name[0] = '\0'; - packet.worklist.name[0] = '\0'; - send_packet_city_request(&aconnection, &packet, PACKET_CITY_SELL); - - destroy_message_dialog(w); - pdialog->sell_shell = NULL; + gtk_clist_unselect_all(GTK_CLIST(pdialog->overview.improvement_list)); + gtk_widget_hide(pdialog->overview.sellno_command); + pdialog->really_sell = 0; } /**************************************************************** @@ -3303,6 +3280,9 @@ GList *selection = GTK_CLIST(pdialog->overview.improvement_list)->selection; + gtk_widget_hide(pdialog->overview.sellno_command); + pdialog->really_sell = 0; + if (!selection || pdialog->pcity->did_buy || pdialog->pcity->did_sell || pdialog->pcity->owner != game.player_idx) { gtk_set_label(GTK_BUTTON(pdialog->overview.sell_command)->child, @@ -3625,10 +3605,6 @@ if (pdialog->change_shell) gtk_widget_destroy(pdialog->change_shell); - if (pdialog->buy_shell) - gtk_widget_destroy(pdialog->buy_shell); - if (pdialog->sell_shell) - gtk_widget_destroy(pdialog->sell_shell); if (pdialog->rename_shell) gtk_widget_destroy(pdialog->rename_shell); @@ -3716,6 +3692,8 @@ pdialog->pcity = new_pcity; + pdialog->really_buy = 0; + /* reinitialize happiness, worklist, and cma dialogs */ gtk_box_pack_start(GTK_BOX(pdialog->happiness.widget), get_top_happiness_display(pdialog->pcity), TRUE, TRUE, 0); @@ -3726,6 +3704,7 @@ center_tile_mapcanvas(pdialog->pcity->x, pdialog->pcity->y); set_cityopt_values(pdialog); /* need not be in refresh_city_dialog */ + refresh_city_dialog(pdialog->pcity); select_impr_list_callback(NULL, 0, 0, NULL, pdialog); /* unselects clist */ }