/*
* gtkatlantic - the gtk+ monopd client, enjoy network monopoly games
*
*
* Copyright © 2002-2015 Sylvain Rochet
*
* gtkatlantic is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, see
* .
*/
#include "config.h"
#include
#include
#include
#include
#include
#include "global.h"
#include "interface.h"
#include "callback.h"
#include "game.h"
#include "client.h"
#include "display.h"
#include "engine.h"
void interface_create_mainwindow() {
// GtkWidget *HandleBar;
//global->Menu
GtkWidget *Button;
GtkWidget *Menu;
GtkWidget *MenuItem;
GdkPixbuf *pixbuf;
global->MainWin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(global->MainWin), "GtkAtlantic");
gtk_widget_set_size_request(global->MainWin, 700, 487);
/* icons */
GList *iconlist = NULL;
pixbuf = gdk_pixbuf_new_from_file (PACKAGE_ICON_DIR "/128x128/apps/gtkatlantic.png", NULL);
if (pixbuf) iconlist = g_list_append(iconlist, pixbuf);
pixbuf = gdk_pixbuf_new_from_file (PACKAGE_ICON_DIR "/64x64/apps/gtkatlantic.png", NULL);
if (pixbuf) iconlist = g_list_append(iconlist, pixbuf);
pixbuf = gdk_pixbuf_new_from_file (PACKAGE_ICON_DIR "/48x48/apps/gtkatlantic.png", NULL);
if (pixbuf) iconlist = g_list_append(iconlist, pixbuf);
pixbuf = gdk_pixbuf_new_from_file (PACKAGE_ICON_DIR "/32x32/apps/gtkatlantic.png", NULL);
if (pixbuf) iconlist = g_list_append(iconlist, pixbuf);
pixbuf = gdk_pixbuf_new_from_file (PACKAGE_ICON_DIR "/16x16/apps/gtkatlantic.png", NULL);
if (pixbuf) iconlist = g_list_append(iconlist, pixbuf);
gtk_window_set_default_icon_list(iconlist);
g_signal_connect(G_OBJECT(global->MainWin), "delete-event", G_CALLBACK(gtk_main_quit), NULL);
global->MainBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add(GTK_CONTAINER(global->MainWin), global->MainBox);
global->Menu = gtk_menu_bar_new();
gtk_box_pack_start(GTK_BOX(global->MainBox), global->Menu, FALSE, FALSE, 0);
/* GAME MENU */
Button = gtk_menu_item_new_with_label("Game");
gtk_menu_shell_append(GTK_MENU_SHELL(global->Menu), Button);
Menu = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(Button), Menu);
MenuItem = gtk_menu_item_new_with_label("Connect to server...");
gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem);
g_object_set_data(G_OBJECT(global->Menu), "connect_to_server", MenuItem);
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(CallBack_menu_connect_to_server), NULL);
MenuItem = gtk_menu_item_new_with_label("Connect to metaserver");
gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem);
g_object_set_data(G_OBJECT(global->Menu), "connect_to_metaserver", MenuItem);
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(Callback_ConnectMetaServer), NULL);
MenuItem = gtk_menu_item_new_with_label("Public server list...");
gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem);
g_object_set_data(G_OBJECT(global->Menu), "public_server_list", MenuItem);
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(CallBack_menu_public_server_list), NULL);
MenuItem = gtk_menu_item_new();
gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem);
MenuItem = gtk_menu_item_new_with_label("Change nickname...");
gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem);
g_object_set_data(G_OBJECT(global->Menu), "change_nickname", MenuItem);
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(CallBack_menu_change_nickname), NULL);
MenuItem = gtk_menu_item_new_with_label("Show estates tree...");
gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem);
g_object_set_data(G_OBJECT(global->Menu), "show_estate_tree", MenuItem);
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(CallBack_estates_tree), NULL);
MenuItem = gtk_menu_item_new_with_label("Add player");
g_object_set_data(G_OBJECT(global->Menu), "upgrade_spectator", MenuItem);
gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem);
GtkWidget *SubMenu = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(MenuItem), SubMenu);
MenuItem = gtk_menu_item_new();
gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem);
MenuItem = gtk_menu_item_new_with_label("Reconnect (after client crash)");
gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem);
g_object_set_data(G_OBJECT(global->Menu), "reconnect", MenuItem);
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(CallBack_menu_reconnect), NULL);
MenuItem = gtk_menu_item_new_with_label("Leave game (disconnect)");
gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem);
g_object_set_data(G_OBJECT(global->Menu), "leave_game", MenuItem);
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(CallBack_menu_LeaveGame), NULL);
MenuItem = gtk_menu_item_new();
gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem);
MenuItem = gtk_menu_item_new_with_label("Exit");
gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem);
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(gtk_main_quit), NULL);
/* CONFIG MENU */
Button = gtk_menu_item_new_with_label("Settings");
gtk_menu_shell_append(GTK_MENU_SHELL(global->Menu), Button);
Menu = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(Button), Menu);
MenuItem = gtk_menu_item_new_with_label("Preferences...");
gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem);
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(Callback_ShowConfiguration), NULL);
// MenuItem = gtk_menu_item_new_with_label("Themes (unavailable yet)");
// gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem);
// g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(Callback_menu_Themes), NULL);
/* HELP MENU */
Button = gtk_menu_item_new_with_label("Help");
gtk_menu_shell_append(GTK_MENU_SHELL(global->Menu), Button);
Menu = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(Button), Menu);
MenuItem = gtk_menu_item_new_with_label("Index...");
gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem);
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(interface_create_helpwin), NULL);
MenuItem = gtk_menu_item_new_with_label("About...");
gtk_menu_shell_append(GTK_MENU_SHELL(Menu), MenuItem);
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(interface_create_aboutwin), NULL);
global->InfoLabel = gtk_label_new(NULL);
gtk_widget_set_margin_top(global->InfoLabel, 0);
gtk_widget_set_margin_bottom(global->InfoLabel, 3);
#if GTK_CHECK_VERSION(3,12,0)
gtk_widget_set_margin_start(global->InfoLabel, 3);
gtk_widget_set_margin_end(global->InfoLabel, 3);
#else /* GTK_CHECK_VERSION(3,12,0) */
gtk_widget_set_margin_left(global->InfoLabel, 3);
gtk_widget_set_margin_right(global->InfoLabel, 3);
#endif /* GTK_CHECK_VERSION(3,12,0) */
gtk_widget_set_halign(global->InfoLabel, GTK_ALIGN_START);
gtk_widget_set_valign(global->InfoLabel, GTK_ALIGN_CENTER);
gtk_box_pack_end(GTK_BOX(global->MainBox), global->InfoLabel, FALSE, FALSE, 0);
gtk_widget_show_all(global->MainWin);
/* Light theme */
global->bg_green = "#c8ffc8";
global->bg_red = "#ffc8c8";
GtkStyleContext *stylecontext = gtk_widget_get_style_context(global->MainWin);
if (!stylecontext) {
return;
}
GdkRGBA rgba;
gtk_style_context_get_color(stylecontext, GTK_STATE_FLAG_NORMAL, &rgba);
if (rgba.red * 0.2126 + rgba.green * 0.7152 + rgba.blue * 0.0722 > 0.5) {
/* Dark theme */
global->bg_green = "#007000";
global->bg_red = "#700000";
}
}
void interface_create_getgamespage(bool autoconnect) {
//global->MainBox
//global->MainVerticalBox
GtkWidget *GameFrame;
GtkWidget *GameListVBox;
GtkWidget *GameScrollwin;
GtkWidget *GameList;
GtkWidget *ConnectButton;
GtkTreeSelection *select;
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
global->phase = PHASE_GETGAMES;
interface_unparent_chat();
if (global->MainVerticalBox) gtk_widget_destroy(global->MainVerticalBox);
global->MainVerticalBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 3);
gtk_container_set_border_width(GTK_CONTAINER(global->MainVerticalBox), 3);
gtk_box_pack_start(GTK_BOX(global->MainBox), global->MainVerticalBox, TRUE, TRUE, 0);
g_signal_connect(G_OBJECT(global->MainVerticalBox), "destroy", G_CALLBACK(CallBack_get_games_page_destroyed), NULL);
/* list of open game & gametype */
GameFrame = gtk_frame_new("Create or join a monopd game");
gtk_box_pack_start(GTK_BOX(global->MainVerticalBox), GameFrame, TRUE, TRUE, 0);
GameListVBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add(GTK_CONTAINER(GameFrame), GameListVBox);
/* Game list container */
GameScrollwin = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(GameScrollwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_set_border_width(GTK_CONTAINER(GameScrollwin), 2);
gtk_box_pack_start(GTK_BOX(GameListVBox), GameScrollwin, TRUE, TRUE, 0);
/* Game list */
GameList = gtk_tree_view_new();
gtk_container_add(GTK_CONTAINER(GameScrollwin), GameList);
select = gtk_tree_view_get_selection(GTK_TREE_VIEW(GameList));
gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE);
g_signal_connect(G_OBJECT(select), "changed", G_CALLBACK(Callback_GetGame_Select), NULL);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("Host", renderer, "text", GAMELIST_COLUMN_HOST, "cell-background", GAMELIST_COLUMN_BGCOLOR, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(GameList), column);
column = gtk_tree_view_column_new_with_attributes("Version", renderer, "text", GAMELIST_COLUMN_VERSION, "cell-background", GAMELIST_COLUMN_BGCOLOR, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(GameList), column);
column = gtk_tree_view_column_new_with_attributes("Game", renderer, "text", GAMELIST_COLUMN_GAME, "cell-background", GAMELIST_COLUMN_BGCOLOR, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(GameList), column);
column = gtk_tree_view_column_new_with_attributes("Status", renderer, "text", GAMELIST_COLUMN_STATUS, "cell-background", GAMELIST_COLUMN_BGCOLOR, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(GameList), column);
column = gtk_tree_view_column_new_with_attributes("Players", renderer, "text", GAMELIST_COLUMN_PLAYERS, "cell-background", GAMELIST_COLUMN_BGCOLOR, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(GameList), column);
global->game_store = gtk_list_store_new(GAMELIST_COLUMN_NUM, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INT);
gtk_tree_view_set_model(GTK_TREE_VIEW(GameList), GTK_TREE_MODEL(global->game_store));
g_object_unref(global->game_store);
/* Server list */
global->server_store = gtk_list_store_new(SERVERLIST_COLUMN_NUM, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT);
/* big connect button */
ConnectButton = gtk_button_new_with_label("Select a game");
gtk_widget_set_size_request(ConnectButton, 150, -1);
gtk_container_set_border_width(GTK_CONTAINER(ConnectButton), 3);
gtk_widget_set_sensitive(ConnectButton, FALSE);
gtk_box_pack_start(GTK_BOX(GameListVBox), ConnectButton, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(ConnectButton), "clicked", G_CALLBACK(Callback_ConnectButton), NULL);
g_object_set_data(G_OBJECT(global->MainVerticalBox), "connect_button", ConnectButton);
GtkWidget *MenuItem;
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "connect_to_server");
gtk_widget_set_sensitive(MenuItem, TRUE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "connect_to_metaserver");
gtk_widget_set_sensitive(MenuItem, TRUE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "public_server_list");
gtk_widget_set_sensitive(MenuItem, FALSE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "change_nickname");
gtk_widget_set_sensitive(MenuItem, FALSE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "show_estate_tree");
gtk_widget_set_sensitive(MenuItem, FALSE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "upgrade_spectator");
gtk_widget_set_sensitive(MenuItem, FALSE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "reconnect");
gtk_widget_set_sensitive(MenuItem, game_cookie_available());
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "leave_game");
gtk_widget_set_sensitive(MenuItem, FALSE);
gtk_widget_show_all(global->MainVerticalBox);
/* autoconnect to server */
if (autoconnect) {
if (config->metaserver_autoconnect) {
create_connection_metaserver();
}
if (config->getgames_autoconnect) {
create_connection_get_games(config->getgames_host, config->getgames_port);
}
}
}
void interface_create_gameconfigpage() {
//global->MainBox
//global->MainVerticalBox
GtkWidget *HorizontalBox;
GtkWidget *VerticalBoxLeft;
GtkWidget *ChatFrame;
//currentgame->ChatBox
GtkWidget *VerticalBoxRight;
GtkWidget *PlayerScrollwin;
GtkWidget *PlayerListFrame;
GtkWidget *ConfigurationFrame;
//currentgame->GameConfigBox
GtkWidget *HorizontalBoxButton;
GtkWidget *StartButton;
GtkWidget *LeaveButton;
GtkTreeSelection *select;
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
GtkListStore *store;
global->phase = PHASE_GAMECREATE;
interface_unparent_chat();
gtk_widget_destroy(global->MainVerticalBox);
global->MainVerticalBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_set_border_width(GTK_CONTAINER(global->MainVerticalBox), 3);
gtk_box_pack_start(GTK_BOX(global->MainBox), global->MainVerticalBox, TRUE, TRUE, 0);
/* main horizontal box */
HorizontalBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3);
gtk_box_pack_start(GTK_BOX(global->MainVerticalBox), HorizontalBox, TRUE, TRUE, 0);
VerticalBoxLeft = gtk_box_new(GTK_ORIENTATION_VERTICAL, 3);
gtk_box_pack_start(GTK_BOX(HorizontalBox), VerticalBoxLeft, TRUE, TRUE, 0);
/* player list frame */
PlayerListFrame = gtk_frame_new("Players");
gtk_widget_set_size_request(PlayerListFrame, -1, 180);
gtk_box_pack_start(GTK_BOX(VerticalBoxLeft), PlayerListFrame, FALSE, FALSE, 0);
PlayerScrollwin = gtk_scrolled_window_new(NULL, NULL);
gtk_container_set_border_width(GTK_CONTAINER(PlayerScrollwin), 2);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(PlayerScrollwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(PlayerListFrame), PlayerScrollwin);
/* player list */
currentgame->PlayerList = gtk_tree_view_new();
gtk_container_add(GTK_CONTAINER(PlayerScrollwin), currentgame->PlayerList);
select = gtk_tree_view_get_selection(GTK_TREE_VIEW(currentgame->PlayerList));
gtk_tree_selection_set_mode(select, GTK_SELECTION_NONE);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("Name", renderer, "text", PLAYERLIST_COLUMN_NAME, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(currentgame->PlayerList), column);
column = gtk_tree_view_column_new_with_attributes("Host", renderer, "text", PLAYERLIST_COLUMN_HOST, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(currentgame->PlayerList), column);
store = gtk_list_store_new(PLAYERLIST_COLUMN_NUM, G_TYPE_STRING, G_TYPE_STRING);
gtk_tree_view_set_model(GTK_TREE_VIEW(currentgame->PlayerList), GTK_TREE_MODEL(store));
g_object_unref(store);
/* chat frame */
ChatFrame = gtk_frame_new("Chat");
gtk_box_pack_start(GTK_BOX(VerticalBoxLeft), ChatFrame, TRUE, TRUE, 0);
interface_create_chat(ChatFrame);
/* vertical box right */
VerticalBoxRight = gtk_box_new(GTK_ORIENTATION_VERTICAL, 3);
gtk_box_pack_start(GTK_BOX(HorizontalBox), VerticalBoxRight, FALSE, FALSE, 0);
/* game configuration frame */
ConfigurationFrame = gtk_frame_new("Game configuration");
gtk_box_pack_start(GTK_BOX(VerticalBoxRight), ConfigurationFrame, FALSE, FALSE, 0);
/* config box might already been created by early events */
if (!currentgame->GameConfigBox) {
currentgame->GameConfigBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
}
gtk_container_set_border_width(GTK_CONTAINER(currentgame->GameConfigBox), 5);
gtk_container_add(GTK_CONTAINER(ConfigurationFrame), currentgame->GameConfigBox);
/* horizontal box button */
HorizontalBoxButton = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3);
gtk_box_pack_end(GTK_BOX(VerticalBoxRight), HorizontalBoxButton, FALSE, FALSE, 0);
/* leave button */
LeaveButton = gtk_button_new_with_label("Leave game");
gtk_box_pack_start(GTK_BOX(HorizontalBoxButton), LeaveButton, TRUE, TRUE, 0);
g_signal_connect(G_OBJECT(LeaveButton), "clicked", G_CALLBACK(CallBack_menu_LeaveGame), NULL);
/* start button */
StartButton = gtk_button_new_with_label("Start game");
gtk_widget_set_sensitive(StartButton, (global->my_playerid == currentgame->master));
gtk_box_pack_start(GTK_BOX(HorizontalBoxButton), StartButton, TRUE, TRUE, 0);
g_signal_connect(G_OBJECT(StartButton), "clicked", G_CALLBACK(Callback_StartButton), NULL);
g_object_set_data(G_OBJECT(global->MainVerticalBox), "start_button", StartButton);
GtkWidget *MenuItem;
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "connect_to_server");
gtk_widget_set_sensitive(MenuItem, FALSE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "connect_to_metaserver");
gtk_widget_set_sensitive(MenuItem, FALSE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "public_server_list");
gtk_widget_set_sensitive(MenuItem, FALSE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "change_nickname");
gtk_widget_set_sensitive(MenuItem, TRUE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "show_estate_tree");
gtk_widget_set_sensitive(MenuItem, FALSE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "upgrade_spectator");
gtk_widget_set_sensitive(MenuItem, FALSE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "reconnect");
gtk_widget_set_sensitive(MenuItem, FALSE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "leave_game");
gtk_widget_set_sensitive(MenuItem, TRUE);
gtk_widget_show_all(global->MainVerticalBox);
}
void interface_create_gameinitpage() {
//global->MainBox
//global->MainVerticalBox
GtkWidget *Label;
global->phase = PHASE_GAMEINIT;
interface_unparent_chat();
gtk_widget_destroy(global->MainVerticalBox);
global->MainVerticalBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_box_pack_start(GTK_BOX(global->MainBox), global->MainVerticalBox, TRUE, TRUE, 0);
/* text */
Label = gtk_label_new("Please wait while loading...");
gtk_widget_set_halign(Label, GTK_ALIGN_CENTER);
gtk_widget_set_valign(Label, GTK_ALIGN_CENTER);
gtk_box_pack_start(GTK_BOX(global->MainVerticalBox), Label, TRUE, TRUE, 0);
gtk_widget_show_all(global->MainVerticalBox);
/* We are going to receive events before game is in running state */
currentgame->BoardCenter = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
display_init();
while(gtk_events_pending()) gtk_main_iteration();
}
void interface_create_gameboardpage() {
//global->MainBox
//global->MainVerticalBox
GtkWidget *MainHorizontalBox;
GtkWidget *VerticalBoxPlayerlistChat;
//currentgame->PlayerList
GtkWidget *PlayerSeparator;
GtkWidget *ChatFrame;
//call interface_create_chat
GtkWidget *FixedBoard;
GtkWidget *EventBox;
//currentgame->BoardCenter;
//currentgame->estate[].gdkrgb
GtkWidget *EstatePopupMenu;
eng_frame *board_frame;
eng_obj *pic;
gint32 i, j, star, houses;
gchar *text, *tmp1, *tmp2;
player *p;
GtkWidget *MenuItem;
global->phase = PHASE_GAMEPLAY;
interface_unparent_chat();
gtk_widget_destroy(global->MainVerticalBox);
global->MainVerticalBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 3);
gtk_container_set_border_width(GTK_CONTAINER(global->MainVerticalBox), 3);
gtk_box_pack_start(GTK_BOX(global->MainBox), global->MainVerticalBox, TRUE, TRUE, 0);
/* horizontal box for board / player status */
MainHorizontalBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3);
gtk_box_pack_start(GTK_BOX(global->MainVerticalBox), MainHorizontalBox, TRUE, TRUE, 0);
/* vertical box for player and chat */
VerticalBoxPlayerlistChat = gtk_box_new(GTK_ORIENTATION_VERTICAL, 3);
if(config->game_playerlist_position == GAME_PLAYERLIST_POS_RIGHT)
gtk_box_pack_end(GTK_BOX(MainHorizontalBox), VerticalBoxPlayerlistChat, TRUE, FALSE, 0);
else /* left (default) */
gtk_box_pack_start(GTK_BOX(MainHorizontalBox), VerticalBoxPlayerlistChat, TRUE, TRUE, 0);
gtk_widget_set_hexpand(VerticalBoxPlayerlistChat, TRUE);
gtk_widget_set_vexpand(VerticalBoxPlayerlistChat, TRUE);
/* players */
currentgame->PlayerList = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_box_pack_start(GTK_BOX(VerticalBoxPlayerlistChat), currentgame->PlayerList, FALSE, FALSE, 0);
/* first player separator */
PlayerSeparator = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_start(GTK_BOX(currentgame->PlayerList), PlayerSeparator, FALSE, FALSE, 0);
/* chat */
ChatFrame = gtk_frame_new("Chat");
gtk_box_pack_start(GTK_BOX(VerticalBoxPlayerlistChat), ChatFrame, TRUE, TRUE, 0);
interface_create_chat(ChatFrame);
/* board */
board_frame = currentgame->board_frame = eng_frame_create();
eng_frame_set_width(board_frame, data->board_width);
eng_frame_set_height(board_frame, data->board_height);
/* add players */
game_sort_playerlist_by_turnorder();
for (p = player_h; p; p = p->next) {
if (p->spectator) continue;
if (p->game != currentgame->gameid) continue;
interface_gameboard_add_player(p);
}
game_update_tokens();
FixedBoard = gtk_fixed_new();
gtk_box_pack_start(GTK_BOX(MainHorizontalBox), FixedBoard, FALSE, FALSE, 0);
/* board center */
if (!currentgame->BoardCenter) {
currentgame->BoardCenter = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
display_init();
}
gtk_container_set_border_width(GTK_CONTAINER(currentgame->BoardCenter), 0);
gtk_widget_set_size_request( GTK_WIDGET(currentgame->BoardCenter), data->board_center_width, data->board_center_height);
gtk_fixed_put(GTK_FIXED(FixedBoard), currentgame->BoardCenter, data->board_center_x, data->board_center_y);
/* board estates */
for(i = 0 ; i < data->number_estates ; i++) {
j = data->estate[i].buffer_board;
EventBox = gtk_event_box_new();
gtk_fixed_put(GTK_FIXED(FixedBoard), EventBox, data->estate[i].x, data->estate[i].y);
currentgame->estate[i].gdkrgb = gtk_drawing_area_new();
gtk_widget_set_size_request( GTK_WIDGET(currentgame->estate[i].gdkrgb), data->pngfile_board_width[j], data->pngfile_board_height[j] );
gtk_widget_set_events(GTK_WIDGET(currentgame->estate[i].gdkrgb), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
g_object_set_data(G_OBJECT(EventBox), "estateid", GINT_TO_POINTER(i));
g_object_set_data(G_OBJECT(currentgame->estate[i].gdkrgb), "estateid", GINT_TO_POINTER(i));
g_signal_connect_after(G_OBJECT(EventBox), "enter_notify_event", G_CALLBACK(Callback_EnterAnEstate), NULL);
g_signal_connect(G_OBJECT(EventBox), "leave_notify_event", G_CALLBACK(Callback_LeaveAnEstate), NULL);
g_signal_connect(G_OBJECT(EventBox), "button_press_event", G_CALLBACK(Callback_ClicOnEstate), NULL);
g_signal_connect(G_OBJECT(currentgame->estate[i].gdkrgb), "draw", G_CALLBACK(on_board_draw), NULL);
gtk_container_add(GTK_CONTAINER(EventBox), currentgame->estate[i].gdkrgb);
/* building estate popup menu */
EstatePopupMenu = gtk_menu_new();
g_object_set_data(G_OBJECT(EstatePopupMenu), "estateid", GINT_TO_POINTER(i));
g_object_set_data(G_OBJECT(EventBox), "menu", EstatePopupMenu);
MenuItem = gtk_menu_item_new_with_label("Build house");
gtk_menu_shell_append(GTK_MENU_SHELL(EstatePopupMenu), MenuItem);
g_object_set_data(G_OBJECT(MenuItem), "action", GINT_TO_POINTER(ESTATE_ACTION_BUILDHOUSE));
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(CallBack_PopupMenuEstate), NULL);
gtk_widget_show(MenuItem);
MenuItem = gtk_menu_item_new_with_label("Sell house");
gtk_menu_shell_append(GTK_MENU_SHELL(EstatePopupMenu), MenuItem);
g_object_set_data(G_OBJECT(MenuItem), "action", GINT_TO_POINTER(ESTATE_ACTION_SELLHOUSE));
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(CallBack_PopupMenuEstate), NULL);
gtk_widget_show(MenuItem);
MenuItem = gtk_menu_item_new_with_label("(Un)mortage");
gtk_menu_shell_append(GTK_MENU_SHELL(EstatePopupMenu), MenuItem);
g_object_set_data(G_OBJECT(MenuItem), "action", GINT_TO_POINTER(ESTATE_ACTION_MORTGAGE));
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(CallBack_PopupMenuEstate), NULL);
gtk_widget_show(MenuItem);
MenuItem = gtk_menu_item_new_with_label("Sell property");
gtk_menu_shell_append(GTK_MENU_SHELL(EstatePopupMenu), MenuItem);
g_object_set_data(G_OBJECT(MenuItem), "action", GINT_TO_POINTER(ESTATE_ACTION_SELL));
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(CallBack_PopupMenuEstate), NULL);
gtk_widget_show(MenuItem);
/* set ToolTips */
text = g_strdup_printf("%s", currentgame->estate[i].name);
if(currentgame->estate[i].group >= 0) {
tmp1 = text;
tmp2 = g_strdup_printf(" (%s)", currentgame->group[ currentgame->estate[i].group ].name);
text = g_strconcat(tmp1, tmp2, NULL);
g_free(tmp1);
g_free(tmp2);
}
if(currentgame->estate[i].price > 0) {
tmp1 = text;
tmp2 = g_strdup_printf("\nPrice: %d", currentgame->estate[i].price);
text = g_strconcat(tmp1, tmp2, NULL);
g_free(tmp1);
g_free(tmp2);
}
if(currentgame->estate[i].rent[5] > 0) {
tmp1 = text;
tmp2 = g_strdup_printf(
"\nNo house: %d, One: %d, Two: %d, Three: %d, Four: %d, Hotel: %d"
"\nHouse price: %d",
currentgame->estate[i].rent[0], currentgame->estate[i].rent[1], currentgame->estate[i].rent[2], currentgame->estate[i].rent[3], currentgame->estate[i].rent[4], currentgame->estate[i].rent[5],
currentgame->estate[i].houseprice );
text = g_strconcat(tmp1, tmp2, NULL);
g_free(tmp1);
g_free(tmp2);
}
if(currentgame->estate[i].mortgageprice > 0) {
tmp1 = text;
tmp2 = g_strdup_printf("\nMortgage value: %d", currentgame->estate[i].mortgageprice);
text = g_strconcat(tmp1, tmp2, NULL);
g_free(tmp1);
g_free(tmp2);
}
gtk_widget_set_tooltip_text(EventBox, text);
g_free(text);
/* pic for estates / stars / houses */
/* estate */
pic = currentgame->estate[i].pic = eng_pic_create(board_frame);
eng_pic_set_x(pic, data->estate[i].x);
eng_pic_set_y(pic, data->estate[i].y);
eng_pic_set_z(pic, 0);
eng_pic_set_width(pic, data->pngfile_board_width[j]);
eng_pic_set_height(pic, data->pngfile_board_height[j]);
eng_pic_set_pixbuf(pic, data->pngfile_board_buf[j]);
/* star */
pic = currentgame->estate[i].star_pic = eng_pic_create(board_frame);
eng_pic_set_x(pic, data->estate[i].xstar);
eng_pic_set_y(pic, data->estate[i].ystar);
eng_pic_set_z(pic, 1);
/* if estate owned && not mortgaged */
if(currentgame->estate[i].owner > 0 && !currentgame->estate[i].mortgaged) {
star = player_from_id(currentgame->estate[i].owner)->tokenid;
pic = currentgame->estate[i].star_pic;
eng_pic_set_width(pic, data->pngfile_star_width[star]);
eng_pic_set_height(pic, data->pngfile_star_height[star]);
eng_pic_set_pixbuf(pic, data->pngfile_star_buf[star]);
eng_pic_show(pic);
}
/* if estate owned && mortgaged */
else if(currentgame->estate[i].owner > 0 && currentgame->estate[i].mortgaged) {
star = player_from_id(currentgame->estate[i].owner )->tokenid;
pic = currentgame->estate[i].star_pic;
eng_pic_set_width(pic, data->pngfile_star_m_width[star]);
eng_pic_set_height(pic, data->pngfile_star_m_height[star]);
eng_pic_set_pixbuf(pic, data->pngfile_star_m_buf[star]);
eng_pic_show(pic);
}
/* if estate unowned */
else /* if( currentgame->estate[i].owner <= 0 ) */ {
pic = currentgame->estate[i].star_pic;
eng_pic_unshow(pic);
}
/* house image */
pic = currentgame->estate[i].house_pic = eng_pic_create(board_frame);
eng_pic_set_x(pic, data->estate[i].xhouse);
eng_pic_set_y(pic, data->estate[i].yhouse);
eng_pic_set_z(pic, 1);
houses = currentgame->estate[i].houses;
if(houses <= 0) {
pic = currentgame->estate[i].house_pic;
eng_pic_unshow(pic);
}
else if(houses > 0 && data->estate[i].type_house == TYPE_HOUSE_HORIZONTAL) {
pic = currentgame->estate[i].house_pic;
eng_pic_set_width(pic, data->pngfile_horiz_house_width[ houses ]);
eng_pic_set_height(pic, data->pngfile_horiz_house_height[ houses ]);
eng_pic_set_pixbuf(pic, data->pngfile_horiz_house_buf[ houses ]);
eng_pic_show(pic);
}
else if(houses > 0 && data->estate[i].type_house == TYPE_HOUSE_VERTICAL) {
pic = currentgame->estate[i].house_pic;
eng_pic_set_width(pic, data->pngfile_vert_house_width[ houses ]);
eng_pic_set_height(pic, data->pngfile_vert_house_height[ houses ]);
eng_pic_set_pixbuf(pic, data->pngfile_vert_house_buf[ houses ]);
eng_pic_show(pic);
}
}
/* board first draw */
eng_create_frame(board_frame);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "connect_to_server");
gtk_widget_set_sensitive(MenuItem, FALSE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "connect_to_metaserver");
gtk_widget_set_sensitive(MenuItem, FALSE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "public_server_list");
gtk_widget_set_sensitive(MenuItem, FALSE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "change_nickname");
gtk_widget_set_sensitive(MenuItem, TRUE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "show_estate_tree");
gtk_widget_set_sensitive(MenuItem, TRUE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "reconnect");
gtk_widget_set_sensitive(MenuItem, FALSE);
MenuItem = g_object_get_data(G_OBJECT(global->Menu), "leave_game");
gtk_widget_set_sensitive(MenuItem, TRUE);
gtk_widget_show_all(global->MainVerticalBox);
}
void interface_gameboard_add_player(player *p) {
GtkWidget *PlayerHorizontalBox;
GtkWidget *PlayerGrid;
GtkWidget *PlayerPopupMenu;
GtkWidget *PlayerSeparator;
GtkWidget *EventBox;
GtkWidget *MenuItem;
gint32 i;
eng_obj *pic;
if (global->phase < PHASE_GAMEPLAY) return;
if (p->spectator) return;
if (p->game != currentgame->gameid) return;
if (p->playerlist_LabelNamePlayer) return; /* already created */
/* select a token which is not already chosen */
for (i = 0; i <= data->token_max; i++) {
player *q;
for (q = player_h; q; q = q->next) {
if (q->spectator) continue;
if (q->game != currentgame->gameid) continue;
if (q->tokenid == i) break;
}
if (!q) {
p->tokenid = i;
break;
}
}
if (p->tokenid < 0) {
return;
}
p->playerlist_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_box_pack_start(GTK_BOX(currentgame->PlayerList), p->playerlist_box, FALSE, FALSE, 0);
/* event box */
EventBox = gtk_event_box_new();
gtk_widget_set_halign(EventBox, GTK_ALIGN_START);
gtk_widget_set_valign(EventBox, GTK_ALIGN_CENTER);
g_signal_connect(G_OBJECT(EventBox), "button_press_event", G_CALLBACK(Callback_ClicOnPlayer), NULL);
gtk_box_pack_start(GTK_BOX(p->playerlist_box), EventBox, FALSE, FALSE, 0);
/* box which contain all widgets for a player */
PlayerHorizontalBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_container_add(GTK_CONTAINER(EventBox), PlayerHorizontalBox);
/* building popup player menu */
PlayerPopupMenu = gtk_menu_new();
g_object_set_data(G_OBJECT(PlayerPopupMenu), "player", p);
g_object_set_data(G_OBJECT(EventBox), "menu", PlayerPopupMenu);
MenuItem = gtk_menu_item_new_with_label("Initiate a trade");
gtk_menu_shell_append(GTK_MENU_SHELL(PlayerPopupMenu), MenuItem);
g_object_set_data(G_OBJECT(MenuItem), "action", GINT_TO_POINTER(PLAYER_ACTION_TRADE));
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(CallBack_PopupMenuPlayer), NULL);
gtk_widget_show(MenuItem);
MenuItem = gtk_menu_item_new();
gtk_menu_shell_append(GTK_MENU_SHELL(PlayerPopupMenu), MenuItem);
gtk_widget_show(MenuItem);
MenuItem = gtk_menu_item_new_with_label("Request version");
gtk_menu_shell_append(GTK_MENU_SHELL(PlayerPopupMenu), MenuItem);
g_object_set_data(G_OBJECT(MenuItem), "action", GINT_TO_POINTER(PLAYER_ACTION_VERSION));
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(CallBack_PopupMenuPlayer), NULL);
gtk_widget_show(MenuItem);
MenuItem = gtk_menu_item_new_with_label("Request date");
gtk_menu_shell_append(GTK_MENU_SHELL(PlayerPopupMenu), MenuItem);
g_object_set_data(G_OBJECT(MenuItem), "action", GINT_TO_POINTER(PLAYER_ACTION_DATE));
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(CallBack_PopupMenuPlayer), NULL);
gtk_widget_show(MenuItem);
MenuItem = gtk_menu_item_new_with_label("Request ping");
gtk_menu_shell_append(GTK_MENU_SHELL(PlayerPopupMenu), MenuItem);
g_object_set_data(G_OBJECT(MenuItem), "action", GINT_TO_POINTER(PLAYER_ACTION_PING));
g_signal_connect(G_OBJECT(MenuItem), "activate", G_CALLBACK(CallBack_PopupMenuPlayer), NULL);
gtk_widget_show(MenuItem);
/* token player in playerlist */
p->playerlist_token_gdkrgb = gtk_drawing_area_new();
gtk_widget_set_size_request(p->playerlist_token_gdkrgb, data->playerlist_token_width, data->playerlist_token_height );
gtk_widget_set_halign(p->playerlist_token_gdkrgb, GTK_ALIGN_CENTER);
gtk_widget_set_valign(p->playerlist_token_gdkrgb, GTK_ALIGN_CENTER);
gtk_box_pack_start(GTK_BOX(PlayerHorizontalBox), p->playerlist_token_gdkrgb, TRUE, TRUE, 0);
g_signal_connect(G_OBJECT(p->playerlist_token_gdkrgb), "draw", G_CALLBACK(on_playertoken_draw), NULL);
g_object_set_data(G_OBJECT(p->playerlist_token_gdkrgb), "player", p);
/* name, money, cards owned by player */
PlayerGrid = gtk_grid_new();
gtk_grid_set_row_spacing(GTK_GRID(PlayerGrid), 0);
gtk_grid_set_column_spacing(GTK_GRID(PlayerGrid), 0);
gtk_box_pack_start(GTK_BOX(PlayerHorizontalBox), PlayerGrid, FALSE, FALSE, 0);
/* cards */
p->playerlist_cards_gdkrgb = gtk_drawing_area_new();
gtk_widget_set_size_request( GTK_WIDGET(p->playerlist_cards_gdkrgb), data->playerlist_cards_width, data->playerlist_cards_height );
gtk_grid_attach(GTK_GRID(PlayerGrid), p->playerlist_cards_gdkrgb, 0, 1, 2, 1);
g_signal_connect(G_OBJECT(p->playerlist_cards_gdkrgb), "draw", G_CALLBACK(on_playercards_draw), NULL);
g_object_set_data(G_OBJECT(p->playerlist_cards_gdkrgb), "player", p);
/* name */
p->playerlist_LabelNamePlayer = gtk_label_new(NULL);
gtk_widget_set_halign(p->playerlist_LabelNamePlayer, GTK_ALIGN_START);
gtk_widget_set_valign(p->playerlist_LabelNamePlayer, GTK_ALIGN_CENTER);
gtk_grid_attach(GTK_GRID(PlayerGrid), p->playerlist_LabelNamePlayer, 0, 0, 1, 1);
if(p->hasturn) {
gchar *tmp = g_markup_printf_escaped("%s", p->name);
gtk_label_set_markup(GTK_LABEL(p->playerlist_LabelNamePlayer), tmp);
g_free(tmp);
} else {
gchar *tmp = g_markup_printf_escaped("%s", p->name);
gtk_label_set_markup(GTK_LABEL(p->playerlist_LabelNamePlayer), tmp);
g_free(tmp);
}
/* money */
p->playerlist_LabelMoneyPlayer = gtk_label_new(NULL);
gtk_widget_set_halign(p->playerlist_LabelMoneyPlayer, GTK_ALIGN_END);
gtk_widget_set_valign(p->playerlist_LabelMoneyPlayer, GTK_ALIGN_CENTER);
gtk_grid_attach(GTK_GRID(PlayerGrid), p->playerlist_LabelMoneyPlayer, 1, 0, 1, 1);
if(p->hasturn) {
gchar *tmp = g_markup_printf_escaped("%d", p->money);
gtk_label_set_markup(GTK_LABEL(p->playerlist_LabelMoneyPlayer), tmp);
g_free(tmp);
} else {
gchar *tmp = g_markup_printf_escaped("%d", p->money);
gtk_label_set_markup(GTK_LABEL(p->playerlist_LabelMoneyPlayer), tmp);
g_free(tmp);
}
/* playerlist token frame */
eng_frame *token_frame = p->playerlist_token_frame = eng_frame_create();
eng_frame_set_width(token_frame, data->playerlist_token_width);
eng_frame_set_height(token_frame, data->playerlist_token_height);
/* playerlist token pic */
pic = p->playerlist_token_pic = eng_pic_create(token_frame);
eng_pic_set_x(pic, (data->playerlist_token_width - data->pngfile_token_width[p->tokenid]) / 2);
eng_pic_set_y(pic, (data->playerlist_token_height - data->pngfile_token_height[p->tokenid]) / 2);
eng_pic_set_z(pic, 0);
eng_pic_set_width(pic, data->pngfile_token_width[p->tokenid]);
eng_pic_set_height(pic, data->pngfile_token_height[p->tokenid]);
eng_pic_set_pixbuf(pic, data->pngfile_token_buf[p->tokenid]);
/* draw token */
eng_create_frame(token_frame);
/* engine frame cards */
eng_frame *card_frame = p->playerlist_cards_frame = eng_frame_create();
eng_frame_set_width(card_frame, data->playerlist_cards_width);
eng_frame_set_height(card_frame, data->playerlist_cards_height);
/* cards */
for(i = 0; i < data->number_playerlist_card; i++) {
gint32 t;
pic = p->playerlist_cards_pic[i] = eng_pic_create(card_frame);
eng_pic_set_x(pic, data->playerlist_card[i].x);
eng_pic_set_y(pic, data->playerlist_card[i].y);
eng_pic_set_z(pic, data->playerlist_card[i].z);
t = data->playerlist_card[i].buffer_card;
eng_pic_set_width(pic, data->pngfile_card_width[t]);
eng_pic_set_height(pic, data->pngfile_card_height[t]);
if(currentgame->estate[ data->playerlist_card[i].estateid ].owner == (gint32)p->playerid) {
if(currentgame->estate[ data->playerlist_card[i].estateid ].mortgaged) {
eng_pic_set_alpha(pic, data->playerlist_cards_alphamortgage);
eng_pic_set_bgcolor(pic, data->playerlist_cards_cardbgcolormortgage);
}
else {
eng_pic_set_alpha(pic, data->playerlist_cards_alphaowned);
eng_pic_set_bgcolor(pic, data->playerlist_cards_cardbgcolor);
}
}
else {
eng_pic_set_alpha(pic, data->playerlist_cards_alphaunowned);
eng_pic_set_bgcolor(pic, data->playerlist_cards_cardbgcolor);
}
eng_pic_set_pixbuf(pic, data->pngfile_card_buf[t]);
}
/* draw cards */
eng_create_frame(card_frame);
/* token on board */
pic = p->token_pic = eng_pic_create(currentgame->board_frame);
eng_pic_set_z(pic, 1);
eng_pic_set_width(pic, data->pngfile_token_width[p->tokenid]);
eng_pic_set_height(pic, data->pngfile_token_height[p->tokenid]);
eng_pic_set_pixbuf(pic, data->pngfile_token_buf[p->tokenid]);
if (p->bankrupt) {
eng_pic_unshow(pic);
}
/* set token location to target location */
p->location = p->location_to;
/* separator */
PlayerSeparator = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_start(GTK_BOX(p->playerlist_box), PlayerSeparator, FALSE, FALSE, 0);
gtk_widget_show_all(p->playerlist_box);
}
void interface_gameboard_remove_player(player *p) {
gint32 i;
if (global->phase < PHASE_GAMEPLAY) return;
if (p->spectator) return;
eng_pic_destroy(p->token_pic);
p->token_pic = NULL;
p->tokenid = -1;
if (p->playerlist_box) {
gtk_widget_destroy(p->playerlist_box);
p->playerlist_box = NULL;
p->playerlist_LabelNamePlayer = NULL;
p->playerlist_LabelMoneyPlayer = NULL;
p->playerlist_cards_gdkrgb = NULL;
p->playerlist_token_gdkrgb = NULL;
}
eng_frame_destroy(p->playerlist_token_frame);
p->playerlist_token_frame = NULL;
p->playerlist_token_pic = NULL;
eng_frame_destroy(p->playerlist_cards_frame);
p->playerlist_cards_frame = NULL;
for (i = 0; i < MAX_PLAYERLIST_CARDS; i++) {
p->playerlist_cards_pic[i] = NULL;
}
}
gboolean interface_chat_scroll_to_the_end(gpointer data) {
GtkWidget *widget = GTK_WIDGET(data);
GtkTextBuffer *textbuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget));
GtkTextMark *textmark = gtk_text_buffer_get_mark(textbuff, "endmark");
gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(widget), textmark, 0.0, FALSE, 0.0, 0.0);
return FALSE;
}
void interface_create_chat(GtkWidget *container) {
//currentgame->ChatBox
GtkWidget *ChatScrolledWindow;
//currentgame->Chat
GtkWidget *SendEntry;
GtkTextBuffer *textbuff;
GtkTextIter textiter;
if(! currentgame) return;
/* already created */
if(currentgame->ChatBox) {
gtk_container_add(GTK_CONTAINER(container), currentgame->ChatBox);
g_object_unref(G_OBJECT(currentgame->ChatBox));
/* This is a bit ugly but I could not find a better way */
g_timeout_add(100, interface_chat_scroll_to_the_end, currentgame->Chat);
return;
}
currentgame->ChatBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_widget_set_size_request(currentgame->ChatBox, -1, 160);
gtk_container_add(GTK_CONTAINER(container), currentgame->ChatBox);
/* Create a scrolled window and put the textview in it */
ChatScrolledWindow = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ChatScrolledWindow),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_box_pack_start(GTK_BOX(currentgame->ChatBox), ChatScrolledWindow, TRUE, TRUE, 0);
currentgame->Chat = gtk_text_view_new();
gtk_text_view_set_editable(GTK_TEXT_VIEW(currentgame->Chat), FALSE);
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(currentgame->Chat), GTK_WRAP_CHAR);
textbuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(currentgame->Chat));
gtk_text_buffer_get_end_iter(textbuff, &textiter);
gtk_text_buffer_create_mark(textbuff, "endmark", &textiter, FALSE);
gtk_container_add(GTK_CONTAINER(ChatScrolledWindow), currentgame->Chat);
/* send entry */
SendEntry = gtk_entry_new();
gtk_box_pack_start(GTK_BOX(currentgame->ChatBox), SendEntry, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(SendEntry), "activate", G_CALLBACK(Callback_SendButton), (gpointer)SendEntry);
}
void interface_unparent_chat() {
if(! currentgame) return;
if(! currentgame->ChatBox) return;
GtkWidget *parent = gtk_widget_get_parent(currentgame->ChatBox);
if (parent == NULL) {
return;
}
g_object_ref(G_OBJECT(currentgame->ChatBox));
gtk_container_remove(GTK_CONTAINER(parent), currentgame->ChatBox);
}
void interface_create_auctionbox(gint32 auctionid, gint32 estateid) {
GtkWidget *vbox;
GtkWidget *PlayerScrollwin;
GtkWidget *PlayerList;
GtkWidget *hbox_entry;
GtkWidget *entry;
GtkWidget *hbox_buttons;
GtkWidget *button;
GtkWidget *label;
GtkTreeIter iter;
GtkTreeSelection *select;
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
GtkListStore *store;
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 15);
g_object_set_data(G_OBJECT(currentgame->BoardCenter), "auctionbox", vbox);
gtk_box_pack_start(GTK_BOX(currentgame->BoardCenter), vbox, TRUE, TRUE, 0);
label = gtk_label_new(NULL);
gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
gtk_widget_set_halign(label, GTK_ALIGN_CENTER);
gtk_widget_set_valign(label, GTK_ALIGN_CENTER);
gtk_widget_set_margin_bottom(label, 15);
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
gchar *tmp = g_markup_printf_escaped("%s", currentgame->estate[estateid].name);
gtk_label_set_markup(GTK_LABEL(label), tmp);
g_free(tmp);
/* player list */
PlayerScrollwin = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(PlayerScrollwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_box_pack_start(GTK_BOX(vbox), PlayerScrollwin, TRUE, TRUE, 0);
PlayerList = gtk_tree_view_new();
gtk_container_add(GTK_CONTAINER(PlayerScrollwin), PlayerList);
select = gtk_tree_view_get_selection(GTK_TREE_VIEW(PlayerList));
gtk_tree_selection_set_mode(select, GTK_SELECTION_NONE);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("Player", renderer, "text", AUCTIONPLAYERLIST_COLUMN_NAME, "weight", AUCTIONPLAYERLIST_WEIGHT, "weight-set", AUCTIONPLAYERLIST_WEIGHTSET, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(PlayerList), column);
column = gtk_tree_view_column_new_with_attributes("Bid", renderer, "text", AUCTIONPLAYERLIST_COLUMN_BID, "weight", AUCTIONPLAYERLIST_WEIGHT, "weight-set", AUCTIONPLAYERLIST_WEIGHTSET, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(PlayerList), column);
store = gtk_list_store_new(AUCTIONPLAYERLIST_COLUMN_NUM, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);
g_object_set_data(G_OBJECT(currentgame->BoardCenter), "auction_store", store);
gtk_tree_view_set_model(GTK_TREE_VIEW(PlayerList), GTK_TREE_MODEL(store));
g_object_unref(store);
player *p;
for (p = player_h; p; p = p->next) {
if (p->spectator) continue;
if (p->game != currentgame->gameid) continue;
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
AUCTIONPLAYERLIST_COLUMN_NAME, p->name,
AUCTIONPLAYERLIST_COLUMN_BID, 0,
AUCTIONPLAYERLIST_COLUMN_PLAYERID, p->playerid,
AUCTIONPLAYERLIST_WEIGHT, PANGO_WEIGHT_NORMAL,
AUCTIONPLAYERLIST_WEIGHTSET, TRUE,
-1);
}
/* Status label */
label = gtk_label_new(NULL);
gtk_widget_set_halign(label, GTK_ALIGN_START);
gtk_widget_set_valign(label, GTK_ALIGN_CENTER);
gtk_widget_set_margin_top(label, 2);
gtk_widget_set_margin_bottom(label, 2);
g_object_set_data(G_OBJECT(currentgame->BoardCenter), "auction_statuslabel", label);
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
/* commands */
hbox_entry = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
/* send entry */
entry = gtk_entry_new();
gtk_box_pack_start(GTK_BOX(hbox_entry), entry, FALSE, FALSE, 0);
gtk_entry_set_width_chars(GTK_ENTRY(entry), 4);
g_object_set_data(G_OBJECT(entry), "auctionid", GINT_TO_POINTER(auctionid));
g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(Callback_AuctionButton_Absolute), (gpointer)entry);
button = gtk_button_new_with_label("Bid");
gtk_box_pack_start(GTK_BOX(hbox_entry), button, FALSE, FALSE, 0);
g_object_set_data(G_OBJECT(button), "auctionid", GINT_TO_POINTER(auctionid));
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(Callback_AuctionButton_Absolute), (gpointer)entry);
/* quick button */
hbox_buttons = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
button = gtk_button_new_with_label("+1");
g_object_set_data(G_OBJECT(button), "value_add", GINT_TO_POINTER(1));
g_object_set_data(G_OBJECT(button), "auctionid", GINT_TO_POINTER(auctionid));
gtk_box_pack_start(GTK_BOX(hbox_buttons), button, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(Callback_AuctionButton_Relative), NULL);
button = gtk_button_new_with_label("+10");
g_object_set_data(G_OBJECT(button), "value_add", GINT_TO_POINTER(10));
g_object_set_data(G_OBJECT(button), "auctionid", GINT_TO_POINTER(auctionid));
gtk_box_pack_start(GTK_BOX(hbox_buttons), button, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(Callback_AuctionButton_Relative), NULL);
button = gtk_button_new_with_label("+50");
g_object_set_data(G_OBJECT(button), "value_add", GINT_TO_POINTER(50));
g_object_set_data(G_OBJECT(button), "auctionid", GINT_TO_POINTER(auctionid));
gtk_box_pack_start(GTK_BOX(hbox_buttons), button, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(Callback_AuctionButton_Relative), NULL);
button = gtk_button_new_with_label("+100");
g_object_set_data(G_OBJECT(button), "value_add", GINT_TO_POINTER(100));
g_object_set_data(G_OBJECT(button), "auctionid", GINT_TO_POINTER(auctionid));
gtk_box_pack_start(GTK_BOX(hbox_buttons), button, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(Callback_AuctionButton_Relative), NULL);
gtk_box_pack_start(GTK_BOX(vbox), hbox_buttons, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox_entry, FALSE, FALSE, 0);
gtk_widget_show_all(vbox);
}
/* create about window */
void interface_create_aboutwin()
{
const char *const authors[] = {
"Sylvain Rochet ",
"Xavier Amado ",
NULL
};
gtk_show_about_dialog(GTK_WINDOW(global->MainWin),
"authors", authors,
"comments", "irc.freenode.net #gtkatlantic",
"license-type", GTK_LICENSE_GPL_2_0,
"logo-icon-name", "gtkatlantic",
"program-name", "GtkAtlantic",
"version", VERSION,
"website", "http://gtkatlantic.gradator.net",
NULL);
}
/* create config panel */
void interface_create_config_panel() {
//global->ConfigWin;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *Frame;
GtkWidget *hboxFrame;
GtkWidget *vboxFrame;
GtkWidget *Label;
GtkWidget *CButton;
GtkWidget *Entry;
GtkWidget *Combo;
GtkAdjustment *Adjust;
GtkWidget *Scale;
GtkWidget *Button;
gchar *text;
if(global->ConfigWin) return;
global->ConfigWin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(global->ConfigWin), "GtkAtlantic: Configuration");
g_signal_connect(G_OBJECT(global->ConfigWin), "delete_event", G_CALLBACK(gtk_widget_destroy), NULL);
g_signal_connect(G_OBJECT(global->ConfigWin), "destroy", G_CALLBACK(CallBack_configwindow_destroyed), NULL);
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
gtk_container_set_border_width(GTK_CONTAINER(vbox), BORDER);
gtk_container_add(GTK_CONTAINER(global->ConfigWin), vbox);
/* PLAYER CONFIG (such has nickname) */
Frame = gtk_frame_new("Player");
gtk_container_set_border_width(GTK_CONTAINER(Frame), BORDER);
gtk_box_pack_start(GTK_BOX(vbox), Frame, FALSE, FALSE, 0);
vboxFrame = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_set_border_width(GTK_CONTAINER(vboxFrame), BORDER);
gtk_container_add(GTK_CONTAINER(Frame), vboxFrame);
hboxFrame = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, BORDER);
gtk_box_pack_start(GTK_BOX(vboxFrame), hboxFrame, FALSE, FALSE, 0);
Label = gtk_label_new("Nickname");
gtk_box_pack_start(GTK_BOX(hboxFrame), Label, FALSE, FALSE, 0);
Entry = gtk_entry_new();
gtk_box_pack_start(GTK_BOX(hboxFrame), Entry, FALSE, FALSE, 0);
g_object_set_data(G_OBJECT(global->ConfigWin), "config_player_nickname", Entry);
gtk_entry_set_text(GTK_ENTRY(Entry), config->nickname);
/* METASERVER */
Frame = gtk_frame_new("Meta server");
gtk_container_set_border_width(GTK_CONTAINER(Frame), BORDER);
gtk_box_pack_start(GTK_BOX(vbox), Frame, TRUE, TRUE, 0);
vboxFrame = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_set_border_width(GTK_CONTAINER(vboxFrame), BORDER);
gtk_container_add(GTK_CONTAINER(Frame), vboxFrame);
CButton = gtk_check_button_new_with_label("Check new releases of GtkAtlantic");
g_object_set_data(G_OBJECT(global->ConfigWin), "config_metaserver_sendclientversion", CButton);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(CButton), config->metaserver_sendclientversion);
gtk_box_pack_start(GTK_BOX(vboxFrame), CButton, FALSE, FALSE, 0);
CButton = gtk_check_button_new_with_label("Autoconnect");
g_object_set_data(G_OBJECT(global->ConfigWin), "config_metaserver_autoconnect", CButton);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(CButton), config->metaserver_autoconnect);
gtk_box_pack_start(GTK_BOX(vboxFrame), CButton, FALSE, FALSE, 0);
/* DEFAULT CUSTOM SERVER */
Frame = gtk_frame_new("Default server");
gtk_container_set_border_width(GTK_CONTAINER(Frame), BORDER);
gtk_box_pack_start(GTK_BOX(vbox), Frame, TRUE, TRUE, 0);
vboxFrame = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_set_border_width(GTK_CONTAINER(vboxFrame), BORDER);
gtk_container_add(GTK_CONTAINER(Frame), vboxFrame);
hboxFrame = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, BORDER);
gtk_box_pack_start(GTK_BOX(vboxFrame), hboxFrame, FALSE, FALSE, 0);
Label = gtk_label_new("Host");
gtk_box_pack_start(GTK_BOX(hboxFrame), Label, FALSE, FALSE, 0);
Entry = gtk_entry_new();
g_object_set_data(G_OBJECT(global->ConfigWin), "config_customserver_host", Entry);
gtk_entry_set_text(GTK_ENTRY(Entry), config->getgames_host);
gtk_box_pack_start(GTK_BOX(hboxFrame), Entry, FALSE, FALSE, 0);
hboxFrame = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, BORDER);
gtk_box_pack_start(GTK_BOX(vboxFrame), hboxFrame, FALSE, FALSE, 0);
Label = gtk_label_new("Port");
gtk_box_pack_start(GTK_BOX(hboxFrame), Label, FALSE, FALSE, 0);
Entry = gtk_entry_new();
g_object_set_data(G_OBJECT(global->ConfigWin), "config_customserver_port", Entry);
text = g_strdup_printf("%d", config->getgames_port);
gtk_entry_set_text(GTK_ENTRY(Entry), text);
g_free(text);
gtk_widget_set_size_request(Entry, 45, -1);
gtk_box_pack_start(GTK_BOX(hboxFrame), Entry, FALSE, FALSE, 0);
CButton = gtk_check_button_new_with_label("Autoconnect");
g_object_set_data(G_OBJECT(global->ConfigWin), "config_customserver_autoconnect", CButton);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(CButton), config->getgames_autoconnect);
gtk_box_pack_start(GTK_BOX(vboxFrame), CButton, FALSE, FALSE, 0);
/* INTERFACE GAME CONFIG */
Frame = gtk_frame_new("Game interface");
gtk_container_set_border_width(GTK_CONTAINER(Frame), BORDER);
gtk_box_pack_start(GTK_BOX(vbox), Frame, FALSE, FALSE, 0);
vboxFrame = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_set_border_width(GTK_CONTAINER(vboxFrame), BORDER);
gtk_container_add(GTK_CONTAINER(Frame), vboxFrame);
hboxFrame = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, BORDER);
gtk_box_pack_start(GTK_BOX(vboxFrame), hboxFrame, FALSE, FALSE, 0);
Label = gtk_label_new("Display player list at ");
gtk_box_pack_start(GTK_BOX(hboxFrame), Label, FALSE, FALSE, 0);
Combo = gtk_combo_box_text_new();
g_object_set_data(G_OBJECT(global->ConfigWin), "config_gameinterface_playerlistposition", Combo);
gtk_widget_set_size_request(Combo, 60, -1);
gtk_box_pack_start(GTK_BOX(hboxFrame), Combo, FALSE, FALSE, 0);
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(Combo), "left");
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(Combo), "right");
if(config->game_playerlist_position == GAME_PLAYERLIST_POS_LEFT)
gtk_combo_box_set_active(GTK_COMBO_BOX(Combo), 0);
else
gtk_combo_box_set_active(GTK_COMBO_BOX(Combo), 1);
hboxFrame = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, BORDER);
gtk_box_pack_start(GTK_BOX(vboxFrame), hboxFrame, FALSE, FALSE, 0);
Label = gtk_label_new("Token speed (in ms per estate) : ");
gtk_box_pack_start(GTK_BOX(hboxFrame), Label, FALSE, FALSE, 0);
Adjust = gtk_adjustment_new (config->game_token_animation_speed, 25, 500, 25, 25, 0);
g_object_set_data(G_OBJECT(global->ConfigWin), "config_gameinterface_tokenanimatespeed", Adjust);
Scale = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT(Adjust));
gtk_widget_set_size_request(Scale, 200, -1);
gtk_scale_set_value_pos (GTK_SCALE (Scale), GTK_POS_TOP);
gtk_scale_set_digits (GTK_SCALE (Scale), 0);
gtk_box_pack_start (GTK_BOX (hboxFrame), Scale, FALSE, FALSE, 0);
CButton = gtk_check_button_new_with_label("Show in transparency the tokens of players who are not moving now");
g_object_set_data(G_OBJECT(global->ConfigWin), "config_gameinterface_tokentransparency", CButton);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(CButton), config->game_token_transparency);
gtk_box_pack_start(GTK_BOX(vboxFrame), CButton, FALSE, FALSE, 0);
/* CANCEL/OK BUTTON */
/* horizontal box buttons */
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
Button = gtk_button_new_with_label("CANCEL");
gtk_widget_set_size_request(Button, 130, 45);
gtk_container_set_border_width(GTK_CONTAINER(Button), 10);
gtk_box_pack_start(GTK_BOX(hbox), Button, TRUE, FALSE, 0);
g_signal_connect_object(G_OBJECT(Button), "clicked", G_CALLBACK(gtk_widget_destroy), global->ConfigWin, G_CONNECT_SWAPPED);
Button = gtk_button_new_with_label("OK");
gtk_widget_set_size_request(Button, 130, 45);
gtk_container_set_border_width(GTK_CONTAINER(Button), 10);
gtk_box_pack_start(GTK_BOX(hbox), Button, TRUE, FALSE, 0);
g_signal_connect(G_OBJECT(Button), "clicked", G_CALLBACK(CallBack_ok_button_configwindow), NULL);
gtk_widget_show_all(global->ConfigWin);
}
/* create the little window connect to server */
void interface_create_connectoserver(void) {
GtkWidget *win;
GtkWidget *grid;
GtkWidget *Entry;
GtkWidget *Label;
gchar *text;
win = gtk_dialog_new_with_buttons("GtkAtlantic: Connect to server",
GTK_WINDOW(global->MainWin), GTK_DIALOG_MODAL,
"Close", GTK_RESPONSE_CLOSE, "Connect", GTK_RESPONSE_OK, NULL);
grid = gtk_grid_new();
gtk_grid_set_column_spacing(GTK_GRID(grid), 5);
gtk_grid_set_row_spacing(GTK_GRID(grid), 2);
gtk_container_set_border_width(GTK_CONTAINER(grid), 10);
gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(win))), grid);
Label = gtk_label_new("Hostname:");
gtk_widget_set_halign(Label, GTK_ALIGN_START);
gtk_widget_set_valign(Label, GTK_ALIGN_CENTER);
gtk_grid_attach(GTK_GRID(grid), Label, 0, 0, 1, 1);
Entry = gtk_entry_new();
gtk_widget_set_size_request(Entry, 150, -1);
g_object_set_data(G_OBJECT(win), "host", Entry);
gtk_entry_set_text(GTK_ENTRY(Entry), config->getgames_host);
gtk_grid_attach(GTK_GRID(grid), Entry, 1, 0, 1, 1);
Label = gtk_label_new("Port:");
gtk_widget_set_halign(Label, GTK_ALIGN_END);
gtk_widget_set_valign(Label, GTK_ALIGN_CENTER);
gtk_grid_attach(GTK_GRID(grid), Label, 0, 1, 1, 1);
Entry = gtk_entry_new();
gtk_widget_set_size_request(Entry, 150, -1);
g_object_set_data(G_OBJECT(win), "port", Entry);
text = g_strdup_printf("%d", config->getgames_port);
gtk_entry_set_text(GTK_ENTRY(Entry), text);
g_free(text);
gtk_grid_attach(GTK_GRID(grid), Entry, 1, 1, 1, 1);
g_signal_connect(G_OBJECT(win), "response", G_CALLBACK(CallBack_response_connect_to_server_window), win);
gtk_widget_show_all(win);
}
/* create the public server list window */
void interface_create_publicserverlist(void) {
GtkWidget *win;
GtkWidget *frame;
GtkWidget *scrollwin;
GtkWidget *ServerList;
GtkCellRenderer *renderer;
GtkTreeSelection *select;
GtkTreeViewColumn *column;
win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request(win, 700, 300);
gtk_window_set_title(GTK_WINDOW(win), "GtkAtlantic: Public server list");
g_signal_connect(G_OBJECT(win), "delete_event", G_CALLBACK(gtk_widget_destroy), NULL);
frame = gtk_frame_new("Public server list");
gtk_container_set_border_width(GTK_CONTAINER(frame), 5);
gtk_container_add(GTK_CONTAINER(win), frame);
scrollwin = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_set_border_width(GTK_CONTAINER(scrollwin), 5);
gtk_container_add(GTK_CONTAINER(frame), scrollwin);
ServerList = gtk_tree_view_new();
gtk_container_add(GTK_CONTAINER(scrollwin), ServerList);
select = gtk_tree_view_get_selection(GTK_TREE_VIEW(ServerList));
gtk_tree_selection_set_mode(select, GTK_SELECTION_NONE);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("Host", renderer, "text", SERVERLIST_COLUMN_HOST, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(ServerList), column);
column = gtk_tree_view_column_new_with_attributes("Port", renderer, "text", SERVERLIST_COLUMN_PORT, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(ServerList), column);
column = gtk_tree_view_column_new_with_attributes("Version", renderer, "text", SERVERLIST_COLUMN_VERSION, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(ServerList), column);
column = gtk_tree_view_column_new_with_attributes("Users", renderer, "text", SERVERLIST_COLUMN_USERS, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(ServerList), column);
gtk_tree_view_set_model(GTK_TREE_VIEW(ServerList), GTK_TREE_MODEL(global->server_store));
gtk_widget_show_all(win);
}
/* create the little window change nickname */
void interface_create_nicknamewin() {
GtkWidget *NicknameWin;
GtkWidget *HBox;
GtkWidget *Entry;
GtkWidget *Label;
NicknameWin = gtk_dialog_new_with_buttons("GtkAtlantic: Nickname",
GTK_WINDOW(global->MainWin), GTK_DIALOG_MODAL,
"_OK", GTK_RESPONSE_OK, NULL);
HBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_container_set_border_width(GTK_CONTAINER(HBox), 10);
gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(NicknameWin))), HBox);
Label = gtk_label_new("Nickname:");
gtk_box_pack_start(GTK_BOX(HBox), Label, FALSE, FALSE, 5);
Entry = gtk_entry_new();
gtk_widget_set_size_request(Entry, 150, -1);
g_object_set_data(G_OBJECT(NicknameWin), "nickname", Entry);
gtk_entry_set_text(GTK_ENTRY(Entry), player_from_id(global->my_playerid)->name);
gtk_box_pack_start(GTK_BOX(HBox), Entry, TRUE, TRUE, 0);
g_signal_connect(G_OBJECT(NicknameWin), "response", G_CALLBACK(CallBack_response_changenick_window), NicknameWin);
gtk_widget_show_all(NicknameWin);
}
/* create estates tree */
void interface_create_estates_tree() {
GtkWidget *EstateWin;
GtkWidget *HBox;
GtkWidget *ScrollWin;
GtkWidget *EstateTree;
GtkWidget *VBox;
GtkWidget *Label;
GtkTreeViewColumn *estateTreeCol;
GtkCellRenderer *estateTreeRenderer;
GtkTreeStore *stateTreestore;
GtkTreeIter stateTreeIterGroup[MAX_GROUPS], stateTreeIterOther, stateTreeIterChild;
GtkTreeSelection *select;
guint32 i;
if(currentgame->WinEstateTree) return;
currentgame->WinEstateTree = EstateWin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request(EstateWin, 450, 400);
gtk_window_set_title(GTK_WINDOW(EstateWin), "GtkAtlantic: Estates Tree");
g_signal_connect(G_OBJECT(EstateWin), "delete_event", G_CALLBACK(gtk_widget_destroy), NULL);
g_signal_connect(G_OBJECT(EstateWin), "destroy", G_CALLBACK(CallBack_EstateTree_Destroyed), NULL);
HBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
g_object_set_data(G_OBJECT(currentgame->WinEstateTree), "parent_box", HBox);
// gtk_container_set_border_width(GTK_CONTAINER(HBox), 10);
gtk_container_add(GTK_CONTAINER(EstateWin), HBox);
/* ScrollWin win */
ScrollWin = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ScrollWin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_widget_set_size_request(ScrollWin, 250, -1);
gtk_box_pack_start(GTK_BOX(HBox), ScrollWin, FALSE, TRUE, 0);
/* estate tree */
EstateTree = gtk_tree_view_new();
select = gtk_tree_view_get_selection(GTK_TREE_VIEW(EstateTree));
gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE);
g_signal_connect(G_OBJECT(select), "changed", G_CALLBACK(CallBack_EstateTree_SelectRow), NULL);
gtk_container_add(GTK_CONTAINER(ScrollWin), EstateTree);
estateTreeCol = gtk_tree_view_column_new();
gtk_tree_view_column_set_title(estateTreeCol, "Estates");
gtk_tree_view_append_column(GTK_TREE_VIEW(EstateTree), estateTreeCol);
estateTreeRenderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(estateTreeCol, estateTreeRenderer, TRUE);
gtk_tree_view_column_add_attribute(estateTreeCol, estateTreeRenderer, "text", 0);
stateTreestore = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_INT);
/* create groups node */
for(i = 0 ; i < MAX_GROUPS ; i++) {
if(! currentgame->group[i].name) continue;
gtk_tree_store_append(stateTreestore, &stateTreeIterGroup[i], NULL);
gtk_tree_store_set(stateTreestore, &stateTreeIterGroup[i], 0, currentgame->group[i].name, 1, -1, -1);
}
gtk_tree_store_append(stateTreestore, &stateTreeIterOther, NULL);
gtk_tree_store_set(stateTreestore, &stateTreeIterOther, 0, "Other", 1, -1, -1);
/* create estates node */
for(i = 0 ; i < data->number_estates ; i++) {
if(currentgame->estate[i].group >= 0) {
gtk_tree_store_append(stateTreestore, &stateTreeIterChild, &stateTreeIterGroup[currentgame->estate[i].group]);
} else {
gtk_tree_store_append(stateTreestore, &stateTreeIterChild, &stateTreeIterOther);
}
gtk_tree_store_set(stateTreestore, &stateTreeIterChild, 0, currentgame->estate[i].name, 1, i, -1);
}
gtk_tree_view_set_model(GTK_TREE_VIEW(EstateTree), GTK_TREE_MODEL(stateTreestore));
g_object_unref(stateTreestore); /* the TreeView creates its own reference */
/* Expand groups */
for(i = 0 ; i < MAX_GROUPS ; i++) {
GtkTreePath *path;
if(! currentgame->group[i].name) continue;
path = gtk_tree_model_get_path(GTK_TREE_MODEL(stateTreestore), &stateTreeIterGroup[i]);
if(path) {
gtk_tree_view_expand_row(GTK_TREE_VIEW(EstateTree), path, FALSE);
gtk_tree_path_free(path);
}
}
/* info box */
VBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
g_object_set_data(G_OBJECT(currentgame->WinEstateTree), "info_box", VBox);
gtk_container_set_border_width(GTK_CONTAINER(VBox), 10);
gtk_box_pack_start(GTK_BOX(HBox), VBox, TRUE, TRUE, 0);
/* default text */
Label = gtk_label_new("Select an estate...");
gtk_widget_set_halign(Label, GTK_ALIGN_START);
gtk_widget_set_valign(Label, GTK_ALIGN_START);
gtk_box_pack_start(GTK_BOX(VBox), Label, FALSE, TRUE, 0);
gtk_widget_show_all(EstateWin);
}
/* create help window */
void interface_create_helpwin() {
GtkWidget *HelpWin;
GtkWidget *Scrolled;
GtkWidget *label;
if(global->HelpWin) return;
global->HelpWin = HelpWin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request(HelpWin, 700, 500);
gtk_window_set_title(GTK_WINDOW(HelpWin), "GtkAtlantic: Help");
g_signal_connect(G_OBJECT(HelpWin), "delete_event", G_CALLBACK(gtk_widget_destroy), NULL);
g_signal_connect(G_OBJECT(HelpWin), "destroy", G_CALLBACK(CallBack_HelpWin_Destroyed), NULL);
Scrolled = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(Scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(global->HelpWin), Scrolled);
label = gtk_label_new(NULL);
gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
gtk_container_add(GTK_CONTAINER(Scrolled), label);
gchar *tmp = g_markup_printf_escaped(
"GtkAtlantic Help\n"
"\n"
"Contents\n"
"\n"
"1) About Atlantic\n"
" i. What is the Atlantic game?\n"
" ii. What is GtkAtlantic?\n"
"2) How to play\n"
"3) Fun chat macros\n"
" i. Remote Macros\n"
" ii. Local Macros\n"
"\n"
"\n"
"1) About Atlantic\n"
"\n"
"i. What is the Atlantic game?\n"
"\n"
"The goal in playing Atlantic is to Get rich quick and win! The richest player is the winner :)\n"
"\n"
"In order to win, you need to buy properties quickly and profitably. To succeed, you need at least one set of the same group of "
"properties, so that you can build Houses and ultimately Hotels upon them.\n"
"\n"
"Play begins from Start square. Players move their tokens around the board by clicking the Roll Dice button. When a player lands "
"on an unowned estate, he may Buy it from the bank or put it up for Auction. When a player lands on a estate owned by custom "
"player, he must pay rent to the owner.\n"
"\n"
"Building houses or hotels dramatically increase payable rents - so much so that it may force other players to declare 'Bankruptcy'. "
"To raise money, you can mortgage any owned estate to the bank.\n"
"\n"
"The Chance and Community squares give you a card whose instructions must be followed. Sometimes you are sent to Jail! :(\n"
"\n"
"Atlantic is a game that combines subtlety and a sense of business - a good mood helps if you are losing! :)\n"
"\n"
"ii. What is GtkAtlantic?\n"
"\n"
"GtkAtlantic is a network client to play the Atlantic game on monopd servers. The Atlantic game looks like a Monopoly® game.\n"
"\n"
"\n"
"2) How to Play\n"
"\n"
"Well, it is quite easy to play with GtkAtlantic. If you know how to play Monopoly® you can probably play without problem.\n"
"\n"
"Roll dice: Clic the Roll button.\n"
"\n"
"Buy a house: Clic on the estate on which you want to build a house then choose Build house.\n"
"Sell a house: Clic on the estate on which you want to sell a house then choose Sell house.\n"
"Mortgage an estate: Clic on the estate you want to mortgage then choose (Un)mortgage.\n"
"\n"
"Start a trade with a player: Clic on the player you want to trade with, then select Initiate a trade.\n"
"\n"
"\n"
"3) Fun chat commands\n"
"\n"
"i. Remote commands\n"
"\n"
"Note that all players will know what you are doing, and all players will receive what you have requested. "
"Please do not flood chat - use with care because some players don't like receiving this information. "
"Only a GtkAtlantic client will answer these requests.\n"
"\n"
"!version [player]\n"
"Returns player client version. If no player is specified, returns client version of all players.\n"
"\n"
"!date [player]\n"
"Returns player local time. If no player is specified, returns date of all players.\n"
"\n"
"!ping [player]\n"
"Returns pong if player is still connected. If no player is specified, returns pong of all players\n"
"\n"
"ii. Local commands\n"
"\n"
"Local commands to use whenever you want and as often as you need.\n"
"\n"
"/me msg\n"
"Sends an action message\n"
"\n"
"/date\n"
"Returns local time\n"
"\n"
"/nick [new nick]\n"
"Changes nick\n"
"\n"
"/assets [player]\n"
"Returns player assets. If no player is specified, returns assets of all players.\n"
"\n"
"/elapsed\n"
"Returns elapsed time since game start.\n"
"\n"
);
gtk_label_set_markup(GTK_LABEL(label), tmp);
g_free(tmp);
gtk_widget_show_all(HelpWin);
}
static gboolean infolabel_timeout(gpointer data) {
(void)data;
gtk_label_set_text(GTK_LABEL(global->InfoLabel), NULL);
global->timeout_InfoLabel = 0;
return FALSE;
}
void interface_set_infolabel(gchar *text, gchar *color, gboolean eternal) {
gchar *tmp = g_markup_printf_escaped("%s", color, text);
gtk_label_set_markup(GTK_LABEL(global->InfoLabel), tmp);
g_free(tmp);
if (global->timeout_InfoLabel) {
g_source_remove(global->timeout_InfoLabel);
global->timeout_InfoLabel = 0;
}
if (!eternal) {
global->timeout_InfoLabel = g_timeout_add_seconds(5, infolabel_timeout, NULL);
}
}
/* generic window with a label into */
void interface_create_messagewin(gchar *msg) {
(void)msg;
#if 0
GtkWidget *MessageWin;
GtkWidget *VBox;
GtkWidget *Label;
GtkWidget *Button;
MessageWin = gtk_window_new(GTK_WINDOW_DIALOG);
gtk_window_set_title(GTK_WINDOW(MessageWin), "GtkAtlantic: Message");
gtk_window_set_position(GTK_WINDOW(MessageWin), GTK_WIN_POS_CENTER);
gtk_window_set_transient_for(GTK_WINDOW(MessageWin), GTK_WINDOW(global->MainWin));
gtk_window_set_modal(GTK_WINDOW(MessageWin), TRUE);
gtk_widget_set_size_request(MessageWin, -1, -1);
g_signal_connect(G_OBJECT(MessageWin), "delete_event", G_CALLBACK(gtk_widget_destroy), NULL);
VBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_set_border_width(GTK_CONTAINER(VBox), 10);
gtk_container_add(GTK_CONTAINER(MessageWin), VBox);
/* text */
Label = gtk_label_new(msg);
gtk_label_set_line_wrap(GTK_LABEL(Label), TRUE);
gtk_box_pack_start(GTK_BOX(VBox), Label, TRUE, TRUE, 0);
/* ok button */
Button = gtk_button_new_with_label("OK");
gtk_widget_set_halign(Button, GTK_ALIGN_CENTER);
gtk_widget_set_valign(Button, GTK_ALIGN_CENTER);
gtk_widget_set_size_request(Button, 70, -1);
gtk_box_pack_start(GTK_BOX(VBox), Button, FALSE, FALSE, 0);
g_signal_connect_object(G_OBJECT(Button), "clicked", G_CALLBACK(gtk_widget_destroy), MessageWin, G_CONNECT_SWAPPED);
gtk_widget_show_all(MessageWin);
#endif
}
/* when receive event: redraw an estate */
void on_board_draw(GtkWidget *widget, cairo_t *cr, gpointer d) {
(void)d;
gint32 id;
eng_frame *frame;
gint32 width, height, stride;
eng_coord coord;
cairo_surface_t *surface;
guint8 *buf;
gint32 bufferid;
id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "estateid"));
frame = currentgame->board_frame;
bufferid = data->estate[id].buffer_board;
width = data->pngfile_board_width[bufferid];
height = data->pngfile_board_height[bufferid];
stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width);
coord.x = data->estate[id].x;
coord.y = data->estate[id].y;
coord.width = width;
coord.height = height;
coord.stride = stride;
buf = eng_get_zone(frame, &coord);
surface = cairo_image_surface_create_for_data((unsigned char*)buf, CAIRO_FORMAT_ARGB32, width, height, stride);
cairo_set_source_surface(cr, surface, 0, 0);
cairo_paint(cr);
cairo_surface_destroy(surface);
g_free(buf);
}
/* when receive event: redraw player token */
void on_playertoken_draw(GtkWidget *widget, cairo_t *cr, gpointer d) {
(void)d;
eng_frame *frame;
gint32 width, height, stride;
eng_coord coord;
cairo_surface_t *surface;
guint8 *buf;
player *p = g_object_get_data(G_OBJECT(widget), "player");
frame = p->playerlist_token_frame;
width = data->playerlist_token_width;
height = data->playerlist_token_height;
stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width);
coord.x = 0;
coord.y = 0;
coord.width = width;
coord.height = height;
coord.stride = stride;
buf = eng_get_zone(frame, &coord);
surface = cairo_image_surface_create_for_data((unsigned char*)buf, CAIRO_FORMAT_ARGB32, width, height, stride);
cairo_set_source_surface(cr, surface, 0, 0);
cairo_paint(cr);
cairo_surface_destroy(surface);
g_free(buf);
}
/* when receive event: redraw player cards */
void on_playercards_draw(GtkWidget *widget, cairo_t *cr, gpointer d) {
(void)d;
eng_frame *frame;
gint32 width, height, stride;
eng_coord coord;
cairo_surface_t *surface;
guint8 *buf;
player *p = g_object_get_data(G_OBJECT(widget), "player");
frame = p->playerlist_cards_frame;
width = data->playerlist_cards_width;
height = data->playerlist_cards_height;
stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width);
coord.x = 0;
coord.y = 0;
coord.width = width;
coord.height = height;
coord.stride = stride;
buf = eng_get_zone(frame, &coord);
surface = cairo_image_surface_create_for_data((unsigned char*)buf, CAIRO_FORMAT_ARGB32, width, height, stride);
cairo_set_source_surface(cr, surface, 0, 0);
cairo_paint(cr);
cairo_surface_destroy(surface);
g_free(buf);
}
/* update display */
void update_display() {
guint32 i;
eng_frame *frame;
if (global->phase != PHASE_GAMEPLAY) {
return;
}
/* draw the board */
frame = currentgame->board_frame;
eng_create_frame(frame);
for(i = 0 ; i < data->number_estates ; i++) {
eng_coord coord;
gint32 width, height;
gint32 bufferid;
if(! currentgame->estate[i].gdkrgb) continue;
if(! frame) continue;
bufferid = data->estate[i].buffer_board;
width = data->pngfile_board_width[bufferid];
height = data->pngfile_board_height[bufferid];
coord.x1 = data->estate[i].x;
coord.y1 = data->estate[i].y;
coord.x2 = coord.x1 + width -1;
coord.y2 = coord.y1 + height -1;
/* force draw event */
if (eng_zone_is_modified(frame, &coord) ) {
gtk_widget_queue_draw_area(currentgame->estate[i].gdkrgb, 0, 0, width, height);
}
}
/* draw playerlist */
player *p;
for (p = player_h; p; p = p->next) {
eng_frame *frame;
gint32 width, height;
eng_coord coord;
if (p->spectator) continue;
if (p->game != currentgame->gameid) continue;
if (!p->playerlist_cards_gdkrgb) continue;
/* playerlist cards */
frame = p->playerlist_cards_frame;
eng_create_frame(frame);
width = data->playerlist_cards_width;
height = data->playerlist_cards_height;
coord.x1 = 0;
coord.y1 = 0;
coord.x2 = width -1;
coord.y2 = height -1;
/* force draw event */
if ( eng_zone_is_modified(frame, &coord) ) {
gtk_widget_queue_draw_area(p->playerlist_cards_gdkrgb, 0, 0, width, height);
}
/* playerlist token */
frame = p->playerlist_token_frame;
eng_create_frame(frame);
width = data->playerlist_token_width;
height = data->playerlist_token_height;
coord.x1 = 0;
coord.y1 = 0;
coord.x2 = width -1;
coord.y2 = height -1;
/* force draw event */
if ( eng_zone_is_modified(frame, &coord) ) {
gtk_widget_queue_draw_area(p->playerlist_token_gdkrgb, 0, 0, width, height);
}
}
}