Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog28
-rw-r--r--boards/missing_letter/Makefile.am5
-rw-r--r--boards/missing_letter/board1.xml.in108
-rw-r--r--boards/missing_letter/board2.xml.in40
-rw-r--r--boards/missing_letter/board3.xml.in40
-rw-r--r--boards/missing_letter/board4.xml.in40
-rw-r--r--src/boards/Makefile.am2
-rw-r--r--src/boards/missingletter.c169
-rw-r--r--src/boards/missingletter_config.c599
-rw-r--r--src/boards/reading.c17
-rw-r--r--src/gcompris/board_config_wordlist.c12
-rw-r--r--src/gcompris/gc_net.c43
-rw-r--r--src/gcompris/gc_net.h1
-rw-r--r--src/gcompris/gcompris.c16
14 files changed, 914 insertions, 206 deletions
diff --git a/ChangeLog b/ChangeLog
index 720ebf9..ef0615c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,31 @@
+2009-02-17 Bruno coudoin <bruno.coudoin@free.fr>
+
+ - Miquel DE IZARRA Added support for editing the content
+ of the missing letter activity.
+
+ * boards/missing_letter/Makefile.am:
+ * boards/missing_letter/board1.xml.in:
+ * boards/missing_letter/board2.xml.in:
+ * boards/missing_letter/board3.xml.in:
+ * boards/missing_letter/board4.xml.in:
+ * src/boards/Makefile.am:
+ * src/boards/missingletter.c: (pause_board), (start_board),
+ (end_board), (set_level), (missing_letter_next_level),
+ (missing_letter_create_item), (game_won), (init_xml),
+ (add_xml_data), (missing_read_xml_file),
+ (missing_destroy_board_list), (conf_ok), (config_start):
+ * src/boards/missingletter_config.c: (new_clicked),
+ (delete_clicked), (valid_entry), (apply_clicked), (up_clicked),
+ (down_clicked), (_save), (save_clicked), (level_changed),
+ (text_changed), (selection_changed), (destroy_conf_data),
+ (configure_colummns), (config_missing_letter):
+ * src/boards/reading.c: (reading_create_item), (get_random_word):
+ * src/gcompris/board_config_wordlist.c: (gc_board_config_wordlist):
+ * src/gcompris/gc_net.c: (gc_net_get_url_from_file),
+ (gc_cache_import_pixmap):
+ * src/gcompris/gc_net.h:
+ * src/gcompris/gcompris.c: (main):
+
2009-02-05 Bruno coudoin <bruno.coudoin@free.fr>
Miguel DE IZARRA added support for online wordlist.
diff --git a/boards/missing_letter/Makefile.am b/boards/missing_letter/Makefile.am
index 4bffd44..3d8c1e3 100644
--- a/boards/missing_letter/Makefile.am
+++ b/boards/missing_letter/Makefile.am
@@ -2,7 +2,10 @@
xmldir = $(pkgdatadir)/@PACKAGE_DATA_DIR@/missing_letter
xml_in_files = \
- board1.xml.in
+ board1.xml.in \
+ board2.xml.in \
+ board3.xml.in \
+ board4.xml.in
xml_DATA = $(xml_in_files:.xml.in=.xml)
diff --git a/boards/missing_letter/board1.xml.in b/boards/missing_letter/board1.xml.in
index 221d6db..4a9a491 100644
--- a/boards/missing_letter/board1.xml.in
+++ b/boards/missing_letter/board1.xml.in
@@ -36,113 +36,5 @@
<pixmapfile>imageid/bed.png</pixmapfile>
<_data>bed/_ed/b/l/f</_data>
</Board>
- <Board>
- <pixmapfile>imageid/bottle.png</pixmapfile>
- <_data>bottle/_ottle/b/t/p</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/cake.png</pixmapfile>
- <_data>cake/_ake/c/p/d</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/ballon.png</pixmapfile>
- <_data>ball/_all/b/p/d</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/avion.png</pixmapfile>
- <_data>plane/p_ane/l/j/i</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/chien.png</pixmapfile>
- <_data>dog/d_g/o/g/a</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/fish.png</pixmapfile>
- <_data>fish/_ish/f/h/l</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/car.png</pixmapfile>
- <_data>car/_ar/c/k/b</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/cartable.png</pixmapfile>
- <_data>satchel/_atchel/s/c/l</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/banana.png</pixmapfile>
- <_data>banana/_anana/b/p/d</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/maison.png</pixmapfile>
- <_data>house/h_use/o/f/u</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/pomme.png</pixmapfile>
- <_data>apple/appl_/e/h/a</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/bed.png</pixmapfile>
- <_data>bed/b_d/e/a/i</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/bottle.png</pixmapfile>
- <_data>bottle/b_ttle/o/u/d</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/cake.png</pixmapfile>
- <_data>cake/c_ke/a/o/e</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/ballon.png</pixmapfile>
- <_data>ball/b_ll/a/u/o</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/avion.png</pixmapfile>
- <_data>plane/pl_ne/a/o/s</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/chien.png</pixmapfile>
- <_data>dog/do_/g/p/q</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/fish.png</pixmapfile>
- <_data>fish/fis_/h/o/i</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/car.png</pixmapfile>
- <_data>car/ca_/r/w/k</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/cartable.png</pixmapfile>
- <_data>satchel/sa_chel/t/p/c</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/banana.png</pixmapfile>
- <_data>banana/ba_ana/n/m/b</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/maison.png</pixmapfile>
- <_data>house/_ouse/h/e/j</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/pomme.png</pixmapfile>
- <_data>apple/app_e/l/h/n</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/bed.png</pixmapfile>
- <_data>bed/be_/d/p/b</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/bottle.png</pixmapfile>
- <_data>bottle/bott_e/l/y/r</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/cake.png</pixmapfile>
- <_data>cake/ca_e/k/q/c</_data>
- </Board>
- <Board>
- <pixmapfile>imageid/ballon.png</pixmapfile>
- <_data>ball/bal_/l/h/s</_data>
- </Board>
</missing_letter>
diff --git a/boards/missing_letter/board2.xml.in b/boards/missing_letter/board2.xml.in
new file mode 100644
index 0000000..3f82d24
--- /dev/null
+++ b/boards/missing_letter/board2.xml.in
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<missing_letter>
+ <Board>
+ <pixmapfile>imageid/bottle.png</pixmapfile>
+ <_data>bottle/_ottle/b/t/p</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/cake.png</pixmapfile>
+ <_data>cake/_ake/c/p/d</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/ballon.png</pixmapfile>
+ <_data>ball/_all/b/p/d</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/avion.png</pixmapfile>
+ <_data>plane/p_ane/l/j/i</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/chien.png</pixmapfile>
+ <_data>dog/d_g/o/g/a</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/fish.png</pixmapfile>
+ <_data>fish/_ish/f/h/l</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/car.png</pixmapfile>
+ <_data>car/_ar/c/k/b</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/cartable.png</pixmapfile>
+ <_data>satchel/_atchel/s/c/l</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/banana.png</pixmapfile>
+ <_data>banana/_anana/b/p/d</_data>
+ </Board>
+</missing_letter>
+
diff --git a/boards/missing_letter/board3.xml.in b/boards/missing_letter/board3.xml.in
new file mode 100644
index 0000000..8d84227
--- /dev/null
+++ b/boards/missing_letter/board3.xml.in
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<missing_letter>
+ <Board>
+ <pixmapfile>imageid/maison.png</pixmapfile>
+ <_data>house/h_use/o/f/u</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/pomme.png</pixmapfile>
+ <_data>apple/appl_/e/h/a</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/bed.png</pixmapfile>
+ <_data>bed/b_d/e/a/i</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/bottle.png</pixmapfile>
+ <_data>bottle/b_ttle/o/u/d</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/cake.png</pixmapfile>
+ <_data>cake/c_ke/a/o/e</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/ballon.png</pixmapfile>
+ <_data>ball/b_ll/a/u/o</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/avion.png</pixmapfile>
+ <_data>plane/pl_ne/a/o/s</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/chien.png</pixmapfile>
+ <_data>dog/do_/g/p/q</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/fish.png</pixmapfile>
+ <_data>fish/fis_/h/o/i</_data>
+ </Board>
+</missing_letter>
+
diff --git a/boards/missing_letter/board4.xml.in b/boards/missing_letter/board4.xml.in
new file mode 100644
index 0000000..6cc224f
--- /dev/null
+++ b/boards/missing_letter/board4.xml.in
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<missing_letter>
+ <Board>
+ <pixmapfile>imageid/car.png</pixmapfile>
+ <_data>car/ca_/r/w/k</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/cartable.png</pixmapfile>
+ <_data>satchel/sa_chel/t/p/c</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/banana.png</pixmapfile>
+ <_data>banana/ba_ana/n/m/b</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/maison.png</pixmapfile>
+ <_data>house/_ouse/h/e/j</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/pomme.png</pixmapfile>
+ <_data>apple/app_e/l/h/n</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/bed.png</pixmapfile>
+ <_data>bed/be_/d/p/b</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/bottle.png</pixmapfile>
+ <_data>bottle/bott_e/l/y/r</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/cake.png</pixmapfile>
+ <_data>cake/ca_e/k/q/c</_data>
+ </Board>
+ <Board>
+ <pixmapfile>imageid/ballon.png</pixmapfile>
+ <_data>ball/bal_/l/h/s</_data>
+ </Board>
+</missing_letter>
+
diff --git a/src/boards/Makefile.am b/src/boards/Makefile.am
index ae064d5..bdf06aa 100644
--- a/src/boards/Makefile.am
+++ b/src/boards/Makefile.am
@@ -161,7 +161,7 @@ libimageid_la_SOURCES = imageid.c
libmissingletter_la_LDFLAGS = $(shared) $(no_undefined) -module -avoid-version $(gc_libs) $(XML_LIBS)
libmissingletter_la_LIBADD =
-libmissingletter_la_SOURCES = missingletter.c
+libmissingletter_la_SOURCES = missingletter.c missingletter_config.c
libclick_on_letter_la_LDFLAGS = $(shared) $(no_undefined) -module -avoid-version $(gc_libs)
diff --git a/src/boards/missingletter.c b/src/boards/missingletter.c
index 5f07d83..476044a 100644
--- a/src/boards/missingletter.c
+++ b/src/boards/missingletter.c
@@ -26,7 +26,7 @@
#define SOUNDLISTFILE PACKAGE
-static GcomprisBoard *gcomprisBoard = NULL;
+GcomprisBoard *gcomprisBoard_missing = NULL;
static gboolean board_paused = TRUE;
static void start_board (GcomprisBoard *agcomprisBoard);
@@ -42,6 +42,9 @@ static void config_start(GcomprisBoard *agcomprisBoard,
GcomprisProfile *aProfile);
static void config_stop(void);
+/* from missingletter_config.c */
+void config_missing_letter(GcomprisBoardConf *config);
+
typedef struct _Board Board;
struct _Board {
char *pixmapfile;
@@ -55,12 +58,10 @@ struct _Board {
static Board * board;
/* XML */
-static gboolean read_xml_file(char *fname);
static void init_xml(void);
-static void add_xml_data(xmlDocPtr, xmlNodePtr, GNode *);
-static void parse_doc(xmlDocPtr doc);
-static gboolean read_xml_file(char *fname);
-static void destroy_board_list();
+static void add_xml_data(xmlDocPtr, xmlNodePtr, GList**);
+gboolean missing_read_xml_file(char *fname, GList**);
+void missing_destroy_board_list(GList *);
static void destroy_board(Board * board);
/* This is the list of boards */
@@ -69,12 +70,7 @@ static GList *board_list = NULL;
#define VERTICAL_SEPARATION 30
#define HORIZONTAL_SEPARATION 30
-//NUMBER_OF_SUBLEVELS*NUMBER_OF_LEVELS must equal the number of boards in XML file
-#define NUMBER_OF_SUBLEVELS 9
-#define NUMBER_OF_LEVELS 4
-
/* ================================================================ */
-static int board_number; // between 0 and board_list.length-1
static int right_word; // between 1 and 3, indicates which choice is the right one (the player clicks on it
static GnomeCanvasGroup *boardRootItem = NULL;
@@ -131,7 +127,7 @@ GET_BPLUGIN_INFO(missingletter)
*/
static void pause_board (gboolean pause)
{
- if(gcomprisBoard==NULL)
+ if(gcomprisBoard_missing==NULL)
return;
gc_bar_hide(FALSE);
@@ -149,6 +145,7 @@ static void pause_board (gboolean pause)
static void start_board (GcomprisBoard *agcomprisBoard)
{
GHashTable *config = gc_db_get_board_conf();
+ gchar * filename;
gc_locale_set(g_hash_table_lookup( config, "locale"));
@@ -156,19 +153,23 @@ static void start_board (GcomprisBoard *agcomprisBoard)
if(agcomprisBoard!=NULL)
{
- gcomprisBoard=agcomprisBoard;
- gc_set_background(gnome_canvas_root(gcomprisBoard->canvas),
+ gcomprisBoard_missing=agcomprisBoard;
+ gc_set_background(gnome_canvas_root(gcomprisBoard_missing->canvas),
"opt/missingletter-bg.jpg");
- gcomprisBoard->level=1;
- gcomprisBoard->maxlevel=NUMBER_OF_LEVELS;
- gcomprisBoard->sublevel=1;
- gcomprisBoard->number_of_sublevel=NUMBER_OF_SUBLEVELS; /* Go to next level after this number of 'play' */
+ gcomprisBoard_missing->level=1;
+
+ /* Calculate the maxlevel based on the available data file for this board */
+ gcomprisBoard_missing->maxlevel = 1;
+ while((filename = gc_file_find_absolute("%s/board%d.xml",
+ gcomprisBoard_missing->boarddir, ++gcomprisBoard_missing->maxlevel)))
+ g_free(filename);
+
+ gcomprisBoard_missing->maxlevel--;
+
+ gcomprisBoard_missing->sublevel=1;
+ gcomprisBoard_missing->number_of_sublevel=G_MAXINT;
+
init_xml();
- g_assert(NUMBER_OF_LEVELS*NUMBER_OF_SUBLEVELS == g_list_length(board_list));
- gc_score_start(SCORESTYLE_NOTE,
- 50,
- gcomprisBoard->height - 50,
- gcomprisBoard->number_of_sublevel);
gc_bar_set(GC_BAR_CONFIG | GC_BAR_LEVEL);
missing_letter_next_level();
@@ -181,27 +182,29 @@ static void start_board (GcomprisBoard *agcomprisBoard)
static void end_board ()
{
- if(gcomprisBoard!=NULL)
+ if(gcomprisBoard_missing!=NULL)
{
pause_board(TRUE);
gc_score_end();
missing_letter_destroy_all_items();
- destroy_board_list();
+ missing_destroy_board_list(board_list);
+ board_list = NULL;
}
gc_locale_reset();
- gcomprisBoard = NULL;
+ gcomprisBoard_missing = NULL;
}
static void
set_level (guint level)
{
- if(gcomprisBoard!=NULL)
+ if(gcomprisBoard_missing!=NULL)
{
- gcomprisBoard->level=level;
- gcomprisBoard->sublevel=1;
+ gcomprisBoard_missing->level=level;
+ gcomprisBoard_missing->sublevel=1;
+ init_xml();
missing_letter_next_level();
}
}
@@ -227,16 +230,16 @@ is_our_board (GcomprisBoard *gcomprisBoard)
/* set initial values for the next level */
static void missing_letter_next_level()
{
- gc_bar_set_level(gcomprisBoard);
+ gc_bar_set_level(gcomprisBoard_missing);
missing_letter_destroy_all_items();
selected_button = NULL;
gamewon = FALSE;
- gc_score_set(gcomprisBoard->sublevel);
+ gc_score_set(gcomprisBoard_missing->sublevel);
/* Try the next level */
- missing_letter_create_item(gnome_canvas_root(gcomprisBoard->canvas));
+ missing_letter_create_item(gnome_canvas_root(gcomprisBoard_missing->canvas));
}
/* ==================================== */
@@ -267,27 +270,24 @@ static GnomeCanvasItem *missing_letter_create_item(GnomeCanvasGroup *parent)
gint txt_area_x = 515;
gint txt_area_y = 435;
- board_number = (gcomprisBoard->level-1) * NUMBER_OF_SUBLEVELS + gcomprisBoard->sublevel-1;
-
- g_assert(board_number >= 0 && board_number < g_list_length(board_list));
place = g_random_int_range( 0, 3);
g_assert(place >= 0 && place < 3);
right_word = place+1;
boardRootItem = GNOME_CANVAS_GROUP(
- gnome_canvas_item_new (gnome_canvas_root(gcomprisBoard->canvas),
+ gnome_canvas_item_new (gnome_canvas_root(gcomprisBoard_missing->canvas),
gnome_canvas_group_get_type (),
"x", (double) 0,
"y", (double) 0,
NULL));
button_pixmap = gc_skin_pixmap_load("button.png");
/* display the image */
- board = g_list_nth_data(board_list, board_number);
+ board = g_list_nth_data(board_list, gcomprisBoard_missing->sublevel-1);
g_assert(board != NULL);
pixmap = gc_pixmap_load(board->pixmapfile);
- yOffset = (gcomprisBoard->height - gdk_pixbuf_get_height(button_pixmap) - gdk_pixbuf_get_height(pixmap) - 2*VERTICAL_SEPARATION)/2;
+ yOffset = (gcomprisBoard_missing->height - gdk_pixbuf_get_height(button_pixmap) - gdk_pixbuf_get_height(pixmap) - 2*VERTICAL_SEPARATION)/2;
text_s = gnome_canvas_item_new (boardRootItem,
gnome_canvas_text_get_type (),
@@ -344,7 +344,7 @@ static GnomeCanvasItem *missing_letter_create_item(GnomeCanvasGroup *parent)
break;
}
- yOffset = ( gcomprisBoard->height - 3*gdk_pixbuf_get_height(button_pixmap) - 2*VERTICAL_SEPARATION) / 2;
+ yOffset = ( gcomprisBoard_missing->height - 3*gdk_pixbuf_get_height(button_pixmap) - 2*VERTICAL_SEPARATION) / 2;
xOffset = (img_area_x-gdk_pixbuf_get_width(button_pixmap))/2;
button1 = gnome_canvas_item_new (boardRootItem,
gnome_canvas_pixbuf_get_type (),
@@ -437,13 +437,15 @@ static GnomeCanvasItem *missing_letter_create_item(GnomeCanvasGroup *parent)
}
/* ==================================== */
static void game_won() {
- gcomprisBoard->sublevel++;
+ gcomprisBoard_missing->sublevel++;
- if(gcomprisBoard->sublevel>gcomprisBoard->number_of_sublevel) {
+ if(gcomprisBoard_missing->sublevel>gcomprisBoard_missing->number_of_sublevel) {
/* Try the next level */
- gcomprisBoard->sublevel=1;
- gcomprisBoard->level++;
- if(gcomprisBoard->level>gcomprisBoard->maxlevel) {
+ gcomprisBoard_missing->sublevel=1;
+ gcomprisBoard_missing->level++;
+ init_xml();
+
+ if(gcomprisBoard_missing->level>gcomprisBoard_missing->maxlevel) {
gc_bonus_end_display(GC_BOARD_FINISHED_TUXPLANE);
return;
}
@@ -562,16 +564,27 @@ static void init_xml()
{
char *filename;
- filename = gc_file_find_absolute("%s/board1.xml",
- gcomprisBoard->boarddir);
-
- g_assert(read_xml_file(filename)== TRUE);
-
+ if(board_list)
+ {
+ missing_destroy_board_list(board_list);
+ board_list = NULL;
+ }
+ filename = gc_file_find_absolute("%s/board%d.xml",
+ gcomprisBoard_missing->boarddir,
+ gcomprisBoard_missing->level);
+ missing_read_xml_file(filename, &board_list);
+ gcomprisBoard_missing->number_of_sublevel = g_list_length(board_list);
g_free(filename);
+
+ gc_score_end();
+ gc_score_start(SCORESTYLE_NOTE,
+ 50,
+ gcomprisBoard_missing->height - 50,
+ gcomprisBoard_missing->number_of_sublevel);
}
/* ==================================== */
-static void add_xml_data(xmlDocPtr doc, xmlNodePtr xmlnode, GNode * child)
+static void add_xml_data(xmlDocPtr doc, xmlNodePtr xmlnode, GList **list)
{
gchar *pixmapfile = NULL;
gchar *question = NULL, *answer = NULL;
@@ -593,22 +606,17 @@ static void add_xml_data(xmlDocPtr doc, xmlNodePtr xmlnode, GNode * child)
{
if(data==NULL)
{
- data = gettext((gchar *)xmlNodeListGetString(doc, xmlnode->xmlChildrenNode, 1));
+ gchar *tmp;
+ tmp = (gchar *)xmlNodeListGetString(doc, xmlnode->xmlChildrenNode, 1);
+ data = g_strdup(gettext(tmp));
+ g_free(tmp);
}
}
xmlnode = xmlnode->next;
}
- // I really don't know why this test, but otherwise, the list is doubled
- // with 1 line on 2 filled with NULL elements
- if ( pixmapfile == NULL || data == NULL)
- return;
-
-/* if ((i=sscanf(data, "%s / %s / %s / %s / %s", answer, question, l1, l2, l3)) != 5)
- printf("Error sscanf result != 5 = %i\n",i);
-*/
gchar **all_answer = g_strsplit(data, "/", 5);
- /* Dont free data, it's a gettext static message */
+ g_free(data);
answer = all_answer[0];
question = all_answer[1];
@@ -627,28 +635,18 @@ static void add_xml_data(xmlDocPtr doc, xmlNodePtr xmlnode, GNode * child)
g_strfreev(all_answer);
- board_list = g_list_append (board_list, board);
+ *list = g_list_append (*list, board);
}
-/* ==================================== */
-static void parse_doc(xmlDocPtr doc)
-{
- xmlNodePtr node;
-
- for(node = doc->children->children; node != NULL; node = node->next) {
- if ( g_strcasecmp((gchar *)node->name, "Board") == 0 )
- add_xml_data(doc, node,NULL);
- }
-
-}
/* ==================================== */
/* read an xml file into our memory structures and update our view,
dump any old data we have in memory if we can load a new set */
-static gboolean read_xml_file(char *fname)
+gboolean missing_read_xml_file(char *fname, GList **list)
{
/* pointer to the new doc */
xmlDocPtr doc;
+ xmlNodePtr node;
g_return_val_if_fail(fname!=NULL,FALSE);
@@ -669,17 +667,21 @@ static gboolean read_xml_file(char *fname)
return FALSE;
}
- parse_doc(doc);
+ for(node = doc->children->children; node != NULL; node = node->next) {
+ if ( g_strcasecmp((gchar *)node->name, "Board") == 0 )
+ add_xml_data(doc, node, list);
+ }
xmlFreeDoc(doc);
return TRUE;
}
+
/* ======================================= */
-static void destroy_board_list() {
+void missing_destroy_board_list(GList *list) {
Board *board;
- while(g_list_length(board_list)>0)
+ while(g_list_length(list)>0)
{
- board = g_list_nth_data(board_list, 0);
- board_list = g_list_remove (board_list, board);
+ board = g_list_nth_data(list, 0);
+ list = g_list_remove (list, board);
destroy_board(board);
}
}
@@ -721,14 +723,14 @@ static void save_table (gpointer key,
static GcomprisConfCallback conf_ok(GHashTable *table)
{
if (!table){
- if (gcomprisBoard)
+ if (gcomprisBoard_missing)
pause_board(FALSE);
return NULL;
}
g_hash_table_foreach(table, (GHFunc) save_table, NULL);
- if (gcomprisBoard){
+ if (gcomprisBoard_missing){
gc_locale_reset();
GHashTable *config;
@@ -743,8 +745,6 @@ static GcomprisConfCallback conf_ok(GHashTable *table)
if (profile_conf)
g_hash_table_destroy(config);
- destroy_board_list();
-
init_xml();
missing_letter_next_level();
@@ -753,6 +753,7 @@ static GcomprisConfCallback conf_ok(GHashTable *table)
board_conf = NULL;
profile_conf = NULL;
+ pause_board(FALSE);
return NULL;
}
@@ -764,7 +765,7 @@ config_start(GcomprisBoard *agcomprisBoard,
board_conf = agcomprisBoard;
profile_conf = aProfile;
- if (gcomprisBoard)
+ if (gcomprisBoard_missing)
pause_board(TRUE);
gchar *label = g_strdup_printf(_("<b>%s</b> configuration\n for profile <b>%s</b>"),
@@ -782,7 +783,7 @@ config_start(GcomprisBoard *agcomprisBoard,
gchar *locale = g_hash_table_lookup( config, "locale");
gc_board_config_combo_locales(bconf, locale);
-
+ config_missing_letter(bconf);
}
diff --git a/src/boards/missingletter_config.c b/src/boards/missingletter_config.c
new file mode 100644
index 0000000..b3600b6
--- /dev/null
+++ b/src/boards/missingletter_config.c
@@ -0,0 +1,599 @@
+#include "gcompris/gcompris.h"
+#include <string.h>
+
+/* from missingletter.c */
+typedef struct _Board Board;
+struct _Board {
+ char *pixmapfile;
+ char *question;
+ char *answer;
+ char *l1;
+ char *l2;
+ char *l3;
+ };
+
+extern GcomprisBoard *gcomprisBoard_missing;
+gboolean missing_read_xml_file(char *fname, GList**);
+void missing_destroy_board_list(GList *);
+
+typedef struct
+ {
+ GtkComboBox *combo_level;
+ GtkTreeView *view;
+
+ GtkFileChooserButton *pixmap;
+ GtkEntry *question, *answer, *choice;
+ gboolean changed;
+ } _config_missing;
+
+enum
+ {
+ QUESTION_COLUMN,
+ ANSWER_COLUMN,
+ CHOICE_COLUMN,
+ PIXMAP_COLUMN,
+ PIXBUF_COLUMN,
+ N_COLUMNS
+ };
+
+#define ICON_SIZE 32
+
+static void new_clicked(GtkButton *b, gpointer data)
+{
+ _config_missing *u = (_config_missing*)data;
+ GtkListStore *ls;
+ GtkTreeIter iter;
+
+ ls = GTK_LIST_STORE(gtk_tree_view_get_model(u->view));
+ gtk_list_store_append(ls, &iter);
+ gtk_list_store_set(ls, &iter,
+ QUESTION_COLUMN, "",
+ ANSWER_COLUMN, "",
+ CHOICE_COLUMN, "",
+ PIXMAP_COLUMN, "",
+ PIXBUF_COLUMN, NULL,
+ -1);
+ GtkTreeSelection* sel = gtk_tree_view_get_selection(u->view);
+ gtk_tree_selection_select_iter(sel , &iter);
+}
+
+static void delete_clicked(GtkButton *b, gpointer data)
+{
+ _config_missing *u = (_config_missing*)data;
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(u->view);
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+ if (gtk_tree_selection_get_selected (selection, &model, &iter))
+ {
+ gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
+ u->changed = TRUE;
+ }
+}
+
+static gboolean valid_entry(gchar *question, gchar *answer,
+ gchar *choice, gchar *pixmap)
+{
+ gboolean result=FALSE;
+ gchar **split;
+
+ if(choice && question && answer && pixmap &&
+ strlen(choice)==3 && strlen(question) && strlen(answer)
+ && strchr(question, '_'))
+ {
+ split = g_strsplit(question, "_", 2);
+ if(g_str_has_prefix(answer, split[0]) &&
+ g_str_has_suffix(answer, split[1]) &&
+ answer[strlen(split[0])] == choice[0])
+ result = TRUE;
+ g_strfreev(split);
+ }
+ return result;
+}
+
+static void apply_clicked(GtkButton *b, gpointer data)
+{
+ _config_missing *u = (_config_missing*)data;
+ const gchar *question, *answer, *choice;
+ gchar *pixmap, *pixfile;
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(u->view);
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+ question = gtk_entry_get_text(u->question);
+ answer = gtk_entry_get_text(u->answer);
+ choice = gtk_entry_get_text(u->choice);
+ pixmap = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(u->pixmap));
+
+ if(valid_entry((gchar*)question, (gchar*) answer, (gchar*)choice, pixmap))
+ {
+ if (gtk_tree_selection_get_selected (selection, &model, &iter))
+ {
+ pixfile = gc_cache_import_pixmap(pixmap, "imageid", 300, 300);
+ GdkPixbuf *pixbuf =
+ gdk_pixbuf_new_from_file_at_size(pixmap, ICON_SIZE,
+ ICON_SIZE, NULL);
+
+ gtk_list_store_set(GTK_LIST_STORE(model),&iter,
+ QUESTION_COLUMN, question,
+ ANSWER_COLUMN, answer,
+ CHOICE_COLUMN, choice,
+ PIXMAP_COLUMN, pixfile,
+ PIXBUF_COLUMN, pixbuf,
+ -1);
+ u->changed = TRUE;
+ g_free(pixfile);
+ g_object_unref(pixbuf);
+ }
+ }
+ g_free(pixmap);
+}
+
+static void up_clicked(GtkButton *b, gpointer data)
+{
+ _config_missing *u = (_config_missing*)data;
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(u->view);
+ GtkTreeIter itera, iterb;
+ GtkTreeModel *model;
+ GtkTreePath *tpa, *tpb;
+ gchar *pa, *pb;
+
+ if (gtk_tree_selection_get_selected (selection, &model, &itera))
+ {
+ pa = gtk_tree_model_get_string_from_iter(model, &itera);
+ tpa = gtk_tree_path_new_from_string(pa);
+ tpb = gtk_tree_path_copy(tpa);
+ gtk_tree_path_prev(tpb);
+ pb = gtk_tree_path_to_string(tpb);
+ gtk_tree_model_get_iter_from_string(model, &iterb, pb);
+ gtk_list_store_swap(GTK_LIST_STORE(model), &itera, &iterb);
+ gtk_tree_path_free(tpa);
+ gtk_tree_path_free(tpb);
+ g_free(pa);
+ g_free(pb);
+ u->changed = TRUE;
+ }
+}
+
+static void down_clicked(GtkButton *b, gpointer data)
+{
+ _config_missing *u = (_config_missing*)data;
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(u->view);
+ GtkTreeIter itera, iterb;
+ GtkTreeModel *model;
+ GtkTreePath *tpa, *tpb;
+ gchar *pa, *pb;
+
+ if (gtk_tree_selection_get_selected (selection, &model, &itera))
+ {
+ pa = gtk_tree_model_get_string_from_iter(model, &itera);
+ tpa = gtk_tree_path_new_from_string(pa);
+ tpb = gtk_tree_path_copy(tpa);
+ gtk_tree_path_next(tpb);
+ pb = gtk_tree_path_to_string(tpb);
+ if(gtk_tree_model_get_iter_from_string(model, &iterb, pb))
+ gtk_list_store_swap(GTK_LIST_STORE(model), &itera, &iterb);
+ gtk_tree_path_free(tpa);
+ gtk_tree_path_free(tpb);
+ g_free(pa);
+ g_free(pb);
+ u->changed = TRUE;
+ }
+}
+
+static gboolean _save(GtkTreeModel *model, GtkTreePath *path,
+ GtkTreeIter *iter, gpointer data)
+{
+ gchar *question, *answer, *choice, *pixmap;
+ gchar *tmp = NULL;
+ xmlNodePtr root, node;
+
+ gtk_tree_model_get (model, iter,
+ QUESTION_COLUMN, &question,
+ ANSWER_COLUMN, &answer,
+ CHOICE_COLUMN, &choice,
+ PIXMAP_COLUMN, &pixmap,
+ -1);
+ if(valid_entry(question, answer, choice, pixmap))
+ {
+ tmp = g_strdup_printf("%s/%s/%c/%c/%c",
+ answer, question,
+ choice[0], choice[1], choice[2]);
+
+ root =(xmlNodePtr)data;
+ node = xmlNewChild(root, NULL, BAD_CAST "Board", NULL);
+ xmlNewChild(node, NULL,BAD_CAST "pixmapfile", BAD_CAST pixmap);
+ xmlNewChild(node, NULL, BAD_CAST "data", BAD_CAST tmp);
+ }
+ g_free(tmp);
+ g_free(question);
+ g_free(answer);
+ g_free(choice);
+ return FALSE;
+}
+
+static void save_clicked(GtkButton *b, gpointer data)
+{
+ _config_missing *u = (_config_missing*)data;
+ GtkTreeModel *model;
+ gchar *filename;
+ xmlNodePtr root;
+ xmlDocPtr doc;
+ int level;
+
+ level = gtk_combo_box_get_active(u->combo_level)+1;
+ if(level==0)
+ return;
+ if(! u->changed)
+ return;
+ model = gtk_tree_view_get_model(u->view);
+ doc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION);
+ root = xmlNewNode(NULL, BAD_CAST "missing_letter");
+ xmlDocSetRootElement(doc,root);
+
+ gtk_tree_model_foreach(model, _save, root);
+
+ filename =
+ gc_file_find_absolute_writeable("%s/board%d.xml",
+ gcomprisBoard_missing->boarddir, level);
+ if(xmlSaveFormatFileEnc(filename, doc, NULL, 1)<0)
+ g_warning("Fail to write %s", filename);
+ g_free(filename);
+ xmlFreeDoc(doc);
+ u->changed = FALSE;
+}
+
+static void level_changed(GtkComboBox *combo, gpointer data)
+{
+ _config_missing *u = (_config_missing*)data;
+ GtkListStore *ls;
+ GtkTreeIter iter;
+ gchar *filename;
+ GList *list=NULL, *l;
+ gchar *tmp;
+ int level, result;
+
+ level = gtk_combo_box_get_active(u->combo_level)+1;
+ if(level==0)
+ return;
+ if(u->changed)
+ {
+ GtkWidget *dialog;
+
+ dialog = gtk_dialog_new_with_buttons("Save changes ?",
+ NULL,
+ GTK_DIALOG_MODAL,
+ GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
+ NULL);
+ result = gtk_dialog_run(GTK_DIALOG(dialog));
+ switch(result)
+ {
+ case GTK_RESPONSE_ACCEPT:
+ save_clicked(NULL, data);
+ break;
+ default:
+ u->changed=FALSE;
+ break;
+ }
+ gtk_widget_destroy (dialog);
+ }
+ ls = GTK_LIST_STORE(gtk_tree_view_get_model(u->view));
+ filename = gc_file_find_absolute("%s/board%d.xml",
+ gcomprisBoard_missing->boarddir, level);
+ missing_read_xml_file(filename,&list);
+ g_free(filename);
+ gtk_list_store_clear(ls);
+ for(l=list; l; l=l->next)
+ {
+ Board *b = l->data;
+ gchar *pixfile = gc_file_find_absolute(b->pixmapfile);
+ GdkPixbuf *pixbuf;
+
+ pixbuf =
+ gdk_pixbuf_new_from_file_at_size(pixfile, ICON_SIZE, ICON_SIZE,
+ NULL);
+
+ tmp = g_strdup_printf("%s%s%s", b->l1, b->l2, b->l3);
+
+ gtk_list_store_append(ls, &iter);
+ gtk_list_store_set(ls, &iter,
+ QUESTION_COLUMN, b->question,
+ ANSWER_COLUMN, b->answer,
+ CHOICE_COLUMN, tmp,
+ PIXMAP_COLUMN, b->pixmapfile,
+ PIXBUF_COLUMN, pixbuf,
+ -1);
+ g_free(tmp);
+ g_free(pixfile);
+ g_object_unref(pixbuf);
+ }
+ missing_destroy_board_list(list);
+}
+
+static void text_changed(GtkWidget *widget, gpointer data)
+{
+ _config_missing *u = (_config_missing*)data;
+
+ const gchar *question, *answer, *choice;
+
+ question = gtk_entry_get_text(u->question);
+ answer = gtk_entry_get_text(u->answer);
+ choice = gtk_entry_get_text(u->choice);
+
+ if(widget == (GtkWidget*)u->answer)
+ {
+ if(g_str_has_prefix(answer,question))
+ {
+ gtk_entry_set_text(u->question,answer);
+ }
+ }
+ else if(widget ==(GtkWidget*) u->question)
+ {
+ if(strchr(question, '_'))
+ {
+ gchar ** split = g_strsplit(question,"_",2);
+ if(answer[strlen(split[0])]!= choice[0])
+ {
+ gchar *tmp;
+ tmp = g_new0(gchar, 4);
+ tmp[0]= answer[strlen(split[0])];
+ gtk_entry_set_text(u->choice, tmp);
+ g_free(tmp);
+ }
+ g_strfreev(split);
+ }
+ }
+}
+
+void selection_changed (GtkTreeSelection *selection,gpointer data)
+{
+ _config_missing *u = (_config_missing*)data;
+ gchar *question, *answer, *choice, *pixmap, *pixfile;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+ if (gtk_tree_selection_get_selected (selection, &model, &iter))
+ {
+ gtk_tree_model_get (model, &iter,
+ QUESTION_COLUMN, &question,
+ ANSWER_COLUMN, &answer,
+ CHOICE_COLUMN, &choice,
+ PIXMAP_COLUMN, &pixmap,
+ -1);
+ gtk_entry_set_text(u->question, question);
+ gtk_entry_set_text(u->answer, answer);
+ gtk_entry_set_text(u->choice, choice);
+ pixfile = gc_file_find_absolute(pixmap);
+ gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(u->pixmap), pixfile);
+
+ g_free(question);
+ g_free(answer);
+ g_free(choice);
+ g_free(pixmap);
+ g_free(pixfile);
+ }
+}
+
+void destroy_conf_data(void *not_used, gpointer *data)
+{
+ g_free(data);
+}
+
+static void configure_colummns(GtkTreeView *treeview)
+{
+ GtkCellRenderer *renderer;
+ GtkTreeViewColumn *column;
+
+ /* pixbuf column */
+ renderer = gtk_cell_renderer_pixbuf_new();
+ column = gtk_tree_view_column_new_with_attributes(_("Pixbuf"),
+ renderer, "pixbuf", PIXBUF_COLUMN, NULL);
+ gtk_tree_view_append_column(treeview, column);
+
+ /* Answer column */
+ renderer = gtk_cell_renderer_text_new();
+ column = gtk_tree_view_column_new_with_attributes(_("Answer"),
+ renderer, "text", ANSWER_COLUMN, NULL);
+ gtk_tree_view_append_column(treeview, column);
+
+ /* Question column */
+ renderer = gtk_cell_renderer_text_new();
+ column = gtk_tree_view_column_new_with_attributes(_("Question"),
+ renderer, "text", QUESTION_COLUMN, NULL);
+ gtk_tree_view_append_column(treeview, column);
+
+ /* Choice column */
+ renderer = gtk_cell_renderer_text_new();
+ column = gtk_tree_view_column_new_with_attributes(_("Choice"),
+ renderer, "text", CHOICE_COLUMN, NULL);
+ gtk_tree_view_append_column(treeview, column);
+#if 0
+ /* pixmap column */
+ renderer = gtk_cell_renderer_text_new();
+ column = gtk_tree_view_column_new_with_attributes(_("Pixmap"),
+ renderer, "text", PIXMAP_COLUMN, NULL);
+ gtk_tree_view_append_column(treeview, column);
+#endif
+}
+
+ void config_missing_letter(GcomprisBoardConf *config)
+ {
+ GtkWidget *frame, *view, *pixmap, *question, *answer, *choice;
+ GtkWidget *level, *vbox, *hbox, *label;
+ GtkWidget *bbox, *button, *table;
+ GtkFileFilter *file_filter;
+ _config_missing *conf_data;
+ int i;
+
+ conf_data = g_new0(_config_missing,1);
+
+ /* frame */
+ frame = gtk_frame_new("");
+ gtk_widget_show(frame);
+ gtk_box_pack_start(GTK_BOX(config->main_conf_box), frame, TRUE, TRUE, 8);
+
+ vbox = gtk_vbox_new(FALSE, 8);
+ gtk_widget_show(vbox);
+ gtk_container_add(GTK_CONTAINER(frame), vbox);
+
+ /* hbox */
+ hbox = gtk_hbox_new(FALSE, 8);
+ gtk_widget_show(hbox);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 8);
+
+ /* combo level */
+ label = gtk_label_new(_("Choice of the level"));
+ gtk_widget_show(label);
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 8);
+
+ level = gtk_combo_box_new_text();
+ for(i=1; i< gcomprisBoard_missing->maxlevel; i++)
+ {
+ gchar *tmp;
+ tmp = g_strdup_printf(_("Level %d"), i);
+ gtk_combo_box_append_text(GTK_COMBO_BOX(level), tmp);
+ g_free(tmp);
+ }
+ gtk_widget_show(level);
+ gtk_box_pack_start(GTK_BOX(hbox), level, FALSE, FALSE, 8);
+
+ /* list view */
+ GtkListStore *list = gtk_list_store_new(N_COLUMNS,
+ G_TYPE_STRING, /*Question */
+ G_TYPE_STRING, /* Answer */
+ G_TYPE_STRING, /* Choice */
+ G_TYPE_STRING, /* pixmap */
+ GDK_TYPE_PIXBUF /* pixbuf */
+ );
+
+ view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list));
+ configure_colummns(GTK_TREE_VIEW(view));
+ gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (view), TRUE);
+ gtk_tree_view_set_search_column (GTK_TREE_VIEW (view), ANSWER_COLUMN);
+ gtk_widget_set_size_request(view, -1, 200);
+ gtk_widget_show(view);
+
+ GtkScrolledWindow *scroll = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL,NULL));
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_widget_show(GTK_WIDGET(scroll));
+ gtk_container_add(GTK_CONTAINER(scroll), view);
+
+ gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(scroll), TRUE, TRUE, 10);
+
+ /* button box */
+ bbox = gtk_hbutton_box_new();
+ gtk_widget_show(bbox);
+ gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 8);
+ button = gtk_button_new_from_stock(GTK_STOCK_NEW);
+ gtk_widget_show(button);
+ gtk_container_add(GTK_CONTAINER(bbox), button);
+ g_signal_connect(G_OBJECT(button), "clicked",
+ G_CALLBACK(new_clicked), (gpointer) conf_data);
+
+ button = gtk_button_new_from_stock(GTK_STOCK_DELETE);
+ gtk_widget_show(button);
+ gtk_container_add(GTK_CONTAINER(bbox), button);
+ g_signal_connect(G_OBJECT(button), "clicked",
+ G_CALLBACK(delete_clicked), (gpointer) conf_data);
+
+ button = gtk_button_new_from_stock(GTK_STOCK_APPLY);
+ gtk_widget_show(button);
+ gtk_container_add(GTK_CONTAINER(bbox), button);
+ g_signal_connect(G_OBJECT(button), "clicked",
+ G_CALLBACK(apply_clicked), (gpointer) conf_data);
+
+ button = gtk_button_new_from_stock(GTK_STOCK_GO_UP);
+ gtk_widget_show(button);
+ gtk_container_add(GTK_CONTAINER(bbox), button);
+ g_signal_connect(G_OBJECT(button), "clicked",
+ G_CALLBACK(up_clicked), (gpointer) conf_data);
+
+ button = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
+ gtk_widget_show(button);
+ gtk_container_add(GTK_CONTAINER(bbox), button);
+ g_signal_connect(G_OBJECT(button), "clicked",
+ G_CALLBACK(down_clicked), (gpointer) conf_data);
+
+ button = gtk_button_new_from_stock(GTK_STOCK_SAVE);
+ gtk_widget_show(button);
+ gtk_container_add(GTK_CONTAINER(bbox), button);
+ g_signal_connect(G_OBJECT(button), "clicked",
+ G_CALLBACK(save_clicked), (gpointer) conf_data);
+
+ /* table */
+ table = gtk_table_new(2, 4, FALSE);
+ gtk_widget_show(table);
+ gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 8);
+
+ /* answer */
+ label = gtk_label_new(_("Answer"));
+ gtk_widget_show(label);
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);
+
+ answer = gtk_entry_new();
+ gtk_widget_show(answer);
+ gtk_table_attach_defaults(GTK_TABLE(table), answer, 1, 2, 0, 1);
+
+ /* pixmap */
+ label = gtk_label_new(_("Picture"));
+ gtk_widget_show(label);
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, 0, 1);
+
+ pixmap = gtk_file_chooser_button_new(_("Choice of the filename"),
+ GTK_FILE_CHOOSER_ACTION_OPEN);
+
+ file_filter = gtk_file_filter_new();
+ gtk_file_filter_add_pixbuf_formats(file_filter);
+ gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(pixmap), file_filter);
+ gtk_widget_show(pixmap);
+ gtk_table_attach_defaults(GTK_TABLE(table), pixmap, 3, 4, 0, 1);
+
+ /* question */
+ label = gtk_label_new(_("Question"));
+ gtk_widget_show(label);
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2);
+
+ question = gtk_entry_new();
+ gtk_widget_show(question);
+ gtk_table_attach_defaults(GTK_TABLE(table), question, 1, 2, 1, 2);
+
+ /* choice */
+ label = gtk_label_new(_("Choice"));
+ gtk_widget_show(label);
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, 1, 2);
+
+ choice = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(choice), 3);
+ gtk_widget_show(choice);
+ gtk_table_attach_defaults(GTK_TABLE(table), choice, 3, 4, 1, 2);
+
+ conf_data -> combo_level = GTK_COMBO_BOX(level);
+ conf_data -> view = GTK_TREE_VIEW(view);
+ conf_data -> pixmap = GTK_FILE_CHOOSER_BUTTON(pixmap);
+ conf_data -> question = GTK_ENTRY(question);
+ conf_data -> answer = GTK_ENTRY(answer);
+ conf_data -> choice = GTK_ENTRY(choice);
+
+ GtkTreeSelection *selection;
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
+ gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
+
+ g_signal_connect(G_OBJECT(selection),
+ "changed",
+ G_CALLBACK(selection_changed),
+ (gpointer) conf_data);
+ g_signal_connect(G_OBJECT(frame), "destroy",
+ G_CALLBACK(destroy_conf_data), (gpointer) conf_data);
+ g_signal_connect(G_OBJECT(level), "changed",
+ G_CALLBACK(level_changed), (gpointer) conf_data);
+ g_signal_connect(G_OBJECT(question), "changed",
+ G_CALLBACK(text_changed), (gpointer) conf_data);
+ g_signal_connect(G_OBJECT(answer), "changed",
+ G_CALLBACK(text_changed), (gpointer) conf_data);
+
+ gtk_combo_box_set_active(GTK_COMBO_BOX(level), 0);
+ level_changed(GTK_COMBO_BOX(level),conf_data);
+ }
+
diff --git a/src/boards/reading.c b/src/boards/reading.c
index d43d1e0..bac3daa 100644
--- a/src/boards/reading.c
+++ b/src/boards/reading.c
@@ -457,7 +457,15 @@ static gboolean reading_create_item(GnomeCanvasGroup *parent)
word = g_strdup(textToFind);
}
- g_assert(word!=NULL);
+ if(word==NULL)
+ {
+ gc_dialog(_("Skip this level. Not enough word in the list !"),
+ (DialogBoxCallBack)reading_next_level);
+ gcomprisBoard->level++;
+ if(gcomprisBoard->level>gcomprisBoard->maxlevel) // the current board is finished : bail out
+ gc_bonus_end_display(GC_BOARD_FINISHED_RANDOM);
+ return FALSE;
+ }
if(textToFindIndex>=0)
textToFindIndex--;
@@ -776,6 +784,7 @@ static gchar *
get_random_word(const gchar* except)
{
gchar *word;
+ int count=0;
word = gc_wordlist_random_word_get(gc_wordlist, gcomprisBoard->level);
@@ -783,6 +792,12 @@ get_random_word(const gchar* except)
while(strcmp(except, word)==0)
{
g_free(word);
+
+ if(count++>100)
+ {
+ word = NULL;
+ break;
+ }
word = gc_wordlist_random_word_get(gc_wordlist, gcomprisBoard->level);
}
diff --git a/src/gcompris/board_config_wordlist.c b/src/gcompris/board_config_wordlist.c
index b0609ba..a6364b2 100644
--- a/src/gcompris/board_config_wordlist.c
+++ b/src/gcompris/board_config_wordlist.c
@@ -49,7 +49,7 @@ static void _combo_level_changed(GtkComboBox *combo_level, gpointer user_data)
}
wordsArray = g_malloc0(sizeof(gpointer)*(g_slist_length(lw->words)+1));
-
+
for(i=0, list = lw->words; list; list=list->next)
{
wordsArray[i]=(gchar*)list->data;
@@ -159,7 +159,7 @@ static void _button_clicked(GtkWidget *w, gpointer data)
static void _destroy(GtkWidget *w, gpointer data)
{
user_param_type_wordlist *u = (user_param_type_wordlist*)data;
-
+
gc_wordlist_free(u->wordlist);
g_free(u);
}
@@ -177,7 +177,7 @@ GtkWidget *gc_board_config_wordlist(GcomprisBoardConf *config, const gchar *file
const gchar *locale;
/* frame */
- frame = gtk_frame_new("Change wordlist");
+ frame = gtk_frame_new(_("Configure the list of words"));
gtk_widget_show(frame);
gtk_box_pack_start(GTK_BOX(config->main_conf_box), frame, FALSE, FALSE, 8);
@@ -206,7 +206,7 @@ GtkWidget *gc_board_config_wordlist(GcomprisBoardConf *config, const gchar *file
gtk_widget_show(combo_lang);
hbox = gtk_hbox_new(FALSE, 8);
- label = gtk_label_new(_("Choice language"));
+ label = gtk_label_new(_("Choice of the language"));
gtk_widget_show(label);
gtk_widget_show(hbox);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 8);
@@ -218,7 +218,7 @@ GtkWidget *gc_board_config_wordlist(GcomprisBoardConf *config, const gchar *file
gtk_widget_show(combo_level);
hbox = gtk_hbox_new(FALSE, 8);
- label = gtk_label_new(_("Choice level"));
+ label = gtk_label_new(_("Choice of the level"));
gtk_widget_show(label);
gtk_widget_show(hbox);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 8);
@@ -243,7 +243,7 @@ GtkWidget *gc_board_config_wordlist(GcomprisBoardConf *config, const gchar *file
gtk_widget_show(hbox);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 8);
- GtkWidget * b_default = gtk_button_new_with_label(_("Return to default"));
+ GtkWidget * b_default = gtk_button_new_with_label(_("Back to default"));
gtk_widget_show(b_default);
gtk_box_pack_start(GTK_BOX(hbox), b_default, FALSE, FALSE, 8);
diff --git a/src/gcompris/gc_net.c b/src/gcompris/gc_net.c
index db840fb..e74a114 100644
--- a/src/gcompris/gc_net.c
+++ b/src/gcompris/gc_net.c
@@ -171,6 +171,11 @@ gc_net_get_url_from_file(const gchar *format, ...)
g_file_set_contents(cache, buf, buflen, NULL);
g_free(buf);
}
+ else
+ { /* file is in content.txt but not in server */
+ g_free(cache);
+ cache = NULL;
+ }
}
}
g_free(file);
@@ -257,6 +262,44 @@ void gc_cache_add(gchar *filename)
g_hash_table_insert(cache_content, g_strdup(filename), g_strdup("0"));
}
+gchar* gc_cache_import_pixmap(gchar *filename, gchar *boarddir, gint width, gint height)
+{
+ GdkPixbuf *pixmap;
+ gchar *basename, *file, *ext, *name, *abs;
+
+ if(!g_path_is_absolute(filename))
+ return g_strdup(filename);
+ basename = g_path_get_basename(filename);
+ name = g_build_filename(boarddir, basename,NULL);
+ abs = gc_file_find_absolute(name);
+ if(abs && strcmp(abs,filename)==0)
+ {
+ g_free(basename);
+ g_free(abs);
+ return name;
+ }
+ pixmap = gdk_pixbuf_new_from_file_at_size(filename, width, height,NULL);
+ if(!pixmap)
+ {
+ g_free(abs);
+ g_free(basename);
+ g_free(name);
+ return NULL;
+ }
+
+ file = gc_file_find_absolute_writeable(name);
+ ext = strchr(basename, '.')+1;
+ if(strcmp(ext, "jpg")==0)
+ ext ="jpeg";
+
+ gdk_pixbuf_save(pixmap, file, ext, NULL,NULL);
+
+ g_free(abs);
+ g_free(basename);
+ g_free(file);
+ return name;
+}
+
void gc_cache_remove(gchar *filename)
{
g_remove(filename);
diff --git a/src/gcompris/gc_net.h b/src/gcompris/gc_net.h
index 968af6e..af0117c 100644
--- a/src/gcompris/gc_net.h
+++ b/src/gcompris/gc_net.h
@@ -40,6 +40,7 @@ void gc_net_destroy();
void gc_cache_init(void);
void gc_cache_add(gchar *filename);
+gchar* gc_cache_import_pixmap(gchar *filename, gchar *boarddir, gint width, gint height);
void gc_cache_remove(gchar *filename);
void gc_cache_save(void);
void gc_cache_destroy(void);
diff --git a/src/gcompris/gcompris.c b/src/gcompris/gcompris.c
index b8355ff..c651358 100644
--- a/src/gcompris/gcompris.c
+++ b/src/gcompris/gcompris.c
@@ -1712,8 +1712,7 @@ main (int argc, char *argv[])
}
}
}
- /* FIXME: Need to translate */
- printf("Number of activities: %d\n", board_count);
+ printf(_("Number of activities: %d\n"), board_count);
exit(0);
}
@@ -1749,7 +1748,7 @@ main (int argc, char *argv[])
{
if (g_access(properties->database, R_OK)==-1)
{
- printf("%s exists but is not readable or writable", properties->database);
+ printf(_("%s exists but is not readable or writable"), properties->database);
exit(0);
}
}
@@ -1808,8 +1807,10 @@ main (int argc, char *argv[])
if (popt_server){
#ifdef USE_GNET
properties->server = g_strdup(popt_server);
+ printf(" Server '%s'\n", properties->server);
#else
- printf("The --server option cannot be used because GCompris has been compiled without network support!");
+ printf(_("The --server option cannot be used because"
+ "GCompris has been compiled without network support!"));
exit(1);
#endif
}
@@ -1823,7 +1824,11 @@ main (int argc, char *argv[])
}
if (popt_server){
+ if(popt_cache_dir)
properties->cache_dir = g_strdup(popt_cache_dir);
+ else
+ properties->cache_dir = g_build_filename(g_get_user_cache_dir(), "gcompris", NULL);
+ printf(" Cache dir '%s'\n",properties->cache_dir);
}
if (popt_drag_mode){
@@ -1855,7 +1860,8 @@ main (int argc, char *argv[])
if(properties->profile == NULL)
{
- printf("ERROR: Profile '%s' is not found. Run 'gcompris --profile-list' to list available ones\n",
+ printf(_("ERROR: Profile '%s' is not found."
+ " Run 'gcompris --profile-list' to list available ones\n"),
popt_profile);
exit(1);
}