[gcompris/gcomprixogoo] Now the erase activity reads the .jpg file in its data directory instead of being hardcoded.
- From: Bruno Coudoin <bcoudoin src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gcompris/gcomprixogoo] Now the erase activity reads the .jpg file in its data directory instead of being hardcoded.
- Date: Tue, 4 Jan 2011 23:50:06 +0000 (UTC)
commit eea4df7b83f60a110916c14012ba27e98856f5c6
Author: Bruno Coudoin <bruno coudoin free fr>
Date: Wed Jan 5 00:43:04 2011 +0100
Now the erase activity reads the .jpg file in its data directory instead of being hardcoded.
In the erase activity we have a large number of animal backgrounds. Now these are found
at run time instead of being hard coded. Also the user can add its own images in the directory
~/My GCompris/erase.
src/erase-activity/erase.c | 147 +++++++++++++-----------
src/erase-activity/erase.xml.in | 2 +-
src/erase-activity/resources/erase/Makefile.am | 1 +
src/erase-activity/resources/erase/README.txt | 5 +
4 files changed, 85 insertions(+), 70 deletions(-)
---
diff --git a/src/erase-activity/erase.c b/src/erase-activity/erase.c
index 65786ba..8ad69fb 100644
--- a/src/erase-activity/erase.c
+++ b/src/erase-activity/erase.c
@@ -45,7 +45,6 @@ static GooCanvasItem *boardRootItem = NULL;
static GooCanvasItem *erase_create_item();
static void erase_destroy_all_items(void);
static void erase_next_level(void);
-static void shuffle_image_list(char *list[], int size);
static gboolean item_event (GooCanvasItem *item,
GooCanvasItem *target,
GdkEventCrossing *event,
@@ -54,6 +53,9 @@ static gboolean canvas_event (GooCanvasItem *item,
GooCanvasItem *target,
GdkEventButton *event,
gpointer data);
+static void init_user_dir();
+static void load_image_from_dir(char *image_dir,
+ GSList **image_list);
static int number_of_items = 0;
static int number_of_item_x = 0;
@@ -70,48 +72,7 @@ static gint timer_id = 0;
static gint board_mode = NORMAL;
// List of images to use in the game
-static gchar *imageList[] =
- {
- "erase/bear001.jpg",
- "erase/black-headed-gull.jpg",
- "erase/butterfly.jpg",
- "erase/cat1.jpg",
- "erase/cat2.jpg",
- "erase/donkey.jpg",
- "erase/elephanteauxgc.jpg",
- "erase/flamentrosegc.jpg",
- "erase/girafegc.jpg",
- "erase/hypogc.jpg",
- "erase/joybear001.jpg",
- "erase/joybear002.jpg",
- "erase/jumentmulassieregc.jpg",
- "erase/malaybear002.jpg",
- "erase/pigeon.jpg",
- "erase/polabear011.jpg",
- "erase/polarbear001.jpg",
- "erase/poolbears001.jpg",
- "erase/rhinogc.jpg",
- "erase/singegc.jpg",
- "erase/spectbear001.jpg",
- "erase/tetegorillegc.jpg",
- "erase/tiger1_by_Ralf_Schmode.jpg",
- "erase/tigercub003.jpg",
- "erase/tigerdrink001.jpg",
- "erase/tigerplay001.jpg",
- "erase/horses.jpg",
- "erase/horses2.jpg",
- "erase/squirrel.jpg",
- "erase/sheep_irish.jpg",
- "erase/sheep_irish2.jpg",
- "erase/cow.jpg",
- "erase/maki1.jpg",
- "erase/maki2.jpg",
- "erase/maki3.jpg",
- "erase/maki4.jpg",
- "erase/maki5.jpg",
- "erase/maki6.jpg",
- };
-#define NUMBER_OF_IMAGES G_N_ELEMENTS(imageList)
+static GSList *image_list = NULL;
/* Store the image index to use */
static int current_image;
@@ -181,6 +142,8 @@ static void start_board (GcomprisBoard *agcomprisBoard)
if(agcomprisBoard!=NULL)
{
+ GcomprisProperties *properties = gc_prop_get ();
+
gcomprisBoard=agcomprisBoard;
gcomprisBoard->level=1;
gcomprisBoard->maxlevel=6;
@@ -207,13 +170,23 @@ static void start_board (GcomprisBoard *agcomprisBoard)
gcomprisBoard->maxlevel=8;
}
+ init_user_dir();
+ load_image_from_dir(properties->package_data_dir, &image_list);
+ load_image_from_dir(properties->user_dir, &image_list);
current_image = 0;
- shuffle_image_list(imageList, NUMBER_OF_IMAGES);
- erase_next_level();
+ if ( g_slist_length(image_list) == 0)
+ {
+ gc_dialog(_("Error: No images found\n"), gc_board_stop);
+ }
+ else
+ {
+
+ erase_next_level();
- gamewon = FALSE;
- pause_board(FALSE);
+ gamewon = FALSE;
+ pause_board(FALSE);
+ }
}
}
@@ -235,6 +208,12 @@ static void end_board ()
pause_board(TRUE);
erase_destroy_all_items();
}
+
+ for ( i=0; i < g_slist_length(image_list); i++)
+ g_free( g_slist_nth_data(image_list, i) );
+ g_slist_free (image_list);
+ image_list = NULL;
+
gcomprisBoard = NULL;
}
@@ -307,11 +286,11 @@ static int get_num_layers()
/* set initial values for the next level */
static void erase_next_level()
{
- gc_set_background(goo_canvas_get_root_item(gcomprisBoard->canvas),
- imageList[current_image++]);
+ gc_set_background( goo_canvas_get_root_item(gcomprisBoard->canvas),
+ g_slist_nth_data (image_list, current_image++) );
- if(current_image>=NUMBER_OF_IMAGES)
- current_image=0;
+ if( current_image >= g_slist_length(image_list) )
+ current_image = 0;
gc_bar_set_level(gcomprisBoard);
@@ -587,26 +566,56 @@ canvas_event (GooCanvasItem *item,
}
-/** \brief shuffle_image_list, takes a char* array and it's length.
- * it swaps a random number of items in it in order to provide
- * the same list but in a random order.
- *
- * \param list: the array to shuffle
- * \param size: the size of the array
- *
- */
-void shuffle_image_list(char *list[], int size)
+static
+void init_user_dir()
{
- int i;
- char *olditem;
+ GcomprisProperties *props = gc_prop_get();
+ gchar *tmp = g_strconcat(props->user_dir, "/erase", NULL);
+ if (!g_file_test(tmp, G_FILE_TEST_IS_DIR))
+ gc_util_create_rootdir(tmp);
+ g_free(tmp);
+
+ tmp = g_strconcat(props->user_dir, "/erase/", _("readme"), ".txt", NULL);
+ g_file_set_contents(tmp,
+ _("Put any number of images in this directory.\n"
+ "They will be used as background in the 'erase' activity.\n"
+ "The image must be in the 'jpeg' format and be suffixed with"
+ " '.jpg' or '.jpeg'.\n"
+ "For best results, they must have a size of 800x520 pixels.\n"),
+ -1,
+ NULL);
+ g_free(tmp);
+}
- for(i=0; i < size - 1; i++)
- {
- int random1 = g_random_int_range(i, size-1);
- if (i == random1) continue;
+static
+void load_image_from_dir(char *base_dir, GSList **image_list)
+{
+ GDir *dir;
+ const gchar *one_dirent;
+
+ gchar *image_dir = g_strconcat(base_dir, "/", "erase", NULL);
+
+ dir = g_dir_open(image_dir, 0, NULL);
- olditem = list[i];
- list[i] = list[random1];
- list[random1] = olditem;
+ if (!dir) {
+ g_warning ("Couldn't open image dir: %s", image_dir);
+ g_free(image_dir);
+ return;
+ }
+
+ /* Fill up the music list */
+ while((one_dirent = g_dir_read_name(dir)) != NULL)
+ {
+ if ( (g_str_has_suffix(one_dirent, ".jpg")) ||
+ (g_str_has_suffix(one_dirent, ".JPG")) ||
+ (g_str_has_suffix(one_dirent, ".jpeg")) ||
+ (g_str_has_suffix(one_dirent, ".JPEG")) )
+ {
+ gchar *str = g_strdup_printf("%s/%s", image_dir, one_dirent);
+ *image_list = g_slist_insert (*image_list, str,
+ RAND(0, g_slist_length(*image_list)));
+ }
}
+ g_free(image_dir);
+ g_dir_close(dir);
}
diff --git a/src/erase-activity/erase.xml.in b/src/erase-activity/erase.xml.in
index 95ca84d..94284a6 100644
--- a/src/erase-activity/erase.xml.in
+++ b/src/erase-activity/erase.xml.in
@@ -14,7 +14,7 @@
<_description>Move the mouse to erase the area and discover the background</_description>
<_prerequisite>Mouse-manipulation</_prerequisite>
<_goal>Motor-coordination</_goal>
- <_manual>Move the mouse until all the blocks disappear.</_manual>
+ <_manual>Move the mouse until all the blocks disappear. You can add you own images under the directory '~/My GCompris/erase'.</_manual>
<_credit>Animal pictures are taken from the Animal Photography Page of Ralf Schmode (<http://schmode.net/>) and from LE BERRE Daniel. These people kindly gave GCompris the authorization to include their pictures. Thanks a lot, both of you.</_credit>
</Board>
</GCompris>
diff --git a/src/erase-activity/resources/erase/Makefile.am b/src/erase-activity/resources/erase/Makefile.am
index 48a5275..e1b59af 100644
--- a/src/erase-activity/resources/erase/Makefile.am
+++ b/src/erase-activity/resources/erase/Makefile.am
@@ -1,5 +1,6 @@
imgdir = $(pkgdatadir)/@PACKAGE_DATA_DIR@/erase
img_DATA = \
+ README.txt \
bear001.jpg \
black-headed-gull.jpg \
butterfly.jpg \
diff --git a/src/erase-activity/resources/erase/README.txt b/src/erase-activity/resources/erase/README.txt
new file mode 100644
index 0000000..33a0aa7
--- /dev/null
+++ b/src/erase-activity/resources/erase/README.txt
@@ -0,0 +1,5 @@
+Put any number of images in this directory.
+They will be used as background in the 'erase' activity.
+The images must be in the 'jpeg' format and be suffixed with '.jpg' or '.jpeg'.
+For best results, they must have a size of 800x520 pixels.
+
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]