summaryrefslogtreecommitdiff
path: root/window_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'window_main.c')
-rw-r--r--window_main.c133
1 files changed, 129 insertions, 4 deletions
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 <unistd.h>
#include <string.h>
#include <glib/gstdio.h>
@@ -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;