00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <gtk/gtk.h>
00026 #include "CwChessboard.h"
00027
00028 static void destroy_event(gchar* response)
00029 {
00030 gtk_main_quit();
00031 }
00032
00033 static gint handle = -1;
00034 static gint arrow_begin_col;
00035 static gint arrow_begin_row;
00036
00037 static inline gboolean is_inside_board(gint col, gint row)
00038 {
00039 return !((col | row) & ~0x7);
00040 }
00041
00042 gboolean button_press_event(GtkWidget* widget, GdkEventButton* event)
00043 {
00044 CwChessboard* chessboard = CW_CHESSBOARD(widget);
00045
00046 if (event->button == 1)
00047 {
00048 handle = -1;
00049
00050 gint col = cw_chessboard_x2col(chessboard, event->x);
00051 gint row = cw_chessboard_y2row(chessboard, event->y);
00052 if (is_inside_board(col, row))
00053 {
00054 CwChessboardCode code = cw_chessboard_get_square(chessboard,col, row);
00055 if (code > 1)
00056
00057 {
00058
00059 cw_chessboard_set_square(chessboard, col, row, empty_square);
00060
00061 double hsside = 0.5 * chessboard->sside;
00062 double fraction = hsside - (gint)hsside;
00063 handle = cw_chessboard_add_floating_piece(chessboard, code,
00064 event->x - fraction, event->y - fraction, TRUE);
00065 }
00066 }
00067 }
00068 else if (event->button == 2)
00069 {
00070 gint col = cw_chessboard_x2col(chessboard, event->x);
00071 gint row = cw_chessboard_y2row(chessboard, event->y);
00072 if (is_inside_board(col, row))
00073 {
00074 cw_chessboard_show_cursor(chessboard);
00075 cw_chessboard_set_marker_color(chessboard, col, row, 1);
00076 arrow_begin_col = col;
00077 arrow_begin_row = row;
00078 }
00079 }
00080 else if (event->button == 3)
00081 cw_chessboard_show_cursor(chessboard);
00082
00083 return (handle != -1);
00084 }
00085
00086 gboolean button_release_event(GtkWidget* widget, GdkEventButton* event)
00087 {
00088 CwChessboard* chessboard = CW_CHESSBOARD(widget);
00089 if (event->button == 1)
00090 {
00091 if (handle != -1)
00092 {
00093
00094 gint col = cw_chessboard_x2col(chessboard, event->x);
00095 gint row = cw_chessboard_y2row(chessboard, event->y);
00096 if (is_inside_board(col, row))
00097 {
00098
00099 cw_chessboard_set_square(chessboard, col, row, cw_chessboard_get_floating_piece(chessboard, handle));
00100 }
00101
00102 cw_chessboard_remove_floating_piece(chessboard, handle);
00103 handle = -1;
00104 return TRUE;
00105 }
00106 }
00107 else if (event->button == 2)
00108 {
00109 GdkColor color = { 0, 0, 0, 65535 };
00110 gint col = cw_chessboard_x2col(chessboard, event->x);
00111 gint row = cw_chessboard_y2row(chessboard, event->y);
00112 cw_chessboard_hide_cursor(chessboard);
00113 cw_chessboard_set_marker_color(chessboard, arrow_begin_col, arrow_begin_row, 0);
00114 if ((arrow_begin_col != col || arrow_begin_row != row)&&
00115 is_inside_board(arrow_begin_col, arrow_begin_row)&&
00116 is_inside_board(col, row))
00117 cw_chessboard_add_arrow(chessboard, arrow_begin_col, arrow_begin_row, col, row,& color);
00118 }
00119 else if (event->button == 3)
00120 cw_chessboard_hide_cursor(chessboard);
00121 return FALSE;
00122 }
00123
00124 static void setup_menu(GtkWidget* vbox)
00125 {
00126
00127 GtkWidget* file_menu = gtk_menu_new();
00128
00129
00130 GtkWidget* quit_item = gtk_menu_item_new_with_label("Quit");
00131
00132
00133 gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), quit_item);
00134
00135
00136 g_signal_connect_swapped(G_OBJECT(quit_item), "activate", G_CALLBACK(destroy_event), (gpointer) "file.quit");
00137
00138
00139 gtk_widget_show(quit_item);
00140
00141 GtkWidget* menu_bar = gtk_menu_bar_new();
00142 gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 2);
00143 gtk_widget_show(menu_bar);
00144
00145 GtkWidget* file_item = gtk_menu_item_new_with_label("File");
00146 gtk_widget_show(file_item);
00147
00148 gtk_menu_item_set_submenu(GTK_MENU_ITEM(file_item), file_menu);
00149 gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), file_item);
00150 }
00151
00152 int main(int argc, char* argv[])
00153 {
00154 if (!gtk_init_check(&argc,& argv))
00155 {
00156 printf("gtk_init_check failed\n");
00157 return 1;
00158 }
00159
00160
00161 GtkWidget* chessboard_widget = cw_chessboard_new();
00162 CwChessboard* chessboard = CW_CHESSBOARD(chessboard_widget);
00163
00164
00165 CwChessboardColorHandle light = cw_chessboard_allocate_color_handle_rgb(chessboard, 1.0, 1.0, 0.6);
00166 CwChessboardColorHandle dark = cw_chessboard_allocate_color_handle_rgb(chessboard, 0.8, 0.93, 0.47);
00167 CwChessboardColorHandle red = cw_chessboard_allocate_color_handle_rgb(chessboard, 1.0, 0.0, 0.0);
00168 CwChessboardColorHandle yellow = cw_chessboard_allocate_color_handle_rgb(chessboard, 1.0, 1.0, 0.0);
00169
00170
00171 for (int row = 1; row < 7; ++row)
00172 cw_chessboard_set_background_color(chessboard, 4, row, (row & 1) ? light : dark);
00173
00174
00175 cw_chessboard_set_square(chessboard, 1, 0, empty_square);
00176 cw_chessboard_set_square(chessboard, 3, 0, empty_square);
00177 cw_chessboard_set_square(chessboard, 6, 0, empty_square);
00178 cw_chessboard_set_square(chessboard, 3, 1, empty_square);
00179 cw_chessboard_set_square(chessboard, 4, 1, empty_square);
00180 cw_chessboard_set_square(chessboard, 2, 2, white_knight);
00181 cw_chessboard_set_square(chessboard, 2, 3, white_knight);
00182 cw_chessboard_set_square(chessboard, 3, 3, white_pawn);
00183 cw_chessboard_set_square(chessboard, 5, 2, white_queen);
00184 cw_chessboard_set_square(chessboard, 2, 1, black_bishop);
00185 cw_chessboard_set_square(chessboard, 2, 5, black_pawn);
00186 cw_chessboard_set_square(chessboard, 5, 5, black_knight);
00187 cw_chessboard_set_square(chessboard, 3, 6, black_knight);
00188 cw_chessboard_set_square(chessboard, 1, 7, empty_square);
00189 cw_chessboard_set_square(chessboard, 2, 7, empty_square);
00190 cw_chessboard_set_square(chessboard, 2, 6, empty_square);
00191 cw_chessboard_set_square(chessboard, 6, 7, empty_square);
00192
00193
00194 cw_chessboard_set_marker_thickness(chessboard, 0.03);
00195 cw_chessboard_set_marker_color(chessboard, 4, 7, red);
00196 cw_chessboard_set_marker_color(chessboard, 2, 1, red);
00197 cw_chessboard_set_marker_color(chessboard, 4, 6, yellow);
00198
00199
00200 GdkColor green = { 0, 0, 32000, 0 };
00201 cw_chessboard_add_arrow(chessboard, 5, 2, 4, 1,& green);
00202 GdkColor red2 = { 0, 65535, 0, 0 };
00203 cw_chessboard_add_arrow(chessboard, 2, 3, 3, 5,& red2);
00204
00205
00206 GtkWidget* main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
00207
00208
00209 gtk_window_set_default_size(GTK_WINDOW(main_window), 500, 532);
00210
00211
00212 GtkWidget* vbox = gtk_vbox_new(FALSE, 0);
00213 gtk_container_add(GTK_CONTAINER(main_window), vbox);
00214 gtk_widget_show(vbox);
00215
00216
00217 setup_menu(vbox);
00218
00219
00220 gtk_container_add(GTK_CONTAINER(vbox), chessboard_widget);
00221
00222
00223 gtk_widget_show(chessboard_widget);
00224
00225
00226 g_signal_connect(G_OBJECT(chessboard), "button-press-event", G_CALLBACK(button_press_event), NULL);
00227 g_signal_connect(G_OBJECT(chessboard), "button-release-event", G_CALLBACK(button_release_event), NULL);
00228
00229
00230 g_signal_connect(G_OBJECT(main_window), "destroy", G_CALLBACK(destroy_event), NULL);
00231
00232
00233 gtk_widget_show(main_window);
00234
00235
00236 gtk_main();
00237 }