diff options
author | Yves Combe <ycombe@src.gnome.org> | 2006-01-25 09:41:17 (GMT) |
---|---|---|
committer | Yves Combe <ycombe@src.gnome.org> | 2006-01-25 09:41:17 (GMT) |
commit | a460ecfb0882b67e2354b410924620e34a1a5e6b (patch) | |
tree | 9bb28f876ec30be4317aefdc13d5b9bc48c89fc1 | |
parent | df19df2f28241730dd0e0f1ed2b0509d04646967 (diff) |
add a confirmation popup on quit. Yet colors problem because of shadow.
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | src/boards/menu2.c | 6 | ||||
-rw-r--r-- | src/gcompris/Makefile.am | 1 | ||||
-rw-r--r-- | src/gcompris/bar.c | 17 | ||||
-rw-r--r-- | src/gcompris/gcompris.h | 12 | ||||
-rw-r--r-- | src/gcompris/gcompris_confirm.c | 501 |
6 files changed, 544 insertions, 5 deletions
@@ -1,3 +1,15 @@ +2006-01-25 Yves Combe <yves@ycombe.net> + + add a confirmation popup on quit. Yet colors problem because of shadow. + + * src/boards/menu2.c: (menu_create_item): + * src/gcompris/Makefile.am: + * src/gcompris/bar.c: (item_event_bar), (confirm_quit): + * src/gcompris/gcompris.h: + * src/gcompris/gcompris_confirm.c: (gcompris_confirm), + (gcompris_confirm_stop), (display_confirm), (free_stuff), + (set_content), (button_event): + 2006-01-25 Bruno coudoin <bruno.coudoin@free.fr> First release of a new activity, the wordprocessor. diff --git a/src/boards/menu2.c b/src/boards/menu2.c index c000186..cb57204 100644 --- a/src/boards/menu2.c +++ b/src/boards/menu2.c @@ -1,6 +1,6 @@ /* gcompris - menu2.c * - * Time-stamp: <2006/01/23 23:27:48 yves> + * Time-stamp: <2006/01/23 23:49:43 yves> * * Copyright (C) 2000 Bruno Coudoin * @@ -464,6 +464,10 @@ static void menu_create_item(GnomeCanvasGroup *parent, MenuItems *menuitems, Gco gcomprisBoard->board_dir = tmp_board_dir; ratio = get_ratio (menu_pixmap, icon_size); + + if (ratio < 1.0) + g_warning("Resize %s", board->icon_name); + pixmap_w = gdk_pixbuf_get_width(menu_pixmap)*ratio; pixmap_h = gdk_pixbuf_get_height(menu_pixmap)*ratio; diff --git a/src/gcompris/Makefile.am b/src/gcompris/Makefile.am index 37b5f7b..f3efcec 100644 --- a/src/gcompris/Makefile.am +++ b/src/gcompris/Makefile.am @@ -121,6 +121,7 @@ libgcompris_1_la_SOURCES = \ board.h board.c \ board_config.h board_config.c \ gcompris_files.c \ + gcompris_confirm.c \ profile.c \ wordlist.c \ gcompris_db.c \ diff --git a/src/gcompris/bar.c b/src/gcompris/bar.c index b43f56c..553a131 100644 --- a/src/gcompris/bar.c +++ b/src/gcompris/bar.c @@ -1,6 +1,6 @@ /* gcompris - bar.c * - * Time-stamp: <2005/10/03 21:36:37 bruno> + * Time-stamp: <2006/01/25 10:24:33 yves> * * Copyright (C) 2000-2003 Bruno Coudoin * @@ -54,6 +54,8 @@ static guint level_handler_id; static gint sound_play_id = 0; +void confirm_quit(gboolean answer); + /* * Main entry point * ---------------- @@ -553,7 +555,12 @@ item_event_bar(GnomeCanvasItem *item, GdkEvent *event, gchar *data) } else if(!strcmp((char *)data, "quit")) { - gcompris_exit(); + //gcompris_exit(); + gcompris_confirm( "GCompris confirmation", + "Sure you want to quit ?", + "Yes, i am sure !", + "No, i am Bruno\'s daughter", + (ConfirmCallBack) confirm_quit); } break; @@ -564,7 +571,11 @@ item_event_bar(GnomeCanvasItem *item, GdkEvent *event, gchar *data) } - +void confirm_quit(gboolean answer) +{ + if (answer) + gcompris_exit(); +} /* Local Variables: */ diff --git a/src/gcompris/gcompris.h b/src/gcompris/gcompris.h index c9d5a6c..30dcc39 100644 --- a/src/gcompris/gcompris.h +++ b/src/gcompris/gcompris.h @@ -1,6 +1,6 @@ /* gcompris - gcompris.h * - * Time-stamp: <2005/11/11 12:50:47 bruno> + * Time-stamp: <2006/01/25 09:37:03 yves> * * Copyright (C) 2000,2001,2002 Bruno Coudoin * @@ -147,6 +147,16 @@ void gcompris_exit(); gchar *gcompris_get_database(); +typedef void (*ConfirmCallBack) (gboolean answer); + +void gcompris_confirm (gchar *title, + gchar *question_text, + gchar *yes_text, + gchar *no_text, + ConfirmCallBack iscb); + +void gcompris_confirm_stop (void); + /* Trace Log */ #define GCOMPRIS_LOG_STATUS_PASSED "PASSED" #define GCOMPRIS_LOG_STATUS_FAILED "FAILED" diff --git a/src/gcompris/gcompris_confirm.c b/src/gcompris/gcompris_confirm.c new file mode 100644 index 0000000..40c4bc6 --- /dev/null +++ b/src/gcompris/gcompris_confirm.c @@ -0,0 +1,501 @@ +/* gcompris - gcompris_confirm.c + * + * Time-stamp: <2006/01/25 10:26:25 yves> + * + * Copyright (C) 2000 Bruno Coudoin + * + * This program 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; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/** + * A confirmation popup for gcompris + * + */ +#include "gcompris.h" + +static gint item_event_confirm(GnomeCanvasItem *item, + GdkEvent *event, + gpointer data); + +static void display_text(GnomeCanvasItem *rootitem, gchar *text); + +static void display_confirm(gchar *title, + gchar *question_text, + gchar *yes_text, + gchar *no_text, + ConfirmCallBack iscb); + +static void entry_enter_callback( GtkWidget *widget, + GtkWidget *entry ); + +static gint +button_event(GnomeCanvasItem *item, GdkEvent *event, gchar *answer); + +static void free_stuff (GtkObject *obj, gchar* data); + +static void set_content(GnomeCanvasRichText *item_content, + GnomeCanvasRichText *item_content_s, + gchar *text); + +static gboolean confirm_displayed = FALSE; + +static GnomeCanvasItem *rootitem = NULL; + + +static ConfirmCallBack confirmCallBack = NULL; + +static gdouble bg_x; +static gdouble bg_y; + +static gdouble titre_x; +static gdouble titre_w; +static gdouble titre_y; +static gdouble titre_h; + + +static gdouble text_zone_x; +static gdouble text_zone_w; +static gdouble text_zone_y; +static gdouble text_zone_h; + + +static gdouble button_x; +static gdouble button_w; +static gdouble button_y; +static gdouble button_h; +static gdouble button_x_int; + +/* background */ +#define BG_X 400 +#define BG_Y 0 + +/* TITLE */ +#define T_X 80 +#define T_Y 24 +#define T_W 620 +#define T_H 30 + +/* Text */ +#define T_Z_X 80 +#define T_Z_Y 120 +#define T_Z_W 620 +#define T_Z_H 115 + +/* Buttons */ +#define T_B_X 80 +#define T_B_Y 250 +#define T_B_W 620 +#define T_B_H 192 +#define T_B_X_INT 30 + + +/* + * Main entry point + * ---------------- + * + */ + +/* + * Do all the file_selector display and register the events + * file_types is A Comma separated text explaining the different file types + */ + +void gcompris_confirm (gchar *title, + gchar *question_text, + gchar *yes_text, + gchar *no_text, + ConfirmCallBack iscb) +{ + display_confirm(title, + question_text, + yes_text, + no_text, + iscb); +} + +/* + * Remove the displayed file_selector. + * Do nothing if none is currently being dislayed + */ + +void gcompris_confirm_stop () +{ + GcomprisBoard *gcomprisBoard = get_current_gcompris_board(); + + if(gcomprisBoard!=NULL && confirm_displayed) + { + if(gcomprisBoard->plugin->pause_board != NULL) + { + gcomprisBoard->plugin->pause_board(FALSE); + } + } + + // Destroy the box + /* FIXME: Crashes randomly */ + if(rootitem!=NULL) + gtk_object_destroy(GTK_OBJECT(rootitem)); + + rootitem = NULL; + + gcompris_bar_hide(FALSE); + confirm_displayed = FALSE; +} + + + +/*-------------------------------------------------------------------------------*/ +/*-------------------------------------------------------------------------------*/ +/*-------------------------------------------------------------------------------*/ +/*-------------------------------------------------------------------------------*/ + + +static void +display_confirm(gchar *title, + gchar *question_text, + gchar *yes_text, + gchar *no_text, + ConfirmCallBack iscb) { + + GcomprisBoard *gcomprisBoard = get_current_gcompris_board(); + + + GnomeCanvasItem *item, *item2, *richtext1, *richtext2; + GdkPixbuf *pixmap = NULL; + GdkPixbuf *pixmap_cross = NULL; + GdkPixbuf *pixmap_stick = NULL; + gint y_start = 0; + gint x_start = 0; + + if(rootitem) + return; + + bg_x = BG_X; + bg_y = BG_Y; + + titre_x = T_X; + titre_w = T_W; + titre_y = T_Y;; + titre_h = T_H; + + + text_zone_x = T_Z_X; + text_zone_w = T_Z_W; + text_zone_y = T_Z_Y; + text_zone_h = T_Z_H; + + + button_x = T_B_X; + button_w = T_B_W; + button_y = T_B_Y; + button_h = T_B_Y; + button_x_int = T_B_X_INT; + + gcompris_bar_hide(TRUE); + + if(gcomprisBoard!=NULL) + { + if(gcomprisBoard->plugin->pause_board != NULL) + gcomprisBoard->plugin->pause_board(TRUE); + } + + confirmCallBack=iscb; + + rootitem = \ + gnome_canvas_item_new (gnome_canvas_root(gcompris_get_canvas()), + gnome_canvas_group_get_type (), + "x", (double)0, + "y", (double)0, + NULL); + + pixmap = gcompris_load_skin_pixmap("help_bg.png"); + y_start = (BOARDHEIGHT - gdk_pixbuf_get_height(pixmap))/2; + if (y_start < 0) + y_start = 0; + x_start = (BOARDWIDTH)/2; + item = gnome_canvas_item_new (GNOME_CANVAS_GROUP(rootitem), + gnome_canvas_pixbuf_get_type (), + "pixbuf", pixmap, + "x", (double) x_start, + "y", (double) y_start, + "anchor", GTK_ANCHOR_NORTH, + NULL); + + gdk_pixbuf_unref(pixmap); + + /* Title */ + gnome_canvas_item_new (GNOME_CANVAS_GROUP(rootitem), + gnome_canvas_text_get_type (), + "text", title, + "x", (gdouble) titre_x + titre_w/2 + 1.0, + "y", (gdouble) titre_y + titre_h/2 + 1.0, + "font", gcompris_skin_font_title, + "anchor", GTK_ANCHOR_CENTER, + "fill_color_rgba", gcompris_skin_color_title, + NULL); + + gnome_canvas_item_new (GNOME_CANVAS_GROUP(rootitem), + gnome_canvas_text_get_type (), + "text", title, + "x", (gdouble) titre_x + titre_w/2 + 1.0, + "y", (gdouble) titre_y + titre_h/2 + 1.0, + "font", gcompris_skin_font_title, + "anchor", GTK_ANCHOR_CENTER, + "fill_color_rgba", gcompris_skin_color_shadow, + NULL); + + richtext1 = gnome_canvas_item_new (GNOME_CANVAS_GROUP(rootitem), + gnome_canvas_rich_text_get_type (), + "x", (double) text_zone_x , + "y", (double) text_zone_y, + "width", text_zone_w, + "height", text_zone_h, + "anchor", GTK_ANCHOR_NW, + "justification", GTK_JUSTIFY_CENTER, + "grow_height", FALSE, + "cursor_visible", FALSE, + "cursor_blink", FALSE, + "editable", FALSE, + NULL); + + richtext2 = gnome_canvas_item_new (GNOME_CANVAS_GROUP(rootitem), + gnome_canvas_rich_text_get_type (), + "x", (double) text_zone_x + 1.0, + "y", (double) text_zone_y + 1.0, + "width", text_zone_w, + "height", text_zone_h, + "anchor", GTK_ANCHOR_NW, + "justification", GTK_JUSTIFY_CENTER, + "grow_height", FALSE, + "cursor_visible", FALSE, + "cursor_blink", FALSE, + "editable", FALSE, + NULL); + + set_content (GNOME_CANVAS_RICH_TEXT(richtext1), + GNOME_CANVAS_RICH_TEXT(richtext2), + question_text); + + + /* + * Buttons + * ------- + */ + + pixmap = gcompris_load_skin_pixmap("button_large.png"); + pixmap_stick = gcompris_load_skin_pixmap("button_checked.png"); + pixmap_cross = gcompris_load_skin_pixmap("bad.png"); + + // CANCEL + item = gnome_canvas_item_new (GNOME_CANVAS_GROUP(rootitem), + gnome_canvas_pixbuf_get_type (), + "pixbuf", pixmap, + "x", (double) button_x , + "y", (double) button_y + 2*button_h/3, + "anchor", GTK_ANCHOR_WEST, + NULL); + + gtk_signal_connect(GTK_OBJECT(item), "event", + (GtkSignalFunc) button_event, + "/no/"); + + gtk_signal_connect(GTK_OBJECT(item), "event", + (GtkSignalFunc) gcompris_item_event_focus, + NULL); + + // CANCEL CROSS + item = gnome_canvas_item_new (GNOME_CANVAS_GROUP(rootitem), + gnome_canvas_pixbuf_get_type (), + "pixbuf", pixmap_cross, + "x", (double) button_x + gdk_pixbuf_get_width(pixmap)/2, + "y", (double) button_y + 2*button_h/3, + "anchor", GTK_ANCHOR_CENTER, + NULL); + + gtk_signal_connect(GTK_OBJECT(item), "event", + (GtkSignalFunc) button_event, + "/no/"); + gtk_signal_connect(GTK_OBJECT(item), "event", + (GtkSignalFunc) gcompris_item_event_focus, + NULL); + + + item2 = gnome_canvas_item_new (GNOME_CANVAS_GROUP(rootitem), + gnome_canvas_text_get_type (), + "text", no_text, + "font", gcompris_skin_font_title, + "x", (double) button_x + gdk_pixbuf_get_width(pixmap) + button_x_int , + "y", (double) button_y + 2*button_h/3, + "anchor", GTK_ANCHOR_WEST, + "fill_color_rgba", gcompris_skin_color_text_button, + NULL); + + gtk_signal_connect(GTK_OBJECT(item2), "event", + (GtkSignalFunc) button_event, + "/no/"); + gtk_signal_connect(GTK_OBJECT(item2), "event", + (GtkSignalFunc) gcompris_item_event_focus, + item); + + // OK + item = gnome_canvas_item_new (GNOME_CANVAS_GROUP(rootitem), + gnome_canvas_pixbuf_get_type (), + "pixbuf", pixmap, + "x", (double) button_x , + "y", (double) button_y + button_h/3, + "anchor", GTK_ANCHOR_WEST, + NULL); + + gtk_signal_connect(GTK_OBJECT(item), "event", + (GtkSignalFunc) button_event, + "/yes/"); + + gtk_signal_connect(GTK_OBJECT(item), "event", + (GtkSignalFunc) gcompris_item_event_focus, + NULL); + + // OK stick + item = gnome_canvas_item_new (GNOME_CANVAS_GROUP(rootitem), + gnome_canvas_pixbuf_get_type (), + "pixbuf", pixmap_stick, + "x", (double) button_x + gdk_pixbuf_get_width(pixmap)/2, + "y", (double) button_y + button_h/3, + "anchor", GTK_ANCHOR_CENTER, + NULL); + + gtk_signal_connect(GTK_OBJECT(item), "event", + (GtkSignalFunc) button_event, + "/yes/"); + gtk_signal_connect(GTK_OBJECT(item), "event", + (GtkSignalFunc) gcompris_item_event_focus, + NULL); + + + item2 = gnome_canvas_item_new (GNOME_CANVAS_GROUP(rootitem), + gnome_canvas_text_get_type (), + "text", yes_text, + "font", gcompris_skin_font_title, + "x", (double) button_x + gdk_pixbuf_get_width(pixmap) + button_x_int , + "y", (double) button_y + button_h/3, + "anchor", GTK_ANCHOR_WEST, + "fill_color_rgba", gcompris_skin_color_text_button, + NULL); + + gtk_signal_connect(GTK_OBJECT(item2), "event", + (GtkSignalFunc) button_event, + "/yes/"); + gtk_signal_connect(GTK_OBJECT(item2), "event", + (GtkSignalFunc) gcompris_item_event_focus, + item); + +} + +static void +free_stuff (GtkObject *obj, gchar *data) +{ + g_free(data); +} + +/* Apply the style to the given RichText item */ +static void +set_content(GnomeCanvasRichText *item_content, + GnomeCanvasRichText *item_content_s, + gchar *text) { + + GtkTextIter iter_start, iter_end; + GtkTextBuffer *buffer; + GtkTextTag *txt_tag; + gboolean success; + gchar *color_string; + GdkColor *color_s = (GdkColor *)malloc(sizeof(GdkColor)); + GdkColor *color = (GdkColor *)malloc(sizeof(GdkColor)); + + /* + * Set the new text in the 2 items + */ + gnome_canvas_item_set(GNOME_CANVAS_ITEM(item_content), + "text", text, + NULL); + + gnome_canvas_item_set(GNOME_CANVAS_ITEM(item_content_s), + "text", text, + NULL); + + /* + * Set the shadow + */ + + color_string = g_strdup_printf("#%x", gcompris_skin_color_shadow >> 8); + gdk_color_parse(color_string, color_s); + success = gdk_colormap_alloc_color(gdk_colormap_get_system(), + color_s, + FALSE, TRUE); + + buffer = gnome_canvas_rich_text_get_buffer(GNOME_CANVAS_RICH_TEXT(item_content_s)); + txt_tag = gtk_text_buffer_create_tag(buffer, NULL, + "foreground-gdk", color_s, + "font", gcompris_skin_font_board_medium, + NULL); + gtk_text_buffer_get_end_iter(buffer, &iter_end); + gtk_text_buffer_get_start_iter(buffer, &iter_start); + gtk_text_buffer_apply_tag(buffer, txt_tag, &iter_start, &iter_end); + + g_free(color_string); + + /* + * Set the text + */ + color_string = g_strdup_printf("#%x", gcompris_skin_get_color("menu/text") >> 8); + gdk_color_parse(color_string, color); + success = gdk_colormap_alloc_color(gdk_colormap_get_system(), + color, + FALSE, TRUE); + + buffer = gnome_canvas_rich_text_get_buffer(GNOME_CANVAS_RICH_TEXT(item_content)); + txt_tag = gtk_text_buffer_create_tag(buffer, NULL, + "foreground-gdk", color, + "font", gcompris_skin_font_board_medium, + NULL); + gtk_text_buffer_get_end_iter(buffer, &iter_end); + gtk_text_buffer_get_start_iter(buffer, &iter_start); + gtk_text_buffer_apply_tag(buffer, txt_tag, &iter_start, &iter_end); + +} + +static gint +button_event(GnomeCanvasItem *item, GdkEvent *event, gchar *answer) +{ + if (event->type != GDK_BUTTON_PRESS) + return FALSE; + + /* Callback with the proper params */ + if (confirmCallBack){ + if (strcmp(answer, "/no/")==0) + confirmCallBack(FALSE); + else + confirmCallBack(TRUE); + } + gcompris_confirm_stop(); + + return TRUE; + +} + +/* Local Variables: */ +/* mode:c */ +/* eval:(load-library "time-stamp") */ +/* eval:(make-local-variable 'write-file-hooks) */ +/* eval:(add-hook 'write-file-hooks 'time-stamp) */ +/* eval:(setq time-stamp-format '(time-stamp-yyyy/mm/dd time-stamp-hh:mm:ss user-login-name)) */ +/* End: */ |