Mercurial > geeqie
annotate src/bar_keywords.c @ 1428:3019f5d3a3c7
added keyword tree filtering
author | nadvornik |
---|---|
date | Fri, 13 Mar 2009 16:45:21 +0000 |
parents | 80462be81410 |
children | 985366bccfb8 |
rev | line source |
---|---|
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1 /* |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
2 * Geeqie |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
3 * (C) 2004 John Ellis |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
4 * Copyright (C) 2008 - 2009 The Geeqie Team |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
5 * |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
6 * Author: John Ellis |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
7 * |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
8 * This software is released under the GNU General Public License (GNU GPL). |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
9 * Please read the included file COPYING for more information. |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
10 * This software comes with no warranty of any kind, use at your own risk! |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
11 */ |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
12 |
1305 | 13 #include <glib/gprintf.h> |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
14 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
15 #include "main.h" |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
16 #include "bar_keywords.h" |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
17 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
18 #include "filedata.h" |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
19 #include "history_list.h" |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
20 #include "metadata.h" |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
21 #include "misc.h" |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
22 #include "ui_fileops.h" |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
23 #include "ui_misc.h" |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
24 #include "ui_utildlg.h" |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
25 #include "utilops.h" |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
26 #include "bar.h" |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
27 #include "ui_menu.h" |
1309 | 28 #include "rcfile.h" |
1387 | 29 #include "layout.h" |
1392 | 30 #include "dnd.h" |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
31 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
32 static const gchar *keyword_favorite_defaults[] = { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
33 N_("Favorite"), |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
34 N_("Todo"), |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
35 N_("People"), |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
36 N_("Places"), |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
37 N_("Art"), |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
38 N_("Nature"), |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
39 N_("Possessions"), |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
40 NULL |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
41 }; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
42 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
43 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
44 static void bar_pane_keywords_keyword_update_all(void); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
45 static void bar_pane_keywords_changed(GtkTextBuffer *buffer, gpointer data); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
46 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
47 /* |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
48 *------------------------------------------------------------------- |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
49 * keyword / comment utils |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
50 *------------------------------------------------------------------- |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
51 */ |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
52 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
53 |
1292
4a3ae0e6f1eb
droped Preferences dialog, sidebar should replace it completely
nadvornik
parents:
1291
diff
changeset
|
54 GList *keyword_list_pull(GtkWidget *text_widget) |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
55 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
56 GList *list; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
57 gchar *text; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
58 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
59 text = text_widget_text_pull(text_widget); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
60 list = string_to_keywords_list(text); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
61 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
62 g_free(text); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
63 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
64 return list; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
65 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
66 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
67 static void keyword_list_push(GtkWidget *textview, GList *list) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
68 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
69 GtkTextBuffer *buffer; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
70 GtkTextIter start, end; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
71 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
72 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
73 gtk_text_buffer_get_bounds(buffer, &start, &end); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
74 gtk_text_buffer_delete(buffer, &start, &end); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
75 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
76 while (list) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
77 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
78 const gchar *word = list->data; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
79 GtkTextIter iter; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
80 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
81 gtk_text_buffer_get_end_iter(buffer, &iter); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
82 if (word) gtk_text_buffer_insert(buffer, &iter, word, -1); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
83 gtk_text_buffer_get_end_iter(buffer, &iter); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
84 gtk_text_buffer_insert(buffer, &iter, "\n", -1); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
85 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
86 list = list->next; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
87 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
88 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
89 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
90 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
91 /* |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
92 *------------------------------------------------------------------- |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
93 * info bar |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
94 *------------------------------------------------------------------- |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
95 */ |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
96 |
1391 | 97 |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
98 enum { |
1391 | 99 FILTER_KEYWORD_COLUMN_TOGGLE = 0, |
100 FILTER_KEYWORD_COLUMN_MARK, | |
101 FILTER_KEYWORD_COLUMN_NAME, | |
102 FILTER_KEYWORD_COLUMN_IS_KEYWORD, | |
103 FILTER_KEYWORD_COLUMN_COUNT | |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
104 }; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
105 |
1391 | 106 static GType filter_keyword_column_types[] = {G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN}; |
107 | |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
108 typedef struct _PaneKeywordsData PaneKeywordsData; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
109 struct _PaneKeywordsData |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
110 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
111 PaneData pane; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
112 GtkWidget *widget; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
113 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
114 GtkWidget *keyword_view; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
115 GtkWidget *keyword_treeview; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
116 |
1414 | 117 GtkTreePath *click_tpath; |
118 | |
1428 | 119 gboolean expand_checked; |
120 gboolean collapse_unchecked; | |
121 gboolean hide_unchecked; | |
122 | |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
123 FileData *fd; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
124 gchar *key; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
125 }; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
126 |
1421 | 127 typedef struct _ConfDialogData ConfDialogData; |
128 struct _ConfDialogData | |
129 { | |
130 PaneKeywordsData *pkd; | |
131 GtkTreePath *click_tpath; | |
132 | |
133 /* dialog parts */ | |
134 GenericDialog *gd; | |
135 GtkWidget *edit_widget; | |
136 gboolean is_keyword; | |
137 | |
138 gboolean edit_existing; | |
139 }; | |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
140 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
141 static GList *bar_list = NULL; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
142 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
143 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
144 static void bar_pane_keywords_write(PaneKeywordsData *pkd) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
145 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
146 GList *list; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
147 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
148 if (!pkd->fd) return; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
149 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
150 list = keyword_list_pull(pkd->keyword_view); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
151 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
152 metadata_write_list(pkd->fd, KEYWORD_KEY, list); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
153 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
154 string_list_free(list); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
155 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
156 |
1428 | 157 gboolean bar_keyword_tree_expand_if_set_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
158 { |
1391 | 159 PaneKeywordsData *pkd = data; |
160 gboolean set; | |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
161 |
1391 | 162 gtk_tree_model_get(model, iter, FILTER_KEYWORD_COLUMN_TOGGLE, &set, -1); |
163 | |
164 if (set && !gtk_tree_view_row_expanded(GTK_TREE_VIEW(pkd->keyword_treeview), path)) | |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
165 { |
1391 | 166 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(pkd->keyword_treeview), path); |
167 } | |
168 return FALSE; | |
169 } | |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
170 |
1428 | 171 gboolean bar_keyword_tree_collapse_if_unset_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) |
172 { | |
173 PaneKeywordsData *pkd = data; | |
174 gboolean set; | |
175 gboolean is_keyword; | |
176 | |
177 gtk_tree_model_get(model, iter, FILTER_KEYWORD_COLUMN_TOGGLE, &set, | |
178 FILTER_KEYWORD_COLUMN_IS_KEYWORD, &is_keyword, -1); | |
179 | |
180 if (is_keyword && !set && gtk_tree_view_row_expanded(GTK_TREE_VIEW(pkd->keyword_treeview), path)) | |
181 { | |
182 gtk_tree_view_collapse_row(GTK_TREE_VIEW(pkd->keyword_treeview), path); | |
183 } | |
184 return FALSE; | |
185 } | |
186 | |
1391 | 187 static void bar_keyword_tree_sync(PaneKeywordsData *pkd) |
188 { | |
1428 | 189 GtkTreeModel *model; |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
190 |
1428 | 191 GtkTreeModel *keyword_tree; |
192 GList *keywords; | |
193 | |
194 model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); | |
195 keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); | |
1391 | 196 |
1428 | 197 keywords = keyword_list_pull(pkd->keyword_view); |
198 keyword_show_set_in(GTK_TREE_STORE(keyword_tree), model, keywords); | |
199 if (pkd->hide_unchecked) keyword_hide_unset_in(GTK_TREE_STORE(keyword_tree), model, keywords); | |
200 string_list_free(keywords); | |
201 | |
202 gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(model)); | |
203 | |
204 if (pkd->expand_checked) gtk_tree_model_foreach(model, bar_keyword_tree_expand_if_set_cb, pkd); | |
205 if (pkd->collapse_unchecked) gtk_tree_model_foreach(model, bar_keyword_tree_collapse_if_unset_cb, pkd); | |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
206 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
207 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
208 static void bar_pane_keywords_keyword_update_all(void) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
209 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
210 GList *work; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
211 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
212 work = bar_list; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
213 while (work) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
214 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
215 PaneKeywordsData *pkd; |
1391 | 216 // GList *keywords; |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
217 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
218 pkd = work->data; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
219 work = work->next; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
220 |
1391 | 221 bar_keyword_tree_sync(pkd); |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
222 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
223 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
224 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
225 static void bar_pane_keywords_update(PaneKeywordsData *pkd) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
226 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
227 GList *keywords = NULL; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
228 GtkTextBuffer *keyword_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pkd->keyword_view)); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
229 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
230 g_signal_handlers_block_by_func(keyword_buffer, bar_pane_keywords_changed, pkd); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
231 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
232 keywords = metadata_read_list(pkd->fd, KEYWORD_KEY, METADATA_PLAIN); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
233 keyword_list_push(pkd->keyword_view, keywords); |
1391 | 234 bar_keyword_tree_sync(pkd); |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
235 string_list_free(keywords); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
236 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
237 g_signal_handlers_unblock_by_func(keyword_buffer, bar_pane_keywords_changed, pkd); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
238 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
239 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
240 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
241 void bar_pane_keywords_set_fd(GtkWidget *pane, FileData *fd) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
242 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
243 PaneKeywordsData *pkd; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
244 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
245 pkd = g_object_get_data(G_OBJECT(pane), "pane_data"); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
246 if (!pkd) return; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
247 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
248 file_data_unref(pkd->fd); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
249 pkd->fd = file_data_ref(fd); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
250 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
251 bar_pane_keywords_update(pkd); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
252 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
253 |
1309 | 254 static void bar_pane_keywords_write_config(GtkWidget *pane, GString *outstr, gint indent) |
255 { | |
256 PaneKeywordsData *pkd; | |
257 | |
258 pkd = g_object_get_data(G_OBJECT(pane), "pane_data"); | |
259 if (!pkd) return; | |
260 | |
1314 | 261 WRITE_STRING("<pane_keywords\n"); |
1309 | 262 indent++; |
1343 | 263 write_char_option(outstr, indent, "pane.title", gtk_label_get_text(GTK_LABEL(pkd->pane.title))); |
1309 | 264 WRITE_BOOL(*pkd, pane.expanded); |
265 WRITE_CHAR(*pkd, key); | |
266 indent--; | |
1314 | 267 WRITE_STRING("/>\n"); |
1309 | 268 } |
269 | |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
270 gint bar_pane_keywords_event(GtkWidget *bar, GdkEvent *event) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
271 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
272 PaneKeywordsData *pkd; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
273 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
274 pkd = g_object_get_data(G_OBJECT(bar), "pane_data"); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
275 if (!pkd) return FALSE; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
276 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
277 if (GTK_WIDGET_HAS_FOCUS(pkd->keyword_view)) return gtk_widget_event(pkd->keyword_view, event); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
278 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
279 return FALSE; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
280 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
281 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
282 static void bar_pane_keywords_keyword_toggle(GtkCellRendererToggle *toggle, const gchar *path, gpointer data) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
283 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
284 PaneKeywordsData *pkd = data; |
1391 | 285 GtkTreeModel *model; |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
286 GtkTreeIter iter; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
287 GtkTreePath *tpath; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
288 gboolean active; |
1391 | 289 GList *list; |
290 GtkTreeIter child_iter; | |
291 GtkTreeModel *keyword_tree; | |
292 | |
293 model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); | |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
294 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
295 tpath = gtk_tree_path_new_from_string(path); |
1391 | 296 gtk_tree_model_get_iter(model, &iter, tpath); |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
297 gtk_tree_path_free(tpath); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
298 |
1391 | 299 gtk_tree_model_get(model, &iter, FILTER_KEYWORD_COLUMN_TOGGLE, &active, -1); |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
300 active = (!active); |
1391 | 301 |
302 | |
303 keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); | |
304 gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), &child_iter, &iter); | |
305 | |
306 list = keyword_list_pull(pkd->keyword_view); | |
307 if (active) | |
308 keyword_tree_set(keyword_tree, &child_iter, &list); | |
309 else | |
310 keyword_tree_reset(keyword_tree, &child_iter, &list); | |
311 | |
312 keyword_list_push(pkd->keyword_view, list); | |
313 string_list_free(list); | |
1392 | 314 /* |
315 keyword_list_push triggers bar_pane_keywords_change which calls bar_keyword_tree_sync, no need to do it again | |
1391 | 316 bar_keyword_tree_sync(pkd); |
1392 | 317 */ |
1391 | 318 } |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
319 |
1391 | 320 void bar_pane_keywords_filter_modify(GtkTreeModel *model, GtkTreeIter *iter, GValue *value, gint column, gpointer data) |
321 { | |
322 PaneKeywordsData *pkd = data; | |
323 GtkTreeModel *keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); | |
324 GtkTreeIter child_iter; | |
1392 | 325 |
1391 | 326 gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), &child_iter, iter); |
327 | |
328 memset(value, 0, sizeof (GValue)); | |
329 | |
330 switch (column) | |
331 { | |
332 case FILTER_KEYWORD_COLUMN_TOGGLE: | |
333 { | |
334 GList *keywords = keyword_list_pull(pkd->keyword_view); | |
335 gboolean set = keyword_tree_is_set(keyword_tree, &child_iter, keywords); | |
336 string_list_free(keywords); | |
337 | |
338 g_value_init(value, G_TYPE_BOOLEAN); | |
339 g_value_set_boolean(value, set); | |
340 break; | |
341 } | |
342 case FILTER_KEYWORD_COLUMN_MARK: | |
343 gtk_tree_model_get_value(keyword_tree, &child_iter, KEYWORD_COLUMN_MARK, value); | |
344 break; | |
345 case FILTER_KEYWORD_COLUMN_NAME: | |
346 gtk_tree_model_get_value(keyword_tree, &child_iter, KEYWORD_COLUMN_NAME, value); | |
347 break; | |
348 case FILTER_KEYWORD_COLUMN_IS_KEYWORD: | |
349 gtk_tree_model_get_value(keyword_tree, &child_iter, KEYWORD_COLUMN_IS_KEYWORD, value); | |
350 break; | |
351 } | |
352 return; | |
353 | |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
354 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
355 |
1428 | 356 gboolean bar_pane_keywords_filter_visible(GtkTreeModel *keyword_tree, GtkTreeIter *iter, gpointer data) |
357 { | |
358 GtkTreeModel *filter = data; | |
359 | |
360 return !keyword_is_hidden_in(keyword_tree, iter, filter); | |
361 } | |
362 | |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
363 static void bar_pane_keywords_set_selection(PaneKeywordsData *pkd, gboolean append) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
364 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
365 GList *keywords = NULL; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
366 GList *list = NULL; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
367 GList *work; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
368 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
369 keywords = keyword_list_pull(pkd->keyword_view); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
370 |
1387 | 371 list = layout_selection_list(pkd->pane.lw); |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
372 work = list; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
373 while (work) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
374 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
375 FileData *fd = work->data; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
376 work = work->next; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
377 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
378 if (append) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
379 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
380 metadata_append_list(fd, KEYWORD_KEY, keywords); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
381 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
382 else |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
383 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
384 metadata_write_list(fd, KEYWORD_KEY, keywords); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
385 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
386 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
387 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
388 filelist_free(list); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
389 string_list_free(keywords); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
390 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
391 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
392 static void bar_pane_keywords_sel_add_cb(GtkWidget *button, gpointer data) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
393 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
394 PaneKeywordsData *pkd = data; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
395 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
396 bar_pane_keywords_set_selection(pkd, TRUE); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
397 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
398 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
399 static void bar_pane_keywords_sel_replace_cb(GtkWidget *button, gpointer data) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
400 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
401 PaneKeywordsData *pkd = data; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
402 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
403 bar_pane_keywords_set_selection(pkd, FALSE); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
404 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
405 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
406 static void bar_pane_keywords_populate_popup_cb(GtkTextView *textview, GtkMenu *menu, gpointer data) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
407 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
408 PaneKeywordsData *pkd = data; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
409 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
410 menu_item_add_divider(GTK_WIDGET(menu)); |
1295 | 411 menu_item_add_stock(GTK_WIDGET(menu), _("Add keywords to selected files"), GTK_STOCK_ADD, G_CALLBACK(bar_pane_keywords_sel_add_cb), pkd); |
412 menu_item_add_stock(GTK_WIDGET(menu), _("Replace existing keywords in selected files"), GTK_STOCK_CONVERT, G_CALLBACK(bar_pane_keywords_sel_replace_cb), pkd); | |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
413 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
414 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
415 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
416 static void bar_pane_keywords_notify_cb(FileData *fd, NotifyType type, gpointer data) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
417 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
418 PaneKeywordsData *pkd = data; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
419 if (fd == pkd->fd) bar_pane_keywords_update(pkd); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
420 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
421 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
422 static void bar_pane_keywords_changed(GtkTextBuffer *buffer, gpointer data) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
423 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
424 PaneKeywordsData *pkd = data; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
425 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
426 file_data_unregister_notify_func(bar_pane_keywords_notify_cb, pkd); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
427 bar_pane_keywords_write(pkd); |
1391 | 428 bar_keyword_tree_sync(pkd); |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
429 file_data_register_notify_func(bar_pane_keywords_notify_cb, pkd, NOTIFY_PRIORITY_LOW); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
430 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
431 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
432 |
1421 | 433 /* |
434 *------------------------------------------------------------------- | |
435 * dnd | |
436 *------------------------------------------------------------------- | |
437 */ | |
438 | |
1392 | 439 |
440 static GtkTargetEntry bar_pane_keywords_drag_types[] = { | |
441 { TARGET_APP_KEYWORD_PATH_STRING, GTK_TARGET_SAME_WIDGET, TARGET_APP_KEYWORD_PATH }, | |
442 { "text/plain", 0, TARGET_TEXT_PLAIN } | |
443 }; | |
444 static gint n_keywords_drag_types = 2; | |
445 | |
446 | |
447 static GtkTargetEntry bar_pane_keywords_drop_types[] = { | |
448 { TARGET_APP_KEYWORD_PATH_STRING, GTK_TARGET_SAME_WIDGET, TARGET_APP_KEYWORD_PATH }, | |
449 { "text/plain", 0, TARGET_TEXT_PLAIN } | |
450 }; | |
451 static gint n_keywords_drop_types = 2; | |
452 | |
453 | |
454 static void bar_pane_keywords_dnd_get(GtkWidget *tree_view, GdkDragContext *context, | |
455 GtkSelectionData *selection_data, guint info, | |
456 guint time, gpointer data) | |
457 { | |
458 GtkTreeIter iter; | |
459 GtkTreeModel *model; | |
460 GtkTreeIter child_iter; | |
461 GtkTreeModel *keyword_tree; | |
462 | |
463 GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); | |
464 | |
465 if (!gtk_tree_selection_get_selected(sel, &model, &iter)) return; | |
466 | |
467 keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); | |
468 gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), &child_iter, &iter); | |
469 | |
470 switch (info) | |
471 { | |
472 case TARGET_APP_KEYWORD_PATH: | |
473 { | |
474 GList *path = keyword_tree_get_path(keyword_tree, &child_iter); | |
475 gtk_selection_data_set(selection_data, selection_data->target, | |
476 8, (gpointer) &path, sizeof(path)); | |
477 break; | |
478 } | |
479 | |
480 case TARGET_TEXT_PLAIN: | |
481 default: | |
482 { | |
483 gchar *name = keyword_get_name(keyword_tree, &child_iter); | |
484 gtk_selection_data_set_text(selection_data, name, -1); | |
485 g_free(name); | |
486 } | |
487 break; | |
488 } | |
489 } | |
490 | |
1393 | 491 static void bar_pane_keywords_dnd_begin(GtkWidget *tree_view, GdkDragContext *context, gpointer data) |
1392 | 492 { |
1393 | 493 GtkTreeIter iter; |
494 GtkTreeModel *model; | |
495 GtkTreeIter child_iter; | |
496 GtkTreeModel *keyword_tree; | |
497 gchar *name; | |
498 | |
499 GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); | |
500 | |
501 if (!gtk_tree_selection_get_selected(sel, &model, &iter)) return; | |
502 | |
503 keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); | |
504 gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), &child_iter, &iter); | |
505 | |
506 name = keyword_get_name(keyword_tree, &child_iter); | |
507 | |
508 dnd_set_drag_label(tree_view, context, name); | |
509 g_free(name); | |
510 | |
1392 | 511 } |
512 | |
513 static void bar_pane_keywords_dnd_end(GtkWidget *widget, GdkDragContext *context, gpointer data) | |
514 { | |
515 } | |
516 | |
517 static void bar_pane_keywords_dnd_receive(GtkWidget *tree_view, GdkDragContext *context, | |
518 gint x, gint y, | |
519 GtkSelectionData *selection_data, guint info, | |
520 guint time, gpointer data) | |
521 { | |
1396 | 522 PaneKeywordsData *pkd = data; |
1392 | 523 GtkTreePath *tpath = NULL; |
524 GtkTreeViewDropPosition pos; | |
525 GtkTreeModel *model; | |
526 | |
527 GtkTreeModel *keyword_tree; | |
528 gboolean src_valid = FALSE; | |
1394 | 529 GList *new_keywords = NULL; |
530 GList *work; | |
1392 | 531 |
532 /* iterators for keyword_tree */ | |
533 GtkTreeIter src_kw_iter; | |
534 GtkTreeIter dest_kw_iter; | |
535 GtkTreeIter new_kw_iter; | |
536 | |
537 g_signal_stop_emission_by_name(tree_view, "drag_data_received"); | |
538 | |
539 gtk_tree_view_set_drag_dest_row(GTK_TREE_VIEW(tree_view), NULL, pos); | |
540 | |
541 model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view)); | |
542 keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); | |
543 | |
544 gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(tree_view), x, y, &tpath, &pos); | |
545 | |
546 | |
547 switch (info) | |
548 { | |
549 case TARGET_APP_KEYWORD_PATH: | |
550 { | |
551 GList *path = *(gpointer *)selection_data->data; | |
552 src_valid = keyword_tree_get_iter(keyword_tree, &src_kw_iter, path); | |
553 string_list_free(path); | |
554 break; | |
555 } | |
556 default: | |
1394 | 557 new_keywords = string_to_keywords_list((gchar *)selection_data->data); |
1392 | 558 break; |
559 } | |
560 | |
561 if (tpath) | |
562 { | |
563 GtkTreeIter dest_iter; | |
564 gtk_tree_model_get_iter(model, &dest_iter, tpath); | |
565 gtk_tree_path_free(tpath); | |
566 gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), &dest_kw_iter, &dest_iter); | |
567 | |
1395 | 568 if (src_valid && gtk_tree_store_is_ancestor(GTK_TREE_STORE(keyword_tree), &src_kw_iter, &dest_kw_iter)) |
569 { | |
570 /* can't move to it's own child */ | |
571 return; | |
572 } | |
1392 | 573 |
1396 | 574 if (src_valid && keyword_compare(keyword_tree, &src_kw_iter, &dest_kw_iter) == 0) |
575 { | |
576 /* can't move to itself */ | |
577 return; | |
578 } | |
579 | |
1392 | 580 if ((pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE || pos == GTK_TREE_VIEW_DROP_INTO_OR_AFTER) && |
581 !gtk_tree_model_iter_has_child(keyword_tree, &dest_kw_iter)) | |
582 { | |
583 gtk_tree_store_append(GTK_TREE_STORE(keyword_tree), &new_kw_iter, &dest_kw_iter); | |
584 } | |
585 else | |
586 { | |
587 switch (pos) | |
588 { | |
589 case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: | |
590 case GTK_TREE_VIEW_DROP_BEFORE: | |
591 gtk_tree_store_insert_before(GTK_TREE_STORE(keyword_tree), &new_kw_iter, NULL, &dest_kw_iter); | |
592 break; | |
593 case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: | |
594 case GTK_TREE_VIEW_DROP_AFTER: | |
595 gtk_tree_store_insert_after(GTK_TREE_STORE(keyword_tree), &new_kw_iter, NULL, &dest_kw_iter); | |
596 break; | |
597 } | |
598 } | |
599 } | |
600 else | |
601 { | |
602 gtk_tree_store_append(GTK_TREE_STORE(keyword_tree), &new_kw_iter, NULL); | |
603 } | |
604 | |
605 | |
606 if (src_valid) | |
607 { | |
608 keyword_move_recursive(GTK_TREE_STORE(keyword_tree), &new_kw_iter, &src_kw_iter); | |
609 } | |
610 | |
1394 | 611 work = new_keywords; |
612 while (work) | |
1392 | 613 { |
1394 | 614 keyword_set(GTK_TREE_STORE(keyword_tree), &new_kw_iter, work->data, TRUE); |
615 work = work->next; | |
616 if (work) | |
617 { | |
618 GtkTreeIter add; | |
619 gtk_tree_store_insert_after(GTK_TREE_STORE(keyword_tree), &add, NULL, &new_kw_iter); | |
620 new_kw_iter = add; | |
621 } | |
1392 | 622 } |
1394 | 623 string_list_free(new_keywords); |
1396 | 624 bar_keyword_tree_sync(pkd); |
1392 | 625 } |
626 | |
627 static gint bar_pane_keywords_dnd_motion(GtkWidget *tree_view, GdkDragContext *context, | |
628 gint x, gint y, guint time, gpointer data) | |
629 { | |
630 GtkTreePath *tpath = NULL; | |
631 GtkTreeViewDropPosition pos; | |
632 gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(tree_view), x, y, &tpath, &pos); | |
633 if (tpath) | |
634 { | |
635 GtkTreeModel *model; | |
636 GtkTreeIter dest_iter; | |
637 model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view)); | |
638 gtk_tree_model_get_iter(model, &dest_iter, tpath); | |
639 if (pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE && gtk_tree_model_iter_has_child(model, &dest_iter)) | |
640 pos = GTK_TREE_VIEW_DROP_BEFORE; | |
641 | |
642 if (pos == GTK_TREE_VIEW_DROP_INTO_OR_AFTER && gtk_tree_model_iter_has_child(model, &dest_iter)) | |
643 pos = GTK_TREE_VIEW_DROP_AFTER; | |
644 } | |
645 | |
646 gtk_tree_view_set_drag_dest_row(GTK_TREE_VIEW(tree_view), tpath, pos); | |
647 gtk_tree_path_free(tpath); | |
1395 | 648 |
649 if (tree_view == gtk_drag_get_source_widget(context)) | |
650 gdk_drag_status(context, GDK_ACTION_MOVE, time); | |
651 else | |
652 gdk_drag_status(context, GDK_ACTION_COPY, time); | |
653 | |
1392 | 654 return TRUE; |
655 } | |
656 | |
1421 | 657 /* |
658 *------------------------------------------------------------------- | |
659 * edit dialog | |
660 *------------------------------------------------------------------- | |
661 */ | |
662 | |
663 static void bar_pane_keywords_edit_destroy_cb(GtkWidget *widget, gpointer data) | |
664 { | |
665 ConfDialogData *cdd = data; | |
666 gtk_tree_path_free(cdd->click_tpath); | |
667 g_free(cdd); | |
668 } | |
669 | |
670 | |
671 static void bar_pane_keywords_edit_cancel_cb(GenericDialog *gd, gpointer data) | |
672 { | |
673 } | |
674 | |
675 | |
676 static void bar_pane_keywords_edit_ok_cb(GenericDialog *gd, gpointer data) | |
677 { | |
678 ConfDialogData *cdd = data; | |
679 PaneKeywordsData *pkd = cdd->pkd; | |
680 GtkTreeModel *model; | |
681 | |
682 GtkTreeModel *keyword_tree; | |
683 GtkTreeIter kw_iter; | |
684 | |
685 gboolean have_dest = FALSE; | |
686 | |
687 GList *keywords; | |
688 | |
689 model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); | |
690 keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); | |
691 | |
692 if (cdd->click_tpath) | |
693 { | |
694 GtkTreeIter iter; | |
695 if (gtk_tree_model_get_iter(model, &iter, cdd->click_tpath)) | |
696 { | |
697 gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), &kw_iter, &iter); | |
698 have_dest = TRUE; | |
699 } | |
700 } | |
701 | |
702 if (cdd->edit_existing && !have_dest) return; | |
703 | |
704 keywords = keyword_list_pull(cdd->edit_widget); | |
705 | |
706 if (cdd->edit_existing) | |
707 { | |
708 if (keywords && keywords->data) /* there should be one keyword */ | |
709 { | |
710 keyword_set(GTK_TREE_STORE(keyword_tree), &kw_iter, keywords->data, cdd->is_keyword); | |
711 } | |
712 } | |
713 else | |
714 { | |
715 GList *work = keywords; | |
716 | |
717 while (work) | |
718 { | |
719 GtkTreeIter add; | |
720 if (have_dest) | |
721 { | |
722 gtk_tree_store_insert_after(GTK_TREE_STORE(keyword_tree), &add, NULL, &kw_iter); | |
723 } | |
724 else | |
725 { | |
726 gtk_tree_store_append(GTK_TREE_STORE(keyword_tree), &add, NULL); | |
727 have_dest = TRUE; | |
728 } | |
729 kw_iter = add; | |
730 keyword_set(GTK_TREE_STORE(keyword_tree), &kw_iter, work->data, cdd->is_keyword); | |
731 work = work->next; | |
732 } | |
733 } | |
734 string_list_free(keywords); | |
735 } | |
736 | |
737 static void bar_pane_keywords_conf_set_helper(GtkWidget *widget, gpointer data) | |
738 { | |
739 ConfDialogData *cdd = data; | |
740 cdd->is_keyword = FALSE; | |
741 } | |
742 | |
743 static void bar_pane_keywords_conf_set_kw(GtkWidget *widget, gpointer data) | |
1414 | 744 { |
1421 | 745 ConfDialogData *cdd = data; |
746 cdd->is_keyword = TRUE; | |
747 } | |
748 | |
749 | |
750 | |
751 static void bar_pane_keywords_edit_dialog(PaneKeywordsData *pkd, gboolean edit_existing) | |
752 { | |
753 ConfDialogData *cdd; | |
754 GenericDialog *gd; | |
755 GtkWidget *table; | |
756 GtkWidget *group; | |
757 GtkWidget *button; | |
758 | |
759 gchar *name = NULL; | |
760 gboolean is_keyword = TRUE; | |
761 | |
762 | |
763 if (edit_existing && pkd->click_tpath) | |
764 { | |
765 GtkTreeModel *model; | |
766 GtkTreeIter iter; | |
767 model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); | |
768 | |
769 if (gtk_tree_model_get_iter(model, &iter, pkd->click_tpath)) | |
770 { | |
771 gtk_tree_model_get(model, &iter, FILTER_KEYWORD_COLUMN_NAME, &name, | |
772 FILTER_KEYWORD_COLUMN_IS_KEYWORD, &is_keyword, -1); | |
773 } | |
774 else | |
775 { | |
776 return; | |
777 } | |
778 } | |
779 | |
780 if (edit_existing && !name) return; | |
781 | |
782 | |
783 cdd = g_new0(ConfDialogData, 1); | |
784 cdd->pkd =pkd; | |
785 cdd->click_tpath = pkd->click_tpath; | |
786 pkd->click_tpath = NULL; | |
787 cdd->is_keyword = is_keyword; | |
788 cdd->edit_existing = edit_existing; | |
789 | |
790 cdd->gd = gd = generic_dialog_new(name ? _("Edit keyword") : _("Add keywords"), "keyword_edit", | |
791 pkd->widget, TRUE, | |
792 bar_pane_keywords_edit_cancel_cb, cdd); | |
793 g_signal_connect(G_OBJECT(gd->dialog), "destroy", | |
794 G_CALLBACK(bar_pane_keywords_edit_destroy_cb), cdd); | |
795 | |
796 | |
797 generic_dialog_add_message(gd, NULL, name ? _("Configure keyword") : _("Add keyword"), NULL); | |
798 | |
799 generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, | |
800 bar_pane_keywords_edit_ok_cb, TRUE); | |
801 | |
802 table = pref_table_new(gd->vbox, 3, 1, FALSE, TRUE); | |
803 pref_table_label(table, 0, 0, _("Keyword:"), 1.0); | |
804 cdd->edit_widget = gtk_entry_new(); | |
805 gtk_widget_set_size_request(cdd->edit_widget, 300, -1); | |
806 if (name) gtk_entry_set_text(GTK_ENTRY(cdd->edit_widget), name); | |
807 gtk_table_attach_defaults(GTK_TABLE(table), cdd->edit_widget, 1, 2, 0, 1); | |
808 /* here could eventually be a text view instead of entry */ | |
809 generic_dialog_attach_default(gd, cdd->edit_widget); | |
810 gtk_widget_show(cdd->edit_widget); | |
811 | |
812 group = pref_group_new(gd->vbox, FALSE, _("Keyword type:"), GTK_ORIENTATION_VERTICAL); | |
813 | |
814 button = pref_radiobutton_new(group, NULL, _("Active keyword"), | |
815 (cdd->is_keyword), | |
816 G_CALLBACK(bar_pane_keywords_conf_set_kw), cdd); | |
817 button = pref_radiobutton_new(group, button, _("Helper"), | |
818 (!cdd->is_keyword), | |
819 G_CALLBACK(bar_pane_keywords_conf_set_helper), cdd); | |
820 g_free(name); | |
821 | |
822 gtk_widget_show(gd->dialog); | |
823 } | |
824 | |
825 | |
826 | |
827 | |
828 /* | |
829 *------------------------------------------------------------------- | |
830 * popup menu | |
831 *------------------------------------------------------------------- | |
832 */ | |
833 | |
834 static void bar_pane_keywords_edit_dialog_cb(GtkWidget *menu_widget, gpointer data) | |
835 { | |
836 PaneKeywordsData *pkd = data; | |
837 bar_pane_keywords_edit_dialog(pkd, TRUE); | |
838 } | |
839 | |
840 static void bar_pane_keywords_add_dialog_cb(GtkWidget *menu_widget, gpointer data) | |
841 { | |
842 PaneKeywordsData *pkd = data; | |
843 bar_pane_keywords_edit_dialog(pkd, FALSE); | |
1414 | 844 } |
845 | |
1425 | 846 static void bar_pane_keywords_connect_mark_cb(GtkWidget *menu_widget, gpointer data) |
847 { | |
848 PaneKeywordsData *pkd = data; | |
849 | |
850 GtkTreeModel *model; | |
851 GtkTreeIter iter; | |
852 | |
853 GtkTreeModel *keyword_tree; | |
854 GtkTreeIter kw_iter; | |
855 | |
856 gint mark = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu_widget), "mark")) - 1; | |
857 | |
858 model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); | |
859 keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); | |
860 | |
861 if (!pkd->click_tpath) return; | |
862 if (!gtk_tree_model_get_iter(model, &iter, pkd->click_tpath)) return; | |
863 | |
864 gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), &kw_iter, &iter); | |
865 | |
866 file_data_unregister_notify_func(bar_pane_keywords_notify_cb, pkd); | |
867 | |
868 meta_data_connect_mark_with_keyword(keyword_tree, &kw_iter, mark); | |
869 | |
870 file_data_register_notify_func(bar_pane_keywords_notify_cb, pkd, NOTIFY_PRIORITY_LOW); | |
871 // bar_pane_keywords_update(pkd); | |
872 } | |
873 | |
874 | |
1414 | 875 static void bar_pane_keywords_delete_cb(GtkWidget *menu_widget, gpointer data) |
876 { | |
877 PaneKeywordsData *pkd = data; | |
878 GtkTreeModel *model; | |
879 GtkTreeIter iter; | |
880 | |
881 GtkTreeModel *keyword_tree; | |
882 GtkTreeIter kw_iter; | |
883 | |
884 if (!pkd->click_tpath) return; | |
885 | |
886 model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); | |
887 keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); | |
888 | |
889 if (!gtk_tree_model_get_iter(model, &iter, pkd->click_tpath)) return; | |
890 gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), &kw_iter, &iter); | |
891 | |
892 keyword_delete(GTK_TREE_STORE(keyword_tree), &kw_iter); | |
893 } | |
894 | |
1428 | 895 static void bar_pane_keywords_hide_cb(GtkWidget *menu_widget, gpointer data) |
896 { | |
897 PaneKeywordsData *pkd = data; | |
898 GtkTreeModel *model; | |
899 GtkTreeIter iter; | |
900 | |
901 GtkTreeModel *keyword_tree; | |
902 GtkTreeIter kw_iter; | |
903 | |
904 if (!pkd->click_tpath) return; | |
905 | |
906 model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); | |
907 keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); | |
908 | |
909 if (!gtk_tree_model_get_iter(model, &iter, pkd->click_tpath)) return; | |
910 gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), &kw_iter, &iter); | |
911 | |
912 keyword_hide_in(GTK_TREE_STORE(keyword_tree), &kw_iter, model); | |
913 } | |
914 | |
915 static void bar_pane_keywords_show_all_cb(GtkWidget *menu_widget, gpointer data) | |
916 { | |
917 PaneKeywordsData *pkd = data; | |
918 GtkTreeModel *model; | |
919 | |
920 GtkTreeModel *keyword_tree; | |
921 | |
922 pkd->hide_unchecked = FALSE; | |
923 | |
924 model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); | |
925 keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); | |
926 | |
927 keyword_show_all_in(GTK_TREE_STORE(keyword_tree), model); | |
928 bar_keyword_tree_sync(pkd); | |
929 } | |
930 | |
931 static void bar_pane_keywords_expand_checked_cb(GtkWidget *menu_widget, gpointer data) | |
932 { | |
933 PaneKeywordsData *pkd = data; | |
934 GtkTreeModel *model; | |
935 | |
936 model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); | |
937 gtk_tree_model_foreach(model, bar_keyword_tree_expand_if_set_cb, pkd); | |
938 } | |
939 | |
940 static void bar_pane_keywords_collapse_unchecked_cb(GtkWidget *menu_widget, gpointer data) | |
941 { | |
942 PaneKeywordsData *pkd = data; | |
943 GtkTreeModel *model; | |
944 | |
945 model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); | |
946 gtk_tree_model_foreach(model, bar_keyword_tree_collapse_if_unset_cb, pkd); | |
947 } | |
948 | |
949 static void bar_pane_keywords_hide_unchecked_cb(GtkWidget *menu_widget, gpointer data) | |
950 { | |
951 PaneKeywordsData *pkd = data; | |
952 GtkTreeModel *model; | |
953 | |
954 GtkTreeModel *keyword_tree; | |
955 GList *keywords; | |
956 | |
957 model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); | |
958 keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); | |
959 | |
960 keywords = keyword_list_pull(pkd->keyword_view); | |
961 keyword_hide_unset_in(GTK_TREE_STORE(keyword_tree), model, keywords); | |
962 string_list_free(keywords); | |
963 bar_keyword_tree_sync(pkd); | |
964 } | |
965 | |
966 static void bar_pane_keywords_expand_checked_toggle_cb(GtkWidget *menu_widget, gpointer data) | |
967 { | |
968 PaneKeywordsData *pkd = data; | |
969 pkd->expand_checked = !pkd->expand_checked; | |
970 bar_keyword_tree_sync(pkd); | |
971 } | |
972 | |
973 static void bar_pane_keywords_collapse_unchecked_toggle_cb(GtkWidget *menu_widget, gpointer data) | |
974 { | |
975 PaneKeywordsData *pkd = data; | |
976 pkd->collapse_unchecked = !pkd->collapse_unchecked; | |
977 bar_keyword_tree_sync(pkd); | |
978 } | |
979 | |
980 static void bar_pane_keywords_hide_unchecked_toggle_cb(GtkWidget *menu_widget, gpointer data) | |
981 { | |
982 PaneKeywordsData *pkd = data; | |
983 pkd->hide_unchecked = !pkd->hide_unchecked; | |
984 bar_keyword_tree_sync(pkd); | |
985 } | |
986 | |
1414 | 987 static void bar_pane_keywords_menu_popup(GtkWidget *widget, PaneKeywordsData *pkd, gint x, gint y) |
988 { | |
989 GtkWidget *menu; | |
1428 | 990 GtkWidget *item; |
991 GtkWidget *submenu; | |
1414 | 992 GtkTreeViewDropPosition pos; |
993 | |
994 if (pkd->click_tpath) gtk_tree_path_free(pkd->click_tpath); | |
995 pkd->click_tpath = NULL; | |
996 gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(pkd->keyword_treeview), x, y, &pkd->click_tpath, &pos); | |
997 | |
998 menu = popup_menu_short_lived(); | |
999 | |
1000 if (pkd->click_tpath) | |
1001 { | |
1002 /* for the entry */ | |
1425 | 1003 gchar *text; |
1004 gchar *mark; | |
1005 gint i; | |
1006 | |
1414 | 1007 GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); |
1008 | |
1009 GtkTreeIter iter; | |
1010 gtk_tree_model_get_iter(model, &iter, pkd->click_tpath); | |
1011 gchar *name; | |
1012 | |
1425 | 1013 gtk_tree_model_get(model, &iter, FILTER_KEYWORD_COLUMN_NAME, &name, |
1014 FILTER_KEYWORD_COLUMN_MARK, &mark, -1); | |
1015 | |
1428 | 1016 text = g_strdup_printf(_("Hide \"%s\""), name); |
1017 menu_item_add_stock(menu, text, GTK_STOCK_EDIT, G_CALLBACK(bar_pane_keywords_hide_cb), pkd); | |
1425 | 1018 g_free(text); |
1414 | 1019 |
1425 | 1020 submenu = gtk_menu_new(); |
1021 for (i = 0; i < FILEDATA_MARKS_SIZE; i++) | |
1022 { | |
1023 text = g_strdup_printf(_("Mark %d"), i + 1); | |
1024 item = menu_item_add(submenu, text, G_CALLBACK(bar_pane_keywords_connect_mark_cb), pkd); | |
1025 g_object_set_data(G_OBJECT(item), "mark", GINT_TO_POINTER(i + 1)); | |
1026 g_free(text); | |
1027 } | |
1028 text = g_strdup_printf(_("Connect \"%s\" to mark"), name); | |
1029 item = menu_item_add(menu, text, NULL, NULL); | |
1030 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); | |
1031 g_free(text); | |
1428 | 1032 |
1033 menu_item_add_divider(menu); | |
1034 | |
1035 text = g_strdup_printf(_("Edit \"%s\""), name); | |
1036 menu_item_add_stock(menu, text, GTK_STOCK_EDIT, G_CALLBACK(bar_pane_keywords_edit_dialog_cb), pkd); | |
1037 g_free(text); | |
1038 text = g_strdup_printf(_("Delete \"%s\""), name); | |
1039 menu_item_add_stock(menu, text, GTK_STOCK_DELETE, G_CALLBACK(bar_pane_keywords_delete_cb), pkd); | |
1040 g_free(text); | |
1041 | |
1425 | 1042 |
1043 if (mark && mark[0]) | |
1044 { | |
1045 text = g_strdup_printf(_("Disconnect \"%s\" from mark %s"), name, mark); | |
1046 menu_item_add_stock(menu, text, GTK_STOCK_DELETE, G_CALLBACK(bar_pane_keywords_connect_mark_cb), pkd); | |
1047 g_free(text); | |
1048 } | |
1049 | |
1414 | 1050 menu_item_add_divider(menu); |
1425 | 1051 g_free(mark); |
1414 | 1052 g_free(name); |
1053 } | |
1054 /* for the pane */ | |
1428 | 1055 |
1056 | |
1057 menu_item_add(menu, _("Expand checked"), G_CALLBACK(bar_pane_keywords_expand_checked_cb), pkd); | |
1058 menu_item_add(menu, _("Collapse unchecked"), G_CALLBACK(bar_pane_keywords_collapse_unchecked_cb), pkd); | |
1059 menu_item_add(menu, _("Hide unchecked"), G_CALLBACK(bar_pane_keywords_hide_unchecked_cb), pkd); | |
1060 menu_item_add(menu, _("Show all"), G_CALLBACK(bar_pane_keywords_show_all_cb), pkd); | |
1061 | |
1062 submenu = gtk_menu_new(); | |
1063 item = menu_item_add(menu, _("On any change"), NULL, NULL); | |
1064 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); | |
1065 | |
1066 menu_item_add_check(submenu, _("Expand checked"), pkd->expand_checked, G_CALLBACK(bar_pane_keywords_expand_checked_toggle_cb), pkd); | |
1067 menu_item_add_check(submenu, _("Collapse unchecked"), pkd->collapse_unchecked, G_CALLBACK(bar_pane_keywords_collapse_unchecked_toggle_cb), pkd); | |
1068 menu_item_add_check(submenu, _("Hide unchecked"), pkd->hide_unchecked, G_CALLBACK(bar_pane_keywords_hide_unchecked_toggle_cb), pkd); | |
1069 | |
1070 menu_item_add_divider(menu); | |
1071 | |
1421 | 1072 menu_item_add_stock(menu, _("Add keyword"), GTK_STOCK_EDIT, G_CALLBACK(bar_pane_keywords_add_dialog_cb), pkd); |
1414 | 1073 |
1074 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, GDK_CURRENT_TIME); | |
1075 } | |
1076 | |
1077 | |
1078 static gboolean bar_pane_keywords_menu_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data) | |
1079 { | |
1080 PaneKeywordsData *pkd = data; | |
1081 if (bevent->button == MOUSE_BUTTON_RIGHT) | |
1082 { | |
1083 bar_pane_keywords_menu_popup(widget, pkd, bevent->x, bevent->y); | |
1084 return TRUE; | |
1085 } | |
1086 return FALSE; | |
1087 } | |
1088 | |
1421 | 1089 /* |
1090 *------------------------------------------------------------------- | |
1091 * init | |
1092 *------------------------------------------------------------------- | |
1093 */ | |
1392 | 1094 |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1095 void bar_pane_keywords_close(GtkWidget *bar) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1096 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1097 PaneKeywordsData *pkd; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1098 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1099 pkd = g_object_get_data(G_OBJECT(bar), "pane_data"); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1100 if (!pkd) return; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1101 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1102 gtk_widget_destroy(pkd->widget); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1103 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1104 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1105 static void bar_pane_keywords_destroy(GtkWidget *widget, gpointer data) |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1106 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1107 PaneKeywordsData *pkd = data; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1108 |
1414 | 1109 if (pkd->click_tpath) gtk_tree_path_free(pkd->click_tpath); |
1110 | |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1111 file_data_unregister_notify_func(bar_pane_keywords_notify_cb, pkd); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1112 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1113 file_data_unref(pkd->fd); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1114 g_free(pkd->key); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1115 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1116 g_free(pkd); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1117 } |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1118 |
1391 | 1119 |
1309 | 1120 GtkWidget *bar_pane_keywords_new(const gchar *title, const gchar *key, gboolean expanded) |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1121 { |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1122 PaneKeywordsData *pkd; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1123 GtkWidget *hbox; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1124 GtkWidget *scrolled; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1125 GtkTextBuffer *buffer; |
1391 | 1126 GtkTreeModel *store; |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1127 GtkTreeViewColumn *column; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1128 GtkCellRenderer *renderer; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1129 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1130 pkd = g_new0(PaneKeywordsData, 1); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1131 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1132 pkd->pane.pane_set_fd = bar_pane_keywords_set_fd; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1133 pkd->pane.pane_event = bar_pane_keywords_event; |
1309 | 1134 pkd->pane.pane_write_config = bar_pane_keywords_write_config; |
1389
c44f21235ffe
Use a common function bar_pane_expander_title() to set expanders title widget.
zas_
parents:
1387
diff
changeset
|
1135 pkd->pane.title = bar_pane_expander_title(title); |
1387 | 1136 |
1309 | 1137 pkd->pane.expanded = expanded; |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1138 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1139 pkd->key = g_strdup(key); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1140 |
1428 | 1141 pkd->expand_checked = TRUE; |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1142 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1143 hbox = gtk_hbox_new(FALSE, PREF_PAD_GAP); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1144 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1145 pkd->widget = hbox; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1146 g_object_set_data(G_OBJECT(pkd->widget), "pane_data", pkd); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1147 g_signal_connect(G_OBJECT(pkd->widget), "destroy", |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1148 G_CALLBACK(bar_pane_keywords_destroy), pkd); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1149 gtk_widget_show(hbox); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1150 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1151 scrolled = gtk_scrolled_window_new(NULL, NULL); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1152 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1153 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1154 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1155 gtk_box_pack_start(GTK_BOX(hbox), scrolled, TRUE, TRUE, 0); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1156 gtk_widget_show(scrolled); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1157 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1158 pkd->keyword_view = gtk_text_view_new(); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1159 gtk_container_add(GTK_CONTAINER(scrolled), pkd->keyword_view); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1160 g_signal_connect(G_OBJECT(pkd->keyword_view), "populate-popup", |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1161 G_CALLBACK(bar_pane_keywords_populate_popup_cb), pkd); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1162 gtk_widget_show(pkd->keyword_view); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1163 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1164 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pkd->keyword_view)); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1165 g_signal_connect(G_OBJECT(buffer), "changed", |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1166 G_CALLBACK(bar_pane_keywords_changed), pkd); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1167 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1168 scrolled = gtk_scrolled_window_new(NULL, NULL); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1169 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1170 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1171 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1172 gtk_box_pack_start(GTK_BOX(hbox), scrolled, TRUE, TRUE, 0); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1173 gtk_widget_show(scrolled); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1174 |
1391 | 1175 |
1176 if (!keyword_tree) keyword_tree_new_default(); | |
1177 | |
1178 store = gtk_tree_model_filter_new(GTK_TREE_MODEL(keyword_tree), NULL); | |
1179 | |
1180 gtk_tree_model_filter_set_modify_func(GTK_TREE_MODEL_FILTER(store), | |
1181 FILTER_KEYWORD_COLUMN_COUNT, | |
1182 filter_keyword_column_types, | |
1183 bar_pane_keywords_filter_modify, | |
1184 pkd, | |
1185 NULL); | |
1428 | 1186 gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(store), |
1187 bar_pane_keywords_filter_visible, | |
1188 store, | |
1189 NULL); | |
1391 | 1190 |
1191 pkd->keyword_treeview = gtk_tree_view_new_with_model(store); | |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1192 g_object_unref(store); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1193 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1194 gtk_widget_set_size_request(pkd->keyword_treeview, -1, 400); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1195 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1196 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(pkd->keyword_treeview), FALSE); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1197 |
1391 | 1198 // gtk_tree_view_set_search_column(GTK_TREE_VIEW(pkd->keyword_treeview), FILTER_KEYWORD_COLUMN_); |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1199 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1200 column = gtk_tree_view_column_new(); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1201 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1202 |
1425 | 1203 renderer = gtk_cell_renderer_text_new(); |
1204 gtk_tree_view_column_pack_start(column, renderer, TRUE); | |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1205 |
1391 | 1206 gtk_tree_view_column_add_attribute(column, renderer, "text", FILTER_KEYWORD_COLUMN_MARK); |
1425 | 1207 |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1208 gtk_tree_view_append_column(GTK_TREE_VIEW(pkd->keyword_treeview), column); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1209 |
1391 | 1210 column = gtk_tree_view_column_new(); |
1211 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); | |
1212 renderer = gtk_cell_renderer_toggle_new(); | |
1213 gtk_tree_view_column_pack_start(column, renderer, FALSE); | |
1214 gtk_tree_view_column_add_attribute(column, renderer, "active", FILTER_KEYWORD_COLUMN_TOGGLE); | |
1215 gtk_tree_view_column_add_attribute(column, renderer, "visible", FILTER_KEYWORD_COLUMN_IS_KEYWORD); | |
1216 g_signal_connect(G_OBJECT(renderer), "toggled", | |
1217 G_CALLBACK(bar_pane_keywords_keyword_toggle), pkd); | |
1218 | |
1219 renderer = gtk_cell_renderer_text_new(); | |
1220 gtk_tree_view_column_pack_start(column, renderer, TRUE); | |
1221 gtk_tree_view_column_add_attribute(column, renderer, "text", FILTER_KEYWORD_COLUMN_NAME); | |
1222 | |
1223 gtk_tree_view_append_column(GTK_TREE_VIEW(pkd->keyword_treeview), column); | |
1224 gtk_tree_view_set_expander_column(GTK_TREE_VIEW(pkd->keyword_treeview), column); | |
1225 | |
1392 | 1226 gtk_drag_source_set(pkd->keyword_treeview, |
1227 GDK_BUTTON1_MASK | GDK_BUTTON2_MASK, | |
1228 bar_pane_keywords_drag_types, n_keywords_drag_types, | |
1229 GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK); | |
1230 | |
1231 g_signal_connect(G_OBJECT(pkd->keyword_treeview), "drag_data_get", | |
1232 G_CALLBACK(bar_pane_keywords_dnd_get), pkd); | |
1233 | |
1234 g_signal_connect(G_OBJECT(pkd->keyword_treeview), "drag_begin", | |
1235 G_CALLBACK(bar_pane_keywords_dnd_begin), pkd); | |
1236 g_signal_connect(G_OBJECT(pkd->keyword_treeview), "drag_end", | |
1237 G_CALLBACK(bar_pane_keywords_dnd_end), pkd); | |
1238 | |
1239 gtk_drag_dest_set(pkd->keyword_treeview, | |
1240 GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP, | |
1241 bar_pane_keywords_drop_types, n_keywords_drop_types, | |
1242 GDK_ACTION_COPY | GDK_ACTION_MOVE); | |
1243 | |
1244 g_signal_connect(G_OBJECT(pkd->keyword_treeview), "drag_data_received", | |
1245 G_CALLBACK(bar_pane_keywords_dnd_receive), pkd); | |
1246 | |
1247 g_signal_connect(G_OBJECT(pkd->keyword_treeview), "drag_motion", | |
1248 G_CALLBACK(bar_pane_keywords_dnd_motion), pkd); | |
1249 | |
1414 | 1250 g_signal_connect(G_OBJECT(pkd->keyword_treeview), "button_press_event", |
1251 G_CALLBACK(bar_pane_keywords_menu_cb), pkd); | |
1252 | |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1253 gtk_container_add(GTK_CONTAINER(scrolled), pkd->keyword_treeview); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1254 gtk_widget_show(pkd->keyword_treeview); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1255 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1256 file_data_register_notify_func(bar_pane_keywords_notify_cb, pkd, NOTIFY_PRIORITY_LOW); |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1257 |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1258 return pkd->widget; |
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1259 } |
1309 | 1260 |
1261 GtkWidget *bar_pane_keywords_new_from_config(const gchar **attribute_names, const gchar **attribute_values) | |
1262 { | |
1263 gchar *title = g_strdup(_("NoName")); | |
1264 gchar *key = g_strdup(COMMENT_KEY); | |
1265 gboolean expanded = TRUE; | |
1266 | |
1267 while (*attribute_names) | |
1268 { | |
1269 const gchar *option = *attribute_names++; | |
1270 const gchar *value = *attribute_values++; | |
1271 | |
1315 | 1272 if (READ_CHAR_FULL("pane.title", title)) continue; |
1273 if (READ_CHAR_FULL("key", key)) continue; | |
1274 if (READ_BOOL_FULL("pane.expanded", expanded)) continue; | |
1309 | 1275 |
1276 | |
1277 DEBUG_1("unknown attribute %s = %s", option, value); | |
1278 } | |
1279 | |
1280 return bar_pane_keywords_new(title, key, expanded); | |
1281 } | |
1282 | |
1291
50ae02a4a675
replaced bar_info with an universal bar, restored the original
nadvornik
parents:
diff
changeset
|
1283 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ |