Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYves 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)
commita460ecfb0882b67e2354b410924620e34a1a5e6b (patch)
tree9bb28f876ec30be4317aefdc13d5b9bc48c89fc1
parentdf19df2f28241730dd0e0f1ed2b0509d04646967 (diff)
add a confirmation popup on quit. Yet colors problem because of shadow.
-rw-r--r--ChangeLog12
-rw-r--r--src/boards/menu2.c6
-rw-r--r--src/gcompris/Makefile.am1
-rw-r--r--src/gcompris/bar.c17
-rw-r--r--src/gcompris/gcompris.h12
-rw-r--r--src/gcompris/gcompris_confirm.c501
6 files changed, 544 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 841408d..dac6e8b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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: */