summaryrefslogtreecommitdiff
path: root/window_tag.c
diff options
context:
space:
mode:
Diffstat (limited to 'window_tag.c')
-rw-r--r--window_tag.c72
1 files changed, 29 insertions, 43 deletions
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));
}