Mercurial > geeqie
annotate src/bar_info.c @ 1220:a0c249bcc4ff
allow writing of empty keywords/comment
author | nadvornik |
---|---|
date | Tue, 23 Dec 2008 22:42:57 +0000 |
parents | 86fcbd0fcb7b |
children | 18d08b10b80e |
rev | line source |
---|---|
9 | 1 /* |
196 | 2 * Geeqie |
9 | 3 * (C) 2004 John Ellis |
475 | 4 * Copyright (C) 2008 The Geeqie Team |
9 | 5 * |
6 * Author: John Ellis | |
7 * | |
8 * This software is released under the GNU General Public License (GNU GPL). | |
9 * Please read the included file COPYING for more information. | |
10 * This software comes with no warranty of any kind, use at your own risk! | |
11 */ | |
12 | |
13 | |
281 | 14 #include "main.h" |
9 | 15 #include "bar_info.h" |
16 | |
586 | 17 #include "filedata.h" |
902 | 18 #include "history_list.h" |
9 | 19 #include "info.h" |
1178
f6449c17306b
Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
1174
diff
changeset
|
20 #include "metadata.h" |
1022
9962b24b6b43
Move miscellaneous functions to their own files (new misc.[ch]).
zas_
parents:
995
diff
changeset
|
21 #include "misc.h" |
9 | 22 #include "ui_fileops.h" |
23 #include "ui_misc.h" | |
24 #include "ui_utildlg.h" | |
1022
9962b24b6b43
Move miscellaneous functions to their own files (new misc.[ch]).
zas_
parents:
995
diff
changeset
|
25 #include "utilops.h" |
9 | 26 |
27 static const gchar *keyword_favorite_defaults[] = { | |
28 N_("Favorite"), | |
29 N_("Todo"), | |
30 N_("People"), | |
31 N_("Places"), | |
32 N_("Art"), | |
33 N_("Nature"), | |
34 N_("Possessions"), | |
35 NULL | |
36 }; | |
37 | |
38 | |
39 static void bar_info_keyword_update_all(void); | |
1217
70f1d002436f
write changes immediately, the necessary buffering is done on lower
nadvornik
parents:
1193
diff
changeset
|
40 static void bar_info_changed(GtkTextBuffer *buffer, gpointer data); |
9 | 41 |
42 /* | |
43 *------------------------------------------------------------------- | |
44 * keyword / comment utils | |
45 *------------------------------------------------------------------- | |
46 */ | |
47 | |
188
0584cb78aa14
write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents:
138
diff
changeset
|
48 |
9 | 49 static gchar *comment_pull(GtkWidget *textview) |
50 { | |
51 GtkTextBuffer *buffer; | |
52 GtkTextIter start, end; | |
442 | 53 |
9 | 54 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); |
55 gtk_text_buffer_get_bounds(buffer, &start, &end); | |
442 | 56 |
9 | 57 return gtk_text_buffer_get_text(buffer, &start, &end, FALSE); |
58 } | |
59 | |
60 GList *keyword_list_pull(GtkWidget *text_widget) | |
61 { | |
1178
f6449c17306b
Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
1174
diff
changeset
|
62 GList *list; |
9 | 63 gchar *text; |
64 | |
65 if (GTK_IS_TEXT_VIEW(text_widget)) | |
66 { | |
67 text = comment_pull(text_widget); | |
68 } | |
69 else if (GTK_IS_ENTRY(text_widget)) | |
70 { | |
71 text = g_strdup(gtk_entry_get_text(GTK_ENTRY(text_widget))); | |
72 } | |
73 else | |
74 { | |
75 return NULL; | |
76 } | |
1178
f6449c17306b
Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
1174
diff
changeset
|
77 |
f6449c17306b
Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
1174
diff
changeset
|
78 list = string_to_keywords_list(text); |
9 | 79 |
80 g_free(text); | |
81 | |
82 return list; | |
83 } | |
84 | |
85 void keyword_list_push(GtkWidget *textview, GList *list) | |
86 { | |
87 GtkTextBuffer *buffer; | |
88 GtkTextIter start, end; | |
89 | |
90 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); | |
91 gtk_text_buffer_get_bounds(buffer, &start, &end); | |
512
f9bf33be53ff
Remove whitespace between function name and first parenthesis for the sake of consistency.
zas_
parents:
507
diff
changeset
|
92 gtk_text_buffer_delete(buffer, &start, &end); |
9 | 93 |
94 while (list) | |
95 { | |
96 const gchar *word = list->data; | |
97 GtkTextIter iter; | |
98 | |
99 gtk_text_buffer_get_end_iter(buffer, &iter); | |
100 if (word) gtk_text_buffer_insert(buffer, &iter, word, -1); | |
101 gtk_text_buffer_get_end_iter(buffer, &iter); | |
102 gtk_text_buffer_insert(buffer, &iter, "\n", -1); | |
103 | |
104 list = list->next; | |
105 } | |
106 } | |
107 | |
108 | |
109 /* | |
110 *------------------------------------------------------------------- | |
111 * keyword list dialog | |
112 *------------------------------------------------------------------- | |
113 */ | |
114 | |
115 #define KEYWORD_DIALOG_WIDTH 200 | |
116 #define KEYWORD_DIALOG_HEIGHT 250 | |
117 | |
118 typedef struct _KeywordDlg KeywordDlg; | |
119 struct _KeywordDlg | |
120 { | |
121 GenericDialog *gd; | |
122 GtkWidget *treeview; | |
123 }; | |
124 | |
125 static KeywordDlg *keyword_dialog = NULL; | |
126 | |
127 | |
128 static void keyword_dialog_cancel_cb(GenericDialog *gd, gpointer data) | |
129 { | |
130 g_free(keyword_dialog); | |
131 keyword_dialog = NULL; | |
132 } | |
133 | |
134 static void keyword_dialog_ok_cb(GenericDialog *gd, gpointer data) | |
135 { | |
136 KeywordDlg *kd = data; | |
137 GtkTreeModel *store; | |
138 GtkTreeIter iter; | |
139 gint valid; | |
140 | |
141 history_list_free_key("keywords"); | |
142 | |
143 store = gtk_tree_view_get_model(GTK_TREE_VIEW(kd->treeview)); | |
144 valid = gtk_tree_model_get_iter_first(store, &iter); | |
145 while (valid) | |
146 { | |
147 gchar *key; | |
148 | |
149 gtk_tree_model_get(store, &iter, 0, &key, -1); | |
150 valid = gtk_tree_model_iter_next(store, &iter); | |
151 | |
152 history_list_add_to_key("keywords", key, 0); | |
153 } | |
154 | |
155 keyword_dialog_cancel_cb(gd, data); | |
156 | |
157 bar_info_keyword_update_all(); | |
158 } | |
159 | |
160 static void keyword_dialog_add_cb(GtkWidget *button, gpointer data) | |
161 { | |
162 KeywordDlg *kd = data; | |
163 GtkTreeSelection *selection; | |
164 GtkTreeModel *store; | |
165 GtkTreeIter sibling; | |
166 GtkTreeIter iter; | |
167 GtkTreePath *tpath; | |
168 | |
169 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(kd->treeview)); | |
170 if (gtk_tree_selection_get_selected(selection, &store, &sibling)) | |
171 { | |
172 gtk_list_store_insert_before(GTK_LIST_STORE(store), &iter, &sibling); | |
173 } | |
174 else | |
175 { | |
176 store = gtk_tree_view_get_model(GTK_TREE_VIEW(kd->treeview)); | |
177 gtk_list_store_append(GTK_LIST_STORE(store), &iter); | |
178 } | |
179 | |
180 gtk_list_store_set(GTK_LIST_STORE(store), &iter, 1, TRUE, -1); | |
181 | |
182 tpath = gtk_tree_model_get_path(store, &iter); | |
183 gtk_tree_view_set_cursor(GTK_TREE_VIEW(kd->treeview), tpath, | |
184 gtk_tree_view_get_column(GTK_TREE_VIEW(kd->treeview), 0), TRUE); | |
185 gtk_tree_path_free(tpath); | |
186 } | |
187 | |
188 static void keyword_dialog_remove_cb(GtkWidget *button, gpointer data) | |
189 { | |
190 KeywordDlg *kd = data; | |
191 GtkTreeSelection *selection; | |
192 GtkTreeModel *store; | |
193 GtkTreeIter iter; | |
194 GtkTreeIter next; | |
195 GtkTreePath *tpath; | |
196 | |
197 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(kd->treeview)); | |
198 if (!gtk_tree_selection_get_selected(selection, &store, &iter)) return; | |
199 | |
200 tpath = NULL; | |
201 next = iter; | |
202 if (gtk_tree_model_iter_next(store, &next)) | |
203 { | |
204 tpath = gtk_tree_model_get_path(store, &next); | |
205 } | |
206 else | |
207 { | |
208 tpath = gtk_tree_model_get_path(store, &iter); | |
209 if (!gtk_tree_path_prev(tpath)) | |
210 { | |
211 gtk_tree_path_free(tpath); | |
212 tpath = NULL; | |
213 } | |
214 } | |
215 if (tpath) | |
216 { | |
217 gtk_tree_view_set_cursor(GTK_TREE_VIEW(kd->treeview), tpath, | |
218 gtk_tree_view_get_column(GTK_TREE_VIEW(kd->treeview), 0), FALSE); | |
219 gtk_tree_path_free(tpath); | |
220 } | |
221 | |
222 gtk_list_store_remove(GTK_LIST_STORE(store), &iter); | |
223 } | |
224 | |
225 static void keyword_dialog_edit_cb(GtkCellRendererText *renderer, const gchar *path, | |
226 const gchar *new_text, gpointer data) | |
227 { | |
228 KeywordDlg *kd = data; | |
229 GtkTreeModel *store; | |
230 GtkTreeIter iter; | |
231 GtkTreePath *tpath; | |
232 | |
233 if (!new_text || strlen(new_text) == 0) return; | |
234 | |
235 store = gtk_tree_view_get_model(GTK_TREE_VIEW(kd->treeview)); | |
236 | |
237 tpath = gtk_tree_path_new_from_string(path); | |
238 gtk_tree_model_get_iter(store, &iter, tpath); | |
239 gtk_tree_path_free(tpath); | |
240 | |
241 gtk_list_store_set(GTK_LIST_STORE(store), &iter, 0, new_text, -1); | |
242 } | |
243 | |
244 static void keyword_dialog_populate(KeywordDlg *kd) | |
245 { | |
246 GtkListStore *store; | |
247 GList *list; | |
248 | |
249 store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(kd->treeview))); | |
250 gtk_list_store_clear(store); | |
251 | |
252 list = history_list_get_by_key("keywords"); | |
253 list = g_list_last(list); | |
254 while (list) | |
255 { | |
256 GtkTreeIter iter; | |
257 | |
258 gtk_list_store_append(store, &iter); | |
259 gtk_list_store_set(store, &iter, 0, list->data, | |
260 1, TRUE, -1); | |
261 | |
262 list = list->prev; | |
263 } | |
264 } | |
265 | |
266 static void keyword_dialog_show(void) | |
267 { | |
268 GtkWidget *scrolled; | |
269 GtkListStore *store; | |
270 GtkTreeViewColumn *column; | |
271 GtkCellRenderer *renderer; | |
272 GtkWidget *hbox; | |
273 GtkWidget *button; | |
274 | |
275 if (keyword_dialog) | |
276 { | |
277 gtk_window_present(GTK_WINDOW(keyword_dialog->gd->dialog)); | |
278 return; | |
279 } | |
280 | |
281 keyword_dialog = g_new0(KeywordDlg, 1); | |
282 | |
283 keyword_dialog->gd = generic_dialog_new(_("Keyword Presets"), | |
1174
0bea79d87065
Drop useless wmclass stuff. Gtk will take care of it and as said in the documentation using gtk_window_set_wmclass() is sort of pointless.
zas_
parents:
1148
diff
changeset
|
284 "keyword_presets", NULL, TRUE, |
9 | 285 keyword_dialog_cancel_cb, keyword_dialog); |
286 generic_dialog_add_message(keyword_dialog->gd, NULL, _("Favorite keywords list"), NULL); | |
287 | |
288 generic_dialog_add_button(keyword_dialog->gd, GTK_STOCK_OK, NULL, | |
289 keyword_dialog_ok_cb, TRUE); | |
290 | |
291 scrolled = gtk_scrolled_window_new(NULL, NULL); | |
292 gtk_widget_set_size_request(scrolled, KEYWORD_DIALOG_WIDTH, KEYWORD_DIALOG_HEIGHT); | |
293 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN); | |
294 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), | |
295 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); | |
296 gtk_box_pack_start(GTK_BOX(keyword_dialog->gd->vbox), scrolled, TRUE, TRUE, 5); | |
297 gtk_widget_show(scrolled); | |
298 | |
299 store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_BOOLEAN); | |
300 keyword_dialog->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); | |
301 g_object_unref(store); | |
302 | |
303 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(keyword_dialog->treeview), FALSE); | |
304 gtk_tree_view_set_search_column(GTK_TREE_VIEW(keyword_dialog->treeview), 0); | |
305 gtk_tree_view_set_reorderable(GTK_TREE_VIEW(keyword_dialog->treeview), TRUE); | |
306 | |
307 column = gtk_tree_view_column_new(); | |
308 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); | |
309 renderer = gtk_cell_renderer_text_new(); | |
310 g_signal_connect(G_OBJECT(renderer), "edited", | |
311 G_CALLBACK(keyword_dialog_edit_cb), keyword_dialog); | |
312 gtk_tree_view_column_pack_start(column, renderer, TRUE); | |
313 gtk_tree_view_column_add_attribute(column, renderer, "text", 0); | |
314 gtk_tree_view_column_add_attribute(column, renderer, "editable", 1); | |
315 gtk_tree_view_append_column(GTK_TREE_VIEW(keyword_dialog->treeview), column); | |
316 | |
317 gtk_container_add(GTK_CONTAINER(scrolled), keyword_dialog->treeview); | |
318 gtk_widget_show(keyword_dialog->treeview); | |
319 | |
320 hbox = gtk_hbox_new(FALSE, 5); | |
321 gtk_box_pack_start(GTK_BOX(keyword_dialog->gd->vbox), hbox, FALSE, FALSE, 0); | |
322 gtk_widget_show(hbox); | |
323 | |
324 button = gtk_button_new_from_stock(GTK_STOCK_ADD); | |
325 g_signal_connect(G_OBJECT(button), "clicked", | |
326 G_CALLBACK(keyword_dialog_add_cb), keyword_dialog); | |
327 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
328 gtk_widget_show(button); | |
329 | |
330 button = gtk_button_new_from_stock(GTK_STOCK_REMOVE); | |
331 g_signal_connect(G_OBJECT(button), "clicked", | |
332 G_CALLBACK(keyword_dialog_remove_cb), keyword_dialog); | |
333 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
334 gtk_widget_show(button); | |
335 | |
336 keyword_dialog_populate(keyword_dialog); | |
337 | |
338 gtk_widget_show(keyword_dialog->gd->dialog); | |
339 } | |
340 | |
341 | |
342 static void bar_keyword_edit_cb(GtkWidget *button, gpointer data) | |
343 { | |
344 keyword_dialog_show(); | |
345 } | |
346 | |
347 | |
348 /* | |
349 *------------------------------------------------------------------- | |
350 * info bar | |
351 *------------------------------------------------------------------- | |
352 */ | |
353 | |
354 typedef enum { | |
355 BAR_SORT_COPY, | |
356 BAR_SORT_MOVE, | |
357 BAR_SORT_LINK | |
358 } SortActionType; | |
359 | |
360 enum { | |
361 KEYWORD_COLUMN_TOGGLE = 0, | |
362 KEYWORD_COLUMN_TEXT | |
363 }; | |
364 | |
365 typedef struct _BarInfoData BarInfoData; | |
366 struct _BarInfoData | |
367 { | |
368 GtkWidget *vbox; | |
369 GtkWidget *group_box; | |
370 GtkWidget *label_file_name; | |
371 GtkWidget *label_file_time; | |
372 | |
373 GtkWidget *keyword_view; | |
374 GtkWidget *keyword_treeview; | |
375 | |
376 GtkWidget *comment_view; | |
377 | |
1217
70f1d002436f
write changes immediately, the necessary buffering is done on lower
nadvornik
parents:
1193
diff
changeset
|
378 #if 0 |
9 | 379 GtkWidget *button_save; |
1217
70f1d002436f
write changes immediately, the necessary buffering is done on lower
nadvornik
parents:
1193
diff
changeset
|
380 #endif |
595
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
381 GtkWidget *button_set_keywords_add; |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
382 GtkWidget *button_set_keywords_replace; |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
383 GtkWidget *button_set_comment_add; |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
384 GtkWidget *button_set_comment_replace; |
9 | 385 |
138 | 386 FileData *fd; |
9 | 387 |
388 GList *(*list_func)(gpointer); | |
389 gpointer list_data; | |
390 }; | |
391 | |
392 | |
393 static GList *bar_list = NULL; | |
394 | |
395 | |
396 static void bar_info_write(BarInfoData *bd) | |
397 { | |
398 GList *list; | |
399 gchar *comment; | |
400 | |
138 | 401 if (!bd->fd) return; |
9 | 402 |
403 list = keyword_list_pull(bd->keyword_view); | |
404 comment = comment_pull(bd->comment_view); | |
405 | |
1220 | 406 metadata_write(bd->fd, &list, &comment); |
9 | 407 |
138 | 408 string_list_free(list); |
9 | 409 g_free(comment); |
410 } | |
411 | |
412 static void bar_keyword_list_sync(BarInfoData *bd, GList *keywords) | |
413 { | |
414 GList *list; | |
415 GtkListStore *store; | |
416 GtkTreeIter iter; | |
417 | |
418 list = history_list_get_by_key("keywords"); | |
419 if (!list) | |
420 { | |
421 /* blank? set up a few example defaults */ | |
422 | |
423 gint i = 0; | |
424 | |
425 while (keyword_favorite_defaults[i] != NULL) | |
426 { | |
427 history_list_add_to_key("keywords", _(keyword_favorite_defaults[i]), 0); | |
428 i++; | |
429 } | |
430 | |
431 list = history_list_get_by_key("keywords"); | |
432 } | |
433 | |
434 store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(bd->keyword_treeview))); | |
435 | |
436 gtk_list_store_clear(store); | |
437 | |
438 list = g_list_last(list); | |
439 while (list) | |
440 { | |
441 gchar *key = list->data; | |
442 | |
443 gtk_list_store_append(store, &iter); | |
1193
aed0e28b2744
keyword_list_find() -> find_string_in_list(), return gboolean.
zas_
parents:
1192
diff
changeset
|
444 gtk_list_store_set(store, &iter, KEYWORD_COLUMN_TOGGLE, find_string_in_list(keywords, key), |
9 | 445 KEYWORD_COLUMN_TEXT, key, -1); |
446 | |
447 list = list->prev; | |
448 } | |
449 } | |
450 | |
451 static void bar_info_keyword_update_all(void) | |
452 { | |
453 GList *work; | |
454 | |
455 work = bar_list; | |
456 while (work) | |
457 { | |
458 BarInfoData *bd; | |
459 GList *keywords; | |
460 | |
461 bd = work->data; | |
462 work = work->next; | |
463 | |
464 keywords = keyword_list_pull(bd->keyword_view); | |
465 bar_keyword_list_sync(bd, keywords); | |
138 | 466 string_list_free(keywords); |
9 | 467 } |
468 } | |
469 | |
470 static void bar_info_update(BarInfoData *bd) | |
471 { | |
472 GList *keywords = NULL; | |
473 gchar *comment = NULL; | |
1217
70f1d002436f
write changes immediately, the necessary buffering is done on lower
nadvornik
parents:
1193
diff
changeset
|
474 GtkTextBuffer *keyword_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bd->keyword_view)); |
70f1d002436f
write changes immediately, the necessary buffering is done on lower
nadvornik
parents:
1193
diff
changeset
|
475 GtkTextBuffer *comment_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bd->comment_view)); |
70f1d002436f
write changes immediately, the necessary buffering is done on lower
nadvornik
parents:
1193
diff
changeset
|
476 |
70f1d002436f
write changes immediately, the necessary buffering is done on lower
nadvornik
parents:
1193
diff
changeset
|
477 g_signal_handlers_block_by_func(keyword_buffer, bar_info_changed, bd); |
70f1d002436f
write changes immediately, the necessary buffering is done on lower
nadvornik
parents:
1193
diff
changeset
|
478 g_signal_handlers_block_by_func(comment_buffer, bar_info_changed, bd); |
9 | 479 |
480 if (bd->label_file_name) | |
481 { | |
138 | 482 gtk_label_set_text(GTK_LABEL(bd->label_file_name), (bd->fd) ? bd->fd->name : ""); |
9 | 483 } |
484 if (bd->label_file_time) | |
485 { | |
138 | 486 gtk_label_set_text(GTK_LABEL(bd->label_file_time), (bd->fd) ? text_from_time(bd->fd->date) : ""); |
9 | 487 } |
488 | |
1191
bb02d0e2a573
Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents:
1178
diff
changeset
|
489 if (metadata_read(bd->fd, &keywords, &comment)) |
9 | 490 { |
491 keyword_list_push(bd->keyword_view, keywords); | |
1217
70f1d002436f
write changes immediately, the necessary buffering is done on lower
nadvornik
parents:
1193
diff
changeset
|
492 gtk_text_buffer_set_text(comment_buffer, |
9 | 493 (comment) ? comment : "", -1); |
494 | |
495 bar_keyword_list_sync(bd, keywords); | |
496 | |
138 | 497 string_list_free(keywords); |
9 | 498 g_free(comment); |
499 } | |
500 else | |
501 { | |
1217
70f1d002436f
write changes immediately, the necessary buffering is done on lower
nadvornik
parents:
1193
diff
changeset
|
502 gtk_text_buffer_set_text(keyword_buffer, "", -1); |
70f1d002436f
write changes immediately, the necessary buffering is done on lower
nadvornik
parents:
1193
diff
changeset
|
503 gtk_text_buffer_set_text(comment_buffer, "", -1); |
9 | 504 |
505 bar_keyword_list_sync(bd, NULL); | |
506 } | |
507 | |
1217
70f1d002436f
write changes immediately, the necessary buffering is done on lower
nadvornik
parents:
1193
diff
changeset
|
508 g_signal_handlers_unblock_by_func(keyword_buffer, bar_info_changed, bd); |
70f1d002436f
write changes immediately, the necessary buffering is done on lower
nadvornik
parents:
1193
diff
changeset
|
509 g_signal_handlers_unblock_by_func(comment_buffer, bar_info_changed, bd); |
9 | 510 |
138 | 511 gtk_widget_set_sensitive(bd->group_box, (bd->fd != NULL)); |
9 | 512 } |
513 | |
138 | 514 void bar_info_set(GtkWidget *bar, FileData *fd) |
9 | 515 { |
516 BarInfoData *bd; | |
517 | |
518 bd = g_object_get_data(G_OBJECT(bar), "bar_info_data"); | |
519 if (!bd) return; | |
520 | |
138 | 521 file_data_unref(bd->fd); |
522 bd->fd = file_data_ref(fd); | |
9 | 523 |
524 bar_info_update(bd); | |
525 } | |
526 | |
138 | 527 void bar_info_maint_renamed(GtkWidget *bar, FileData *fd) |
9 | 528 { |
529 BarInfoData *bd; | |
530 | |
531 bd = g_object_get_data(G_OBJECT(bar), "bar_info_data"); | |
532 if (!bd) return; | |
533 | |
138 | 534 file_data_unref(bd->fd); |
535 bd->fd = file_data_ref(fd); | |
9 | 536 |
537 if (bd->label_file_name) | |
538 { | |
138 | 539 gtk_label_set_text(GTK_LABEL(bd->label_file_name), (bd->fd) ? bd->fd->name : ""); |
9 | 540 } |
541 } | |
542 | |
543 gint bar_info_event(GtkWidget *bar, GdkEvent *event) | |
544 { | |
545 BarInfoData *bd; | |
546 | |
547 bd = g_object_get_data(G_OBJECT(bar), "bar_info_data"); | |
548 if (!bd) return FALSE; | |
549 | |
550 if (GTK_WIDGET_HAS_FOCUS(bd->keyword_view)) return gtk_widget_event(bd->keyword_view, event); | |
551 if (GTK_WIDGET_HAS_FOCUS(bd->comment_view)) return gtk_widget_event(bd->comment_view, event); | |
552 | |
553 return FALSE; | |
554 } | |
555 | |
556 static void bar_info_keyword_set(BarInfoData *bd, const gchar *keyword, gint active) | |
557 { | |
558 GList *list; | |
559 gint found; | |
560 | |
561 if (!keyword) return; | |
562 | |
563 list = keyword_list_pull(bd->keyword_view); | |
1193
aed0e28b2744
keyword_list_find() -> find_string_in_list(), return gboolean.
zas_
parents:
1192
diff
changeset
|
564 found = find_string_in_list(list, keyword); |
9 | 565 |
566 if (active != found) | |
567 { | |
568 if (found) | |
569 { | |
570 GList *work = list; | |
571 | |
572 while (work) | |
573 { | |
574 gchar *key = work->data; | |
575 work = work->next; | |
576 | |
577 if (key && keyword && strcmp(key, keyword) == 0) | |
578 { | |
579 list = g_list_remove(list, key); | |
580 g_free(key); | |
581 } | |
582 } | |
583 } | |
584 else | |
585 { | |
586 list = g_list_append(list, g_strdup(keyword)); | |
587 } | |
588 | |
589 keyword_list_push(bd->keyword_view, list); | |
590 } | |
591 | |
138 | 592 string_list_free(list); |
9 | 593 } |
594 | |
595 static void bar_info_keyword_toggle(GtkCellRendererToggle *toggle, const gchar *path, gpointer data) | |
596 { | |
597 BarInfoData *bd = data; | |
598 GtkTreeModel *store; | |
599 GtkTreeIter iter; | |
600 GtkTreePath *tpath; | |
601 gchar *key = NULL; | |
602 gboolean active; | |
603 | |
604 store = gtk_tree_view_get_model(GTK_TREE_VIEW(bd->keyword_treeview)); | |
605 | |
606 tpath = gtk_tree_path_new_from_string(path); | |
607 gtk_tree_model_get_iter(store, &iter, tpath); | |
608 gtk_tree_path_free(tpath); | |
609 | |
610 gtk_tree_model_get(store, &iter, KEYWORD_COLUMN_TOGGLE, &active, | |
611 KEYWORD_COLUMN_TEXT, &key, -1); | |
612 active = (!active); | |
613 gtk_list_store_set(GTK_LIST_STORE(store), &iter, KEYWORD_COLUMN_TOGGLE, active, -1); | |
614 | |
615 bar_info_keyword_set(bd, key, active); | |
616 g_free(key); | |
617 } | |
618 | |
1192
48d62a7e3c33
metadata_set_keywords() -> metadata_set(). Use gboolean type for boolean parameters.
zas_
parents:
1191
diff
changeset
|
619 static void bar_info_set_selection(BarInfoData *bd, gboolean set_keywords, gboolean set_comment, gboolean append) |
9 | 620 { |
595
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
621 GList *keywords = NULL; |
9 | 622 GList *list = NULL; |
623 GList *work; | |
595
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
624 gchar *comment = NULL; |
9 | 625 |
626 if (!bd->list_func) return; | |
627 | |
595
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
628 if (set_keywords) |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
629 { |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
630 keywords = keyword_list_pull(bd->keyword_view); |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
631 } |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
632 |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
633 if (set_comment) |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
634 { |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
635 comment = comment_pull(bd->comment_view); |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
636 } |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
637 |
1192
48d62a7e3c33
metadata_set_keywords() -> metadata_set(). Use gboolean type for boolean parameters.
zas_
parents:
1191
diff
changeset
|
638 if (append && !keywords && !comment) return; |
9 | 639 |
640 list = bd->list_func(bd->list_data); | |
641 work = list; | |
642 while (work) | |
643 { | |
138 | 644 FileData *fd = work->data; |
9 | 645 work = work->next; |
646 | |
1192
48d62a7e3c33
metadata_set_keywords() -> metadata_set(). Use gboolean type for boolean parameters.
zas_
parents:
1191
diff
changeset
|
647 metadata_set(fd, keywords, comment, append); |
9 | 648 } |
649 | |
138 | 650 filelist_free(list); |
651 string_list_free(keywords); | |
595
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
652 g_free(comment); |
9 | 653 } |
654 | |
595
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
655 static void bar_info_set_keywords_add(GtkWidget *button, gpointer data) |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
656 { |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
657 BarInfoData *bd = data; |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
658 |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
659 bar_info_set_selection(bd, TRUE, FALSE, TRUE); |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
660 } |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
661 |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
662 static void bar_info_set_keywords_replace(GtkWidget *button, gpointer data) |
9 | 663 { |
664 BarInfoData *bd = data; | |
665 | |
595
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
666 bar_info_set_selection(bd, TRUE, FALSE, FALSE); |
9 | 667 } |
668 | |
595
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
669 static void bar_info_set_comment_add(GtkWidget *button, gpointer data) |
9 | 670 { |
671 BarInfoData *bd = data; | |
672 | |
595
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
673 bar_info_set_selection(bd, FALSE, TRUE, TRUE); |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
674 } |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
675 |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
676 static void bar_info_set_comment_replace(GtkWidget *button, gpointer data) |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
677 { |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
678 BarInfoData *bd = data; |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
679 |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
680 bar_info_set_selection(bd, FALSE, TRUE, FALSE); |
9 | 681 } |
682 | |
1219 | 683 static void bar_info_notify_cb(FileData *fd, NotifyType type, gpointer data) |
684 { | |
685 BarInfoData *bd = data; | |
686 if (fd == bd->fd) bar_info_update(bd); | |
687 } | |
688 | |
9 | 689 static void bar_info_changed(GtkTextBuffer *buffer, gpointer data) |
690 { | |
691 BarInfoData *bd = data; | |
692 | |
1219 | 693 file_data_unregister_notify_func(bar_info_notify_cb, bd); |
1217
70f1d002436f
write changes immediately, the necessary buffering is done on lower
nadvornik
parents:
1193
diff
changeset
|
694 bar_info_write(bd); |
1219 | 695 file_data_register_notify_func(bar_info_notify_cb, bd, NOTIFY_PRIORITY_LOW); |
9 | 696 } |
697 | |
698 void bar_info_close(GtkWidget *bar) | |
699 { | |
700 BarInfoData *bd; | |
701 | |
702 bd = g_object_get_data(G_OBJECT(bar), "bar_info_data"); | |
703 if (!bd) return; | |
704 | |
705 gtk_widget_destroy(bd->vbox); | |
706 } | |
707 | |
708 static void bar_info_destroy(GtkWidget *widget, gpointer data) | |
709 { | |
710 BarInfoData *bd = data; | |
711 | |
1219 | 712 file_data_unregister_notify_func(bar_info_notify_cb, bd); |
9 | 713 bar_list = g_list_remove(bar_list, bd); |
714 | |
138 | 715 file_data_unref(bd->fd); |
9 | 716 |
717 g_free(bd); | |
718 } | |
719 | |
138 | 720 GtkWidget *bar_info_new(FileData *fd, gint metadata_only, GtkWidget *bounding_widget) |
9 | 721 { |
722 BarInfoData *bd; | |
723 GtkWidget *box; | |
724 GtkWidget *hbox; | |
725 GtkWidget *table; | |
726 GtkWidget *scrolled; | |
727 GtkTextBuffer *buffer; | |
728 GtkWidget *label; | |
729 GtkWidget *tbar; | |
730 GtkListStore *store; | |
731 GtkTreeViewColumn *column; | |
732 GtkCellRenderer *renderer; | |
733 | |
734 bd = g_new0(BarInfoData, 1); | |
735 | |
736 bd->list_func = NULL; | |
737 bd->list_data = NULL; | |
738 | |
739 bd->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP); | |
740 g_object_set_data(G_OBJECT(bd->vbox), "bar_info_data", bd); | |
741 g_signal_connect(G_OBJECT(bd->vbox), "destroy", | |
742 G_CALLBACK(bar_info_destroy), bd); | |
743 | |
744 if (!metadata_only) | |
745 { | |
746 hbox = pref_box_new(bd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP); | |
747 | |
748 label = sizer_new(bd->vbox, bounding_widget, SIZER_POS_LEFT); | |
749 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
750 gtk_widget_show(label); | |
751 | |
752 label = gtk_label_new(_("Keywords")); | |
753 pref_label_bold(label, TRUE, FALSE); | |
754 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); | |
755 gtk_widget_show(label); | |
756 } | |
757 | |
758 bd->group_box = pref_box_new(bd->vbox, TRUE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP); | |
759 | |
760 if (!metadata_only) | |
761 { | |
762 GtkWidget *table; | |
763 | |
764 table = pref_table_new(bd->group_box, 2, 2, FALSE, FALSE); | |
765 | |
766 bd->label_file_name = table_add_line(table, 0, 0, _("Filename:"), NULL); | |
767 bd->label_file_time = table_add_line(table, 0, 1, _("File date:"), NULL); | |
768 } | |
769 else | |
770 { | |
771 bd->label_file_name = NULL; | |
772 bd->label_file_time = NULL; | |
773 } | |
774 | |
775 table = gtk_table_new(3, 1, TRUE); | |
776 gtk_table_set_row_spacings(GTK_TABLE(table), PREF_PAD_GAP); | |
777 gtk_box_pack_start(GTK_BOX(bd->group_box), table, TRUE, TRUE, 0); | |
778 gtk_widget_show(table); | |
779 | |
780 /* keyword entry */ | |
781 | |
782 box = gtk_vbox_new(FALSE, 0); | |
783 gtk_table_attach(GTK_TABLE(table), box, 0, 1, 0, 2, | |
784 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); | |
785 gtk_widget_show(box); | |
786 | |
787 label = pref_label_new(box, _("Keywords:")); | |
788 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); | |
789 pref_label_bold(label, TRUE, FALSE); | |
790 | |
791 hbox = pref_box_new(box, TRUE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP); | |
792 | |
793 scrolled = gtk_scrolled_window_new(NULL, NULL); | |
794 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN); | |
795 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), | |
796 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); | |
797 gtk_box_pack_start(GTK_BOX(hbox), scrolled, TRUE, TRUE, 0); | |
798 gtk_widget_show(scrolled); | |
799 | |
800 bd->keyword_view = gtk_text_view_new(); | |
801 gtk_container_add(GTK_CONTAINER(scrolled), bd->keyword_view); | |
802 gtk_widget_show(bd->keyword_view); | |
803 | |
804 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bd->keyword_view)); | |
805 g_signal_connect(G_OBJECT(buffer), "changed", | |
806 G_CALLBACK(bar_info_changed), bd); | |
807 | |
808 scrolled = gtk_scrolled_window_new(NULL, NULL); | |
809 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN); | |
810 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), | |
811 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); | |
812 gtk_box_pack_start(GTK_BOX(hbox), scrolled, TRUE, TRUE, 0); | |
813 gtk_widget_show(scrolled); | |
814 | |
815 store = gtk_list_store_new(2, G_TYPE_BOOLEAN, G_TYPE_STRING); | |
816 bd->keyword_treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); | |
817 g_object_unref(store); | |
818 | |
819 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(bd->keyword_treeview), FALSE); | |
820 | |
821 if (metadata_only) | |
822 { | |
823 gtk_tree_view_set_search_column(GTK_TREE_VIEW(bd->keyword_treeview), KEYWORD_COLUMN_TEXT); | |
824 } | |
825 else | |
826 { | |
827 gtk_tree_view_set_enable_search(GTK_TREE_VIEW(bd->keyword_treeview), FALSE); | |
828 } | |
829 | |
830 column = gtk_tree_view_column_new(); | |
831 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); | |
832 | |
833 renderer = gtk_cell_renderer_toggle_new(); | |
834 gtk_tree_view_column_pack_start(column, renderer, FALSE); | |
835 gtk_tree_view_column_add_attribute(column, renderer, "active", KEYWORD_COLUMN_TOGGLE); | |
836 g_signal_connect(G_OBJECT(renderer), "toggled", | |
837 G_CALLBACK(bar_info_keyword_toggle), bd); | |
838 | |
839 renderer = gtk_cell_renderer_text_new(); | |
840 gtk_tree_view_column_pack_start(column, renderer, TRUE); | |
841 gtk_tree_view_column_add_attribute(column, renderer, "text", KEYWORD_COLUMN_TEXT); | |
842 | |
843 gtk_tree_view_append_column(GTK_TREE_VIEW(bd->keyword_treeview), column); | |
844 | |
845 gtk_container_add(GTK_CONTAINER(scrolled), bd->keyword_treeview); | |
846 gtk_widget_show(bd->keyword_treeview); | |
847 | |
848 /* comment entry */ | |
849 | |
850 box = gtk_vbox_new(FALSE, 0); | |
851 gtk_table_attach(GTK_TABLE(table), box, 0, 1, 2, 3, | |
852 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); | |
853 gtk_widget_show(box); | |
854 | |
855 label = pref_label_new(box, _("Comment:")); | |
856 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); | |
857 pref_label_bold(label, TRUE, FALSE); | |
858 | |
859 scrolled = gtk_scrolled_window_new(NULL, NULL); | |
860 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN); | |
861 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), | |
862 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); | |
863 gtk_box_pack_start(GTK_BOX(box), scrolled, TRUE, TRUE, 0); | |
864 gtk_widget_show(scrolled); | |
865 | |
866 bd->comment_view = gtk_text_view_new(); | |
867 gtk_container_add(GTK_CONTAINER(scrolled), bd->comment_view); | |
868 gtk_widget_show(bd->comment_view); | |
869 | |
870 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bd->comment_view)); | |
871 g_signal_connect(G_OBJECT(buffer), "changed", | |
872 G_CALLBACK(bar_info_changed), bd); | |
873 | |
874 /* toolbar */ | |
875 | |
876 tbar = pref_toolbar_new(bd->group_box, GTK_TOOLBAR_ICONS); | |
877 | |
41
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
878 pref_toolbar_button(tbar, GTK_STOCK_INDEX, NULL, FALSE, |
9 | 879 _("Edit favorite keywords list."), |
880 G_CALLBACK(bar_keyword_edit_cb), bd); | |
881 pref_toolbar_spacer(tbar); | |
595
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
882 bd->button_set_keywords_add = pref_toolbar_button(tbar, GTK_STOCK_ADD, NULL, FALSE, |
9 | 883 _("Add keywords to selected files"), |
595
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
884 G_CALLBACK(bar_info_set_keywords_add), bd); |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
885 bd->button_set_keywords_replace = pref_toolbar_button(tbar, GTK_STOCK_CONVERT, NULL, FALSE, |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
886 _("Add keywords to selected files, replacing existing ones"), |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
887 G_CALLBACK(bar_info_set_keywords_replace), bd); |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
888 bd->button_set_comment_add = pref_toolbar_button(tbar, GTK_STOCK_DND_MULTIPLE, NULL, FALSE, |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
889 _("Add comment to selected files"), |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
890 G_CALLBACK(bar_info_set_comment_add), bd); |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
891 bd->button_set_comment_replace = pref_toolbar_button(tbar, GTK_STOCK_DND, NULL, FALSE, |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
892 _("Add comment to selected files, replacing existing one"), |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
893 G_CALLBACK(bar_info_set_comment_replace), bd); |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
894 |
1217
70f1d002436f
write changes immediately, the necessary buffering is done on lower
nadvornik
parents:
1193
diff
changeset
|
895 #if 0 |
9 | 896 pref_toolbar_spacer(tbar); |
41
6281cc38e5ca
Wed Apr 27 15:17:57 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
897 bd->button_save = pref_toolbar_button(tbar, GTK_STOCK_SAVE, NULL, FALSE, |
9 | 898 _("Save comment now"), |
899 G_CALLBACK(bar_info_save), bd); | |
1217
70f1d002436f
write changes immediately, the necessary buffering is done on lower
nadvornik
parents:
1193
diff
changeset
|
900 #endif |
9 | 901 |
138 | 902 bd->fd = file_data_ref(fd); |
9 | 903 bar_info_update(bd); |
904 | |
905 bar_info_selection(bd->vbox, 0); | |
906 | |
907 bar_list = g_list_append(bar_list, bd); | |
442 | 908 |
1219 | 909 file_data_register_notify_func(bar_info_notify_cb, bd, NOTIFY_PRIORITY_LOW); |
910 | |
9 | 911 return bd->vbox; |
912 } | |
913 | |
914 void bar_info_set_selection_func(GtkWidget *bar, GList *(*list_func)(gpointer data), gpointer data) | |
915 { | |
916 BarInfoData *bd; | |
917 | |
918 bd = g_object_get_data(G_OBJECT(bar), "bar_info_data"); | |
919 if (!bd) return; | |
920 | |
921 bd->list_func = list_func; | |
922 bd->list_data = data; | |
923 } | |
924 | |
925 void bar_info_selection(GtkWidget *bar, gint count) | |
926 { | |
927 BarInfoData *bd; | |
928 gint enable; | |
929 | |
930 bd = g_object_get_data(G_OBJECT(bar), "bar_info_data"); | |
931 if (!bd) return; | |
932 | |
933 enable = (count > 0 && bd->list_func != NULL); | |
934 | |
595
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
935 gtk_widget_set_sensitive(bd->button_set_keywords_add, enable); |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
936 gtk_widget_set_sensitive(bd->button_set_keywords_replace, enable); |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
937 gtk_widget_set_sensitive(bd->button_set_comment_add, enable); |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
938 gtk_widget_set_sensitive(bd->button_set_comment_replace, enable); |
15766932414c
Allow the user to append or replace comments for a group of selected files.
zas_
parents:
594
diff
changeset
|
939 |
9 | 940 } |
1055
1646720364cf
Adding a vim modeline to all files - patch by Klaus Ethgen
nadvornik
parents:
1051
diff
changeset
|
941 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ |