From 4bff733352f608744e86328deb443d68ce666f7d Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Wed, 30 Dec 2009 04:30:25 +0100 Subject: Basic adding and assigning of tags implemented. Committing this before it gets out of hand. Only adding new tags is working atm. Created a text input dialog. Added a tag dialog. Other minor changes. --- window_main.c | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 129 insertions(+), 4 deletions(-) (limited to 'window_main.c') diff --git a/window_main.c b/window_main.c index 38e1899..a1832e4 100644 --- a/window_main.c +++ b/window_main.c @@ -1,4 +1,3 @@ -//#include #include #include @@ -12,6 +11,7 @@ #include "wallpapers.h" #include "thumbnails.h" #include "walls_conf.h" +#include "window_tag.h" struct wallpaper_t *cur_wall = NULL; GdkPixbuf *orig_pixbuf = NULL; @@ -217,7 +217,7 @@ static void fill_wall_list(GtkListStore *liststore, GArray *array) { wall = &g_array_index(array, struct wallpaper_t, i); gtk_list_store_append(liststore, &iter); - gtk_list_store_set(liststore, &iter, 0, NULL, 1, wall->filepath, -1); + gtk_list_store_set(liststore, &iter, 0, NULL, 1, wall->filepath, 2, wall->id,-1); g_free(wall->filepath); } g_array_free(array, TRUE); @@ -237,7 +237,7 @@ void on_foldtree_selection_changed(GtkTreeSelection *treeselection, gpointer use if(!db_get_wallpapers(dir->dirid, &array)) return; - liststore = gtk_list_store_new(2, GDK_TYPE_PIXBUF, G_TYPE_STRING); + liststore = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_UINT64); fill_wall_list(liststore, array); gtk_icon_view_set_model(thumbview, GTK_TREE_MODEL(liststore)); @@ -308,6 +308,131 @@ void on_add_dir_action_activate(GtkAction *action, gpointer user_data) { gtk_widget_destroy(dialog); } +static void thumbview_selected_foreach(GtkIconView *icon_view, GtkTreePath *path, gpointer user_data) { + GtkTreeIter iter; + GtkTreeModel *model; + GArray *array; + GValue value = {0}; + guint64 id; + + model = gtk_icon_view_get_model(icon_view); + + gtk_tree_model_get_iter(model, &iter, path); + + gtk_tree_model_get_value(model, &iter, 2, &value); + + array = user_data; + id = g_value_get_uint64(&value); + g_array_append_val(array, id); +} + +inline static void update_wall_tags(GArray *wallarray, guint64 tagid, gboolean active) { + guint64 wallid; + for(int i = 0; i < wallarray->len; i++) { + wallid = g_array_index(wallarray, guint64, i); + if(active) { + db_add_wall_tag(wallid, tagid); + } else { + db_remove_wall_tag(wallid, tagid); + } + } +} + +static void update_tags(GArray *wallarray, GtkListStore *liststore) { + GtkTreeIter iter; + GValue value = {0}; + gboolean active, inconsistent; + guint64 tagid; + + if(!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(liststore), &iter)) { + g_error("Failed to get iter\n"); + return; + } + + do { + gtk_tree_model_get_value(GTK_TREE_MODEL(liststore), &iter, 1, &value); + inconsistent = g_value_get_boolean(&value); + g_value_unset(&value); + + /* Don't update inconsistent tags. */ + if(inconsistent) + continue; + + gtk_tree_model_get_value(GTK_TREE_MODEL(liststore), &iter, 0, &value); + active = g_value_get_boolean(&value); + g_value_unset(&value); + + gtk_tree_model_get_value(GTK_TREE_MODEL(liststore), &iter, 3, &value); + tagid = g_value_get_uint64(&value); + g_value_unset(&value); + + update_wall_tags(wallarray, tagid, active); + } while(gtk_tree_model_iter_next(GTK_TREE_MODEL(liststore), &iter)); +} + +void on_tags_activate(GtkMenuItem *menuitem, gpointer user_data) { + struct tagdialog_data_t *data; + GArray *array; + + array = g_array_new(FALSE, TRUE, sizeof(guint64)); + gtk_icon_view_selected_foreach(thumbview, thumbview_selected_foreach, array); + + data = window_tagview_new(GTK_WIDGET(window), array); + + if(gtk_dialog_run(GTK_DIALOG(data->dialog)) == GTK_RESPONSE_APPLY) { + update_tags(array, GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(data->tagview)))); + } + + gtk_widget_destroy(GTK_WIDGET(data->dialog)); + + g_array_free(array, TRUE); +} + +inline static void thumbview_popup_add_items(GtkWidget *menu) { + GtkWidget *tags; + + tags = gtk_menu_item_new_with_label("Tags"); + + gtk_menu_shell_append(GTK_MENU_SHELL(menu), tags); + + g_signal_connect(G_OBJECT(tags), "activate", G_CALLBACK(on_tags_activate), NULL); + + gtk_widget_show(tags); +} + +static void do_thumbview_popup(GtkWidget *widget, GdkEventButton *event) { + GtkWidget *menu; + int button, event_time; + + menu = gtk_menu_new(); + g_signal_connect(menu, "selection-done", G_CALLBACK(gtk_widget_destroy), NULL); + + thumbview_popup_add_items(menu); + + if(event) { + button = event->button; + event_time = event->time; + } else { + button = 0; + event_time = gtk_get_current_event_time(); + } + + gtk_menu_attach_to_widget(GTK_MENU(menu), widget, NULL); + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, button, event_time); +} + +gboolean on_thumbview_popup_menu(GtkWidget *widget, gpointer user_data) { + do_thumbview_popup(widget, NULL); +} + +gboolean on_thumbview_button_press_event(GtkWidget *widget, GdkEventButton *event) { + if(event->button == 3 && event->type == GDK_BUTTON_PRESS) { + do_thumbview_popup(widget, event); + return TRUE; + } + return FALSE; +} + static void save_window() { gint width, height; @@ -356,7 +481,7 @@ int gui_main(int argc, char **argv) { gtk_init(&argc, &argv); builder = gtk_builder_new(); - if(!gtk_builder_add_from_string(builder, ui_string, -1, &error)) { + if(!gtk_builder_add_from_string(builder, walls_ui_string, -1, &error)) { g_warning("%s", error->message); g_error_free(error); return 1; -- cgit v1.2.3