From 0d4b1caee4135b6e0dcd2aa3bd6ce2387c1c3773 Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Sun, 25 Apr 2010 17:28:49 +0200 Subject: Added a tree model to display tags in tree structures. Adding children to tags is not yet implemented. --- window_tag.c | 72 ++++++++++++++++++++++++------------------------------------ 1 file changed, 29 insertions(+), 43 deletions(-) (limited to 'window_tag.c') diff --git a/window_tag.c b/window_tag.c index ca6d6f4..da77cdc 100644 --- a/window_tag.c +++ b/window_tag.c @@ -2,12 +2,12 @@ #include "tags_ui.h" #include "db.h" #include "text_input_dialog.h" +#include "tag_model.h" void on_tagview_cell_toggled(GtkCellRendererToggle *cell_renderer, gchar *path_string, gpointer user_data) { GtkTreeIter iter; GtkTreeModel *model; struct tagdialog_data_t *data; - GValue value = {0}; gboolean active, inconsistent; data = user_data; @@ -15,18 +15,14 @@ void on_tagview_cell_toggled(GtkCellRendererToggle *cell_renderer, gchar *path_s model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->tagview)); gtk_tree_model_get_iter_from_string(model, &iter, path_string); - gtk_tree_model_get_value(model, &iter, 0, &value); - active = g_value_get_boolean(&value); - g_value_unset(&value); - gtk_tree_model_get_value(model, &iter, 1, &value); - inconsistent = g_value_get_boolean(&value); - g_value_unset(&value); + active = tag_model_get_checked(model, &iter); + inconsistent = tag_model_get_inconsistent(model, &iter); if(inconsistent) { - gtk_list_store_set(GTK_LIST_STORE(model), &iter, 1, FALSE, -1); + tag_model_set_inconsistent(GTK_TREE_MODEL(model), &iter, FALSE); } else { - gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, !active, -1); + tag_model_set_checked(GTK_TREE_MODEL(model), &iter, !active); } } @@ -60,12 +56,24 @@ inline static gboolean is_tag_inconsistent(struct tag_t *tag, GArray *walltags, return (n_n == 0 || n_y == 0 ? FALSE : TRUE); } -static void tagview_create_model(GtkTreeView *tagview, gpointer user_data) { - GtkListStore *model; - GArray *array, *walltags, *walltag_single, *wallarray; - GtkTreeIter iter; +/** + * foreach-callback for setting checked and inconsistent in the tag model. + */ +static gboolean tagview_model_foreach(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data) { struct tag_t *tag; gboolean inconsistent, exists; + + tag_model_get_tag_record(GTK_TREE_MODEL(model), iter, &tag); + inconsistent = is_tag_inconsistent(tag, (GArray*)user_data, &exists); + tag_model_set_checked(GTK_TREE_MODEL(model), iter, exists); + tag_model_set_inconsistent(GTK_TREE_MODEL(model), iter, inconsistent); + + return FALSE; +} + +static void tagview_create_model(GtkTreeView *tagview, gpointer user_data) { + GtkTreeModel *model; + GArray *walltags, *walltag_single, *wallarray; struct tagdialog_data_t *data; data = user_data; @@ -81,28 +89,16 @@ static void tagview_create_model(GtkTreeView *tagview, gpointer user_data) { } } - model = gtk_list_store_new(4, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_UINT64); + model = GTK_TREE_MODEL(tag_model_new()); + gtk_tree_view_set_model(tagview, GTK_TREE_MODEL(model)); - if(db_get_tags_all(&array)) { - for(int i = 0; i < array->len; i++) { - tag = &g_array_index(array, struct tag_t, i); - gtk_list_store_append(model, &iter); - inconsistent = is_tag_inconsistent(tag, walltags, &exists); - gtk_list_store_set(model, &iter, 0, exists, 1, inconsistent, 2, g_strdup(tag->name), 3, tag->id, -1); - g_free(tag->name); - } - g_array_free(array, TRUE); - } else { - g_warning("Could not fetch tags\n"); - } + gtk_tree_model_foreach(GTK_TREE_MODEL(model), tagview_model_foreach, walltags); for(int i = 0; i < walltags->len; i++) { walltag_single = g_array_index(walltags, GArray*, i); g_array_free(walltag_single, TRUE); } g_array_free(walltags, TRUE); - - gtk_tree_view_set_model(tagview, GTK_TREE_MODEL(model)); } static void tagview_init(GtkTreeView *tagview, gpointer user_data) { @@ -154,9 +150,7 @@ void on_tags_rembtn_clicked(GtkButton *button, gpointer user_data) { GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; - gchar *tagname; - guint64 tagid; - GValue value = {0}; + struct tag_t *tag; data = user_data; @@ -164,21 +158,13 @@ void on_tags_rembtn_clicked(GtkButton *button, gpointer user_data) { if(!gtk_tree_selection_get_selected(selection, &model, &iter)) return; - gtk_tree_model_get_value(model, &iter, 3, &value); - tagid = g_value_get_uint64(&value); - g_value_unset(&value); - - gtk_tree_model_get_value(model, &iter, 2, &value); - tagname = g_value_dup_string(&value); - g_value_unset(&value); + tag_model_get_tag_record(GTK_TREE_MODEL(model), &iter, &tag); dialog = gtk_message_dialog_new(GTK_WINDOW(data->dialog), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "Are you sure you want to delete the tag \"%s\"?", tagname); - - g_free(tagname); + GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "Are you sure you want to delete the tag \"%s\" and all its children?", tag->name); if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES) { - db_remove_tag(tagid); + db_remove_tag(tag->id); tagview_create_model(GTK_TREE_VIEW(data->tagview), user_data); } @@ -198,7 +184,7 @@ static void tags_select(gpointer user_data, gboolean select) { return; do { - gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, select, -1); + tag_model_set_checked(GTK_TREE_MODEL(model), &iter, select); } while(gtk_tree_model_iter_next(model, &iter)); } -- cgit v1.2.3