diff --git a/bygfoot.glade b/bygfoot.glade index 168244c8..c4dbd6ee 100644 --- a/bygfoot.glade +++ b/bygfoot.glade @@ -64,7 +64,7 @@ - + True gtk-open 1 @@ -132,7 +132,7 @@ - + True gtk-preferences 1 @@ -643,6 +643,22 @@ + + + True + + + + + + True + Show history + True + + + + + True @@ -658,7 +674,7 @@ - + True gtk-go-forward 1 @@ -680,7 +696,7 @@ - + True gtk-go-back 1 @@ -702,7 +718,7 @@ - + True gtk-justify-fill 1 diff --git a/src/Makefile.am b/src/Makefile.am index 2d769a2d..1e6de6da 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -10,17 +10,17 @@ bin_PROGRAMS = bygfoot bygfoot_SOURCES = \ callback_func.c callback_func.h callbacks.h cup.h finance.h fixture.h game_gui.h league.h live_game.h maths.h misc.h option.h player.h start_end.h team.h transfer.h treeview.h user.h window.h \ - callbacks.c callbacks.h callback_func.h free.h game_gui.h gui.h load_save.h main.h option.h player.h team.h transfer.h treeview.h user.h window.h \ + callbacks.c callbacks.h callback_func.h free.h game_gui.h gui.h load_save.h main.h option.h player.h team.h transfer.h treeview.h treeview_helper.h user.h window.h \ cup.c cup.h fixture.h free.h league.h main.h maths.h misc.h team.h variables.h xml_league.h \ file.c file.h free.h main.h misc.h option.h support.h variables.h \ finance.c callbacks.h finance.h game_gui.h maths.h option.h player.h team.h user.h \ - fixture.c cup.h fixture.h free.h league.h main.h maths.h misc.h table.h team.h variables.h \ + fixture.c cup.h fixture.h free.h league.h main.h maths.h misc.h option.h user.h table.h team.h variables.h \ free.c free.h user.h variables.h \ game.c cup.h finance.h fixture.h game.h game_gui.h league.h live_game.h maths.h misc.h option.h player.h table.h team.h treeview.h user.h variables.h \ game_gui.c file.h callbacks.h file.h game_gui.h gui.h league.h live_game.h maths.h misc.h option.h treeview.h support.h team.h user.h variables.h window.h \ gui.c gui.h misc.h support.h variables.h window.h \ interface.c callbacks.h interface.h support.h \ - league.c cup.h league.h maths.h option.h player.h table.h team.h variables.h \ + league.c cup.h league.h maths.h option.h player.h user.h table.h team.h variables.h \ live_game.c fixture.h free.h game.h game_gui.h live_game.h maths.h misc_callback_func.h option.h player.h support.h team.h treeview.h user.h variables.h window.h \ load_save.c callbacks.h file.h game_gui.h gui.h load_save.h option.h support.h user.h variables.h xml_loadsave_misc.h xml_loadsave_cup.h xml_loadsave_league.h xml_loadsave_transfers.h xml_loadsave_users.h xml.h \ main.c cup_struct.h misc_callbacks.h file.h free.h league_struct.h live_game.h main.h transfer_struct.h variables.h window.h \ @@ -42,9 +42,9 @@ bygfoot_SOURCES = \ table.c cup.h league.h table.h variables.h \ team.c cup.h fixture.h game.h game_gui.h league.h maths.h misc.h option.h player.h team.h transfer.h user.h \ transfer.c finance.h free.h game_gui.h maths.h option.h player.h support.h team.h transfer.h treeview.h user.h \ - treeview.c cup.h file.h finance.h fixture.h free.h game.h league.h live_game.h maths.h misc.h player.h option.h support.h team.h transfer.h treeview.h treeview_cell.h user.h \ - treeview_cell.c cup.h league.h misc.h option.h player.h team.h treeview.h treeview_cell.h user.h variables.h \ - user.c fixture.h free.h game_gui.h live_game.h maths.h misc.h option.h player.h team.h transfer.h treeview.h user.h window.h \ + treeview.c cup.h finance.h fixture.h free.h game.h league.h live_game.h maths.h misc.h player.h option.h support.h team.h transfer.h treeview.h treeview_helper.h user.h \ + treeview_helper.c cup.h file.h fixture.h free.h league.h misc.h option.h player.h support.h team.h treeview.h treeview_helper.h user.h variables.h \ + user.c cup.h fixture.h free.h game_gui.h league.h live_game.h maths.h misc.h option.h player.h team.h transfer.h treeview.h user.h window.h \ window.c file.h finance.h free.h game_gui.h gui.h interface.h main.h misc_interface.h misc2_interface.h option.h support.h user.h window.h \ xml.c cup.h file.h free.h gui.h league.h misc.h support.h table.h transfer_struct.h user.h variables.h xml.h xml_loadsave_cup.h xml_loadsave_league.h xml_loadsave_teams.h xml_loadsave_fixtures.h xml_loadsave_table.h xml_loadsave_transfers.h xml_loadsave_users.h \ xml_loadsave_misc.c cup.h file.h misc.h variables.h xml.h xml_loadsave_misc.h xml_loadsave_cup.h xml_loadsave_league.h \ diff --git a/src/callback_func.c b/src/callback_func.c index c38d3598..0f40b846 100644 --- a/src/callback_func.c +++ b/src/callback_func.c @@ -14,6 +14,7 @@ #include "team.h" #include "transfer.h" #include "treeview.h" +#include "treeview_helper.h" #include "user.h" #include "window.h" @@ -349,7 +350,7 @@ callback_show_team(gint type) if(type == SHOW_CURRENT) { - tm = (const Team*)treeview_get_pointer(treeview_right, 2); + tm = (const Team*)treeview_helper_get_pointer(treeview_right, 2); stat1 = team_get_index(tm); } else if(type == SHOW_NEXT) diff --git a/src/callbacks.c b/src/callbacks.c index d0dd033a..64c9f72f 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -10,6 +10,7 @@ #include "team.h" #include "transfer.h" #include "treeview.h" +#include "treeview_helper.h" #include "user.h" #include "window.h" @@ -179,8 +180,8 @@ on_player_list1_button_press_event (GtkWidget *widget, return TRUE; } - if(treeview_select_row(GTK_TREE_VIEW(widget), event)) - idx = treeview_get_index(GTK_TREE_VIEW(widget), 0); + if(treeview_helper_select_row(GTK_TREE_VIEW(widget), event)) + idx = treeview_helper_get_index(GTK_TREE_VIEW(widget), 0); if(idx < 0 || idx - 1 == selected_row[0]) { @@ -461,8 +462,8 @@ on_treeview_right_button_press_event (GtkWidget *widget, GTK_SELECTION_NONE) return TRUE; - if(treeview_select_row(GTK_TREE_VIEW(widget), event)) - idx = treeview_get_index(GTK_TREE_VIEW(widget), 0); + if(treeview_helper_select_row(GTK_TREE_VIEW(widget), event)) + idx = treeview_helper_get_index(GTK_TREE_VIEW(widget), 0); else return TRUE; @@ -784,3 +785,13 @@ on_menu_load_last_save_activate (GtkMenuItem *menuitem, { load_save_load_game("last_save"); } + +void +on_menu_user_show_history_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + stat0 = STATUS_SHOW_USER_HISTORY; + treeview_show_user_history(); + + gui_set_arrows(); +} diff --git a/src/callbacks.h b/src/callbacks.h index 918738d1..8fb38d04 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -236,7 +236,6 @@ on_player_menu_show_info_activate (GtkMenuItem *menuitem, void on_menu_rearrange_team_activate (GtkMenuItem *menuitem, gpointer user_data); -#endif void on_menu_load_last_save_activate (GtkMenuItem *menuitem, @@ -245,3 +244,8 @@ on_menu_load_last_save_activate (GtkMenuItem *menuitem, void on_menu_fixtures_week_activate (GtkMenuItem *menuitem, gpointer user_data); + +void +on_menu_user_show_history_activate (GtkMenuItem *menuitem, + gpointer user_data); +#endif diff --git a/src/cup.c b/src/cup.c index 90515126..e1325dd5 100644 --- a/src/cup.c +++ b/src/cup.c @@ -666,19 +666,11 @@ cup_round_name(const Fixture *fix, gchar *buf) const CupRound *cup_round = &g_array_index(cup->rounds, CupRound, fix->round); - if(cup_round->round_robin_number_of_groups > 0) + cup_get_round_name(cup, fix->round, buf); + + if(cup_round->round_robin_number_of_groups == 0) strcpy(buf, "Round robin"); - else - { - if(fix->round == cup->rounds->len - 1) - strcpy(buf, _("Final")); - else if(fix->round == cup->rounds->len - 2) - strcpy(buf, _("Semi-final")); - else if(fix->round == cup->rounds->len - 3) - strcpy(buf, _("Quarter-final")); - else - sprintf(buf, _("Last %d"), (gint)rint(powf(2, cup->rounds->len - fix->round))); - + { if(cup_round->home_away) { if(fix->second_leg) @@ -691,6 +683,37 @@ cup_round_name(const Fixture *fix, gchar *buf) } } +/** Return the cup round given by the number. */ +void +cup_get_round_name(const Cup *cup, gint round, gchar *buf) +{ + const CupRound *cup_round = + &g_array_index(cup->rounds, CupRound, round); + + if(cup_round->round_robin_number_of_groups > 0) + { + strcpy(buf, _("Round robin")); + return; + } + + switch(cup->rounds->len - round) + { + default: + sprintf(buf, "Last %d", (gint)rint(powf(2, cup->rounds->len - round))); + break; + case 1: + strcpy(buf, _("Final")); + break; + case 2: + strcpy(buf, _("Semi-final")); + break; + case 3: + strcpy(buf, _("Quarter-final")); + break; + } +} + + /** Find out whether it's time to write the fixtures for the supercup. */ gboolean diff --git a/src/cup.h b/src/cup.h index 11fd20f7..87e831d3 100644 --- a/src/cup.h +++ b/src/cup.h @@ -69,4 +69,7 @@ cup_get_choose_team_league_cup(const CupChooseTeam *ct, gint cup_get_last_week_from_first(const Cup *cup, gint first_week); +void +cup_get_round_name(const Cup *cup, gint round, gchar *buf); + #endif diff --git a/src/enums.h b/src/enums.h index fc78e8b7..026f64e4 100644 --- a/src/enums.h +++ b/src/enums.h @@ -74,6 +74,7 @@ enum Status0Value STATUS_SHOW_TABLES, STATUS_SHOW_FINANCES, STATUS_SHOW_TRANSFER_LIST, + STATUS_SHOW_USER_HISTORY, STATUS_GET_LOAN, STATUS_PAY_LOAN, STATUS_SHOW_EVENT, diff --git a/src/finance.c b/src/finance.c index 8bc1addc..3b04613e 100644 --- a/src/finance.c +++ b/src/finance.c @@ -81,7 +81,7 @@ finance_update_user_weekly(User *user) _("You have to pay back your loan this week.")); if(user->counters[COUNT_USER_POSITIVE] == 0) user_event_add(user, EVENT_TYPE_WARNING, -1, -1, NULL, - _("Your bank account has to exceed your drawing credit limit next week.")); + _("Your bank account has to be above your drawing credit limit next week.")); if((user->counters[COUNT_USER_LOAN] == -1 && user->debt != 0) || (user->counters[COUNT_USER_POSITIVE] == -1 && @@ -89,6 +89,8 @@ finance_update_user_weekly(User *user) { new_team = team_get_new(tm, TRUE); user_event_add(user, EVENT_TYPE_FIRE_FINANCE, -1, -1, new_team, NULL); + user_history_add(user, USER_HISTORY_FIRE_FINANCES, tm->id, + new_team->id, new_team->clid, ""); } } diff --git a/src/fixture.c b/src/fixture.c index fc61073d..1a4610ea 100644 --- a/src/fixture.c +++ b/src/fixture.c @@ -5,6 +5,8 @@ #include "main.h" #include "maths.h" #include "misc.h" +#include "option.h" +#include "user.h" #include "table.h" #include "team.h" #include "variables.h" @@ -1090,7 +1092,11 @@ fixture_get_next_week(gint *week_number, gint *week_round_number) for(i=0;ilen;i++) { fix = fixture_get_next(lig(i).id, local_week, local_round); - if(fix->week_number > local_week && fix->week_number < *week_number) + if((fix->week_number > local_week || + (fix->week_number == local_week && fix->week_round_number > local_round)) && + (fix->week_number < *week_number || + (fix->week_number == *week_number && fix->week_round_number < *week_round_number)) && + (fix->clid == current_user.tm->clid || opt_user_int("int_opt_user_show_all_leagues"))) { *week_number = fix->week_number; *week_round_number = 1; @@ -1132,7 +1138,8 @@ fixture_get_previous_week(gint *week_number, gint *week_round_number) if((fix->week_number < local_week || (fix->week_number == local_week && fix->week_round_number < local_round)) && (fix->week_number > *week_number || - (fix->week_number == *week_number && fix->week_round_number > *week_round_number))) + (fix->week_number == *week_number && fix->week_round_number > *week_round_number)) && + (fix->clid == current_user.tm->clid || opt_user_int("int_opt_user_show_all_leagues"))) { *week_number = fix->week_number; *week_round_number = 1; diff --git a/src/free.c b/src/free.c index 4fab9c17..756d2099 100644 --- a/src/free.c +++ b/src/free.c @@ -53,6 +53,11 @@ free_user(User *user) free_event(&g_array_index(user->events, Event, i)); free_g_array(&user->events); + + for(i=0;ihistory->len;i++) + g_string_free(g_array_index(user->history, + UserHistory, i).value_string, TRUE); + free_g_array(&user->history); } /** Free a user event. */ diff --git a/src/game.c b/src/game.c index d99c43a4..365c2e4c 100644 --- a/src/game.c +++ b/src/game.c @@ -872,6 +872,7 @@ void game_post_match(Fixture *fix) { gint i; + User *user = NULL; if(query_fixture_has_tables(fix)) table_update(fix); @@ -884,6 +885,26 @@ game_post_match(Fixture *fix) else team_update_post_match(fix->teams[i], fix->clid); } + + if(fix->clid < ID_CUP_START || fixture_user_team_involved(fix) == -1) + return; + + user = &usr(fixture_user_team_involved(fix)); + + if(fix->round == cup_from_clid(fix->clid)->rounds->len - 1 && + fix == &g_array_index((league_cup_get_fixtures(fix->clid)), Fixture, + (league_cup_get_fixtures(fix->clid))->len - 1)) + { + if((Team*)fixture_winner_of(fix, FALSE) == user->tm) + user_history_add(user, USER_HISTORY_WIN_FINAL, user->team_id, fix->clid, fix->round, + fix->teams[fix->teams[0] != user->tm]->name->str); + else + user_history_add(user, USER_HISTORY_LOSE_FINAL, user->team_id, fix->clid, fix->round, + fix->teams[fix->teams[0] != user->tm]->name->str); + } + else + user_history_add(user, USER_HISTORY_REACH_CUP_ROUND, user->team_id, + fix->clid, fix->round, ""); } /** Reduce stadium capacity and safety after a stadium event. diff --git a/src/interface.c b/src/interface.c index 989595d9..4b421911 100644 --- a/src/interface.c +++ b/src/interface.c @@ -38,7 +38,7 @@ create_main_window (void) GtkWidget *menu_new; GtkWidget *menu_open; GtkWidget *menu_load_last_save; - GtkWidget *image289; + GtkWidget *image293; GtkWidget *menu_save; GtkWidget *menu_save_as; GtkWidget *trennlinie1; @@ -46,7 +46,7 @@ create_main_window (void) GtkWidget *menu_options; GtkWidget *menu_options_menu; GtkWidget *menu_preferences; - GtkWidget *image290; + GtkWidget *image294; GtkWidget *trennlinie7; GtkWidget *menu_job_offers; GtkWidget *menu_live_game; @@ -108,13 +108,15 @@ create_main_window (void) GtkWidget *menu_user_menu; GtkWidget *menu_user_show_last_match; GtkWidget *menu_user_show_last_stats; + GtkWidget *trennlinie12; + GtkWidget *menu_user_show_history; GtkWidget *trennlinie9; GtkWidget *menu_next_user; - GtkWidget *image291; + GtkWidget *image295; GtkWidget *menu_previous_user; - GtkWidget *image292; + GtkWidget *image296; GtkWidget *menu_manage_users; - GtkWidget *image293; + GtkWidget *image297; GtkWidget *menu_finances_stadium; GtkWidget *menu_finances_stadium_menu; GtkWidget *menu_show_finances; @@ -244,9 +246,9 @@ create_main_window (void) GDK_l, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE); - image289 = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_MENU); - gtk_widget_show (image289); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_load_last_save), image289); + image293 = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_MENU); + gtk_widget_show (image293); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_load_last_save), image293); menu_save = gtk_image_menu_item_new_from_stock ("gtk-save", accel_group); gtk_widget_show (menu_save); @@ -279,9 +281,9 @@ create_main_window (void) GDK_p, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); - image290 = gtk_image_new_from_stock ("gtk-preferences", GTK_ICON_SIZE_MENU); - gtk_widget_show (image290); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_preferences), image290); + image294 = gtk_image_new_from_stock ("gtk-preferences", GTK_ICON_SIZE_MENU); + gtk_widget_show (image294); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_preferences), image294); trennlinie7 = gtk_menu_item_new (); gtk_widget_show (trennlinie7); @@ -557,6 +559,18 @@ create_main_window (void) GDK_F2, 0, GTK_ACCEL_VISIBLE); + trennlinie12 = gtk_menu_item_new (); + gtk_widget_show (trennlinie12); + gtk_container_add (GTK_CONTAINER (menu_user_menu), trennlinie12); + gtk_widget_set_sensitive (trennlinie12, FALSE); + + menu_user_show_history = gtk_menu_item_new_with_mnemonic (_("Show history")); + gtk_widget_show (menu_user_show_history); + gtk_container_add (GTK_CONTAINER (menu_user_menu), menu_user_show_history); + gtk_widget_add_accelerator (menu_user_show_history, "activate", accel_group, + GDK_h, GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE); + trennlinie9 = gtk_menu_item_new (); gtk_widget_show (trennlinie9); gtk_container_add (GTK_CONTAINER (menu_user_menu), trennlinie9); @@ -569,9 +583,9 @@ create_main_window (void) GDK_F9, 0, GTK_ACCEL_VISIBLE); - image291 = gtk_image_new_from_stock ("gtk-go-forward", GTK_ICON_SIZE_MENU); - gtk_widget_show (image291); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_next_user), image291); + image295 = gtk_image_new_from_stock ("gtk-go-forward", GTK_ICON_SIZE_MENU); + gtk_widget_show (image295); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_next_user), image295); menu_previous_user = gtk_image_menu_item_new_with_mnemonic (_("Previous user")); gtk_widget_show (menu_previous_user); @@ -580,9 +594,9 @@ create_main_window (void) GDK_F8, 0, GTK_ACCEL_VISIBLE); - image292 = gtk_image_new_from_stock ("gtk-go-back", GTK_ICON_SIZE_MENU); - gtk_widget_show (image292); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_previous_user), image292); + image296 = gtk_image_new_from_stock ("gtk-go-back", GTK_ICON_SIZE_MENU); + gtk_widget_show (image296); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_previous_user), image296); menu_manage_users = gtk_image_menu_item_new_with_mnemonic (_("Manage users")); gtk_widget_show (menu_manage_users); @@ -591,9 +605,9 @@ create_main_window (void) GDK_F12, 0, GTK_ACCEL_VISIBLE); - image293 = gtk_image_new_from_stock ("gtk-justify-fill", GTK_ICON_SIZE_MENU); - gtk_widget_show (image293); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_manage_users), image293); + image297 = gtk_image_new_from_stock ("gtk-justify-fill", GTK_ICON_SIZE_MENU); + gtk_widget_show (image297); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_manage_users), image297); menu_finances_stadium = gtk_menu_item_new_with_mnemonic (_("FinStad")); gtk_widget_show (menu_finances_stadium); @@ -1154,6 +1168,9 @@ create_main_window (void) g_signal_connect ((gpointer) menu_user_show_last_stats, "activate", G_CALLBACK (on_menu_user_show_last_stats_activate), NULL); + g_signal_connect ((gpointer) menu_user_show_history, "activate", + G_CALLBACK (on_menu_user_show_history_activate), + NULL); g_signal_connect ((gpointer) menu_next_user, "activate", G_CALLBACK (on_menu_next_user_activate), NULL); @@ -1233,7 +1250,7 @@ create_main_window (void) GLADE_HOOKUP_OBJECT (main_window, menu_new, "menu_new"); GLADE_HOOKUP_OBJECT (main_window, menu_open, "menu_open"); GLADE_HOOKUP_OBJECT (main_window, menu_load_last_save, "menu_load_last_save"); - GLADE_HOOKUP_OBJECT (main_window, image289, "image289"); + GLADE_HOOKUP_OBJECT (main_window, image293, "image293"); GLADE_HOOKUP_OBJECT (main_window, menu_save, "menu_save"); GLADE_HOOKUP_OBJECT (main_window, menu_save_as, "menu_save_as"); GLADE_HOOKUP_OBJECT (main_window, trennlinie1, "trennlinie1"); @@ -1241,7 +1258,7 @@ create_main_window (void) GLADE_HOOKUP_OBJECT (main_window, menu_options, "menu_options"); GLADE_HOOKUP_OBJECT (main_window, menu_options_menu, "menu_options_menu"); GLADE_HOOKUP_OBJECT (main_window, menu_preferences, "menu_preferences"); - GLADE_HOOKUP_OBJECT (main_window, image290, "image290"); + GLADE_HOOKUP_OBJECT (main_window, image294, "image294"); GLADE_HOOKUP_OBJECT (main_window, trennlinie7, "trennlinie7"); GLADE_HOOKUP_OBJECT (main_window, menu_job_offers, "menu_job_offers"); GLADE_HOOKUP_OBJECT (main_window, menu_live_game, "menu_live_game"); @@ -1299,13 +1316,15 @@ create_main_window (void) GLADE_HOOKUP_OBJECT (main_window, menu_user_menu, "menu_user_menu"); GLADE_HOOKUP_OBJECT (main_window, menu_user_show_last_match, "menu_user_show_last_match"); GLADE_HOOKUP_OBJECT (main_window, menu_user_show_last_stats, "menu_user_show_last_stats"); + GLADE_HOOKUP_OBJECT (main_window, trennlinie12, "trennlinie12"); + GLADE_HOOKUP_OBJECT (main_window, menu_user_show_history, "menu_user_show_history"); GLADE_HOOKUP_OBJECT (main_window, trennlinie9, "trennlinie9"); GLADE_HOOKUP_OBJECT (main_window, menu_next_user, "menu_next_user"); - GLADE_HOOKUP_OBJECT (main_window, image291, "image291"); + GLADE_HOOKUP_OBJECT (main_window, image295, "image295"); GLADE_HOOKUP_OBJECT (main_window, menu_previous_user, "menu_previous_user"); - GLADE_HOOKUP_OBJECT (main_window, image292, "image292"); + GLADE_HOOKUP_OBJECT (main_window, image296, "image296"); GLADE_HOOKUP_OBJECT (main_window, menu_manage_users, "menu_manage_users"); - GLADE_HOOKUP_OBJECT (main_window, image293, "image293"); + GLADE_HOOKUP_OBJECT (main_window, image297, "image297"); GLADE_HOOKUP_OBJECT (main_window, menu_finances_stadium, "menu_finances_stadium"); GLADE_HOOKUP_OBJECT (main_window, menu_finances_stadium_menu, "menu_finances_stadium_menu"); GLADE_HOOKUP_OBJECT (main_window, menu_show_finances, "menu_show_finances"); diff --git a/src/league.c b/src/league.c index 2e253998..2cf1381d 100644 --- a/src/league.c +++ b/src/league.c @@ -3,6 +3,7 @@ #include "maths.h" #include "option.h" #include "player.h" +#include "user.h" #include "table.h" #include "team.h" #include "variables.h" @@ -304,6 +305,18 @@ league_get_team_movements(League *league, GArray *team_movements) new_move.league_idx = league_index_from_sid(g_array_index(elements, PromRelElement, i).dest_sid->str); g_array_append_val(team_movements, new_move); + + if(team_is_user(g_array_index(league->table.elements, TableElement, j - 1).team) != -1) + { + if(g_array_index(elements, PromRelElement, i).type == PROM_REL_PROMOTION) + user_history_add(&usr(team_is_user( + g_array_index(league->table.elements, TableElement, j - 1).team)), + USER_HISTORY_PROMOTED, new_move.tm.id, lig(new_move.league_idx).id, -1, ""); + else + user_history_add(&usr(team_is_user( + g_array_index(league->table.elements, TableElement, j - 1).team)), + USER_HISTORY_RELEGATED, new_move.tm.id, lig(new_move.league_idx).id, -1, ""); + } } } @@ -341,6 +354,11 @@ league_get_team_movements(League *league, GArray *team_movements) new_move.tm = *((Team*)g_ptr_array_index(prom_games_teams, i)); new_move.league_idx = dest_idx; g_array_append_val(team_movements, new_move); + + if(team_is_user((Team*)g_ptr_array_index(prom_games_teams, i)) != -1) + user_history_add(&usr(team_is_user( + (Team*)g_ptr_array_index(prom_games_teams, i))), + USER_HISTORY_PROMOTED, new_move.tm.id, lig(dest_idx).id, -1, ""); } if(strlen(league->prom_rel.prom_games_loser_sid->str) > 0) @@ -352,6 +370,11 @@ league_get_team_movements(League *league, GArray *team_movements) new_move.tm = *((Team*)g_ptr_array_index(prom_games_teams, i)); new_move.league_idx = dest_idx; g_array_append_val(team_movements, new_move); + + if(team_is_user((Team*)g_ptr_array_index(prom_games_teams, i)) != -1) + user_history_add(&usr(team_is_user( + (Team*)g_ptr_array_index(prom_games_teams, i))), + USER_HISTORY_RELEGATED, new_move.tm.id, lig(dest_idx).id, -1, ""); } } @@ -386,7 +409,6 @@ league_season_start(League *league) g_array_index(league->table.elements, TableElement, i).values[j] = 0; } - /*todo: make teams better if user champion?*/ for(i=0;iteams->len;i++) { team_change_factor = diff --git a/src/league.h b/src/league.h index 009dec31..2bfc49c4 100644 --- a/src/league.h +++ b/src/league.h @@ -5,10 +5,10 @@ #include "league_struct.h" #include "fixture_struct.h" -#define league_cup_get_teams(clid) (clid < ID_CUP_START) ? league_from_clid(clid)->teams : cup_from_clid(clid)->teams -#define league_cup_get_fixtures(clid) (clid < ID_CUP_START) ? league_from_clid(clid)->fixtures : cup_from_clid(clid)->fixtures +#define league_cup_get_teams(clid) (clid < ID_CUP_START) ? (league_from_clid(clid)->teams) : (cup_from_clid(clid)->teams) +#define league_cup_get_fixtures(clid) (clid < ID_CUP_START) ? (league_from_clid(clid)->fixtures) : (cup_from_clid(clid)->fixtures) #define league_cup_get_name_string(clid) (clid < ID_CUP_START) ? league_from_clid(clid)->name->str : cup_from_clid(clid)->name->str -#define league_cup_get_yellow_red(clid) (clid < ID_CUP_START) ? league_from_clid(clid)->yellow_red : cup_from_clid(clid)->yellow_red +#define league_cup_get_yellow_red(clid) (clid < ID_CUP_START) ? (league_from_clid(clid)->yellow_red) : (cup_from_clid(clid)->yellow_red) #define league_has_prom_games(league) (strlen(league->prom_rel.prom_games_dest_sid->str) > 0) diff --git a/src/main.c b/src/main.c index ef80b659..0907fe6a 100644 --- a/src/main.c +++ b/src/main.c @@ -28,6 +28,8 @@ main_init_variables(void) transfer_list = NULL; player_names = NULL; + season = week = week_round = 1; + for(i=0;i 0) g_string_printf(new_user.name, "%s", user_name); @@ -160,6 +161,8 @@ misc2_callback_add_user(void) new_user.tm = tm; new_user.team_id = tm->id; + user_history_add(&new_user, USER_HISTORY_START_GAME, tm->id, tm->clid, -1, ""); + g_array_append_val(users, new_user); user_set_up_team(&usr(users->len - 1)); diff --git a/src/misc2_callbacks.c b/src/misc2_callbacks.c index 0cf6f640..914b9917 100644 --- a/src/misc2_callbacks.c +++ b/src/misc2_callbacks.c @@ -10,6 +10,7 @@ #include "support.h" #include "transfer.h" #include "treeview.h" +#include "treeview_helper.h" #include "user.h" #include "window.h" @@ -237,10 +238,10 @@ on_treeview_user_management_users_button_press_event gchar buf[SMALL]; gint idx = -1; - if(!treeview_select_row(GTK_TREE_VIEW(widget), event)) + if(!treeview_helper_select_row(GTK_TREE_VIEW(widget), event)) return TRUE; - idx = treeview_get_index(GTK_TREE_VIEW(widget), 0) - 1; + idx = treeview_helper_get_index(GTK_TREE_VIEW(widget), 0) - 1; if(users->len == 1) { diff --git a/src/misc_callback_func.c b/src/misc_callback_func.c index a94415b9..d3a1d878 100644 --- a/src/misc_callback_func.c +++ b/src/misc_callback_func.c @@ -10,6 +10,7 @@ #include "start_end.h" #include "support.h" #include "treeview.h" +#include "treeview_helper.h" #include "user.h" #include "variables.h" #include "window.h" @@ -65,7 +66,7 @@ misc_callback_add_player(void) GTK_ENTRY(lookup_widget(window.startup, "entry_player_name")); const gchar *player_name = gtk_entry_get_text(entry_player_name); User new_user = user_new(); - Team *tm = (Team*)treeview_get_pointer(treeview_startup, 2); + Team *tm = (Team*)treeview_helper_get_pointer(treeview_startup, 2); if(strlen(player_name) > 0) g_string_printf(new_user.name, "%s", player_name); @@ -82,6 +83,8 @@ misc_callback_add_player(void) new_user.tm = tm; new_user.team_id = tm->id; + user_history_add(&new_user, USER_HISTORY_START_GAME, tm->id, tm->clid, -1, ""); + g_array_append_val(users, new_user); treeview_show_users(treeview_users); @@ -105,10 +108,10 @@ misc_callback_remove_user(GdkEventButton *event) GtkTreeView *treeview_startup = GTK_TREE_VIEW(lookup_widget(window.startup, "treeview_startup")); - if(!treeview_select_row(treeview_users, event)) + if(!treeview_helper_select_row(treeview_users, event)) return; - user_remove(treeview_get_index(treeview_users, 0) - 1, FALSE); + user_remove(treeview_helper_get_index(treeview_users, 0) - 1, FALSE); treeview_show_users(treeview_users); treeview_show_team_list(treeview_startup, FALSE, FALSE); diff --git a/src/treeview.c b/src/treeview.c index f11011fd..a368111a 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -1,5 +1,4 @@ #include "cup.h" -#include "file.h" #include "finance.h" #include "fixture.h" #include "free.h" @@ -14,275 +13,9 @@ #include "team.h" #include "transfer.h" #include "treeview.h" -#include "treeview_cell.h" +#include "treeview_helper.h" #include "user.h" -/** Select the row that's been clicked on. */ -gboolean -treeview_select_row(GtkTreeView *treeview, GdkEventButton *event) -{ - GtkTreeSelection *selection = - gtk_tree_view_get_selection(treeview); - GtkTreePath *path; - - if(!gtk_tree_view_get_path_at_pos(treeview, - event->x, event->y, - &path, NULL, NULL, NULL)) - return FALSE; - - gtk_tree_selection_select_path(selection, path); - gtk_tree_path_free(path); - - return TRUE; -} - -/** Return the number in the 'column'th column of the currently - selected row of the treeview. - @param treeview The treeview argument. - @param column The column we'd like to get the contents of. - @return The number in the given column of the selected row. -*/ -gint -treeview_get_index(GtkTreeView *treeview, gint column) -{ - gint value; - GtkTreeSelection *selection = - gtk_tree_view_get_selection(treeview); - GtkTreeModel *model; - GtkTreeIter iter; - - gtk_tree_selection_get_selected(selection, &model, &iter); - - gtk_tree_model_get(model, &iter, column, - &value, -1); - - return value; -} - -/** Return the pointer in the 'column'th column of the currently - selected row of the treeview. - @param treeview The treeview argument. - @param column The column we'd like to get the content of. - @return The pointer in the given column of the selected row. -*/ -/*d*/ -gpointer -treeview_get_pointer(GtkTreeView *treeview, gint column) -{ - gpointer ptr; - GtkTreeSelection *selection = - gtk_tree_view_get_selection(treeview); - GtkTreeModel *model; - GtkTreeIter iter; - - gtk_tree_selection_get_selected(selection, &model, &iter); - - gtk_tree_model_get(model, &iter, column, - &ptr, -1); - - return ptr; -} - -/** - * Removes all columns from a GTK treeview. I didn't find a better way - * to completely clear a treeview :-/. - * @param treeview The pointer to the treeview widget we'd like to clear. - */ -void -treeview_clear(GtkTreeView *treeview) -{ - gint i; - gint number_of_columns; - GtkTreeView *list = (treeview == NULL) ? - GTK_TREE_VIEW(lookup_widget(window.main, "player_info")) : - treeview; - - gtk_tree_view_set_model(GTK_TREE_VIEW(list), - NULL); - - number_of_columns = 0; - while(gtk_tree_view_get_column(GTK_TREE_VIEW(list), - number_of_columns) != NULL) - number_of_columns++; - - for(i = number_of_columns - 1; i >= 0; i--) - gtk_tree_view_remove_column( - GTK_TREE_VIEW(list), - gtk_tree_view_get_column(GTK_TREE_VIEW(list), - i)); -} - -/** Return number of given column or -1 if not found or on error. - @param col The column pointer. - @return The index of the column within the treeview. */ -gint -treeview_get_col_number_column (GtkTreeViewColumn *col) -{ - GList *cols; - gint num; - - g_return_val_if_fail ( col != NULL, -1 ); - g_return_val_if_fail ( col->tree_view != NULL, -1 ); - - cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(col->tree_view)); - num = g_list_index(cols, (gpointer) col); - g_list_free(cols); - - return num; -} - -/** Return the row index of the iter in the model. - Since we only work with flat models (no children), - the path is a single number. */ -gint -treeview_iter_get_row(GtkTreeModel *model, GtkTreeIter *iter) -{ - gchar *path = gtk_tree_model_get_string_from_iter(model, iter); - gint row_idx = (gint)g_ascii_strtod(path, NULL); - - g_free(path); - - return row_idx; -} - -/** Return a cell renderer with font name set - according to the font option. */ -GtkCellRenderer* -treeview_cell_renderer_text_new(void) -{ - GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); - - if(strlen(opt_str("string_opt_font_name")) > 0) - g_object_set(renderer, "font", opt_str("string_opt_font_name"), NULL); - - return renderer; -} - -/** Return the filename of the icon going with the LiveGameEvent - with type event_type. - @param event_type The type of the event. - @return A filename specifying a pixmap. */ -gchar* -treeview_live_game_icon(gint event_type) -{ - if(event_type == LIVE_GAME_EVENT_START_MATCH || - event_type == LIVE_GAME_EVENT_END_MATCH || - event_type == LIVE_GAME_EVENT_HALF_TIME || - event_type == LIVE_GAME_EVENT_EXTRA_TIME || - event_type == LIVE_GAME_EVENT_PENALTIES) - return const_str("string_live_game_event_start_match_icon"); - else if(event_type == LIVE_GAME_EVENT_LOST_POSSESSION) - return const_str("string_live_game_event_lost_possession_icon"); - else if(event_type == LIVE_GAME_EVENT_PENALTY) - return const_str("string_live_game_event_penalty_icon"); - else if(event_type == LIVE_GAME_EVENT_SCORING_CHANCE || - event_type == LIVE_GAME_EVENT_FREE_KICK) - return const_str("string_live_game_event_scoring_chance_icon"); - else if(event_type == LIVE_GAME_EVENT_GOAL) - return const_str("string_live_game_event_goal_icon"); - else if(event_type == LIVE_GAME_EVENT_OWN_GOAL) - return const_str("string_live_game_event_own_goal_icon"); - else if(event_type == LIVE_GAME_EVENT_POST || - event_type == LIVE_GAME_EVENT_CROSS_BAR) - return const_str("string_live_game_event_post_icon"); - else if(event_type == LIVE_GAME_EVENT_SAVE) - return const_str("string_live_game_event_save_icon"); - else if(event_type == LIVE_GAME_EVENT_MISSED) - return const_str("string_live_game_event_missed_icon"); - else if(event_type == LIVE_GAME_EVENT_FOUL) - return const_str("string_live_game_event_foul_icon"); - else if(event_type == LIVE_GAME_EVENT_FOUL_YELLOW) - return const_str("string_live_game_event_foul_yellow_icon"); - else if(event_type == LIVE_GAME_EVENT_SEND_OFF) - return const_str("string_live_game_event_send_off_icon"); - else if(event_type == LIVE_GAME_EVENT_INJURY) - return const_str("string_live_game_event_injury_icon"); - else if(event_type == LIVE_GAME_EVENT_TEMP_INJURY) - return const_str("string_live_game_event_temp_injury_icon"); - else if(event_type == LIVE_GAME_EVENT_STADIUM_BREAKDOWN) - return const_str("string_live_game_event_stadium_breakdown_icon"); - else if(event_type == LIVE_GAME_EVENT_STADIUM_FIRE) - return const_str("string_live_game_event_stadium_fire_icon"); - else if(event_type == LIVE_GAME_EVENT_STADIUM_RIOTS) - return const_str("string_live_game_event_stadium_riots_icon"); - else if(event_type == LIVE_GAME_EVENT_SUBSTITUTION) - return const_str("string_live_game_event_substitution_icon"); - else if(event_type == LIVE_GAME_EVENT_STRUCTURE_CHANGE) - return const_str("string_live_game_event_structure_change_icon"); - else if(event_type == LIVE_GAME_EVENT_STYLE_CHANGE_ALL_OUT_DEFEND) - return const_str("string_game_gui_style_all_out_defend_icon"); - else if(event_type == LIVE_GAME_EVENT_STYLE_CHANGE_DEFEND) - return const_str("string_game_gui_style_defend_icon"); - else if(event_type == LIVE_GAME_EVENT_STYLE_CHANGE_BALANCED) - return const_str("string_game_gui_style_balanced_icon"); - else if(event_type == LIVE_GAME_EVENT_STYLE_CHANGE_ATTACK) - return const_str("string_game_gui_style_attack_icon"); - else if(event_type == LIVE_GAME_EVENT_STYLE_CHANGE_ALL_OUT_ATTACK) - return const_str("string_game_gui_style_all_out_attack_icon"); - else if(event_type == LIVE_GAME_EVENT_BOOST_CHANGE_ANTI) - return const_str("string_game_gui_boost_anti_icon"); - else if(event_type == LIVE_GAME_EVENT_BOOST_CHANGE_OFF) - return const_str("string_game_gui_boost_off_icon"); - else if(event_type == LIVE_GAME_EVENT_BOOST_CHANGE_ON) - return const_str("string_game_gui_boost_on_icon"); - else - return ""; -} - -/** Return a new pixbuf created from the specified filename. - @param filename Name of a pixmap file located in one of the support directories. - @return A new pixbuf or NULL on error. */ -GdkPixbuf* -treeview_pixbuf_from_filename(gchar *filename) -{ - GdkPixbuf *symbol = NULL; - GError *error = NULL; - gchar *symbol_file = NULL; - - if(filename != NULL && strlen(filename) != 0) - { - symbol_file = file_find_support_file(filename, FALSE); - if(symbol_file != NULL) - { - symbol = gdk_pixbuf_new_from_file(symbol_file, &error); - misc_print_error(&error, FALSE); - g_free(symbol_file); - } - } - else - symbol = NULL; - - return symbol; -} - -/** Function comparing two teams in a team list treeview. */ -gint -treeview_team_compare(GtkTreeModel *model, - GtkTreeIter *a, - GtkTreeIter *b, - gpointer user_data) -{ - gint type = GPOINTER_TO_INT(user_data); - Team *tm1, *tm2; - gint return_value = 0; - - gtk_tree_model_get(model, a, 4, &tm1, -1); - gtk_tree_model_get(model, b, 4, &tm2, -1); - - switch(type) - { - default: - g_warning("treeview_team_compare: unknown type %d.\n", type); - break; - case TEAM_COMPARE_AV_SKILL: - return_value = misc_float_compare(team_get_average_skill(tm1, FALSE), - team_get_average_skill(tm2, FALSE)); - break; - } - - return return_value; -} - /** Creates the model for the treeview in the team selection window. The model contains a list of all the teams from the leagues in @@ -310,7 +43,7 @@ treeview_create_team_selection_list(gboolean show_cup_teams, gboolean show_user_ for(i=0;ilen;i++) { - symbol = treeview_pixbuf_from_filename(lig(i).symbol->str); + symbol = treeview_helper_pixbuf_from_filename(lig(i).symbol->str); for(j=0;jlen;j++) { @@ -339,7 +72,7 @@ treeview_create_team_selection_list(gboolean show_cup_teams, gboolean show_user_ for(j=0;jlen;j++) { symbol = - treeview_pixbuf_from_filename(g_array_index(cp(i).teams, Team, j).symbol->str); + treeview_helper_pixbuf_from_filename(g_array_index(cp(i).teams, Team, j).symbol->str); gtk_list_store_append(liststore, &iter); gtk_list_store_set(liststore, &iter, @@ -354,7 +87,7 @@ treeview_create_team_selection_list(gboolean show_cup_teams, gboolean show_user_ } gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(liststore), 4, - treeview_team_compare, GINT_TO_POINTER(TEAM_COMPARE_AV_SKILL), NULL); + treeview_helper_team_compare, GINT_TO_POINTER(TEAM_COMPARE_AV_SKILL), NULL); return GTK_TREE_MODEL(liststore); } @@ -379,7 +112,7 @@ treeview_set_up_team_selection_treeview (GtkTreeView *treeview) /* Numbering the teams */ col = gtk_tree_view_column_new(); gtk_tree_view_append_column(treeview, col); - renderer = treeview_cell_renderer_text_new(); + renderer = treeview_helper_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col, renderer, TRUE); gtk_tree_view_column_add_attribute(col, renderer, "text", 0); @@ -396,16 +129,16 @@ treeview_set_up_team_selection_treeview (GtkTreeView *treeview) col = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col, _("Team")); gtk_tree_view_append_column(treeview, col); - renderer = treeview_cell_renderer_text_new(); + renderer = treeview_helper_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(col, renderer, - treeview_cell_team_selection, + treeview_helper_team_selection, NULL, NULL); /* League column */ col = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col, _("League")); gtk_tree_view_append_column(treeview, col); - renderer = treeview_cell_renderer_text_new(); + renderer = treeview_helper_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col, renderer, TRUE); gtk_tree_view_column_add_attribute(col, renderer, "text", 3); @@ -415,10 +148,10 @@ treeview_set_up_team_selection_treeview (GtkTreeView *treeview) gtk_tree_view_column_set_title(col, _("Av.Sk.")); gtk_tree_view_column_set_sort_column_id(col, 4); gtk_tree_view_append_column(treeview, col); - renderer = treeview_cell_renderer_text_new(); + renderer = treeview_helper_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(col, renderer, - treeview_cell_team_selection, + treeview_helper_team_selection, NULL, NULL); } @@ -439,7 +172,7 @@ treeview_show_team_list(GtkTreeView *treeview, gboolean show_cup_teams, treeview_create_team_selection_list(show_cup_teams, show_user_teams); GtkTreeSelection *selection; - treeview_clear(treeview); + treeview_helper_clear(treeview); treeview_set_up_team_selection_treeview(treeview); @@ -451,68 +184,6 @@ treeview_show_team_list(GtkTreeView *treeview, gboolean show_cup_teams, g_object_unref(team_list); } -/** Compare two players in a treeview. */ -gint -treeview_player_compare(GtkTreeModel *model, - GtkTreeIter *a, - GtkTreeIter *b, - gpointer user_data) -{ - gint type = GPOINTER_TO_INT(user_data); - Player *pl1, *pl2; - gint return_value = 0; - - gtk_tree_model_get(model, a, 4, &pl1, -1); - gtk_tree_model_get(model, b, 4, &pl2, -1); - - switch(type) - { - default: - g_warning("treeview_player_compare: unknown type %d.\n", type); - break; - case PLAYER_LIST_ATTRIBUTE_POS: - return_value = misc_int_compare(pl1->pos, pl2->pos); - break; - case PLAYER_LIST_ATTRIBUTE_GOALS: - if(pl1->pos == 0 && pl2->pos == 0) - return_value = misc_int_compare(player_games_goals_get(pl2, pl2->team->clid, PLAYER_VALUE_GOALS), - player_games_goals_get(pl1, pl1->team->clid, PLAYER_VALUE_GOALS)); - else if(pl1->pos == 0 || pl2->pos == 0) - return_value = (pl1->pos == 0) ? 1 : -1; - else - return_value = misc_int_compare(player_games_goals_get(pl1, pl1->team->clid, PLAYER_VALUE_GOALS), - player_games_goals_get(pl2, pl2->team->clid, PLAYER_VALUE_GOALS)); - break; - case PLAYER_LIST_ATTRIBUTE_SHOTS: - return_value = misc_int_compare(player_games_goals_get(pl1, pl1->team->clid, PLAYER_VALUE_SHOTS), - player_games_goals_get(pl2, pl2->team->clid, PLAYER_VALUE_SHOTS)); - break; - case PLAYER_LIST_ATTRIBUTE_GAMES: - return_value = misc_int_compare(player_games_goals_get(pl1, pl1->team->clid, PLAYER_VALUE_GAMES), - player_games_goals_get(pl2, pl2->team->clid, PLAYER_VALUE_GAMES)); - break; - case PLAYER_LIST_ATTRIBUTE_SKILL: - return_value = misc_float_compare(pl1->skill, pl2->skill); - break; - case PLAYER_LIST_ATTRIBUTE_AGE: - return_value = misc_float_compare(pl1->age, pl2->age); - break; - case PLAYER_LIST_ATTRIBUTE_ETAL: - return_value = misc_float_compare(pl1->etal[current_user.scout % 10], - pl2->etal[current_user.scout % 10]); - break; - case PLAYER_LIST_ATTRIBUTE_VALUE: - return_value = misc_int_compare(pl1->value, pl2->value); - break; - case PLAYER_LIST_ATTRIBUTE_WAGE: - return_value = misc_int_compare(pl1->wage, pl2->wage); - break; - } - - return return_value; - -} - /** Create the list store for a player list. @param players The array containing the players. @param attributes An array containing the attributes we show. @@ -537,7 +208,7 @@ treeview_create_player_list(GPtrArray *players, gint *attributes, gint max, gboo gtk_list_store_append(liststore, &iter); if(show_separator && i == 11) { - gtk_list_store_set(liststore, &iter, 0, const_int("int_treeview_cell_int_empty"), -1); + gtk_list_store_set(liststore, &iter, 0, const_int("int_treeview_helper_int_empty"), -1); for(j=0;jevent.type)); + treeview_helper_pixbuf_from_filename(treeview_helper_live_game_icon(unit->event.type)); sprintf(buf, "%3d.", live_game_unit_get_minute(unit)); gtk_list_store_prepend(liststore, &iter); gtk_list_store_set(liststore, &iter, 0, buf, 1, symbol, @@ -787,7 +430,7 @@ treeview_live_game_create_init_commentary(const LiveGameUnit *unit) sprintf(buf, "%3d.", unit->minute); symbol = - treeview_pixbuf_from_filename(treeview_live_game_icon(unit->event.type)); + treeview_helper_pixbuf_from_filename(treeview_helper_live_game_icon(unit->event.type)); gtk_list_store_append(liststore, &iter); gtk_list_store_set(liststore, &iter, 0, buf, 1, symbol, 2, @@ -814,7 +457,7 @@ treeview_live_game_set_up_commentary(void) col = gtk_tree_view_column_new(); gtk_tree_view_append_column(treeview, col); - renderer = treeview_cell_renderer_text_new(); + renderer = treeview_helper_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col, renderer, TRUE); gtk_tree_view_column_add_attribute(col, renderer, "text", 0); @@ -828,7 +471,7 @@ treeview_live_game_set_up_commentary(void) col = gtk_tree_view_column_new(); gtk_tree_view_append_column(treeview, col); - renderer = treeview_cell_renderer_text_new(); + renderer = treeview_helper_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col, renderer, TRUE); gtk_tree_view_column_add_attribute(col, renderer, "text", 2); @@ -843,7 +486,7 @@ treeview_live_game_show_initial_commentary(const LiveGameUnit *unit) GTK_TREE_VIEW(lookup_widget(window.live, "treeview_commentary")); GtkTreeModel *model = NULL; - treeview_clear(treeview); + treeview_helper_clear(treeview); treeview_live_game_set_up_commentary(); @@ -892,10 +535,10 @@ treeview_live_game_set_up_result(void) { col = gtk_tree_view_column_new(); gtk_tree_view_append_column(treeview, col); - renderer = treeview_cell_renderer_text_new(); + renderer = treeview_helper_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(col, renderer, - treeview_cell_live_game_result, + treeview_helper_live_game_result, NULL, NULL); } } @@ -910,7 +553,7 @@ treeview_live_game_show_result(const LiveGameUnit *unit) GTK_TREE_VIEW(lookup_widget(window.live, "treeview_result")); GtkTreeModel *model = NULL; - treeview_clear(treeview); + treeview_helper_clear(treeview); treeview_live_game_set_up_result(); @@ -982,7 +625,7 @@ treeview_set_up_users(GtkTreeView *treeview) col = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col, titles[i]); gtk_tree_view_append_column(treeview, col); - renderer = treeview_cell_renderer_text_new(); + renderer = treeview_helper_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col, renderer, (i != 3)); gtk_tree_view_column_add_attribute(col, renderer, "text", i); @@ -996,7 +639,7 @@ treeview_show_users(GtkTreeView *treeview) { GtkTreeModel *model = NULL; - treeview_clear(treeview); + treeview_helper_clear(treeview); treeview_set_up_users(treeview); model = treeview_create_users(); @@ -1031,11 +674,7 @@ treeview_create_game_stats(LiveGame *live_game) G_TYPE_STRING, G_TYPE_STRING); - /*d*/ fixture_result_to_buf(live_game->fix, buf[0]); -/* sprintf(buf[0], "%d : %d", */ -/* math_sum_int_array(live_game->fix->result[0], 3), */ -/* math_sum_int_array(live_game->fix->result[1], 3)); */ gtk_list_store_append(liststore, &iter); gtk_list_store_set(liststore, &iter, 0, live_game->fix->teams[0]->name->str, 1, buf[0], @@ -1054,13 +693,13 @@ treeview_create_game_stats(LiveGame *live_game) strcpy(buf[1], " "); if(k == LIVE_GAME_STAT_ARRAY_INJURED) sprintf(buf[0], " ", - const_str("string_treeview_cell_color_player_injury")); + const_str("string_treeview_helper_color_player_injury")); else if(k == LIVE_GAME_STAT_ARRAY_REDS) sprintf(buf[0], " ", - const_str("string_treeview_cell_color_player_banned")); + const_str("string_treeview_helper_color_player_banned")); else if(k == LIVE_GAME_STAT_ARRAY_YELLOWS) sprintf(buf[0], " ", - const_str("string_treeview_cell_color_player_yellow_danger")); + const_str("string_treeview_helper_color_player_yellow_danger")); } for(i=0;iplayers[0][k]->len, @@ -1143,7 +782,7 @@ treeview_set_up_game_stats(GtkTreeView *treeview) { col = gtk_tree_view_column_new(); gtk_tree_view_append_column(treeview, col); - renderer = treeview_cell_renderer_text_new(); + renderer = treeview_helper_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col, renderer, TRUE); gtk_tree_view_column_add_attribute(col, renderer, "markup", i); @@ -1160,7 +799,7 @@ treeview_show_game_stats(GtkTreeView *treeview, LiveGame *live_game) { GtkTreeModel *model = NULL; - treeview_clear(treeview); + treeview_helper_clear(treeview); treeview_set_up_game_stats(treeview); model = treeview_create_game_stats(live_game); @@ -1188,7 +827,7 @@ treeview_create_fixtures_header(const Fixture *fix, GtkListStore *liststore, gbo { name = league_from_clid(fix->clid)->name->str; strcpy(round_name, ""); - symbol = treeview_pixbuf_from_filename(league_from_clid(fix->clid)->symbol->str); + symbol = treeview_helper_pixbuf_from_filename(league_from_clid(fix->clid)->symbol->str); } else { @@ -1196,7 +835,7 @@ treeview_create_fixtures_header(const Fixture *fix, GtkListStore *liststore, gbo cup_round_name(fix, buf); sprintf(round_name, "\n%s", buf); strcat(buf3, "\n"); - symbol = treeview_pixbuf_from_filename(cup_from_clid(fix->clid)->symbol->str); + symbol = treeview_helper_pixbuf_from_filename(cup_from_clid(fix->clid)->symbol->str); } sprintf(buf, "%s%s", @@ -1233,7 +872,7 @@ treeview_create_fixture(const Fixture *fix, GtkListStore *liststore) if(fix->clid >= ID_CUP_START && cup_from_clid(fix->clid)->type == CUP_TYPE_INTERNATIONAL) for(i=0;i<2;i++) - symbol[i] = treeview_pixbuf_from_filename(fix->teams[i]->symbol->str); + symbol[i] = treeview_helper_pixbuf_from_filename(fix->teams[i]->symbol->str); if(fixture_user_team_involved(fix) != -1) { @@ -1250,8 +889,8 @@ treeview_create_fixture(const Fixture *fix, GtkListStore *liststore) } else { - colour_fg = const_str("string_treeview_cell_color_default_foreground"); - colour_bg = const_str("string_treeview_cell_color_default_background"); + colour_fg = const_str("string_treeview_helper_color_default_foreground"); + colour_bg = const_str("string_treeview_helper_color_default_background"); } fixture_result_to_buf(fix, buf_result); @@ -1338,7 +977,7 @@ treeview_set_up_fixtures(GtkTreeView *treeview) { col = gtk_tree_view_column_new(); gtk_tree_view_append_column(treeview, col); - renderer = treeview_cell_renderer_text_new(); + renderer = treeview_helper_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col, renderer, TRUE); gtk_tree_view_column_add_attribute(col, renderer, "markup", i + 1); @@ -1368,7 +1007,7 @@ treeview_show_fixtures(GtkTreeView *treeview, gint clid, { GtkTreeModel *model = NULL; - treeview_clear(treeview); + treeview_helper_clear(treeview); treeview_set_up_fixtures(treeview); model = treeview_create_fixtures(clid, week_number, week_round_number); @@ -1389,12 +1028,12 @@ treeview_table_write_header(GtkListStore *liststore, gint clid, gint number) if(clid < ID_CUP_START) { - symbol = treeview_pixbuf_from_filename(league_from_clid(clid)->symbol->str); + symbol = treeview_helper_pixbuf_from_filename(league_from_clid(clid)->symbol->str); strcpy(buf, league_from_clid(clid)->name->str); } else { - symbol = treeview_pixbuf_from_filename(cup_from_clid(clid)->symbol->str); + symbol = treeview_helper_pixbuf_from_filename(cup_from_clid(clid)->symbol->str); sprintf(buf, _("%s Group %d"), cup_from_clid(clid)->name->str, number); } @@ -1408,104 +1047,6 @@ treeview_table_write_header(GtkListStore *liststore, gint clid, gint number) g_object_unref(symbol); } -/** Find out whether the team given by the index in the league - table would participate in an international cup and set the - colours accordingly. */ -gboolean -treeview_get_table_element_colour_cups(const League *league, gint idx, gchar *colour_bg) -{ - gint i; - gint league_idx = league_get_index(league->id) + 1; - gchar buf[SMALL]; - - sprintf(buf, "league%d", league_idx); - - for(i=0;ilen;i++) - if(cp(i).type == CUP_TYPE_INTERNATIONAL && - strcmp(cp(i).choose_team_user.sid->str, buf) == 0) - { - if((idx + 1 >= cp(i).choose_team_user.start_idx && - idx + 1 <= cp(i).choose_team_user.end_idx && - cp(i).choose_team_user.randomly) || - (idx + 1 >= cp(i).choose_team_user.start_idx && - idx + 1 < cp(i).choose_team_user.start_idx + - cp(i).choose_team_user.number_of_teams && - !cp(i).choose_team_user.randomly)) - { - strcpy(colour_bg, const_str("string_treeview_table_cup")); - return TRUE; - } - } - - return FALSE; -} - -/** Get the colours for a team in the tables. - @param table The table pointer. - @param idx The index of the element we're looking at. - @param user Whether to take into account user colours. */ -void -treeview_get_table_element_colours(const Table *table, gint idx, gchar *colour_fg, - gchar *colour_bg, gboolean user) -{ - gint i; - const TableElement *elem = &g_array_index(table->elements, TableElement, idx); - const PromRelElement *pelem = NULL; - const League *league = NULL; - GPtrArray *cup_advance = NULL; - - strcpy(colour_fg, const_str("string_treeview_cell_color_default_foreground")); - strcpy(colour_bg, const_str("string_treeview_cell_color_default_background")); - - if(user && elem->team == current_user.tm) - { - strcpy(colour_fg, const_str("string_treeview_current_user_fg")); - strcpy(colour_bg, const_str("string_treeview_current_user_bg")); - } - else if(user && team_is_user(elem->team) != -1) - { - strcpy(colour_fg, const_str("string_treeview_user_fg")); - strcpy(colour_bg, const_str("string_treeview_user_bg")); - } - else if(table->clid < ID_CUP_START) - { - league = league_from_clid(table->clid); - - if(idx + 1 == 1) - strcpy(colour_bg, const_str("string_treeview_table_first")); - else - { - if(!treeview_get_table_element_colour_cups(league, idx, colour_bg)) - { - for(i=0;iprom_rel.elements->len;i++) - { - pelem = &g_array_index(league_from_clid(table->clid)->prom_rel.elements, PromRelElement, i); - if(pelem->ranks[0] <= idx + 1 && idx + 1 <= pelem->ranks[1]) - { - if(pelem->type == PROM_REL_PROMOTION) - strcpy(colour_bg, const_str("string_treeview_table_promotion")); - else if(pelem->type == PROM_REL_RELEGATION) - strcpy(colour_bg, const_str("string_treeview_table_relegation")); - } - } - - if(query_league_rank_in_prom_games(league, idx + 1)) - strcpy(colour_bg, const_str("string_treeview_table_promgames")); - } - } - } - else - { - cup_advance = - fixture_get_round_robin_advance(cup_from_clid(table->clid), table->round); - for(i=0;ilen;i++) - if((Team*)g_ptr_array_index(cup_advance, i) == elem->team) - strcpy(colour_bg, const_str("string_treeview_table_promotion")); - - free_g_ptr_array(&cup_advance); - } -} - /** Display a table in the liststore. @param number The number of the table if we display more than one (cups, round robin); or -1 for leagues. */ @@ -1527,16 +1068,16 @@ treeview_create_single_table(GtkListStore *liststore, const Table *table, gint n elem = &g_array_index(table->elements, TableElement, i); if(table->clid >= ID_CUP_START) - symbol = treeview_pixbuf_from_filename(elem->team->symbol->str); + symbol = treeview_helper_pixbuf_from_filename(elem->team->symbol->str); gtk_list_store_set(liststore, &iter, 0, symbol, -1); /*todo: cup choose team user */ - treeview_get_table_element_colours(table, i, colour_fg, colour_bg, FALSE); + treeview_helper_get_table_element_colours(table, i, colour_fg, colour_bg, FALSE); sprintf(buf[0], "%d", colour_bg, colour_fg, i + 1); - treeview_get_table_element_colours(table, i, colour_fg, colour_bg, TRUE); + treeview_helper_get_table_element_colours(table, i, colour_fg, colour_bg, TRUE); sprintf(buf[1], "%s", colour_bg, colour_fg, elem->team->name->str); @@ -1630,7 +1171,7 @@ treeview_set_up_table(GtkTreeView *treeview) col = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col, titles[i]); gtk_tree_view_append_column(treeview, col); - renderer = treeview_cell_renderer_text_new(); + renderer = treeview_helper_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col, renderer, FALSE); gtk_tree_view_column_add_attribute(col, renderer, "markup", i); @@ -1646,7 +1187,7 @@ treeview_show_table(GtkTreeView *treeview, gint clid) { GtkTreeModel *model = NULL; - treeview_clear(treeview); + treeview_helper_clear(treeview); treeview_set_up_table(treeview); model = treeview_create_table(clid); @@ -1809,7 +1350,7 @@ treeview_set_up_finances(GtkTreeView *treeview) col = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col, titles[i]); gtk_tree_view_append_column(treeview, col); - renderer = treeview_cell_renderer_text_new(); + renderer = treeview_helper_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col, renderer, FALSE); gtk_tree_view_column_add_attribute(col, renderer, "markup", i); @@ -1825,7 +1366,7 @@ treeview_show_finances(GtkTreeView *treeview, const User* user) { GtkTreeModel *model = NULL; - treeview_clear(treeview); + treeview_helper_clear(treeview); treeview_set_up_finances(treeview); model = treeview_create_finances(user); @@ -1844,7 +1385,7 @@ treeview_show_transfer_list(GtkTreeView *treeview) g_ptr_array_add(players, player_of_id_team(trans(i).tm, trans(i).id)); treeview_show_player_list(treeview, players, - treeview_get_attributes_from_scout(current_user.scout), FALSE); + treeview_helper_get_attributes_from_scout(current_user.scout), FALSE); } /** Show the results of the user team against the specified team. */ @@ -2063,7 +1604,7 @@ treeview_set_up_next_opponent(GtkTreeView *treeview) { col = gtk_tree_view_column_new(); gtk_tree_view_append_column(treeview, col); - renderer = treeview_cell_renderer_text_new(); + renderer = treeview_helper_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col, renderer, FALSE); gtk_tree_view_column_add_attribute(col, renderer, "markup", i); @@ -2078,7 +1619,7 @@ treeview_show_next_opponent(void) GTK_TREE_VIEW(lookup_widget(window.main, "treeview_right")); GtkTreeModel *model = NULL; - treeview_clear(treeview); + treeview_helper_clear(treeview); treeview_set_up_next_opponent(treeview); model = treeview_create_next_opponent(); @@ -2162,7 +1703,7 @@ treeview_set_up_league_results(GtkTreeView *treeview) col = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col, titles[i]); gtk_tree_view_append_column(treeview, col); - renderer = treeview_cell_renderer_text_new(); + renderer = treeview_helper_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col, renderer, FALSE); gtk_tree_view_column_add_attribute(col, renderer, "markup", i); @@ -2176,7 +1717,7 @@ treeview_show_league_results(GtkTreeView *treeview) { GtkTreeModel *model = NULL; - treeview_clear(treeview); + treeview_helper_clear(treeview); treeview_set_up_league_results(treeview); model = treeview_create_league_results(); @@ -2199,7 +1740,7 @@ treeview_show_all_players(GArray *teams) treeview_show_player_list(GTK_TREE_VIEW(lookup_widget(window.main, "treeview_right")), players, - treeview_get_attributes_from_scout(current_user.scout), FALSE); + treeview_helper_get_attributes_from_scout(current_user.scout), FALSE); } GtkTreeModel* @@ -2246,7 +1787,7 @@ treeview_show_preview(void) GtkTreeView *treeview = GTK_TREE_VIEW(lookup_widget(window.main, "treeview_right")); GtkTreeModel *model = NULL; - treeview_clear(treeview); + treeview_helper_clear(treeview); treeview_set_up_fixtures(treeview); model = treeview_create_preview(); @@ -2302,17 +1843,17 @@ treeview_set_up_player_info(GtkTreeView *treeview) col = gtk_tree_view_column_new(); gtk_tree_view_append_column(treeview, col); - renderer = treeview_cell_renderer_text_new(); + renderer = treeview_helper_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col, renderer, FALSE); gtk_tree_view_column_add_attribute(col, renderer, "markup", 0); col = gtk_tree_view_column_new(); gtk_tree_view_append_column(treeview, col); - renderer = treeview_cell_renderer_text_new(); + renderer = treeview_helper_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(col, renderer, - treeview_cell_player_ext_info_to_cell, + treeview_helper_player_ext_info_to_cell, NULL, NULL); } @@ -2323,7 +1864,7 @@ treeview_show_player_info(const Player *pl) GtkTreeView *treeview = GTK_TREE_VIEW(lookup_widget(window.main, "treeview_right")); GtkTreeModel *model = NULL; - treeview_clear(treeview); + treeview_helper_clear(treeview); treeview_set_up_player_info(treeview); model = treeview_create_player_info(pl); @@ -2377,10 +1918,102 @@ treeview_show_fixtures_week(gint week_number, gint week_round_number) GtkTreeView *treeview = GTK_TREE_VIEW(lookup_widget(window.main, "treeview_right")); GtkTreeModel *model = NULL; - treeview_clear(treeview); + treeview_helper_clear(treeview); treeview_set_up_fixtures(treeview); model = treeview_create_fixtures_week(week_number, week_round_number); gtk_tree_view_set_model(treeview, model); g_object_unref(model); } + +GtkTreeModel* +treeview_create_user_history(void) +{ + gint i; + gchar buf[SMALL]; + GtkListStore *liststore = + gtk_list_store_new(5, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_STRING); + GtkTreeIter iter; + GdkPixbuf *symbol = NULL; + + for(i=0;ilen;i++) + { + user_history_to_string(&g_array_index(current_user.history, UserHistory, i), buf); + symbol = treeview_helper_pixbuf_from_filename( + treeview_helper_get_user_history_icon( + g_array_index(current_user.history, UserHistory, i).type)); + + gtk_list_store_append(liststore, &iter); + gtk_list_store_set(liststore, &iter, + 0, g_array_index(current_user.history, UserHistory, i).season, + 1, g_array_index(current_user.history, UserHistory, i).week, + 2, team_of_id(g_array_index(current_user.history, UserHistory, i).team_id)->name->str, + 3, symbol, + 4, buf, -1); + + if(symbol != NULL) + g_object_unref(symbol); + } + + return GTK_TREE_MODEL(liststore); +} + +void +treeview_set_up_user_history(GtkTreeView *treeview) +{ + gint i; + GtkTreeViewColumn *col; + GtkCellRenderer *renderer; + gchar *titles[3] ={"Sea", "Week", "Team"}; + + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(treeview), + GTK_SELECTION_NONE); + gtk_tree_view_set_rules_hint(treeview, TRUE); + gtk_tree_view_set_headers_visible(treeview, TRUE); + + for(i=0;i<3;i++) + { + col = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(col, titles[i]); + gtk_tree_view_column_set_alignment(col, 0.5); + gtk_tree_view_append_column(treeview, col); + renderer = treeview_helper_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(col, renderer, TRUE); + gtk_tree_view_column_add_attribute(col, renderer, + "text", i); + g_object_set(renderer, "xalign", 0.5, NULL); + } + + col = gtk_tree_view_column_new(); + gtk_tree_view_column_set_alignment(col, 0.5); + gtk_tree_view_append_column(treeview, col); + renderer = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(col, renderer, TRUE); + gtk_tree_view_column_add_attribute(col, renderer, + "pixbuf", 3); + g_object_set(renderer, "xalign", 0.5, NULL); + + col = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(col, _("Event")); + gtk_tree_view_append_column(treeview, col); + renderer = treeview_helper_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(col, renderer, FALSE); + gtk_tree_view_column_add_attribute(col, renderer, + "text", 4); +} + +/** Show the history array of the current user in the + right treeview. */ +void +treeview_show_user_history(void) +{ + GtkTreeView *treeview = GTK_TREE_VIEW(lookup_widget(window.main, "treeview_right")); + GtkTreeModel *model = NULL; + + treeview_helper_clear(treeview); + + treeview_set_up_user_history(treeview); + model = treeview_create_user_history(); + gtk_tree_view_set_model(treeview, model); + g_object_unref(model); +} diff --git a/src/treeview.h b/src/treeview.h index d56dca3d..8eb9ce7d 100644 --- a/src/treeview.h +++ b/src/treeview.h @@ -8,30 +8,6 @@ #include "user_struct.h" #include "table_struct.h" -gboolean -treeview_select_row(GtkTreeView *treeview, GdkEventButton *event); - -GdkPixbuf* -treeview_pixbuf_from_filename(gchar *filename); - -GtkCellRenderer* -treeview_cell_renderer_text_new(void); - -gchar* -treeview_live_game_icon(gint event_type); - -gint -treeview_get_index(GtkTreeView *treeview, gint column); - -gpointer -treeview_get_pointer(GtkTreeView *treeview, gint column); - -void -treeview_clear(GtkTreeView *treeview); - -gint -treeview_get_col_number_column (GtkTreeViewColumn *col); - GtkTreeModel* treeview_create_team_selection_list(gboolean show_cup_teams, gboolean show_user_teams); @@ -129,13 +105,6 @@ treeview_create_single_table(GtkListStore *liststore, const Table *table, gint n void treeview_table_write_header(GtkListStore *liststore, gint clid, gint number); -void -treeview_get_table_element_colours(const Table *table, gint idx, gchar *colour_fg, - gchar *colour_bg, gboolean user); - -gboolean -treeview_get_table_element_colour_cups(const League *league, gint idx, gchar *colour_bg); - void treeview_show_finances(GtkTreeView *treeview, const User* user); @@ -148,9 +117,6 @@ treeview_create_finances(const User* user); void treeview_show_player_list_team(GtkTreeView *treeview, const Team *tm, gint scout); -PlayerListAttribute -treeview_get_attributes_from_scout(gint scout); - void treeview_show_transfer_list(GtkTreeView *treeview); @@ -181,21 +147,9 @@ treeview_create_league_results(void); void treeview_create_next_opponent_values(GtkListStore *liststore, const Fixture *fix); -gint -treeview_team_compare(GtkTreeModel *model, - GtkTreeIter *a, - GtkTreeIter *b, - gpointer user_data); - void treeview_show_all_players(GArray *teams); -gint -treeview_player_compare(GtkTreeModel *model, - GtkTreeIter *a, - GtkTreeIter *b, - gpointer user_data); - GtkTreeModel* treeview_create_preview(void); @@ -211,19 +165,22 @@ treeview_set_up_player_info(GtkTreeView *treeview); GtkTreeModel* treeview_create_player_info(const Player *pl); -gint -treeview_iter_get_row(GtkTreeModel *model, GtkTreeIter *iter); - void treeview_create_stadium_summary(GtkListStore *liststore); void treeview_show_fixtures_week(gint week_number, gint week_round_number); -void -treeview_show_fixtures_week(gint week_number, gint week_round_number); - GtkTreeModel* treeview_create_fixtures_week(gint week_number, gint week_round_number); +void +treeview_show_user_history(void); + +void +treeview_set_up_user_history(GtkTreeView *treeview); + +GtkTreeModel* +treeview_create_user_history(void); + #endif diff --git a/src/user.c b/src/user.c index 970af27b..8f4eabd8 100644 --- a/src/user.c +++ b/src/user.c @@ -1,6 +1,8 @@ +#include "cup.h" #include "fixture.h" #include "free.h" #include "game_gui.h" +#include "league.h" #include "live_game.h" #include "maths.h" #include "misc.h" @@ -25,6 +27,7 @@ user_new(void) live_game_reset(&new.live_game, NULL, FALSE); new.events = g_array_new(FALSE, FALSE, sizeof(Event)); + new.history = g_array_new(FALSE, FALSE, sizeof(UserHistory)); new.options.list = NULL; new.options.datalist = NULL; @@ -81,6 +84,8 @@ user_set_up_team(User *user) user->scout = user->physio = QUALITY_AVERAGE; + user->tm->style = 0; + user_set_up_finances(user); user_set_up_counters(user); } @@ -353,9 +358,9 @@ user_event_show_next(void) break; case EVENT_TYPE_OVERDRAW: if(event->value1 == 1) - sprintf(buf, _("You have overdrawn your bank account. The team owners give you %d weeks to exceed your drawing credit limit again."), const_int("int_finance_overdraw_positive")); + sprintf(buf, _("You have overdrawn your bank account. The team owners give you %d weeks to get above your drawing credit limit."), const_int("int_finance_overdraw_positive")); else - sprintf(buf, _("You have overdrawn your bank account once again. Bear in mind that after the fourth time you get fired.\nThe team owners give you %d weeks to exceed your drawing credit limit again."), const_int("int_finance_overdraw_positive")); + sprintf(buf, _("You have overdrawn your bank account once again. Bear in mind that after the fourth time you get fired.\nThe team owners give you %d weeks to get above your drawing credit limit."), const_int("int_finance_overdraw_positive")); game_gui_show_warning(buf); break; case EVENT_TYPE_TRANSFER_OFFER_REJECTED: @@ -465,3 +470,145 @@ query_user_teams_have_unfit(void) return FALSE; } + +/** Compare function for history sorting. */ +gint +user_history_compare(gconstpointer a, gconstpointer b) +{ + gint return_value = 0; + const UserHistory *his1 = (const UserHistory*)a, + *his2 = (const UserHistory*)b; + + if(his1->season < his2->season) + return_value = 1; + else if(his1->season > his2->season) + return_value = -1; + else if(his1->week < his2->week) + return_value = 1; + else if(his1->week > his2->week) + return_value = -1; + + return return_value; +} + +/** Add an element to the user history filled with the given values. */ +void +user_history_add(User *user, gint type, gint team_id, + gint value1, gint value2, gchar *string) +{ + gint i; + UserHistory new_history; + UserHistory *his = &new_history; + gboolean replace = FALSE; + + + if(type == USER_HISTORY_WIN_FINAL || + type == USER_HISTORY_LOSE_FINAL || + type == USER_HISTORY_REACH_CUP_ROUND) + { + for(i=0;ihistory->len;i++) + if((g_array_index(user->history, UserHistory, i).type == USER_HISTORY_WIN_FINAL || + g_array_index(user->history, UserHistory, i).type == USER_HISTORY_LOSE_FINAL || + g_array_index(user->history, UserHistory, i).type == USER_HISTORY_REACH_CUP_ROUND) && + g_array_index(user->history, UserHistory, i).season == season && + g_array_index(user->history, UserHistory, i).team_id == team_id && + g_array_index(user->history, UserHistory, i).value1 == value1) + { + /** Same cup round. */ + if(g_array_index(user->history, UserHistory, i).value2 == value2 && + type == USER_HISTORY_REACH_CUP_ROUND) + return; + + his = &g_array_index(user->history, UserHistory, i); + replace = TRUE; + break; + } + } + + his->season = season; + his->week = week; + + /*todo: check for old cup comp */ + his->type = type; + his->team_id = team_id; + his->value1 = value1; + his->value2 = value2; + + if(replace) + { + g_string_printf(his->value_string, "%s", string); + g_array_sort(user->history, (GCompareFunc)user_history_compare); + } + else + { + his->value_string = g_string_new(string); + g_array_prepend_val(user->history, *his); + } +} + +/** Write the text corresponding to the history event + into the buffer. */ +void +user_history_to_string(const UserHistory *history, gchar *buf) +{ + gchar buf2[SMALL]; + + switch(history->type) + { + default: + g_warning("user_history_to_string: unknown history type %d.\n", history->type); + strcpy(buf, "FIXME!!!"); + case USER_HISTORY_START_GAME: + sprintf(buf, "You start the game with %s in the %s.", + team_of_id(history->team_id)->name->str, + league_cup_get_name_string(history->value1)); + break; + case USER_HISTORY_FIRE_FINANCES: + sprintf(buf, "%s fires you because of financial mismanagement.\nYou find a new job with %s in the %s.", + team_of_id(history->team_id)->name->str, + team_of_id(history->value1)->name->str, + league_cup_get_name_string(history->value2)); + break; + case USER_HISTORY_FIRE_FAILURE: + sprintf(buf, "%s fires you because of unsuccessfulness.\nYou find a new job with %s in the %s.", + team_of_id(history->team_id)->name->str, + team_of_id(history->value1)->name->str, + league_cup_get_name_string(history->value2)); + break; + case USER_HISTORY_JOB_OFFER_ACCEPTED: + sprintf(buf, "%s offer you a job in the %s.\nYou accept the challenge and leave %s.", + team_of_id(history->value1)->name->str, + league_cup_get_name_string(history->value2), + team_of_id(history->team_id)->name->str); + break; + case USER_HISTORY_END_SEASON: + sprintf(buf, "You finish the season in %s on rank %d.", + league_cup_get_name_string(history->value1), + history->value2); + break; + case USER_HISTORY_PROMOTED: + sprintf(buf, "You get promoted to the %s.", + league_cup_get_name_string(history->value1)); + break; + case USER_HISTORY_RELEGATED: + sprintf(buf, "You get relegated to the %s.", + league_cup_get_name_string(history->value1)); + break; + case USER_HISTORY_WIN_FINAL: + sprintf(buf, "You win the %s final against %s.", + league_cup_get_name_string(history->value1), + history->value_string->str); + break; + case USER_HISTORY_LOSE_FINAL: + sprintf(buf, "You lose in the %s final against %s.", + league_cup_get_name_string(history->value1), + history->value_string->str); + break; + case USER_HISTORY_REACH_CUP_ROUND: + cup_get_round_name(cup_from_clid(history->value1), history->value2, buf2); + sprintf(buf, "You reach the %s (round %d) of the %s.", buf2, + history->value2 + 1, + league_cup_get_name_string(history->value1)); + break; + } +} diff --git a/src/user.h b/src/user.h index d40a12f1..687fdbec 100644 --- a/src/user.h +++ b/src/user.h @@ -69,4 +69,14 @@ user_event_get_index(User *user, gint type, gint value1, gint value2, gboolean query_user_teams_have_unfit(void); +void +user_history_add(User *user, gint type, gint team_id, + gint value1, gint value2, gchar *string); + +void +user_history_to_string(const UserHistory *history, gchar *buf); + +gint +user_history_compare(gconstpointer a, gconstpointer b); + #endif diff --git a/src/user_struct.h b/src/user_struct.h index f37ba6b7..62aedac4 100644 --- a/src/user_struct.h +++ b/src/user_struct.h @@ -61,6 +61,8 @@ typedef struct OptionList options; /** Events shown each week. */ GArray *events; + /** User history. */ + GArray *history; /** User counters (not changeable by the user), like number of weeks until debt has to be paid back. */ gint counters[COUNT_USER_END]; @@ -112,4 +114,38 @@ typedef struct } Event; + +/** User-related things that get recorded. */ +enum UserHistoryType +{ + USER_HISTORY_START_GAME = 0, + USER_HISTORY_FIRE_FINANCES, + USER_HISTORY_FIRE_FAILURE, + USER_HISTORY_JOB_OFFER_ACCEPTED, + USER_HISTORY_END_SEASON, + USER_HISTORY_PROMOTED, + USER_HISTORY_RELEGATED, + USER_HISTORY_WIN_FINAL, + USER_HISTORY_LOSE_FINAL, + USER_HISTORY_REACH_CUP_ROUND, + USER_HISTORY_END +}; + +/** A structure holding an element of a user's history, + e.g. the event of being fired. */ +typedef struct +{ + /** When the event happened. */ + gint season, week; + + /** The type (see #UserHistoryType) and team + of the user. */ + gint type, team_id, + /** These can hold various information like + team or league/cup ids. */ + value1, value2; + GString *value_string; + +} UserHistory; + #endif diff --git a/src/xml_loadsave_users.c b/src/xml_loadsave_users.c index 0b41bd05..474a6b45 100644 --- a/src/xml_loadsave_users.c +++ b/src/xml_loadsave_users.c @@ -20,11 +20,20 @@ enum TAG_USER_MONEY_OUT, TAG_USER_SCOUT, TAG_USER_PHYSIO, + TAG_USER_HISTORY, + TAG_USER_HISTORY_SEASON, + TAG_USER_HISTORY_WEEK, + TAG_USER_HISTORY_TYPE, + TAG_USER_HISTORY_TEAM_ID, + TAG_USER_HISTORY_VALUE1, + TAG_USER_HISTORY_VALUE2, + TAG_USER_HISTORY_VALUE_STRING, TAG_END }; gint state, idx_mon_in, idx_mon_out, idx; User new_user; +UserHistory new_history; void xml_loadsave_users_start_element (GMarkupParseContext *context, @@ -88,7 +97,8 @@ xml_loadsave_users_end_element (GMarkupParseContext *context, tag == TAG_USER_SCOUT || tag == TAG_USER_PHYSIO || tag == TAG_NAME || - tag == TAG_TEAM_ID) + tag == TAG_TEAM_ID || + tag == TAG_USER_HISTORY) { state = TAG_USER; if(tag == TAG_USER_COUNTER) @@ -97,6 +107,8 @@ xml_loadsave_users_end_element (GMarkupParseContext *context, idx_mon_out++; else if(tag == TAG_USER_MONEY_INS) idx_mon_in++; + else if(tag == TAG_USER_HISTORY) + g_array_append_val(new_user.history, new_history); } else if(tag == TAG_USER_MONEY_OUT) { @@ -108,6 +120,14 @@ xml_loadsave_users_end_element (GMarkupParseContext *context, state = TAG_USER_MONEY_INS; idx++; } + else if(tag == TAG_USER_HISTORY_SEASON || + tag == TAG_USER_HISTORY_WEEK || + tag == TAG_USER_HISTORY_TYPE || + tag == TAG_USER_HISTORY_TEAM_ID || + tag == TAG_USER_HISTORY_VALUE1 || + tag == TAG_USER_HISTORY_VALUE2 || + tag == TAG_USER_HISTORY_VALUE_STRING) + state = TAG_USER_HISTORY; else if(tag != TAG_USERS) g_warning("xml_loadsave_users_end_element: unknown tag: %s; I'm in state %d\n", element_name, state); @@ -149,6 +169,20 @@ xml_loadsave_users_text (GMarkupParseContext *context, new_user.money_in[idx_mon_in][idx] = int_value; else if(state == TAG_USER_MONEY_OUT) new_user.money_out[idx_mon_out][idx] = int_value; + else if(state == TAG_USER_HISTORY_SEASON) + new_history.season = int_value; + else if(state == TAG_USER_HISTORY_WEEK) + new_history.week = int_value; + else if(state == TAG_USER_HISTORY_TYPE) + new_history.type = int_value; + else if(state == TAG_USER_HISTORY_TEAM_ID) + new_history.team_id = int_value; + else if(state == TAG_USER_HISTORY_VALUE1) + new_history.value1 = int_value; + else if(state == TAG_USER_HISTORY_VALUE2) + new_history.value2 = int_value; + else if(state == TAG_USER_HISTORY_VALUE_STRING) + new_history.value_string = g_string_new(buf); } void @@ -238,6 +272,28 @@ xml_loadsave_users_write(const gchar *prefix) fprintf(fil, "%s\n", I1, TAG_USER_MONEY_OUTS); } + for(j=0;jlen;j++) + { + fprintf(fil, "%s<_%d>\n", I1, TAG_USER_HISTORY); + + xml_write_int(fil, g_array_index(usr(i).history, UserHistory, j).season, + TAG_USER_HISTORY_SEASON, I2); + xml_write_int(fil, g_array_index(usr(i).history, UserHistory, j).week, + TAG_USER_HISTORY_WEEK, I2); + xml_write_int(fil, g_array_index(usr(i).history, UserHistory, j).type, + TAG_USER_HISTORY_TYPE, I2); + xml_write_int(fil, g_array_index(usr(i).history, UserHistory, j).team_id, + TAG_USER_HISTORY_TEAM_ID, I2); + xml_write_int(fil, g_array_index(usr(i).history, UserHistory, j).value1, + TAG_USER_HISTORY_VALUE1, I2); + xml_write_int(fil, g_array_index(usr(i).history, UserHistory, j).value2, + TAG_USER_HISTORY_VALUE2, I2); + xml_write_g_string(fil, g_array_index(usr(i).history, UserHistory, j).value_string, + TAG_USER_HISTORY_VALUE_STRING, I2); + + fprintf(fil, "%s\n", I1, TAG_USER_HISTORY); + } + fprintf(fil, "\n", TAG_USER); } diff --git a/support_files/bygfoot.conf b/support_files/bygfoot.conf index 3b5a2809..ace4118f 100644 --- a/support_files/bygfoot.conf +++ b/support_files/bygfoot.conf @@ -14,14 +14,14 @@ int_opt_autosave_interval 5 int_opt_autosave_files 5 # precision of skill and talent in player lists -int_opt_player_precision 2 +int_opt_player_precision 0 # refresh rate of the player list during a live game # the smaller the more often the list gets refreshed int_opt_live_game_player_list_refresh 48 # whether some debugging info's shown (in the console) -int_opt_debug 0 #60 +int_opt_debug 0 string_opt_player_names_file player_names.xml string_opt_constants_file bygfoot_constants diff --git a/support_files/bygfoot_constants b/support_files/bygfoot_constants index b528219c..60b073e3 100644 --- a/support_files/bygfoot_constants +++ b/support_files/bygfoot_constants @@ -156,22 +156,22 @@ float_player_etal_scout_factor 70000 # fitness limits below which fitness is shown # in orange and red etc. -float_treeview_cell_limit_player_fitness_below1 8500 -float_treeview_cell_limit_player_fitness_below2 7000 -float_treeview_cell_limit_player_fitness_below3 6000 +float_treeview_helper_limit_player_fitness_below1 8500 +float_treeview_helper_limit_player_fitness_below2 7000 +float_treeview_helper_limit_player_fitness_below3 6000 # contract limits below which contract time is shown # in orange and red etc. -float_treeview_cell_limit_player_contract_below1 10000 -float_treeview_cell_limit_player_contract_below2 7000 -float_treeview_cell_limit_player_contract_below3 4000 +float_treeview_helper_limit_player_contract_below1 10000 +float_treeview_helper_limit_player_contract_below2 7000 +float_treeview_helper_limit_player_contract_below3 4000 # the factor that determines how much money the user has to pay # if he fires a player float_player_fire_wage_factor 100000 # the integer that the cell data functions will interpret as an empty string. -int_treeview_cell_int_empty -5 +int_treeview_helper_int_empty -5 # number of results shown in the next opponent # info @@ -682,43 +682,43 @@ string_live_game_event_substitution_icon sub.png string_live_game_event_structure_change_icon structure_change.png # font attributes for the live game window result. -string_treeview_cell_live_game_result_attributes weight='bold' size='large' +string_treeview_helper_live_game_result_attributes weight='bold' size='large' # colour indicating ball possession during a live game string_live_game_possession_color darkblue # default background and foreground in treeviews -string_treeview_cell_color_default_background white -string_treeview_cell_color_default_foreground black +string_treeview_helper_color_default_background white +string_treeview_helper_color_default_foreground black # player list colours -string_treeview_cell_color_player_pos_goalie_bg black -string_treeview_cell_color_player_pos_goalie_fg white -string_treeview_cell_color_player_pos_defender_bg darkgreen -string_treeview_cell_color_player_pos_defender_fg white -string_treeview_cell_color_player_pos_midfielder_bg darkblue -string_treeview_cell_color_player_pos_midfielder_fg white -string_treeview_cell_color_player_pos_forward_bg darkred -string_treeview_cell_color_player_pos_forward_fg white +string_treeview_helper_color_player_pos_goalie_bg black +string_treeview_helper_color_player_pos_goalie_fg white +string_treeview_helper_color_player_pos_defender_bg darkgreen +string_treeview_helper_color_player_pos_defender_fg white +string_treeview_helper_color_player_pos_midfielder_bg darkblue +string_treeview_helper_color_player_pos_midfielder_fg white +string_treeview_helper_color_player_pos_forward_bg darkred +string_treeview_helper_color_player_pos_forward_fg white -string_treeview_cell_color_player_injury lightgreen -string_treeview_cell_color_player_banned red -string_treeview_cell_color_player_yellow_danger yellow +string_treeview_helper_color_player_injury lightgreen +string_treeview_helper_color_player_banned red +string_treeview_helper_color_player_yellow_danger yellow -string_treeview_cell_color_player_fitness_normal darkgreen -string_treeview_cell_color_player_fitness_below1 darkorange -string_treeview_cell_color_player_fitness_below2 orangered -string_treeview_cell_color_player_fitness_below3 red +string_treeview_helper_color_player_fitness_normal darkgreen +string_treeview_helper_color_player_fitness_below1 darkorange +string_treeview_helper_color_player_fitness_below2 orangered +string_treeview_helper_color_player_fitness_below3 red -string_treeview_cell_color_player_contract_normal darkgreen +string_treeview_helper_color_player_contract_normal darkgreen # see also the int constants for contract limits -string_treeview_cell_color_player_contract_below1 darkorange -string_treeview_cell_color_player_contract_below2 orangered -string_treeview_cell_color_player_contract_below3 red +string_treeview_helper_color_player_contract_below1 darkorange +string_treeview_helper_color_player_contract_below2 orangered +string_treeview_helper_color_player_contract_below3 red # colours for cskill in wrong position -string_treeview_cell_color_player_bad_cskill_bg lightblue -string_treeview_cell_color_player_bad_cskill_fg red +string_treeview_helper_color_player_bad_cskill_bg lightblue +string_treeview_helper_color_player_bad_cskill_fg red # fixture list colours # the header, e.g. 'champions' league round robin' @@ -761,3 +761,16 @@ string_treeview_league_results_away_fg black # foreground of own team bar in the opponent preview string_treeview_opponent_value_colour_fg darkgreen + + +# symbols in the user history view +string_treeview_helper_user_history_symbol_start_game +string_treeview_helper_user_history_symbol_fire_finances +string_treeview_helper_user_history_symbol_fire_failure +string_treeview_helper_user_history_symbol_end_season +string_treeview_helper_user_history_symbol_win_final +string_treeview_helper_user_history_symbol_lose_final +string_treeview_helper_user_history_symbol_reach_cup_round +string_treeview_helper_user_history_symbol_job_offer_accepted +string_treeview_helper_user_history_symbol_promoted +string_treeview_helper_user_history_symbol_relegated