[gcompris] click_on_letter: added a 'back to default' button in the configuration.
- From: Bruno Coudoin <bcoudoin src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gcompris] click_on_letter: added a 'back to default' button in the configuration.
- Date: Sun, 21 Aug 2011 21:26:50 +0000 (UTC)
commit 10efcf2b4773113ad95b5385abd2c4d79b39c242
Author: Bruno Coudoin <bruno coudoin free fr>
Date: Sun Aug 21 22:59:12 2011 +0200
click_on_letter: added a 'back to default' button in the configuration.
Fixed memory leaks in the 'levels' model.
src/click_on_letter-activity/click_on_letter.c | 131 +++++++++++++++++-------
src/gcompris/board_config_combo.c | 2 +-
2 files changed, 97 insertions(+), 36 deletions(-)
---
diff --git a/src/click_on_letter-activity/click_on_letter.c b/src/click_on_letter-activity/click_on_letter.c
index 5c5191c..83288ad 100644
--- a/src/click_on_letter-activity/click_on_letter.c
+++ b/src/click_on_letter-activity/click_on_letter.c
@@ -59,6 +59,7 @@ static gchar **questions;
static gchar **answers;
static void load_datafile();
+static void clear_levels();
/* The data model of the configuration */
static GtkListStore *model;
@@ -165,7 +166,7 @@ GET_BPLUGIN_INFO(click_on_letter)
static void start_board (GcomprisBoard *agcomprisBoard)
{
GHashTable *config = gc_db_get_board_conf();
- int ready;
+ guint ready;
board_paused = TRUE;
@@ -194,8 +195,6 @@ static void start_board (GcomprisBoard *agcomprisBoard)
50,
50,
0);
- /* create level array */
- levels = g_array_sized_new (FALSE, FALSE, sizeof (Level), 10);
load_datafile();
@@ -282,8 +281,7 @@ static void end_board ()
g_object_unref(carriage_svg_handle);
g_object_unref(cloud_svg_handle);
- g_array_free(levels, TRUE);
- levels = NULL;
+ clear_levels();
}
gc_locale_reset();
gcomprisBoard = NULL;
@@ -701,6 +699,11 @@ static void load_datafile() {
GError *error = NULL;
gchar *filename = gc_file_find_absolute("click_on_letter/default-$LOCALE.desktop");
+ clear_levels();
+
+ /* create level array */
+ levels = g_array_sized_new (FALSE, FALSE, sizeof (Level), 10);
+
if ( ! filename )
{
/* Fallback to english */
@@ -760,7 +763,6 @@ static gchar *levels_to_desktop() {
}
gchar *buffer = g_key_file_to_data(keyfile, NULL, NULL);
- printf("%s\n", buffer);
return buffer;
}
@@ -810,11 +812,48 @@ static void create_levels_from_config_model()
GtkTreeIter iter;
gtk_tree_model_get_iter_first (GTK_TREE_MODEL(model), &iter );
- g_array_free(levels, TRUE);
+ clear_levels();
levels = g_array_sized_new (FALSE, FALSE, sizeof (Level), 10);
gtk_tree_model_foreach(GTK_TREE_MODEL(model), _save_level_from_model, NULL);
}
+void
+load_model_from_levels(GtkListStore *model)
+{
+ GtkTreeIter iter;
+
+ gtk_list_store_clear(model);
+ guint i;
+ for ( i = 0; i < levels->len; i++)
+ {
+ Level level = g_array_index (levels, Level, i);
+ gtk_list_store_append(model, &iter);
+ gtk_list_store_set(model, &iter,
+ LEVEL_COLUMN, level.level,
+ ANSWER_COLUMN, level.answers,
+ QUESTION_COLUMN, level.questions,
+ -1);
+ }
+}
+
+void
+clear_levels()
+{
+ if ( ! levels )
+ return;
+
+ gint i = 0;
+ for (i = 0; i < levels->len; i++)
+ {
+ Level level = g_array_index (levels, Level, i);
+ g_free(level.answers);
+ g_free(level.questions);
+ }
+
+ g_array_free(levels, TRUE);
+ levels = NULL;
+}
+
static gboolean
valid_entry(Level *level)
{
@@ -919,6 +958,21 @@ _check_errors(GtkTreeModel *model, GtkTreePath *path,
}
+/**
+ * Based on the current locale, return the user desktop filename
+ * to use.
+ * The returned value must be freed
+ */
+gchar *get_user_desktop_file()
+{
+ gchar **locale = g_strsplit_set(gc_locale_get(), ".", 2);
+ gchar *filename =
+ gc_file_find_absolute_writeable("%s/default-%s.desktop",
+ gcomprisBoard->boarddir,
+ locale[0]);
+ g_strfreev(locale);
+ return filename;
+}
static gboolean
conf_ok(GHashTable *table)
@@ -964,7 +1018,7 @@ conf_ok(GHashTable *table)
if (profile_conf)
g_hash_table_destroy(config);
- sounds_are_fine();
+ guint ready = sounds_are_fine();
/*
* Save the new editied value if needed
@@ -980,23 +1034,21 @@ conf_ok(GHashTable *table)
if (strcmp(old_levels, new_levels) != 0)
{
/* The level has changed, save the new desktop file in the user's dir */
- gchar **locale = g_strsplit_set(gc_locale_get(), ".", 2);
- gchar *filename =
- gc_file_find_absolute_writeable("%s/default-%s.desktop",
- gcomprisBoard->boarddir,
- locale[0]);
- printf("file to save: %s\n", filename);
+ gchar *filename = get_user_desktop_file();
g_file_set_contents(filename, new_levels, -1, NULL);
g_free(filename);
- g_strfreev(locale);
}
g_free(old_levels);
g_free(new_levels);
- click_on_letter_next_level();
+ if(ready)
+ {
+ if(ready == OK)
+ click_on_letter_next_level();
- gamewon = FALSE;
- pause_board(FALSE);
+ gamewon = FALSE;
+ pause_board(FALSE);
+ }
}
@@ -1005,8 +1057,9 @@ conf_ok(GHashTable *table)
return TRUE;
}
-static gboolean resequence_level_in_model(GtkTreeModel *model, GtkTreePath *path,
- GtkTreeIter *iter, gpointer data)
+static gboolean
+resequence_level_in_model(GtkTreeModel *model, GtkTreePath *path,
+ GtkTreeIter *iter, gpointer data)
{
guint *level = (guint*)data;
@@ -1123,6 +1176,21 @@ down_item (GtkWidget *widget, gpointer data)
move_item(widget, data, FALSE);
}
+static void
+return_to_default(GtkWidget *widget, gpointer data)
+{
+ GtkListStore *model = (GtkListStore *)data;
+ gchar *filename = get_user_desktop_file();
+ /* Erase the user desktop file */
+ gc_cache_remove(filename);
+ g_free(filename);
+
+ load_datafile();
+ load_model_from_levels(model);
+
+}
+
+
static void cell_edited_callback (GtkCellRendererText *cell,
gchar *path,
gchar *new_text,
@@ -1251,23 +1319,9 @@ config_start(GcomprisBoard *agcomprisBoard,
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
- GtkTreeIter iter;
-
model = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)));
- guint i;
- for ( i = 0; i < levels->len; i++)
- {
- Level level = g_array_index (levels, Level, i);
- gtk_list_store_append(model, &iter);
- gtk_list_store_set(model, &iter,
- LEVEL_COLUMN, level.level,
- ANSWER_COLUMN, level.answers,
- QUESTION_COLUMN, level.questions,
- -1);
- }
-
- gtk_tree_selection_select_iter(selection , &iter);
+ load_model_from_levels(model);
/* some buttons */
GtkWidget *hbox = gtk_hbox_new (TRUE, 4);
@@ -1298,6 +1352,13 @@ config_start(GcomprisBoard *agcomprisBoard,
G_CALLBACK (down_item), treeview);
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
+ button = gtk_button_new_with_label(_("Back to default"));
+ gtk_widget_show(button);
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (return_to_default), model);
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
+
+
g_hash_table_destroy(config);
}
diff --git a/src/gcompris/board_config_combo.c b/src/gcompris/board_config_combo.c
index 1531197..96722d4 100644
--- a/src/gcompris/board_config_combo.c
+++ b/src/gcompris/board_config_combo.c
@@ -95,7 +95,7 @@ void
gc_board_config_combo_locales_changed(GtkComboBox *combobox,
gpointer data)
{
- _gc_boardconf_key*u = (_gc_boardconf_key*)data;
+ _gc_boardconf_key *u = (_gc_boardconf_key*)data;
gchar *the_key = g_strdup((gchar *)u->key);
gchar *value;
gint index = gtk_combo_box_get_active (combobox);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]