--- /home/dzinsli/source/freeciv-cvs/client/gui-gtk/gamedlgs.c Sun Jan 2 12:55:26 2000 +++ /home/dzinsli/source/freeciv/client/gui-gtk/gamedlgs.c Sat Jan 29 21:17:41 2000 @@ -47,6 +47,7 @@ /******************************************************************/ GtkWidget *rates_dialog_shell; GtkWidget *rates_gov_label; +GtkWidget *rates_science_label; GtkWidget *rates_tax_toggle, *rates_lux_toggle, *rates_sci_toggle; GtkWidget *rates_tax_label, *rates_lux_label, *rates_sci_label; GtkObject *rates_tax_adj, *rates_lux_adj, *rates_sci_adj; @@ -55,7 +56,7 @@ /******************************************************************/ int rates_tax_value, rates_lux_value, rates_sci_value; - +int rates_old_tax_value, rates_old_lux_value, rates_old_sci_value; void rates_changed_callback(GtkAdjustment *adj); @@ -167,7 +168,10 @@ **************************************************************************/ void rates_changed_callback(GtkAdjustment *adj) { + char buf[64]; int percent=adj->value; + int turns; + struct packet_player_request packet; if(adj==GTK_ADJUSTMENT(rates_tax_adj)) { int tax_value; @@ -190,6 +194,19 @@ sci_value=MIN(sci_value, 100); rates_set_values(rates_tax_value,0, rates_lux_value,0, sci_value,1); } + + turns = tech_turns_per_research (game.player_ptr); + my_snprintf(buf, sizeof(buf), turns == 1 ? _("Discovery every turn") : + _("Discovery every %d turns"), + turns); + + gtk_set_label(rates_science_label, buf); + + packet.tax=rates_tax_value; + packet.science=rates_sci_value; + packet.luxury=rates_lux_value; + send_packet_player_request(&aconnection, &packet, PACKET_PLAYER_RATES); + } @@ -198,15 +215,9 @@ **************************************************************************/ static void rates_ok_command_callback(GtkWidget *widget, gpointer data) { - struct packet_player_request packet; - gtk_widget_set_sensitive(toplevel, TRUE); gtk_widget_destroy(rates_dialog_shell); - packet.tax=rates_tax_value; - packet.science=rates_sci_value; - packet.luxury=rates_lux_value; - send_packet_player_request(&aconnection, &packet, PACKET_PLAYER_RATES); } @@ -215,12 +226,20 @@ **************************************************************************/ static void rates_cancel_command_callback(GtkWidget *widget, gpointer data) { + struct packet_player_request packet; + gtk_widget_set_sensitive(toplevel, TRUE); gtk_widget_destroy(rates_dialog_shell); + + packet.tax=rates_old_tax_value; + packet.science=rates_old_sci_value; + packet.luxury=rates_old_lux_value; + send_packet_player_request(&aconnection, &packet, PACKET_PLAYER_RATES); } + /**************************************************************** ... *****************************************************************/ @@ -243,6 +262,9 @@ rates_gov_label = gtk_label_new(""); gtk_box_pack_start( GTK_BOX( GTK_DIALOG( rates_dialog_shell )->vbox ), rates_gov_label, TRUE, TRUE, 5 ); + rates_science_label = gtk_label_new(""); + gtk_box_pack_start( GTK_BOX( GTK_DIALOG( rates_dialog_shell )->vbox ), rates_science_label, TRUE, TRUE, 5 ); + frame = gtk_frame_new( _("Tax") ); gtk_box_pack_start( GTK_BOX( GTK_DIALOG( rates_dialog_shell )->vbox ), frame, TRUE, TRUE, 5 ); @@ -342,6 +364,11 @@ rates_set_values( game.player_ptr->economic.tax, 0, game.player_ptr->economic.luxury, 0, game.player_ptr->economic.science, 0 ); + + rates_old_tax_value = game.player_ptr->economic.tax; + rates_old_sci_value = game.player_ptr->economic.science; + rates_old_lux_value = game.player_ptr->economic.luxury; + return; } @@ -354,6 +381,7 @@ void popup_rates_dialog( void ) { char buf[64]; + int turns = 0; gtk_widget_set_sensitive(toplevel, FALSE ); create_rates_dialog(); @@ -362,6 +390,13 @@ get_government_name(game.player_ptr->government), get_government_max_rate(game.player_ptr->government)); gtk_set_label(rates_gov_label, buf); + + turns = tech_turns_per_research (game.player_ptr); + my_snprintf(buf, sizeof(buf), turns == 1 ? _("Discovery every turn") : + _("Discovery every %d turns"), + turns); + + gtk_set_label(rates_science_label, buf); gtk_widget_show( rates_dialog_shell ); } diff -u -X/home/dzinsli/source/freeciv-patches/no.freeciv -r /home/dzinsli/source/freeciv-cvs/client/gui-gtk/helpdlg.c /home/dzinsli/source/freeciv/client/gui-gtk/helpdlg.c --- /home/dzinsli/source/freeciv-cvs/client/gui-gtk/helpdlg.c Sun Jan 2 12:55:27 2000 +++ /home/dzinsli/source/freeciv/client/gui-gtk/helpdlg.c Sat Jan 29 20:56:25 2000 @@ -119,6 +119,12 @@ } return; } +/**************************************************************** +tells whether help dialog is already active +*****************************************************************/ +int popup_help_dialog_active() { + return help_dialog_shell?1:0; +} /**************************************************************** ... @@ -335,7 +341,7 @@ style = gtk_style_new( ); - style->fg[GTK_STATE_NORMAL] = *colors_standard[COLOR_STD_RED]; + /*style->fg[GTK_STATE_NORMAL] = *colors_standard[COLOR_STD_RED];*/ help_itable = gtk_table_new(6, 1, FALSE); diff -u -X/home/dzinsli/source/freeciv-patches/no.freeciv -r /home/dzinsli/source/freeciv-cvs/client/gui-gtk/repodlgs.c /home/dzinsli/source/freeciv/client/gui-gtk/repodlgs.c --- /home/dzinsli/source/freeciv-cvs/client/gui-gtk/repodlgs.c Sun Jan 2 12:55:28 2000 +++ /home/dzinsli/source/freeciv/client/gui-gtk/repodlgs.c Sat Jan 29 22:07:44 2000 @@ -48,10 +48,11 @@ void create_science_dialog(int make_modal); -void science_close_callback(GtkWidget *widget, gpointer data); -void science_help_callback(GtkWidget *w, gint row, gint column); -void science_change_callback(GtkWidget *widget, gpointer data); -void science_goal_callback(GtkWidget *widget, gpointer data); +static void science_close_callback(GtkWidget *widget, gpointer data); +static void science_help_callback(GtkWidget *w, gint row, gint column); +static void science_help_button_callback(GtkWidget * w); +static void science_change_callback(GtkWidget *widget, gpointer data); +static void science_goal_callback(GtkWidget *widget, gpointer data); /******************************************************************/ @@ -59,7 +60,7 @@ GtkWidget *science_label; GtkWidget *science_current_label, *science_goal_label; GtkWidget *science_change_menu_button, *science_goal_menu_button; -GtkWidget *science_list, *science_help_toggle; +GtkWidget *science_list, *science_help_button; int science_dialog_shell_is_modal; int science_dialog_popupmenu; GtkWidget *popupmenu, *goalmenu; @@ -207,8 +208,8 @@ gtk_box_pack_start( GTK_BOX( hbox ), science_current_label,TRUE, FALSE, 0 ); gtk_widget_set_usize(science_current_label, 0,25); - science_help_toggle = gtk_check_button_new_with_label (_("Help")); - gtk_box_pack_start( GTK_BOX( hbox ), science_help_toggle, TRUE, FALSE, 0 ); + w = gtk_label_new(""); + gtk_box_pack_start(GTK_BOX(hbox), w, TRUE, FALSE, 0); frame = gtk_frame_new( _("Goal")); gtk_box_pack_start( GTK_BOX( GTK_DIALOG(science_dialog_shell)->vbox ), @@ -227,8 +228,8 @@ gtk_box_pack_start( GTK_BOX( hbox ), science_goal_label, TRUE, FALSE, 0 ); gtk_widget_set_usize(science_goal_label, 0,25); - w = gtk_label_new(""); - gtk_box_pack_start( GTK_BOX( hbox ), w,TRUE, FALSE, 0 ); + science_help_button = gtk_button_new_with_label(_("Help")); + gtk_box_pack_start(GTK_BOX(hbox), science_help_button, TRUE, FALSE, 0); science_list = gtk_clist_new(4); gtk_box_pack_start( GTK_BOX( GTK_DIALOG(science_dialog_shell)->vbox ), @@ -246,6 +247,9 @@ gtk_signal_connect(GTK_OBJECT(science_list), "select_row", GTK_SIGNAL_FUNC(science_help_callback), NULL); + gtk_signal_connect(GTK_OBJECT(science_help_button), "clicked", + GTK_SIGNAL_FUNC(science_help_button_callback), NULL); + gtk_widget_show_all( GTK_DIALOG(science_dialog_shell)->vbox ); gtk_widget_show_all( GTK_DIALOG(science_dialog_shell)->action_area ); @@ -266,24 +270,28 @@ char text[512]; struct packet_player_request packet; size_t to; + int turns_per, turns_left; to=(size_t)data; - if (GTK_TOGGLE_BUTTON(science_help_toggle)->active) { + if (popup_help_dialog_active()) popup_help_dialog_typed(advances[to].name, HELP_TECH); - /* Following is to make the menu go back to the current research; - * there may be a better way to do this? --dwp */ - science_dialog_update(); - } - else { - my_snprintf(text, sizeof(text), "%d/%d", - game.player_ptr->research.researched, - research_time(game.player_ptr)); - gtk_set_label(science_current_label,text); + + turns_per = tech_turns_per_research (game.player_ptr); + turns_left = tech_turns_left (game.player_ptr); + + my_snprintf(text, sizeof(text), _("%d/%d Research every %d %s, %d %s left"), + game.player_ptr->research.researched, + research_time(game.player_ptr), + turns_per, + turns_per == 1 ? _("turn") : _("turns"), + turns_left, + turns_left == 1 ?_("turn") : _("turns")); + + gtk_set_label(science_current_label,text); - packet.tech=to; - send_packet_player_request(&aconnection, &packet, PACKET_PLAYER_RESEARCH); - } + packet.tech=to; + send_packet_player_request(&aconnection, &packet, PACKET_PLAYER_RESEARCH); } /**************************************************************** @@ -297,20 +305,16 @@ to=(size_t)data; - if (GTK_TOGGLE_BUTTON(science_help_toggle)->active) { + if (popup_help_dialog_active()) popup_help_dialog_typed(advances[to].name, HELP_TECH); - /* Following is to make the menu go back to the current goal; - * there may be a better way to do this? --dwp */ - science_dialog_update(); - } - else { - my_snprintf(text, sizeof(text), _("(%d steps)"), - tech_goal_turns(game.player_ptr, to)); - gtk_set_label(science_goal_label,text); - packet.tech=to; - send_packet_player_request(&aconnection, &packet, PACKET_PLAYER_TECH_GOAL); - } + my_snprintf(text, sizeof(text), _("(%d steps)"), + tech_goal_turns(game.player_ptr, to)); + gtk_set_label(science_goal_label,text); + + packet.tech=to; + send_packet_player_request(&aconnection, &packet, PACKET_PLAYER_TECH_GOAL); + } /**************************************************************** @@ -326,22 +330,29 @@ } /**************************************************************** -... +opens help dialog to current goal *****************************************************************/ +void science_help_button_callback(GtkWidget * w) +{ + GtkWidget *m = gtk_option_menu_get_menu(GTK_OPTION_MENU(science_goal_menu_button)); + GtkWidget *a = gtk_menu_get_active(GTK_MENU(m)); + gchar *s = gtk_widget_get_name(a); + popup_help_dialog_typed(s, HELP_TECH); +} +/**************************************************************** +... +*****************************************************************/ void science_help_callback(GtkWidget *w, gint row, gint column) { char *s; gtk_clist_get_text(GTK_CLIST(science_list), row, column, &s); - if (GTK_TOGGLE_BUTTON(science_help_toggle)->active) - { - if (*s != '\0') - popup_help_dialog_typed(s, HELP_TECH); - else - popup_help_dialog_string(HELP_TECHS_ITEM); - } + if (*s != '\0') + popup_help_dialog_typed(s, HELP_TECH); + else + popup_help_dialog_string(HELP_TECHS_ITEM); } /**************************************************************** @@ -349,6 +360,8 @@ *****************************************************************/ void science_dialog_update(void) { + int turns_per, turns_left; + if(science_dialog_shell) { char text[512]; int i, j, hist, n; @@ -391,9 +404,17 @@ gtk_widget_destroy(popupmenu); popupmenu = gtk_menu_new(); - my_snprintf(text, sizeof(text), "%d/%d", + turns_per = tech_turns_per_research (game.player_ptr); + turns_left = tech_turns_left (game.player_ptr); + + my_snprintf(text, sizeof(text), _("%d/%d Research every %d %s, %d %s left"), game.player_ptr->research.researched, - research_time(game.player_ptr)); + research_time(game.player_ptr), + turns_per, + turns_per == 1 ? _("turn") : _("turns"), + turns_left, + turns_left == 1 ?_("turn") : _("turns")); + gtk_set_label(science_current_label,text); hist=0; @@ -452,6 +473,7 @@ hist=j; item = gtk_menu_item_new_with_label(advances[i].name); + gtk_widget_set_name(item, advances[i].name); gtk_menu_append(GTK_MENU(goalmenu), item); gtk_signal_connect(GTK_OBJECT(item), "activate", diff -u -X/home/dzinsli/source/freeciv-patches/no.freeciv -r /home/dzinsli/source/freeciv-cvs/client/include/helpdlg_g.h /home/dzinsli/source/freeciv/client/include/helpdlg_g.h --- /home/dzinsli/source/freeciv-cvs/client/include/helpdlg_g.h Mon Dec 27 15:09:02 1999 +++ /home/dzinsli/source/freeciv/client/include/helpdlg_g.h Sat Jan 29 20:56:42 2000 @@ -20,6 +20,7 @@ void popup_help_dialog(int item); void popup_help_dialog_string(char *item); void popup_help_dialog_typed(char *item, enum help_page_type); +int popup_help_dialog_active(); void popdown_help_dialog(void); #define HELP_PLAYING_ITEM "Strategy and tactics" diff -u -X/home/dzinsli/source/freeciv-patches/no.freeciv -r /home/dzinsli/source/freeciv-cvs/common/tech.c /home/dzinsli/source/freeciv/common/tech.c --- /home/dzinsli/source/freeciv-cvs/common/tech.c Wed Jan 12 19:08:09 2000 +++ /home/dzinsli/source/freeciv/common/tech.c Sat Jan 29 20:54:09 2000 @@ -213,3 +213,39 @@ return A_LAST; } +/************************************************************************** + Returns turns per research +**************************************************************************/ +int tech_turns_per_research ( struct player *pplayer) { + + double res = 0; + + city_list_iterate(pplayer->cities, pcity) { + res += pcity->science_total; + } city_list_iterate_end; + + if (res <= 0) + return 999; + + return ((research_time(pplayer) + res - 1) / res); + +} + +/************************************************************************** +returns the number of turns to finish currently researched tech. +**************************************************************************/ +int tech_turns_left(struct player *plr) +{ + int bulbs_left = research_time(plr) - + plr->research.researched; + int science = 0; + + city_list_iterate(plr->cities, pcity) { + science += pcity->science_total; + } city_list_iterate_end; + + if (science <= 0) + return 999; + + return bulbs_left / science + (bulbs_left % science ? 1 : 0); +} diff -u -X/home/dzinsli/source/freeciv-patches/no.freeciv -r /home/dzinsli/source/freeciv-cvs/common/tech.h /home/dzinsli/source/freeciv/common/tech.h --- /home/dzinsli/source/freeciv-cvs/common/tech.h Wed Jan 12 19:08:09 2000 +++ /home/dzinsli/source/freeciv/common/tech.h Sat Jan 29 21:16:38 2000 @@ -71,6 +71,7 @@ void set_invention(struct player *plr, int tech, int value); void update_research(struct player *plr); int tech_goal_turns(struct player *plr, int goal); +int tech_turns_left(struct player *plr); int get_next_tech(struct player *plr, int goal); int tech_exists(Tech_Type_id id); @@ -80,7 +81,7 @@ enum tech_flag_id tech_flag_from_str(char *s); int find_tech_by_flag( int index, int flag ); - +int tech_turns_per_research ( struct player *pplayer); extern struct advance advances[]; #endif /* FC__TECH_H */