Merge pull request #8 from wdlkmpx/patch1

use GtkDialog
This commit is contained in:
Eugene Morozov 2021-01-19 17:48:02 +03:00 committed by GitHub
commit 79657f6ccb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 183 additions and 204 deletions

View File

@ -35,6 +35,53 @@ GtkWidget *ut_window_new(gchar *title, gchar *wmname, gchar *wmclass,
}
GtkWidget * gtkutil_dialog_new (char * title,
GtkWindow * parent,
gboolean resizable,
GtkWidget ** main_vbox) /* out */
{
GtkWidget * dialog;
dialog = gtk_dialog_new ();
gtk_window_set_title (GTK_WINDOW (dialog), title);
gtk_container_set_border_width (GTK_CONTAINER (dialog), 4); /* padding */
if (parent) {
gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent));
gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE);
gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ON_PARENT);
gtk_window_set_skip_pager_hint (GTK_WINDOW (dialog), TRUE);
gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog), TRUE);
}
if (!resizable) {
// no need to call this if TRUE, unexpected behavior in GTK3 IIRC
gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
}
if (main_vbox) {
*main_vbox = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
/* padding */
gtk_container_set_border_width (GTK_CONTAINER (*main_vbox), 4);
}
return dialog;
}
GtkWidget * gtkutil_frame_vbox (char * label, GtkWidget * parent_box)
{
GtkWidget * frame;
frame = gtk_frame_new (label);
gtk_box_pack_start (GTK_BOX (parent_box), frame, FALSE, FALSE, 0);
GtkWidget * frame_vbox = gtk_vbox_new (FALSE, 5);
gtk_container_add (GTK_CONTAINER (frame), frame_vbox);
/* padding */
gtk_container_set_border_width (GTK_CONTAINER (frame_vbox), 5);
return frame_vbox;
}
GtkWidget *ut_check_button_new(gchar *label, gboolean active, GtkWidget *parent)
{
GtkWidget *button;
@ -60,39 +107,13 @@ GtkWidget *ut_button_new(gchar *label, gpointer func, gpointer func_data, GtkWid
}
GtkWidget *ut_button_new_stock(const gchar *stock_id, gpointer func, gpointer func_data, GtkWidget *parent)
{
GtkWidget *button;
button = gtk_button_new_from_stock(stock_id);
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(func), func_data);
gtk_box_pack_start(GTK_BOX(parent), button, TRUE, TRUE, 0);
gtk_widget_set_can_default (button, TRUE);
return button;
}
GtkWidget *ut_button_new_stock_swap(const gchar *stock_id, gpointer func, gpointer func_data, GtkWidget *parent)
{
GtkWidget *button;
button = gtk_button_new_from_stock(stock_id);
g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(func), func_data);
gtk_box_pack_start(GTK_BOX(parent), button, TRUE, TRUE, 0);
gtk_widget_set_can_default (button, TRUE);
return button;
}
GtkWidget *ut_spin_button_new(gchar *label, gint min, gint max, gint val, GtkWidget *parent)
{
GtkAdjustment *adj;
GtkWidget *button, *hbox, *labelw;
hbox = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(parent), hbox, TRUE, TRUE, 2);
gtk_box_pack_start(GTK_BOX(parent), hbox, TRUE, TRUE, 0);
labelw = gtk_label_new(label);
gtk_box_pack_start(GTK_BOX(hbox), labelw, FALSE, FALSE, 5);

View File

@ -10,6 +10,13 @@ GtkWidget *ut_window_new (gchar *title,
gboolean resizable,
gint border);
GtkWidget * gtkutil_dialog_new (char * title,
GtkWindow * parent,
gboolean resizable,
GtkWidget ** main_vbox); /* out */
GtkWidget * gtkutil_frame_vbox (char * label, GtkWidget * parent_box);
GtkWidget *ut_check_button_new (gchar *label,
gboolean active,
GtkWidget *parent);
@ -19,16 +26,6 @@ GtkWidget *ut_button_new (gchar *label,
gpointer func_data,
GtkWidget *parent);
GtkWidget *ut_button_new_stock (const gchar *stock_id,
gpointer func,
gpointer func_data,
GtkWidget *parent);
GtkWidget *ut_button_new_stock_swap (const gchar *stock_id,
gpointer func,
gpointer func_data,
GtkWidget *parent);
GtkWidget *ut_spin_button_new (gchar *label,
gint min,
gint max,

View File

@ -13,10 +13,9 @@
void show_hall_of_fame (GtkWidget *widget, gpointer data, struct score_board b[10])
{
GtkWidget * hall_of_fame;
GtkWidget * dialog;
GtkWidget * frame, * sw, * tv;
GtkWidget * vbox, * button_box;
GtkWidget * close_button;
GtkWidget * main_vbox, * vbox;
gint i;
struct score_board *bs = b;
struct score_board bn[10];
@ -34,20 +33,14 @@ void show_hall_of_fame (GtkWidget *widget, gpointer data, struct score_board b[1
}
bs = bn;
}
hall_of_fame = ut_window_new(_("Hall of Fame"), "GtkBalls_Scores", "GtkBalls", TRUE, TRUE, FALSE, 5);
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 1);
gtk_container_add(GTK_CONTAINER(hall_of_fame), vbox);
frame = gtk_frame_new(_("Hall of Fame"));
gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0);
dialog = gtkutil_dialog_new (_("Hall of Fame"), main_window, FALSE, &main_vbox);
vbox = gtkutil_frame_vbox (_("Hall of Fame"), main_vbox);
sw = gtk_scrolled_window_new(NULL, NULL);
gtk_container_set_border_width(GTK_CONTAINER(sw), 5);
gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_NEVER);
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);
gtk_container_add(GTK_CONTAINER(frame), sw);
store = gtk_list_store_new (3,
G_TYPE_STRING,
@ -90,14 +83,11 @@ void show_hall_of_fame (GtkWidget *widget, gpointer data, struct score_board b[1
g_free(str);
}
button_box = gtk_hbox_new(TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), button_box, FALSE, FALSE, 4);
gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-close", GTK_RESPONSE_CLOSE);
g_signal_connect_swapped (dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog);
gtk_widget_grab_focus (gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE));
close_button = ut_button_new_stock_swap(GTK_STOCK_CLOSE, gtk_widget_destroy, hall_of_fame, button_box);
gtk_widget_grab_focus (close_button);
gtk_widget_grab_default (close_button);
gtk_widget_show_all (hall_of_fame);
gtk_widget_show_all (dialog);
}

View File

@ -16,12 +16,10 @@
#include "halloffame.h"
#include "game.h"
static GtkWidget *_dialog = NULL;
static gchar _last_player_name[15] = "";
static gint _saved_score = 0;
void read_entry(GtkWidget *widget, gpointer data)
static void read_entry (GtkEntry *entry, gpointer data)
{
struct score_board current_entry;
time_t current_time;
@ -32,7 +30,7 @@ void read_entry(GtkWidget *widget, gpointer data)
struct score_board b[10];
struct score_board_full *bf = NULL;
tstr = (gchar*)gtk_entry_get_text(GTK_ENTRY(data));
tstr = (gchar*)gtk_entry_get_text (entry);
strncpy(current_entry.name, tstr && *tstr ? tstr : _("Anonymous"), sizeof(current_entry.name));
strncpy(_last_player_name, current_entry.name, sizeof(_last_player_name));
current_entry.score = _saved_score;
@ -72,14 +70,25 @@ void read_entry(GtkWidget *widget, gpointer data)
}
}
gtk_widget_destroy(_dialog);
gtk_widget_destroy (GTK_WIDGET (data));
/* show scores to let user see if (s)he's on top ;) */
}
static void input_name_response (GtkDialog * dlg, int response, gpointer user_data)
{
if (response == GTK_RESPONSE_OK) {
read_entry (GTK_ENTRY (user_data), dlg);
}
}
static void input_name_esc (GtkDialog * dlg, gpointer data)
{
g_signal_stop_emission_by_name (dlg, "close"); // ignore Esc
}
void input_name_dialog(void)
{
GtkWidget * prompt_label, * vbox;
GtkWidget * dialog, * prompt_label, * vbox;
GtkWidget * name;
GtkWidget * button;
gchar * s;
@ -87,18 +96,14 @@ void input_name_dialog(void)
/* we have to save score, because they will be set to 0 in new_game() */
_saved_score = game_get_score();
_dialog = gtk_dialog_new();
gtk_window_set_role(GTK_WINDOW(_dialog), "GtkBalls_Inputname");
vbox = gtk_dialog_get_content_area (GTK_DIALOG (_dialog));
gtk_container_set_border_width(GTK_CONTAINER(vbox), 2);
dialog = gtkutil_dialog_new (NULL, main_window, TRUE, &vbox);
prompt_label = gtk_label_new(_("Enter your name"));
gtk_box_pack_start (GTK_BOX(vbox), prompt_label, TRUE, TRUE, 0);
name = gtk_entry_new();
gtk_entry_set_max_length(GTK_ENTRY(name), 14);
g_signal_connect(G_OBJECT(name), "activate", G_CALLBACK(read_entry), name);
g_signal_connect(G_OBJECT(name), "activate", G_CALLBACK(read_entry), dialog);
/* restore the last player's name */
if (!(*_last_player_name)) {
@ -110,10 +115,9 @@ void input_name_dialog(void)
gtk_editable_select_region(GTK_EDITABLE(name), 0, -1);
gtk_box_pack_start (GTK_BOX(vbox), name, TRUE, TRUE, 5);
button=ut_button_new_stock(GTK_STOCK_OK, read_entry, name, GTK_DIALOG(_dialog)->action_area);
gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-ok", GTK_RESPONSE_OK);
g_signal_connect (dialog, "response", G_CALLBACK (input_name_response), name);
g_signal_connect (dialog, "close", G_CALLBACK (input_name_esc), name);
gtk_widget_grab_focus(name);
gtk_widget_grab_default(button);
gtk_widget_show_all(_dialog);
gtk_widget_show_all (dialog);
}

View File

@ -18,7 +18,6 @@
enum
{
PR_DIALOG,
PR_SHOW_NEXT,
PR_SHOW_PATH,
PR_SHOW_PAWS,
@ -33,26 +32,17 @@ enum
PR_SIZE
};
void parent_toggled(GtkToggleButton *togglebutton, gpointer data) {
static void parent_toggled(GtkToggleButton *togglebutton, gpointer data) {
gtk_widget_set_sensitive(GTK_WIDGET(data), gtk_toggle_button_get_active(togglebutton));
}
void preferences_destroy_cb(GtkWidget *widget, gpointer data) {
g_free(data);
}
void preferences_cancel(GtkWidget *widget, gpointer data) {
GtkWidget **buttons = data;
gtk_widget_destroy(buttons[PR_DIALOG]);
}
gboolean fix_draw_next_balls(gpointer data) {
static gboolean fix_draw_next_balls(gpointer data) {
draw_next_balls();
return FALSE;
}
void preferences_apply(GtkWidget *widget, gpointer data)
static void preferences_apply(gpointer data)
{
GtkWidget **buttons = data;
GtkTreeModel *model;
@ -108,22 +98,29 @@ void preferences_apply(GtkWidget *widget, gpointer data)
}
}
void preferences_ok(GtkWidget *widget, gpointer data) {
GtkWidget **buttons = data;
preferences_apply(widget, buttons);
gtk_widget_destroy(buttons[PR_DIALOG]);
static void prefs_dialog_response (GtkDialog * dlg, int response, gpointer user_data)
{
switch (response)
{
case GTK_RESPONSE_APPLY:
preferences_apply (user_data);
g_signal_stop_emission_by_name (dlg, "response");
return;
case GTK_RESPONSE_OK:
preferences_apply (user_data);
break;
}
gtk_widget_destroy (GTK_WIDGET (dlg));
g_free (user_data); /* buttons */
}
void preferences_dialog (void)
{
GtkWidget ** buttons;
GtkWidget * frame;
GtkWidget * big_vbox, * vbox, * buttons_box;
GtkWidget * dialog, * frame;
GtkWidget * big_vbox, * vbox;
GtkWidget * theme_scrolled_window;
GtkWidget * separator;
gint i, st;
GtkListStore * store;
GtkTreeIter iter;
@ -140,18 +137,8 @@ void preferences_dialog (void)
buttons = g_malloc (PR_SIZE * sizeof(GtkWidget));
buttons[PR_DIALOG] = ut_window_new(_("Preferences"), "GtkBalls_Preferences", "GtkBalls", TRUE, TRUE, TRUE, 5);
g_signal_connect (G_OBJECT(buttons[PR_DIALOG]), "destroy", G_CALLBACK(preferences_destroy_cb), buttons);
big_vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER(buttons[PR_DIALOG]), big_vbox);
frame = gtk_frame_new (_("Preferences"));
gtk_box_pack_start (GTK_BOX(big_vbox), frame, FALSE, FALSE, 0);
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER(vbox), 5);
gtk_container_add (GTK_CONTAINER(frame), vbox);
dialog = gtkutil_dialog_new (_("Preferences"), main_window, TRUE, &big_vbox);
vbox = gtkutil_frame_vbox (_("Preferences"), big_vbox);
buttons[PR_SHOW_NEXT] = ut_check_button_new(_("Show colors that will appear on next turn"), pref_get_show_next_colors(), vbox);
buttons[PR_SHOW_PATH] = ut_check_button_new(_("Show path of the ball"), pref_get_show_path(), vbox);
@ -212,16 +199,10 @@ void preferences_dialog (void)
}
g_free (pathstr);
separator = gtk_hseparator_new ();
gtk_box_pack_start (GTK_BOX(big_vbox), separator, FALSE, FALSE, 5);
gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-apply", GTK_RESPONSE_APPLY);
gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-ok", GTK_RESPONSE_OK);
gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-cancel", GTK_RESPONSE_CANCEL);
g_signal_connect (dialog, "response", G_CALLBACK (prefs_dialog_response), buttons);
buttons_box = gtk_hbutton_box_new ();
gtk_button_box_set_layout (GTK_BUTTON_BOX(buttons_box), GTK_BUTTONBOX_SPREAD);
gtk_box_pack_start (GTK_BOX(big_vbox), buttons_box, TRUE, TRUE, 0);
gtk_widget_grab_default (ut_button_new_stock(GTK_STOCK_OK, preferences_ok, buttons, buttons_box));
ut_button_new_stock (GTK_STOCK_CANCEL, preferences_cancel, buttons, buttons_box);
ut_button_new_stock (GTK_STOCK_APPLY, preferences_apply, buttons, buttons_box);
gtk_widget_show_all (buttons[PR_DIALOG]);
gtk_widget_show_all (dialog);
}

View File

@ -13,24 +13,16 @@
/* Show dialog box with game rules*/
void show_rules (GtkWidget *widget, gpointer data)
{
GtkWidget * window;
GtkWidget * vbox, * hbox, * button_box;
GtkWidget * dialog;
GtkWidget * main_vbox, * vbox, * hbox;
GtkWidget * label;
GtkWidget * frame;
GtkWidget * separator;
GtkWidget * ok_button;
window = ut_window_new(_("Rules"), "GtkBalls_Rules", "GtkBalls", TRUE, FALSE, FALSE, 5);
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER(window), vbox);
frame = gtk_frame_new (_("Rules"));
gtk_box_pack_start (GTK_BOX(vbox), frame, TRUE, TRUE, 3);
dialog = gtkutil_dialog_new (_("Rules"), main_window, TRUE, &main_vbox);
vbox = gtkutil_frame_vbox (_("Rules"), main_vbox);
hbox = gtk_hbox_new (FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER(hbox), 10);
gtk_container_add (GTK_CONTAINER(frame), hbox);
gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
label = gtk_label_new (_("The standard play area of GtkBalls is a 9x9\n" \
"grid (it can be changed through \"Rules\"\n" \
@ -64,14 +56,8 @@ void show_rules (GtkWidget *widget, gpointer data)
"the grid will be."));
gtk_box_pack_start (GTK_BOX(hbox), label, TRUE, TRUE, 5);
separator = gtk_hseparator_new ();
gtk_box_pack_start (GTK_BOX(vbox), separator, FALSE, FALSE, 5);
gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-close", GTK_RESPONSE_OK);
g_signal_connect_swapped (dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog);
button_box = gtk_hbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX(vbox), button_box, TRUE, TRUE, 2);
ok_button = ut_button_new_stock_swap (GTK_STOCK_CLOSE, gtk_widget_destroy, window, button_box);
gtk_widget_grab_default (ok_button);
gtk_widget_show_all (window);
gtk_widget_show_all (dialog);
}

View File

@ -20,7 +20,7 @@ struct _gtkb_rules_dialog {
struct _gtkb_rules_dialog _rd;
void rules_ok(GtkWidget *widget, gpointer data)
static void rules_ok (void)
{
gint oldnext = rules_get_next();
gchar *msg;
@ -33,9 +33,6 @@ void rules_ok(GtkWidget *widget, gpointer data)
reinit_board (NULL, NULL, 0, oldnext);
if(data) {
gtk_widget_destroy (GTK_WIDGET(data));
}
msg = save_preferences ();
if(msg) {
ut_simple_message_box (msg);
@ -44,36 +41,33 @@ void rules_ok(GtkWidget *widget, gpointer data)
}
void rules_classic(void)
{
gtk_spin_button_set_value(GTK_SPIN_BUTTON(_rd.xrange), rules_get_classic_width());
gtk_spin_button_set_value(GTK_SPIN_BUTTON(_rd.yrange), rules_get_classic_height());
gtk_spin_button_set_value(GTK_SPIN_BUTTON(_rd.crange), rules_get_classic_colors());
gtk_spin_button_set_value(GTK_SPIN_BUTTON(_rd.nrange), rules_get_classic_next());
gtk_spin_button_set_value(GTK_SPIN_BUTTON(_rd.drange), rules_get_classic_destroy());
}
#define BTN_CLASSIC_RULES 100
static void rules_dialog_response (GtkDialog * dlg, int response, gpointer user_data)
{
if (response == BTN_CLASSIC_RULES) {
gtk_spin_button_set_value (GTK_SPIN_BUTTON(_rd.xrange), rules_get_classic_width());
gtk_spin_button_set_value (GTK_SPIN_BUTTON(_rd.yrange), rules_get_classic_height());
gtk_spin_button_set_value (GTK_SPIN_BUTTON(_rd.crange), rules_get_classic_colors());
gtk_spin_button_set_value (GTK_SPIN_BUTTON(_rd.nrange), rules_get_classic_next());
gtk_spin_button_set_value (GTK_SPIN_BUTTON(_rd.drange), rules_get_classic_destroy());
g_signal_stop_emission_by_name (dlg, "response");
return;
}
if (response == GTK_RESPONSE_OK) {
rules_ok ();
}
gtk_widget_destroy (GTK_WIDGET (dlg));
}
void rules_dialog (void)
{
GtkWidget * dialog;
GtkWidget * frame;
GtkWidget * big_vbox, * vbox, * buttons_box;
GtkWidget * separator;
GtkWidget * ok_button, * cancel_button, * classic_button;
GtkWidget * big_vbox, * vbox, * btn;
dialog = ut_window_new(_("Game rules"), "GtkBalls_Rules", "GtkBalls", TRUE, TRUE, TRUE, 5);
big_vbox = gtk_vbox_new (FALSE, 5);
gtk_container_add (GTK_CONTAINER(dialog), big_vbox);
frame = gtk_frame_new (_("Game rules"));
gtk_box_pack_start (GTK_BOX(big_vbox), frame, FALSE, FALSE, 0);
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER(vbox), 5);
gtk_container_add (GTK_CONTAINER(frame), vbox);
dialog = gtkutil_dialog_new (_("Game rules"), main_window, TRUE, &big_vbox);
vbox = gtkutil_frame_vbox (_("Game rules"), big_vbox);
_rd.xrange = ut_spin_button_new (_("Board width"), 4, 99, rules_get_width(), vbox);
_rd.yrange = ut_spin_button_new (_("Board height"), 4, 99, rules_get_height(), vbox);
@ -83,18 +77,11 @@ void rules_dialog (void)
_rd.drange = ut_spin_button_new (_("How many balls at line eliminate it"),
3, 99, rules_get_destroy(), vbox);
classic_button = ut_button_new (_("Classic rules"), rules_classic, dialog, big_vbox);
gtk_dialog_add_button (GTK_DIALOG (dialog), _("Classic rules"), BTN_CLASSIC_RULES);
gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-ok", GTK_RESPONSE_OK);
gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-cancel", GTK_RESPONSE_CANCEL);
separator = gtk_hseparator_new ();
gtk_box_pack_start (GTK_BOX(big_vbox), separator, FALSE, FALSE, 5);
buttons_box = gtk_hbutton_box_new ();
gtk_button_box_set_layout (GTK_BUTTON_BOX(buttons_box), GTK_BUTTONBOX_SPREAD);
gtk_box_pack_start (GTK_BOX(big_vbox), buttons_box, TRUE, TRUE, 0);
ok_button = ut_button_new_stock (GTK_STOCK_OK, rules_ok, dialog, buttons_box);
cancel_button = ut_button_new_stock_swap (GTK_STOCK_CANCEL, gtk_widget_destroy, dialog, buttons_box);
gtk_widget_grab_default (ok_button);
gtk_widget_grab_default (gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK));
g_signal_connect (dialog, "response", G_CALLBACK (rules_dialog_response), NULL);
gtk_widget_show_all (dialog);
}

View File

@ -58,7 +58,7 @@ void do_load_game(GtkWidget *widget, gpointer data) {
}
}
void do_delete_game(GtkWidget *widget, GtkWidget *treeview) {
static void do_delete_game (GtkWidget *treeview) {
GtkTreeModel *model;
GtkTreeIter iter, nextiter;
GValue value = {0, };
@ -175,6 +175,29 @@ gint game_compare_func(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpoi
}
#define BUTTON_SAVE_GAME 100
#define BUTTON_LOAD_GAME 101
#define BUTTON_DELETE_GAME 102
static void save_load_dlg_response (GtkDialog * dlg, int response, gpointer user_data)
{
GtkWidget * treeview = GTK_WIDGET (user_data);
switch (response)
{
case BUTTON_SAVE_GAME:
do_save_game (treeview, dlg);
return;
case BUTTON_LOAD_GAME:
do_load_game (treeview, dlg);
return;
case BUTTON_DELETE_GAME:
do_delete_game (treeview);
return;
}
gtk_widget_destroy (GTK_WIDGET (dlg));
}
void save_load_game_dialog(gboolean is_save)
{
@ -184,9 +207,7 @@ void save_load_game_dialog(gboolean is_save)
GtkCellRenderer * renderer;
GtkTreeViewColumn * column;
GtkTreePath * path;
GtkWidget * window, * swindow;
GtkWidget * vbox, * button_box;
GtkWidget * ok_button, * cancel_button, *delete_button;
GtkWidget * dialog, * swindow, * main_vbox, * vbox;
gint i, num;
gchar ** gamelist, str1[20], * str2;
@ -198,13 +219,8 @@ void save_load_game_dialog(gboolean is_save)
return;
}
window = ut_window_new(is_save ? _("Save game") : _("Load game"),
is_save ? "GtkBalls_Save" : "GtkBalls_Load",
"GtkBalls", TRUE, TRUE, TRUE, 5);
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER(vbox), 1);
gtk_container_add (GTK_CONTAINER(window), vbox);
dialog = gtkutil_dialog_new (is_save ? _("Save game") : _("Load game"),
main_window, TRUE, &vbox);
swindow = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(swindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
@ -269,24 +285,21 @@ void save_load_game_dialog(gboolean is_save)
}
g_object_unref (G_OBJECT(store));
button_box = gtk_hbox_new (TRUE, 10);
if (is_save) {
ok_button = ut_button_new (_("Save game"), do_save_game, window, button_box);
g_signal_connect (G_OBJECT(treeview), "row_activated", G_CALLBACK(save_row_activated_cb), window);
gtk_dialog_add_button (GTK_DIALOG (dialog), _("Save game"), BUTTON_SAVE_GAME);
g_signal_connect (G_OBJECT(treeview), "row_activated", G_CALLBACK(save_row_activated_cb), dialog);
} else {
ok_button = ut_button_new (_("Load game"), do_load_game, window, button_box);
g_signal_connect(G_OBJECT(treeview), "row_activated", G_CALLBACK(load_row_activated_cb), window);
gtk_dialog_add_button (GTK_DIALOG (dialog), _("Load game"), BUTTON_LOAD_GAME);
g_signal_connect (G_OBJECT(treeview), "row_activated", G_CALLBACK(load_row_activated_cb), dialog);
}
delete_button = ut_button_new (_("Delete game"), do_delete_game, treeview, button_box);
gtk_dialog_add_button (GTK_DIALOG (dialog), _("Delete game"), BUTTON_DELETE_GAME);
gtk_dialog_add_button (GTK_DIALOG (dialog), "gtk-cancel", GTK_RESPONSE_CANCEL);
g_signal_connect (dialog, "response", G_CALLBACK (save_load_dlg_response),
treeview);
cancel_button = ut_button_new_stock_swap (GTK_STOCK_CANCEL, gtk_widget_destroy, window, button_box);
gtk_box_pack_start (GTK_BOX(vbox), button_box, FALSE, FALSE, 4);
gtk_widget_grab_default (ok_button);
gtk_widget_grab_focus (ok_button);
gtk_window_set_default_size (GTK_WINDOW(window), -1, 300);
gtk_widget_show_all (window);
gtk_window_set_default_size (GTK_WINDOW(dialog), -1, 300);
gtk_widget_show_all (dialog);
}
void save_game_cb(GtkWidget *widget, gpointer data) {