static void board_window_rebuild_board_menu (window_board_t *win) { if (gtk_menu_item_get_submenu (GTK_MENU_ITEM (win->board_menu))) gtk_menu_item_remove_submenu (GTK_MENU_ITEM (win->board_menu)); GtkWidget *submenu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (win->board_menu), submenu); int i; GSList *group = NULL; for (i = 0; i < win->n_boards; i++) { board *b = win->boards[i]; GString *label = g_string_new (b->name->str); g_string_append_printf (label, " (%s)", contract_string (b->level, b->trumps, b->declarer, b->doubled)); GtkWidget *menuitem = gtk_radio_menu_item_new_with_label (group, label->str); g_string_free (label, TRUE); group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem)); if (i == win->cur) gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), TRUE); g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (board_menu_select), &(win->board_numbers[i])); /* pointer to array index */ gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem); gtk_widget_show (menuitem); } }
void window_options_board_list_populate (void) /* no parameter as it is called from window_board.c */ { if (! window_options) return; assert (board_store); PROTECT_BEGIN; GtkWidget *w = get_widget ("board_list"); gtk_tree_view_set_model (GTK_TREE_VIEW (w), GTK_TREE_MODEL (board_store)); gtk_list_store_clear (board_store); GtkTreeIter iter; int i; GString *name = g_string_new (NULL); for (i = 0; i < win->n_boards; i++) { board *b = win->boards[i]; gtk_list_store_append (board_store, &iter); g_string_printf (name, "%s (%s)", b->name->str, contract_string (b->level, b->trumps, b->declarer, b->doubled)); gtk_list_store_set (board_store, &iter, 0, i + 1, 1, name->str, -1); } g_string_free (name, TRUE); PROTECT_END; }
void show_board (board *b, redraw_t redraw) { GtkWidget *w; GString *str = g_string_new(NULL); assert (b); if (redraw & REDRAW_BOARD_LIST) { board_window_rebuild_board_menu (win); window_options_board_list_populate (); } if (redraw & (REDRAW_TITLE | REDRAW_CONTRACT)) { g_string_printf(str, "Tenace - %s (%s)", b->name->str, contract_string_asc (b->level, b->trumps, b->declarer, b->doubled)); if (win->title) { g_string_append_printf (str, " - %s", win->title); if (win->subtitle) g_string_append_printf (str, " - %s", win->subtitle); if (win->team1 && win->team2) g_string_append_printf (str, _(" - %s vs. %s"), win->team1, win->team2); } else if (win->filename) { char *fname = win->filename; if (strrchr(fname, '/')) fname = strrchr(fname, '/') + 1; g_string_append_printf (str, " - %s", fname); } gtk_window_set_title(GTK_WINDOW(win->window), str->str); } if (redraw & REDRAW_CONTRACT) { w = get_widget ("label_board"); g_string_printf(str, "%s\n%s\n%s: %s\n%s: %s", b->name->str, contract_string(b->level, b->trumps, b->declarer, b->doubled), _("Dealer"), _(seat_str[b->dealer]), _("Vulnerable"), vuln_string(b)); gtk_label_set_text((GtkLabel*) w, str->str); char *dealermenu[] = { 0, "dealer_west1", "dealer_north1", "dealer_east1", "dealer_south1"}; w = get_widget (dealermenu[b->dealer]); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), TRUE); char *declarermenu[] = { 0, "declarer_west1", "declarer_north1", "declarer_east1", "declarer_south1"}; w = get_widget (declarermenu[b->declarer]); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), TRUE); char *levelmenu[] = { "level1" /* PASS */, "level1", "level2", "level3", "level4", "level5", "level6", "level7" }; w = get_widget (levelmenu[b->level]); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), TRUE); char *suitmenu[] = { "contract_clubs1", "contract_diamonds1", "contract_hearts1", "contract_spades1", "contract_no_trump1" }; w = get_widget (suitmenu[b->trumps]); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), TRUE); char *doublemenu[] = { "level_doubled0", "level_doubled1", "level_redoubled1" }; w = get_widget (doublemenu[b->doubled]); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), TRUE); char *vulnmenu[] = { "vuln_none", "vuln_ns", "vuln_ew", "vuln_all" }; w = get_widget (vulnmenu[2 * b->vuln[1] + b->vuln[0]]); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), TRUE); window_options_board_populate (); } if (redraw & REDRAW_NAMES) { w = get_widget ("label_west"); board_set_player_name (w, west, b->dealer == west, b->vuln[1], b->declarer == west, b->current_turn == west, b->hand_name[0]->str); w = get_widget ("label_north"); board_set_player_name (w, north, b->dealer == north, b->vuln[0], b->declarer == north, b->current_turn == north, b->hand_name[1]->str); w = get_widget ("label_east"); board_set_player_name (w, east, b->dealer == east, b->vuln[1], b->declarer == east, b->current_turn == east, b->hand_name[2]->str); w = get_widget ("label_south"); board_set_player_name (w, south, b->dealer == south, b->vuln[0], b->declarer == south, b->current_turn == south, b->hand_name[3]->str); window_options_board_populate (); } if (redraw & REDRAW_TRICKS) { w = get_widget ("label_tricks"); g_string_printf(str, _("NS: %d\nEW: %d"), b->tricks[0], b->tricks[1]); gtk_label_set_markup((GtkLabel*) w, str->str); } if (redraw & REDRAW_PAR) { w = get_widget ("par_label"); if (b->par_score == -1) { gtk_label_set_text (GTK_LABEL (w), ""); } else { char *par = par_label (b); gtk_label_set_markup(GTK_LABEL (w), par); free (par); } } if (redraw & REDRAW_HANDS) { int i, c; /* hands */ int next_card = b->played_cards[b->n_played_cards]; for (i = west; i <= south; i++) { for (c = 51; c >= 0; c--) { int has = i == b->cards[c]; int had = i == b->dealt_cards[c]; int color; if (seat_mask (i, win->show_hands)) color = has ? (c == next_card ? HAND_DISPLAY_HILIGHT_CARD : HAND_DISPLAY_CARD) : (had && win->show_played_cards ? HAND_DISPLAY_OLD_CARD : HAND_DISPLAY_NO_CARD); else color = HAND_DISPLAY_NO_CARD; hand_display_set_card (win->handdisp[i - 1], c, color); if (has && b->current_dd && b->current_dd->card_score[c] >= 0 && seat_mask (i, win->show_dd_scores)) hand_display_set_card_score (win->handdisp[i - 1], c, card_overtricks(b, c)); else hand_display_set_card_score (win->handdisp[i - 1], c, HAND_DISPLAY_NO_SCORE); } hand_display_set_card_score_neg (win->handdisp[i - 1], i % 2 != b->declarer % 2); hand_display_draw(GTK_WIDGET (win->handdisp[i - 1])); } /* table */ hand_display_table_reset_cards (win->table); if (b->n_played_cards) { int trick_start = b->n_played_cards - seat_mod(b->n_played_cards); for (i = trick_start; i < b->n_played_cards; i++) { card c = b->played_cards[i]; seat s = b->dealt_cards[c]; hand_display_table_set_card (win->table, i - trick_start, s, c); } } hand_display_draw(GTK_WIDGET (win->table)); line_entry_set_from_board(b); } g_string_free(str, TRUE); if (redraw & REDRAW_PLAY) window_play_update(b); if (redraw & REDRAW_BIDDING) { bidding_update (win, b, redraw & REDRAW_BIDDING_SCROLL); } }