annotate src/metadata.c @ 1686:59c72fd324ce

fixes for a built without Exiv2 don't try to access XMP metadata if not compiled with Exiv2 some metadata options are valid without Exiv2, do not disable them
author nadvornik
date Tue, 30 Jun 2009 20:12:28 +0000
parents 6a97ed4d2ba5
children 9fef1cbc556e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
1 /*
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
2 * Geeqie
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
3 * (C) 2004 John Ellis
1284
8b89e3ff286b Add year 2009 to copyright info everywhere.
zas_
parents: 1255
diff changeset
4 * Copyright (C) 2008 - 2009 The Geeqie Team
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
5 *
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
6 * Author: John Ellis, Laurent Monin
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
7 *
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
8 * This software is released under the GNU General Public License (GNU GPL).
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
9 * Please read the included file COPYING for more information.
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
10 * This software comes with no warranty of any kind, use at your own risk!
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
11 */
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
12
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
13
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
14 #include "main.h"
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
15 #include "metadata.h"
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
16
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
17 #include "cache.h"
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
18 #include "exif.h"
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
19 #include "filedata.h"
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
20 #include "misc.h"
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
21 #include "secure_save.h"
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
22 #include "ui_fileops.h"
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
23 #include "ui_misc.h"
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
24 #include "utilops.h"
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
25 #include "filefilter.h"
1582
2ca277a9845b - handle color profile and write metadata buttons on statusbar by ui_manager
nadvornik
parents: 1568
diff changeset
26 #include "layout_util.h"
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
27 #include "rcfile.h"
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
28
1191
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
29 typedef enum {
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
30 MK_NONE,
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
31 MK_KEYWORDS,
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
32 MK_COMMENT
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
33 } MetadataKey;
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
34
1597
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
35 static const gchar *group_keys[] = { /* tags that will be written to all files in a group, options->metadata.sync_grouped_files */
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
36 "Xmp.dc.title",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
37 "Xmp.photoshop.Urgency",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
38 "Xmp.photoshop.Category",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
39 "Xmp.photoshop.SupplementalCategory",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
40 "Xmp.dc.subject",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
41 "Xmp.iptc.Location",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
42 "Xmp.photoshop.Instruction",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
43 "Xmp.photoshop.DateCreated",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
44 "Xmp.dc.creator",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
45 "Xmp.photoshop.AuthorsPosition",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
46 "Xmp.photoshop.City",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
47 "Xmp.photoshop.State",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
48 "Xmp.iptc.CountryCode",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
49 "Xmp.photoshop.Country",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
50 "Xmp.photoshop.TransmissionReference",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
51 "Xmp.photoshop.Headline",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
52 "Xmp.photoshop.Credit",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
53 "Xmp.photoshop.Source",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
54 "Xmp.dc.rights",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
55 "Xmp.dc.description",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
56 "Xmp.photoshop.CaptionWriter",
e02bf864fcdc extended the list of grouped metadata tags
nadvornik
parents: 1593
diff changeset
57 NULL};
1204
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
58
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
59 static gboolean metadata_write_queue_idle_cb(gpointer data);
1434
b106af9689db More gboolean.
zas_
parents: 1432
diff changeset
60 static gboolean metadata_legacy_write(FileData *fd);
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
61 static void metadata_legacy_delete(FileData *fd, const gchar *except);
1683
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
62 static gboolean metadata_file_read(gchar *path, GList **keywords, gchar **comment);
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
63
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
64
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
65
1204
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
66 /*
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
67 *-------------------------------------------------------------------
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
68 * write queue
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
69 *-------------------------------------------------------------------
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
70 */
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
71
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
72 static GList *metadata_write_queue = NULL;
1523
24a12aa0cb54 Fix up event source ids type: gint -> guint.
zas_
parents: 1509
diff changeset
73 static guint metadata_write_idle_id = 0; /* event source id */
1204
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
74
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
75 static void metadata_write_queue_add(FileData *fd)
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
76 {
1218
46e4fda574dd improved buffering and notifications
nadvornik
parents: 1214
diff changeset
77 if (!g_list_find(metadata_write_queue, fd))
46e4fda574dd improved buffering and notifications
nadvornik
parents: 1214
diff changeset
78 {
46e4fda574dd improved buffering and notifications
nadvornik
parents: 1214
diff changeset
79 metadata_write_queue = g_list_prepend(metadata_write_queue, fd);
46e4fda574dd improved buffering and notifications
nadvornik
parents: 1214
diff changeset
80 file_data_ref(fd);
1240
30e207ac22e4 added a status bar button for writting metadata immediately
nadvornik
parents: 1238
diff changeset
81
1582
2ca277a9845b - handle color profile and write metadata buttons on statusbar by ui_manager
nadvornik
parents: 1568
diff changeset
82 layout_util_status_update_write_all();
1218
46e4fda574dd improved buffering and notifications
nadvornik
parents: 1214
diff changeset
83 }
1204
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
84
1523
24a12aa0cb54 Fix up event source ids type: gint -> guint.
zas_
parents: 1509
diff changeset
85 if (metadata_write_idle_id)
1214
31402ecb2aed write metadata after timeout, image change or dir change
nadvornik
parents: 1211
diff changeset
86 {
31402ecb2aed write metadata after timeout, image change or dir change
nadvornik
parents: 1211
diff changeset
87 g_source_remove(metadata_write_idle_id);
1523
24a12aa0cb54 Fix up event source ids type: gint -> guint.
zas_
parents: 1509
diff changeset
88 metadata_write_idle_id = 0;
1214
31402ecb2aed write metadata after timeout, image change or dir change
nadvornik
parents: 1211
diff changeset
89 }
31402ecb2aed write metadata after timeout, image change or dir change
nadvornik
parents: 1211
diff changeset
90
1244
b2d98b7c26c1 improved metadata preferences
nadvornik
parents: 1243
diff changeset
91 if (options->metadata.confirm_after_timeout)
1214
31402ecb2aed write metadata after timeout, image change or dir change
nadvornik
parents: 1211
diff changeset
92 {
31402ecb2aed write metadata after timeout, image change or dir change
nadvornik
parents: 1211
diff changeset
93 metadata_write_idle_id = g_timeout_add(options->metadata.confirm_timeout * 1000, metadata_write_queue_idle_cb, NULL);
31402ecb2aed write metadata after timeout, image change or dir change
nadvornik
parents: 1211
diff changeset
94 }
1204
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
95 }
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
96
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
97
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
98 gboolean metadata_write_queue_remove(FileData *fd)
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
99 {
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
100 g_hash_table_destroy(fd->modified_xmp);
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
101 fd->modified_xmp = NULL;
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
102
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
103 metadata_write_queue = g_list_remove(metadata_write_queue, fd);
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
104
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
105 file_data_increment_version(fd);
1432
cf4029d10d38 improved notification system
nadvornik
parents: 1429
diff changeset
106 file_data_send_notification(fd, NOTIFY_REREAD);
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
107
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
108 file_data_unref(fd);
1240
30e207ac22e4 added a status bar button for writting metadata immediately
nadvornik
parents: 1238
diff changeset
109
1582
2ca277a9845b - handle color profile and write metadata buttons on statusbar by ui_manager
nadvornik
parents: 1568
diff changeset
110 layout_util_status_update_write_all();
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
111 return TRUE;
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
112 }
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
113
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
114 gboolean metadata_write_queue_remove_list(GList *list)
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
115 {
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
116 GList *work;
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
117 gboolean ret = TRUE;
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
118
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
119 work = list;
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
120 while (work)
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
121 {
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
122 FileData *fd = work->data;
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
123 work = work->next;
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
124 ret = ret && metadata_write_queue_remove(fd);
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
125 }
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
126 return ret;
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
127 }
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
128
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
129
1586
249b539cc952 force the metadata dialog if it was triggered by the menu or the button
nadvornik
parents: 1582
diff changeset
130 gboolean metadata_write_queue_confirm(gboolean force_dialog, FileUtilDoneFunc done_func, gpointer done_data)
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
131 {
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
132 GList *work;
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
133 GList *to_approve = NULL;
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
134
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
135 work = metadata_write_queue;
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
136 while (work)
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
137 {
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
138 FileData *fd = work->data;
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
139 work = work->next;
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
140
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
141 if (fd->change) continue; /* another operation in progress, skip this file for now */
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
142
1225
3e5f52382573 fixed previous change
nadvornik
parents: 1224
diff changeset
143 to_approve = g_list_prepend(to_approve, file_data_ref(fd));
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
144 }
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
145
1586
249b539cc952 force the metadata dialog if it was triggered by the menu or the button
nadvornik
parents: 1582
diff changeset
146 file_util_write_metadata(NULL, to_approve, NULL, force_dialog, done_func, done_data);
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
147
1214
31402ecb2aed write metadata after timeout, image change or dir change
nadvornik
parents: 1211
diff changeset
148 return (metadata_write_queue != NULL);
31402ecb2aed write metadata after timeout, image change or dir change
nadvornik
parents: 1211
diff changeset
149 }
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
150
1214
31402ecb2aed write metadata after timeout, image change or dir change
nadvornik
parents: 1211
diff changeset
151 static gboolean metadata_write_queue_idle_cb(gpointer data)
31402ecb2aed write metadata after timeout, image change or dir change
nadvornik
parents: 1211
diff changeset
152 {
1586
249b539cc952 force the metadata dialog if it was triggered by the menu or the button
nadvornik
parents: 1582
diff changeset
153 metadata_write_queue_confirm(FALSE, NULL, NULL);
1523
24a12aa0cb54 Fix up event source ids type: gint -> guint.
zas_
parents: 1509
diff changeset
154 metadata_write_idle_id = 0;
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
155 return FALSE;
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
156 }
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
157
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
158 gboolean metadata_write_perform(FileData *fd)
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
159 {
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
160 gboolean success;
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
161 ExifData *exif;
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
162
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
163 g_assert(fd->change);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
164
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
165 if (fd->change->dest &&
1228
4d5587c4bf56 fixed writting of legacy metadata
nadvornik
parents: 1225
diff changeset
166 strcmp(extension_from_path(fd->change->dest), GQ_CACHE_EXT_METADATA) == 0)
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
167 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
168 success = metadata_legacy_write(fd);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
169 if (success) metadata_legacy_delete(fd, fd->change->dest);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
170 return success;
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
171 }
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
172
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
173 /* write via exiv2 */
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
174 /* we can either use cached metadata which have fd->modified_xmp already applied
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
175 or read metadata from file and apply fd->modified_xmp
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
176 metadata are read also if the file was modified meanwhile */
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
177 exif = exif_read_fd(fd);
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
178 if (!exif) return FALSE;
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
179
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
180 success = (fd->change->dest) ? exif_write_sidecar(exif, fd->change->dest) : exif_write(exif); /* write modified metadata */
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
181 exif_free_fd(fd, exif);
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
182
1255
71a75a53dde7 do not ignore newly created sidecars
nadvornik
parents: 1244
diff changeset
183 if (fd->change->dest)
71a75a53dde7 do not ignore newly created sidecars
nadvornik
parents: 1244
diff changeset
184 /* this will create a FileData for the sidecar and link it to the main file
71a75a53dde7 do not ignore newly created sidecars
nadvornik
parents: 1244
diff changeset
185 (we can't wait until the sidecar is discovered by directory scanning because
71a75a53dde7 do not ignore newly created sidecars
nadvornik
parents: 1244
diff changeset
186 exif_read_fd is called before that and it would read the main file only and
71a75a53dde7 do not ignore newly created sidecars
nadvornik
parents: 1244
diff changeset
187 store the metadata in the cache)
71a75a53dde7 do not ignore newly created sidecars
nadvornik
parents: 1244
diff changeset
188 FIXME: this does not catch new sidecars created by independent external programs
71a75a53dde7 do not ignore newly created sidecars
nadvornik
parents: 1244
diff changeset
189 */
71a75a53dde7 do not ignore newly created sidecars
nadvornik
parents: 1244
diff changeset
190 file_data_unref(file_data_new_simple(fd->change->dest));
71a75a53dde7 do not ignore newly created sidecars
nadvornik
parents: 1244
diff changeset
191
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
192 if (success) metadata_legacy_delete(fd, fd->change->dest);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
193 return success;
1204
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
194 }
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
195
1240
30e207ac22e4 added a status bar button for writting metadata immediately
nadvornik
parents: 1238
diff changeset
196 gint metadata_queue_length(void)
30e207ac22e4 added a status bar button for writting metadata immediately
nadvornik
parents: 1238
diff changeset
197 {
30e207ac22e4 added a status bar button for writting metadata immediately
nadvornik
parents: 1238
diff changeset
198 return g_list_length(metadata_write_queue);
30e207ac22e4 added a status bar button for writting metadata immediately
nadvornik
parents: 1238
diff changeset
199 }
30e207ac22e4 added a status bar button for writting metadata immediately
nadvornik
parents: 1238
diff changeset
200
1234
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
201 static gboolean metadata_check_key(const gchar *keys[], const gchar *key)
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
202 {
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
203 const gchar **k = keys;
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
204
1243
5106f40597a3 fixed possible segfault
nadvornik
parents: 1241
diff changeset
205 while (*k)
1234
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
206 {
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
207 if (strcmp(key, *k) == 0) return TRUE;
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
208 k++;
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
209 }
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
210 return FALSE;
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
211 }
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
212
1567
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
213 gboolean metadata_write_revert(FileData *fd, const gchar *key)
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
214 {
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
215 if (!fd->modified_xmp) return FALSE;
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
216
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
217 g_hash_table_remove(fd->modified_xmp, key);
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
218
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
219 if (g_hash_table_size(fd->modified_xmp) == 0)
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
220 {
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
221 metadata_write_queue_remove(fd);
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
222 }
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
223 else
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
224 {
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
225 /* reread the metadata to restore the original value */
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
226 file_data_increment_version(fd);
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
227 file_data_send_notification(fd, NOTIFY_REREAD);
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
228 }
1568
678009e94efe fixed return from metadata_write_revert
nadvornik
parents: 1567
diff changeset
229 return TRUE;
1567
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
230 }
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
231
1234
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
232 gboolean metadata_write_list(FileData *fd, const gchar *key, const GList *values)
1203
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
233 {
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
234 if (!fd->modified_xmp)
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
235 {
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
236 fd->modified_xmp = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)string_list_free);
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
237 }
1234
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
238 g_hash_table_insert(fd->modified_xmp, g_strdup(key), string_list_copy((GList *)values));
1203
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
239 if (fd->exif)
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
240 {
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
241 exif_update_metadata(fd->exif, key, values);
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
242 }
1204
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
243 metadata_write_queue_add(fd);
1218
46e4fda574dd improved buffering and notifications
nadvornik
parents: 1214
diff changeset
244 file_data_increment_version(fd);
1432
cf4029d10d38 improved notification system
nadvornik
parents: 1429
diff changeset
245 file_data_send_notification(fd, NOTIFY_METADATA);
1218
46e4fda574dd improved buffering and notifications
nadvornik
parents: 1214
diff changeset
246
1234
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
247 if (options->metadata.sync_grouped_files && metadata_check_key(group_keys, key))
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
248 {
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
249 GList *work = fd->sidecar_files;
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
250
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
251 while (work)
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
252 {
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
253 FileData *sfd = work->data;
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
254 work = work->next;
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
255
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
256 if (filter_file_class(sfd->extension, FORMAT_CLASS_META)) continue;
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
257
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
258 metadata_write_list(sfd, key, values);
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
259 }
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
260 }
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
261
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
262
1203
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
263 return TRUE;
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
264 }
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
265
1234
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
266 gboolean metadata_write_string(FileData *fd, const gchar *key, const char *value)
1203
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
267 {
1234
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
268 GList *list = g_list_append(NULL, g_strdup(value));
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
269 gboolean ret = metadata_write_list(fd, key, list);
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
270 string_list_free(list);
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
271 return ret;
1203
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
272 }
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
273
1567
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
274 gboolean metadata_write_int(FileData *fd, const gchar *key, guint64 value)
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
275 {
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
276 gchar string[50];
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
277
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
278 g_snprintf(string, sizeof(string), "%ld", value);
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
279 return metadata_write_string(fd, key, string);
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
280 }
1203
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
281
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
282 /*
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
283 *-------------------------------------------------------------------
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
284 * keyword / comment read/write
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
285 *-------------------------------------------------------------------
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
286 */
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
287
1683
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
288 static gboolean metadata_file_write(gchar *path, const GList *keywords, const gchar *comment)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
289 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
290 SecureSaveInfo *ssi;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
291
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
292 ssi = secure_open(path);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
293 if (!ssi) return FALSE;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
294
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
295 secure_fprintf(ssi, "#%s comment (%s)\n\n", GQ_APPNAME, VERSION);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
296
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
297 secure_fprintf(ssi, "[keywords]\n");
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
298 while (keywords && secsave_errno == SS_ERR_NONE)
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
299 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
300 const gchar *word = keywords->data;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
301 keywords = keywords->next;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
302
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
303 secure_fprintf(ssi, "%s\n", word);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
304 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
305 secure_fputc(ssi, '\n');
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
306
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
307 secure_fprintf(ssi, "[comment]\n");
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
308 secure_fprintf(ssi, "%s\n", (comment) ? comment : "");
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
309
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
310 secure_fprintf(ssi, "#end\n");
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
311
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
312 return (secure_close(ssi) == 0);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
313 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
314
1434
b106af9689db More gboolean.
zas_
parents: 1432
diff changeset
315 static gboolean metadata_legacy_write(FileData *fd)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
316 {
1434
b106af9689db More gboolean.
zas_
parents: 1432
diff changeset
317 gboolean success = FALSE;
b106af9689db More gboolean.
zas_
parents: 1432
diff changeset
318 gchar *metadata_pathl;
1683
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
319 gpointer keywords;
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
320 gpointer comment_l;
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
321 gboolean have_keywords;
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
322 gboolean have_comment;
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
323 const gchar *comment;
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
324 GList *orig_keywords = NULL;
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
325 gchar *orig_comment = NULL;
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
326
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
327 g_assert(fd->change && fd->change->dest);
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
328
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
329 DEBUG_1("Saving comment: %s", fd->change->dest);
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
330
1683
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
331 if (!fd->modified_xmp) return TRUE;
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
332
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
333 metadata_pathl = path_from_utf8(fd->change->dest);
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
334
1683
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
335 have_keywords = g_hash_table_lookup_extended(fd->modified_xmp, KEYWORD_KEY, NULL, &keywords);
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
336 have_comment = g_hash_table_lookup_extended(fd->modified_xmp, COMMENT_KEY, NULL, &comment_l);
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
337 comment = comment_l ? ((GList *)comment_l)->data : NULL;
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
338
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
339 if (!have_keywords || !have_comment) metadata_file_read(metadata_pathl, &orig_keywords, &orig_comment);
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
340
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
341 success = metadata_file_write(metadata_pathl,
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
342 have_keywords ? (GList *)keywords : orig_keywords,
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
343 have_comment ? comment : orig_comment);
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
344
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
345 g_free(metadata_pathl);
1683
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
346 g_free(orig_comment);
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
347 string_list_free(orig_keywords);
6a97ed4d2ba5 fixed writting to gqview legacy format
nadvornik
parents: 1656
diff changeset
348
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
349 return success;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
350 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
351
1434
b106af9689db More gboolean.
zas_
parents: 1432
diff changeset
352 static gboolean metadata_file_read(gchar *path, GList **keywords, gchar **comment)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
353 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
354 FILE *f;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
355 gchar s_buf[1024];
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
356 MetadataKey key = MK_NONE;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
357 GList *list = NULL;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
358 GString *comment_build = NULL;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
359
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
360 f = fopen(path, "r");
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
361 if (!f) return FALSE;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
362
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
363 while (fgets(s_buf, sizeof(s_buf), f))
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
364 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
365 gchar *ptr = s_buf;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
366
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
367 if (*ptr == '#') continue;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
368 if (*ptr == '[' && key != MK_COMMENT)
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
369 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
370 gchar *keystr = ++ptr;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
371
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
372 key = MK_NONE;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
373 while (*ptr != ']' && *ptr != '\n' && *ptr != '\0') ptr++;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
374
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
375 if (*ptr == ']')
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
376 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
377 *ptr = '\0';
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
378 if (g_ascii_strcasecmp(keystr, "keywords") == 0)
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
379 key = MK_KEYWORDS;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
380 else if (g_ascii_strcasecmp(keystr, "comment") == 0)
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
381 key = MK_COMMENT;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
382 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
383 continue;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
384 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
385
1347
79937bc55f3a Add missing space between switch and first parenthesis.
zas_
parents: 1340
diff changeset
386 switch (key)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
387 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
388 case MK_NONE:
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
389 break;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
390 case MK_KEYWORDS:
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
391 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
392 while (*ptr != '\n' && *ptr != '\0') ptr++;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
393 *ptr = '\0';
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
394 if (strlen(s_buf) > 0)
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
395 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
396 gchar *kw = utf8_validate_or_convert(s_buf);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
397
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
398 list = g_list_prepend(list, kw);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
399 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
400 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
401 break;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
402 case MK_COMMENT:
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
403 if (!comment_build) comment_build = g_string_new("");
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
404 g_string_append(comment_build, s_buf);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
405 break;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
406 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
407 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
408
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
409 fclose(f);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
410
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
411 if (keywords)
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
412 {
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
413 *keywords = g_list_reverse(list);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
414 }
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
415 else
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
416 {
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
417 string_list_free(list);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
418 }
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
419
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
420 if (comment_build)
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
421 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
422 if (comment)
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
423 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
424 gint len;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
425 gchar *ptr = comment_build->str;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
426
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
427 /* strip leading and trailing newlines */
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
428 while (*ptr == '\n') ptr++;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
429 len = strlen(ptr);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
430 while (len > 0 && ptr[len - 1] == '\n') len--;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
431 if (ptr[len] == '\n') len++; /* keep the last one */
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
432 if (len > 0)
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
433 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
434 gchar *text = g_strndup(ptr, len);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
435
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
436 *comment = utf8_validate_or_convert(text);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
437 g_free(text);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
438 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
439 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
440 g_string_free(comment_build, TRUE);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
441 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
442
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
443 return TRUE;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
444 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
445
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
446 static void metadata_legacy_delete(FileData *fd, const gchar *except)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
447 {
1191
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
448 gchar *metadata_path;
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
449 gchar *metadata_pathl;
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
450 if (!fd) return;
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
451
1191
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
452 metadata_path = cache_find_location(CACHE_TYPE_METADATA, fd->path);
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
453 if (metadata_path && (!except || strcmp(metadata_path, except) != 0))
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
454 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
455 metadata_pathl = path_from_utf8(metadata_path);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
456 unlink(metadata_pathl);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
457 g_free(metadata_pathl);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
458 g_free(metadata_path);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
459 }
1686
59c72fd324ce fixes for a built without Exiv2
nadvornik
parents: 1683
diff changeset
460
59c72fd324ce fixes for a built without Exiv2
nadvornik
parents: 1683
diff changeset
461 #ifdef HAVE_EXIV2
59c72fd324ce fixes for a built without Exiv2
nadvornik
parents: 1683
diff changeset
462 /* without exiv2: do not delete xmp metadata because we are not able to convert it,
59c72fd324ce fixes for a built without Exiv2
nadvornik
parents: 1683
diff changeset
463 just ignore it */
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
464 metadata_path = cache_find_location(CACHE_TYPE_XMP_METADATA, fd->path);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
465 if (metadata_path && (!except || strcmp(metadata_path, except) != 0))
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
466 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
467 metadata_pathl = path_from_utf8(metadata_path);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
468 unlink(metadata_pathl);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
469 g_free(metadata_pathl);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
470 g_free(metadata_path);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
471 }
1686
59c72fd324ce fixes for a built without Exiv2
nadvornik
parents: 1683
diff changeset
472 #endif
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
473 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
474
1434
b106af9689db More gboolean.
zas_
parents: 1432
diff changeset
475 static gboolean metadata_legacy_read(FileData *fd, GList **keywords, gchar **comment)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
476 {
1191
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
477 gchar *metadata_path;
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
478 gchar *metadata_pathl;
1434
b106af9689db More gboolean.
zas_
parents: 1432
diff changeset
479 gboolean success = FALSE;
b106af9689db More gboolean.
zas_
parents: 1432
diff changeset
480
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
481 if (!fd) return FALSE;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
482
1191
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
483 metadata_path = cache_find_location(CACHE_TYPE_METADATA, fd->path);
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
484 if (!metadata_path) return FALSE;
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
485
1191
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
486 metadata_pathl = path_from_utf8(metadata_path);
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
487
1191
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
488 success = metadata_file_read(metadata_pathl, keywords, comment);
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
489
1191
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
490 g_free(metadata_pathl);
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
491 g_free(metadata_path);
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
492
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
493 return success;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
494 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
495
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
496 static GList *remove_duplicate_strings_from_list(GList *list)
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
497 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
498 GList *work = list;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
499 GHashTable *hashtable = g_hash_table_new(g_str_hash, g_str_equal);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
500 GList *newlist = NULL;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
501
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
502 while (work)
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
503 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
504 gchar *key = work->data;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
505
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
506 if (g_hash_table_lookup(hashtable, key) == NULL)
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
507 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
508 g_hash_table_insert(hashtable, (gpointer) key, GINT_TO_POINTER(1));
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
509 newlist = g_list_prepend(newlist, key);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
510 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
511 work = work->next;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
512 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
513
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
514 g_hash_table_destroy(hashtable);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
515 g_list_free(list);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
516
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
517 return g_list_reverse(newlist);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
518 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
519
1288
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
520 GList *metadata_read_list(FileData *fd, const gchar *key, MetadataFormat format)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
521 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
522 ExifData *exif;
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
523 GList *list = NULL;
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
524 if (!fd) return NULL;
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
525
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
526 /* unwritten data overide everything */
1288
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
527 if (fd->modified_xmp && format == METADATA_PLAIN)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
528 {
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
529 list = g_hash_table_lookup(fd->modified_xmp, key);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
530 if (list) return string_list_copy(list);
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
531 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
532
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
533 /*
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
534 Legacy metadata file is the primary source if it exists.
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
535 Merging the lists does not make much sense, because the existence of
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
536 legacy metadata file indicates that the other metadata sources are not
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
537 writable and thus it would not be possible to delete the keywords
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
538 that comes from the image file.
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
539 */
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
540 if (strcmp(key, KEYWORD_KEY) == 0)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
541 {
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
542 if (metadata_legacy_read(fd, &list, NULL)) return list;
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
543 }
1504
1e2737565cb7 Cleanup.
zas_
parents: 1487
diff changeset
544 else if (strcmp(key, COMMENT_KEY) == 0)
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
545 {
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
546 gchar *comment = NULL;
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
547 if (metadata_legacy_read(fd, NULL, &comment)) return g_list_append(NULL, comment);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
548 }
1504
1e2737565cb7 Cleanup.
zas_
parents: 1487
diff changeset
549 else if (strncmp(key, "file.", 5) == 0)
1483
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1465
diff changeset
550 {
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1465
diff changeset
551 return g_list_append(NULL, metadata_file_info(fd, key, format));
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1465
diff changeset
552 }
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1465
diff changeset
553
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
554 exif = exif_read_fd(fd); /* this is cached, thus inexpensive */
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
555 if (!exif) return NULL;
1288
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
556 list = exif_get_metadata(exif, key, format);
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
557 exif_free_fd(fd, exif);
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
558 return list;
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
559 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
560
1288
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
561 gchar *metadata_read_string(FileData *fd, const gchar *key, MetadataFormat format)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
562 {
1288
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
563 GList *string_list = metadata_read_list(fd, key, format);
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
564 if (string_list)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
565 {
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
566 gchar *str = string_list->data;
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
567 string_list->data = NULL;
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
568 string_list_free(string_list);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
569 return str;
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
570 }
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
571 return NULL;
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
572 }
1288
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
573
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
574 guint64 metadata_read_int(FileData *fd, const gchar *key, guint64 fallback)
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
575 {
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
576 guint64 ret;
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
577 gchar *endptr;
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
578 gchar *string = metadata_read_string(fd, key, METADATA_PLAIN);
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
579 if (!string) return fallback;
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
580
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
581 ret = g_ascii_strtoull(string, &endptr, 10);
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
582 if (string == endptr) ret = fallback;
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
583 g_free(string);
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
584 return ret;
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
585 }
1509
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
586
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
587 gdouble metadata_read_GPS_coord(FileData *fd, const gchar *key, gdouble fallback)
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
588 {
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
589 gdouble coord;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
590 gchar *endptr;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
591 gdouble deg, min, sec;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
592 gboolean ok = FALSE;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
593 gchar *string = metadata_read_string(fd, key, METADATA_PLAIN);
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
594 if (!string) return fallback;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
595
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
596 deg = g_ascii_strtod(string, &endptr);
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
597 if (*endptr == ',')
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
598 {
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
599 min = g_ascii_strtod(endptr + 1, &endptr);
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
600 if (*endptr == ',')
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
601 sec = g_ascii_strtod(endptr + 1, &endptr);
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
602 else
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
603 sec = 0.0;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
604
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
605
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
606 if (*endptr == 'S' || *endptr == 'W' || *endptr == 'N' || *endptr == 'E')
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
607 {
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
608 coord = deg + min /60.0 + sec / 3600.0;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
609 ok = TRUE;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
610 if (*endptr == 'S' || *endptr == 'W') coord = -coord;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
611 }
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
612 }
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
613
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
614 if (!ok)
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
615 {
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
616 coord = fallback;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
617 log_printf("unable to parse GPS coordinate '%s'\n", string);
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
618 }
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
619
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
620 g_free(string);
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
621 return coord;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
622 }
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
623
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
624 gboolean metadata_append_string(FileData *fd, const gchar *key, const char *value)
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
625 {
1288
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
626 gchar *str = metadata_read_string(fd, key, METADATA_PLAIN);
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
627
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
628 if (!str)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
629 {
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
630 return metadata_write_string(fd, key, value);
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
631 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
632 else
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
633 {
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
634 gchar *new_string = g_strconcat(str, value, NULL);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
635 gboolean ret = metadata_write_string(fd, key, new_string);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
636 g_free(str);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
637 g_free(new_string);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
638 return ret;
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
639 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
640 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
641
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
642 gboolean metadata_append_list(FileData *fd, const gchar *key, const GList *values)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
643 {
1288
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
644 GList *list = metadata_read_list(fd, key, METADATA_PLAIN);
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
645
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
646 if (!list)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
647 {
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
648 return metadata_write_list(fd, key, values);
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
649 }
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
650 else
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
651 {
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
652 gboolean ret;
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
653 list = g_list_concat(list, string_list_copy(values));
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
654 list = remove_duplicate_strings_from_list(list);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
655
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
656 ret = metadata_write_list(fd, key, list);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
657 string_list_free(list);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
658 return ret;
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
659 }
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
660 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
661
1340
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
662 gchar *find_string_in_list_utf8nocase(GList *list, const gchar *string)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
663 {
1340
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
664 gchar *string_casefold = g_utf8_casefold(string, -1);
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
665
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
666 while (list)
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
667 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
668 gchar *haystack = list->data;
1340
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
669
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
670 if (haystack)
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
671 {
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
672 gboolean equal;
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
673 gchar *haystack_casefold = g_utf8_casefold(haystack, -1);
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
674
1340
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
675 equal = (strcmp(haystack_casefold, string_casefold) == 0);
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
676 g_free(haystack_casefold);
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
677
1340
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
678 if (equal)
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
679 {
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
680 g_free(string_casefold);
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
681 return haystack;
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
682 }
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
683 }
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
684
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
685 list = list->next;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
686 }
1340
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
687
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
688 g_free(string_casefold);
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
689 return NULL;
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
690 }
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
691
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
692
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
693 #define KEYWORDS_SEPARATOR(c) ((c) == ',' || (c) == ';' || (c) == '\n' || (c) == '\r' || (c) == '\b')
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
694
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
695 GList *string_to_keywords_list(const gchar *text)
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
696 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
697 GList *list = NULL;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
698 const gchar *ptr = text;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
699
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
700 while (*ptr != '\0')
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
701 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
702 const gchar *begin;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
703 gint l = 0;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
704
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
705 while (KEYWORDS_SEPARATOR(*ptr)) ptr++;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
706 begin = ptr;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
707 while (*ptr != '\0' && !KEYWORDS_SEPARATOR(*ptr))
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
708 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
709 ptr++;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
710 l++;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
711 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
712
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
713 /* trim starting and ending whitespaces */
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
714 while (l > 0 && g_ascii_isspace(*begin)) begin++, l--;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
715 while (l > 0 && g_ascii_isspace(begin[l-1])) l--;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
716
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
717 if (l > 0)
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
718 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
719 gchar *keyword = g_strndup(begin, l);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
720
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
721 /* only add if not already in the list */
1340
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
722 if (!find_string_in_list_utf8nocase(list, keyword))
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
723 list = g_list_append(list, keyword);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
724 else
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
725 g_free(keyword);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
726 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
727 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
728
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
729 return list;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
730 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
731
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
732 /*
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
733 * keywords to marks
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
734 */
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
735
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
736
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
737 gboolean meta_data_get_keyword_mark(FileData *fd, gint n, gpointer data)
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
738 {
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
739 /* FIXME: do not use global keyword_tree */
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
740 GList *path = data;
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
741 GList *keywords;
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
742 gboolean found = FALSE;
1288
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
743 keywords = metadata_read_list(fd, KEYWORD_KEY, METADATA_PLAIN);
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
744 if (keywords)
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
745 {
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
746 GtkTreeIter iter;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
747 if (keyword_tree_get_iter(GTK_TREE_MODEL(keyword_tree), &iter, path) &&
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
748 keyword_tree_is_set(GTK_TREE_MODEL(keyword_tree), &iter, keywords))
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
749 found = TRUE;
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
750
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
751 }
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
752 return found;
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
753 }
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
754
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
755 gboolean meta_data_set_keyword_mark(FileData *fd, gint n, gboolean value, gpointer data)
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
756 {
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
757 GList *path = data;
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
758 GList *keywords = NULL;
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
759 GtkTreeIter iter;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
760
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
761 if (!keyword_tree_get_iter(GTK_TREE_MODEL(keyword_tree), &iter, path)) return FALSE;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
762
1288
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
763 keywords = metadata_read_list(fd, KEYWORD_KEY, METADATA_PLAIN);
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
764
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
765 if (!!keyword_tree_is_set(GTK_TREE_MODEL(keyword_tree), &iter, keywords) != !!value)
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
766 {
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
767 if (value)
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
768 {
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
769 keyword_tree_set(GTK_TREE_MODEL(keyword_tree), &iter, &keywords);
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
770 }
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
771 else
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
772 {
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
773 keyword_tree_reset(GTK_TREE_MODEL(keyword_tree), &iter, &keywords);
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
774 }
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
775 metadata_write_list(fd, KEYWORD_KEY, keywords);
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
776 }
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
777
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
778 string_list_free(keywords);
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
779 return TRUE;
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
780 }
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
781
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
782
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
783
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
784 void meta_data_connect_mark_with_keyword(GtkTreeModel *keyword_tree, GtkTreeIter *kw_iter, gint mark)
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
785 {
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
786
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
787 FileDataGetMarkFunc get_mark_func;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
788 FileDataSetMarkFunc set_mark_func;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
789 gpointer mark_func_data;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
790
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
791 gint i;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
792
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
793 for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
794 {
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
795 file_data_get_registered_mark_func(i, &get_mark_func, &set_mark_func, &mark_func_data);
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
796 if (get_mark_func == meta_data_get_keyword_mark)
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
797 {
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
798 GtkTreeIter old_kw_iter;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
799 GList *old_path = mark_func_data;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
800
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
801 if (keyword_tree_get_iter(keyword_tree, &old_kw_iter, old_path) &&
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
802 (i == mark || /* release any previous connection of given mark */
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
803 keyword_compare(keyword_tree, &old_kw_iter, kw_iter) == 0)) /* or given keyword */
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
804 {
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
805 file_data_register_mark_func(i, NULL, NULL, NULL, NULL);
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
806 gtk_tree_store_set(GTK_TREE_STORE(keyword_tree), &old_kw_iter, KEYWORD_COLUMN_MARK, "", -1);
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
807 }
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
808 }
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
809 }
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
810
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
811
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
812 if (mark >= 0 && mark < FILEDATA_MARKS_SIZE)
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
813 {
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
814 GList *path;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
815 gchar *mark_str;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
816 path = keyword_tree_get_path(keyword_tree, kw_iter);
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
817 file_data_register_mark_func(mark, meta_data_get_keyword_mark, meta_data_set_keyword_mark, path, (GDestroyNotify)string_list_free);
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
818
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
819 mark_str = g_strdup_printf("%d", mark + 1);
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
820 gtk_tree_store_set(GTK_TREE_STORE(keyword_tree), kw_iter, KEYWORD_COLUMN_MARK, mark_str, -1);
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
821 g_free(mark_str);
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
822 }
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
823 }
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
824
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
825
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
826 /*
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
827 *-------------------------------------------------------------------
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
828 * keyword tree
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
829 *-------------------------------------------------------------------
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
830 */
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
831
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
832
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
833
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
834 GtkTreeStore *keyword_tree;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
835
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
836 gchar *keyword_get_name(GtkTreeModel *keyword_tree, GtkTreeIter *iter)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
837 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
838 gchar *name;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
839 gtk_tree_model_get(keyword_tree, iter, KEYWORD_COLUMN_NAME, &name, -1);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
840 return name;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
841 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
842
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
843 gchar *keyword_get_casefold(GtkTreeModel *keyword_tree, GtkTreeIter *iter)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
844 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
845 gchar *casefold;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
846 gtk_tree_model_get(keyword_tree, iter, KEYWORD_COLUMN_CASEFOLD, &casefold, -1);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
847 return casefold;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
848 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
849
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
850 gboolean keyword_get_is_keyword(GtkTreeModel *keyword_tree, GtkTreeIter *iter)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
851 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
852 gboolean is_keyword;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
853 gtk_tree_model_get(keyword_tree, iter, KEYWORD_COLUMN_IS_KEYWORD, &is_keyword, -1);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
854 return is_keyword;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
855 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
856
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
857 void keyword_set(GtkTreeStore *keyword_tree, GtkTreeIter *iter, const gchar *name, gboolean is_keyword)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
858 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
859 gchar *casefold = g_utf8_casefold(name, -1);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
860 gtk_tree_store_set(keyword_tree, iter, KEYWORD_COLUMN_MARK, "",
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
861 KEYWORD_COLUMN_NAME, name,
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
862 KEYWORD_COLUMN_CASEFOLD, casefold,
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
863 KEYWORD_COLUMN_IS_KEYWORD, is_keyword, -1);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
864 g_free(casefold);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
865 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
866
1396
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
867 gboolean keyword_compare(GtkTreeModel *keyword_tree, GtkTreeIter *a, GtkTreeIter *b)
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
868 {
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
869 GtkTreePath *pa = gtk_tree_model_get_path(keyword_tree, a);
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
870 GtkTreePath *pb = gtk_tree_model_get_path(keyword_tree, b);
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
871 gint ret = gtk_tree_path_compare(pa, pb);
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
872 gtk_tree_path_free(pa);
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
873 gtk_tree_path_free(pb);
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
874 return ret;
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
875 }
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
876
1429
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
877 gboolean keyword_same_parent(GtkTreeModel *keyword_tree, GtkTreeIter *a, GtkTreeIter *b)
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
878 {
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
879 GtkTreeIter parent_a;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
880 GtkTreeIter parent_b;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
881
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
882 gboolean valid_pa = gtk_tree_model_iter_parent(keyword_tree, &parent_a, a);
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
883 gboolean valid_pb = gtk_tree_model_iter_parent(keyword_tree, &parent_b, b);
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
884
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
885 if (valid_pa && valid_pb)
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
886 {
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
887 return keyword_compare(keyword_tree, &parent_a, &parent_b) == 0;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
888 }
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
889 else
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
890 {
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
891 return (!valid_pa && !valid_pb); /* both are toplevel */
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
892 }
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
893 }
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
894
1465
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
895 gboolean keyword_exists(GtkTreeModel *keyword_tree, GtkTreeIter *parent_ptr, GtkTreeIter *sibling, const gchar *name, gboolean exclude_sibling, GtkTreeIter *result)
1429
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
896 {
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
897 GtkTreeIter parent;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
898 GtkTreeIter iter;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
899 gboolean toplevel = FALSE;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
900 gboolean ret;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
901 gchar *casefold;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
902
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
903 if (parent_ptr)
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
904 {
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
905 parent = *parent_ptr;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
906 }
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
907 else if (sibling)
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
908 {
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
909 toplevel = !gtk_tree_model_iter_parent(keyword_tree, &parent, sibling);
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
910 }
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
911 else
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
912 {
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
913 toplevel = TRUE;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
914 }
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
915
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
916 if (!gtk_tree_model_iter_children(GTK_TREE_MODEL(keyword_tree), &iter, toplevel ? NULL : &parent)) return FALSE;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
917
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
918 casefold = g_utf8_casefold(name, -1);
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
919 ret = FALSE;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
920
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
921 while (TRUE)
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
922 {
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
923 if (!(exclude_sibling && sibling && keyword_compare(keyword_tree, &iter, sibling) == 0))
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
924 {
1590
1a5a3b7ca2cd use "keywords" instead of "tags" in option name, it is more consistent
nadvornik
parents: 1586
diff changeset
925 if (options->metadata.keywords_case_sensitive)
1540
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
926 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
927 gchar *iter_name = keyword_get_name(keyword_tree, &iter);
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
928 ret = strcmp(name, iter_name) == 0;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
929 g_free(iter_name);
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
930 }
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
931 else
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
932 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
933 gchar *iter_casefold = keyword_get_casefold(keyword_tree, &iter);
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
934 ret = strcmp(casefold, iter_casefold) == 0;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
935 g_free(iter_casefold);
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
936 } // if (options->metadata.tags_cas...
1429
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
937 }
1465
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
938 if (ret)
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
939 {
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
940 if (result) *result = iter;
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
941 break;
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
942 }
1429
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
943 if (!gtk_tree_model_iter_next(keyword_tree, &iter)) break;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
944 }
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
945 g_free(casefold);
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
946 return ret;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
947 }
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
948
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
949
1392
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
950 void keyword_copy(GtkTreeStore *keyword_tree, GtkTreeIter *to, GtkTreeIter *from)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
951 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
952
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
953 gchar *mark, *name, *casefold;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
954 gboolean is_keyword;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
955
1428
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
956 /* do not copy KEYWORD_COLUMN_HIDE_IN, it fully shows the new subtree */
1392
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
957 gtk_tree_model_get(GTK_TREE_MODEL(keyword_tree), from, KEYWORD_COLUMN_MARK, &mark,
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
958 KEYWORD_COLUMN_NAME, &name,
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
959 KEYWORD_COLUMN_CASEFOLD, &casefold,
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
960 KEYWORD_COLUMN_IS_KEYWORD, &is_keyword, -1);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
961
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
962 gtk_tree_store_set(keyword_tree, to, KEYWORD_COLUMN_MARK, mark,
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
963 KEYWORD_COLUMN_NAME, name,
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
964 KEYWORD_COLUMN_CASEFOLD, casefold,
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
965 KEYWORD_COLUMN_IS_KEYWORD, is_keyword, -1);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
966 g_free(mark);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
967 g_free(name);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
968 g_free(casefold);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
969 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
970
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
971 void keyword_copy_recursive(GtkTreeStore *keyword_tree, GtkTreeIter *to, GtkTreeIter *from)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
972 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
973 GtkTreeIter from_child;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
974
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
975 keyword_copy(keyword_tree, to, from);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
976
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
977 if (!gtk_tree_model_iter_children(GTK_TREE_MODEL(keyword_tree), &from_child, from)) return;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
978
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
979 while (TRUE)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
980 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
981 GtkTreeIter to_child;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
982 gtk_tree_store_append(keyword_tree, &to_child, to);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
983 keyword_copy_recursive(keyword_tree, &to_child, &from_child);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
984 if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(keyword_tree), &from_child)) return;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
985 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
986 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
987
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
988 void keyword_move_recursive(GtkTreeStore *keyword_tree, GtkTreeIter *to, GtkTreeIter *from)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
989 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
990 keyword_copy_recursive(keyword_tree, to, from);
1428
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
991 keyword_delete(keyword_tree, from);
1392
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
992 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
993
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
994 GList *keyword_tree_get_path(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
995 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
996 GList *path = NULL;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
997 GtkTreeIter iter = *iter_ptr;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
998
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
999 while (TRUE)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1000 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1001 GtkTreeIter parent;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1002 path = g_list_prepend(path, keyword_get_name(keyword_tree, &iter));
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1003 if (!gtk_tree_model_iter_parent(keyword_tree, &parent, &iter)) break;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1004 iter = parent;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1005 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1006 return path;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1007 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1008
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1009 gboolean keyword_tree_get_iter(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr, GList *path)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1010 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1011 GtkTreeIter iter;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1012
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1013 if (!gtk_tree_model_get_iter_first(keyword_tree, &iter)) return FALSE;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1014
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1015 while (TRUE)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1016 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1017 GtkTreeIter children;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1018 while (TRUE)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1019 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1020 gchar *name = keyword_get_name(keyword_tree, &iter);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1021 if (strcmp(name, path->data) == 0) break;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1022 g_free(name);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1023 if (!gtk_tree_model_iter_next(keyword_tree, &iter)) return FALSE;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1024 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1025 path = path->next;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1026 if (!path)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1027 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1028 *iter_ptr = iter;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1029 return TRUE;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1030 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1031
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1032 if (!gtk_tree_model_iter_children(keyword_tree, &children, &iter)) return FALSE;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1033 iter = children;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1034 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1035 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1036
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1037
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1038 static gboolean keyword_tree_is_set_casefold(GtkTreeModel *keyword_tree, GtkTreeIter iter, GList *casefold_list)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1039 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1040 if (!casefold_list) return FALSE;
1456
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1041
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1042 if (!keyword_get_is_keyword(keyword_tree, &iter))
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1043 {
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1044 /* for the purpose of expanding and hiding, a helper is set if it has any children set */
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1045 GtkTreeIter child;
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1046 if (!gtk_tree_model_iter_children(keyword_tree, &child, &iter))
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1047 return FALSE; /* this should happen only on empty helpers */
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1048
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1049 while (TRUE)
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1050 {
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1051 if (keyword_tree_is_set_casefold(keyword_tree, child, casefold_list)) return TRUE;
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1052 if (!gtk_tree_model_iter_next(keyword_tree, &child)) return FALSE;
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1053 }
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1054 }
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1055
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1056 while (TRUE)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1057 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1058 GtkTreeIter parent;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1059
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1060 if (keyword_get_is_keyword(keyword_tree, &iter))
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1061 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1062 GList *work = casefold_list;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1063 gboolean found = FALSE;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1064 gchar *iter_casefold = keyword_get_casefold(keyword_tree, &iter);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1065 while (work)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1066 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1067 const gchar *casefold = work->data;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1068 work = work->next;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1069
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1070 if (strcmp(iter_casefold, casefold) == 0)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1071 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1072 found = TRUE;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1073 break;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1074 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1075 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1076 g_free(iter_casefold);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1077 if (!found) return FALSE;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1078 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1079
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1080 if (!gtk_tree_model_iter_parent(keyword_tree, &parent, &iter)) return TRUE;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1081 iter = parent;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1082 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1083 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1084
1540
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1085 static gboolean keyword_tree_is_set_casefull(GtkTreeModel *keyword_tree, GtkTreeIter iter, GList *kw_list)
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1086 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1087 if (!kw_list) return FALSE;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1088
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1089 if (!keyword_get_is_keyword(keyword_tree, &iter))
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1090 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1091 /* for the purpose of expanding and hiding, a helper is set if it has any children set */
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1092 GtkTreeIter child;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1093 if (!gtk_tree_model_iter_children(keyword_tree, &child, &iter))
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1094 return FALSE; /* this should happen only on empty helpers */
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1095
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1096 while (TRUE)
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1097 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1098 if (keyword_tree_is_set_casefull(keyword_tree, child, kw_list)) return TRUE;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1099 if (!gtk_tree_model_iter_next(keyword_tree, &child)) return FALSE;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1100 }
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1101 }
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1102
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1103 while (TRUE)
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1104 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1105 GtkTreeIter parent;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1106
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1107 if (keyword_get_is_keyword(keyword_tree, &iter))
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1108 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1109 GList *work = kw_list;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1110 gboolean found = FALSE;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1111 gchar *iter_name = keyword_get_name(keyword_tree, &iter);
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1112 while (work)
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1113 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1114 const gchar *name = work->data;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1115 work = work->next;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1116
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1117 if (strcmp(iter_name, name) == 0)
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1118 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1119 found = TRUE;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1120 break;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1121 }
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1122 }
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1123 g_free(iter_name);
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1124 if (!found) return FALSE;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1125 }
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1126
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1127 if (!gtk_tree_model_iter_parent(keyword_tree, &parent, &iter)) return TRUE;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1128 iter = parent;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1129 }
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1130 }
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1131
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1132 gboolean keyword_tree_is_set(GtkTreeModel *keyword_tree, GtkTreeIter *iter, GList *kw_list)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1133 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1134 gboolean ret;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1135 GList *casefold_list = NULL;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1136 GList *work;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1137
1590
1a5a3b7ca2cd use "keywords" instead of "tags" in option name, it is more consistent
nadvornik
parents: 1586
diff changeset
1138 if (options->metadata.keywords_case_sensitive)
1540
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1139 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1140 ret = keyword_tree_is_set_casefull(keyword_tree, *iter, kw_list);
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1141 }
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1142 else
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1143 {
1540
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1144 work = kw_list;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1145 while (work)
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1146 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1147 const gchar *kw = work->data;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1148 work = work->next;
1428
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1149
1540
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1150 casefold_list = g_list_prepend(casefold_list, g_utf8_casefold(kw, -1));
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1151 }
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1152
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1153 ret = keyword_tree_is_set_casefold(keyword_tree, *iter, casefold_list);
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1154
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1155 string_list_free(casefold_list);
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1156 }
1540
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1157
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1158 return ret;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1159 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1160
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1161 void keyword_tree_set(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr, GList **kw_list)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1162 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1163 GtkTreeIter iter = *iter_ptr;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1164 while (TRUE)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1165 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1166 GtkTreeIter parent;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1167
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1168 if (keyword_get_is_keyword(keyword_tree, &iter))
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1169 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1170 gchar *name = keyword_get_name(keyword_tree, &iter);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1171 if (!find_string_in_list_utf8nocase(*kw_list, name))
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1172 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1173 *kw_list = g_list_append(*kw_list, name);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1174 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1175 else
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1176 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1177 g_free(name);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1178 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1179 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1180
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1181 if (!gtk_tree_model_iter_parent(keyword_tree, &parent, &iter)) return;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1182 iter = parent;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1183 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1184 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1185
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1186 static void keyword_tree_reset1(GtkTreeModel *keyword_tree, GtkTreeIter *iter, GList **kw_list)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1187 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1188 gchar *found;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1189 gchar *name;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1190 if (!keyword_get_is_keyword(keyword_tree, iter)) return;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1191
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1192 name = keyword_get_name(keyword_tree, iter);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1193 found = find_string_in_list_utf8nocase(*kw_list, name);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1194
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1195 if (found)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1196 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1197 *kw_list = g_list_remove(*kw_list, found);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1198 g_free(found);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1199 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1200 g_free(name);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1201 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1202
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1203 static void keyword_tree_reset_recursive(GtkTreeModel *keyword_tree, GtkTreeIter *iter, GList **kw_list)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1204 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1205 GtkTreeIter child;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1206 keyword_tree_reset1(keyword_tree, iter, kw_list);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1207
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1208 if (!gtk_tree_model_iter_children(keyword_tree, &child, iter)) return;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1209
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1210 while (TRUE)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1211 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1212 keyword_tree_reset_recursive(keyword_tree, &child, kw_list);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1213 if (!gtk_tree_model_iter_next(keyword_tree, &child)) return;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1214 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1215 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1216
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1217 static gboolean keyword_tree_check_empty_children(GtkTreeModel *keyword_tree, GtkTreeIter *parent, GList *kw_list)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1218 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1219 GtkTreeIter iter;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1220
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1221 if (!gtk_tree_model_iter_children(keyword_tree, &iter, parent))
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1222 return TRUE; /* this should happen only on empty helpers */
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1223
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1224 while (TRUE)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1225 {
1457
5c0ecb2ebbc5 simplified code
nadvornik
parents: 1456
diff changeset
1226 if (keyword_tree_is_set(keyword_tree, &iter, kw_list)) return FALSE;
5c0ecb2ebbc5 simplified code
nadvornik
parents: 1456
diff changeset
1227 if (!gtk_tree_model_iter_next(keyword_tree, &iter)) return TRUE;
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1228 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1229 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1230
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1231 void keyword_tree_reset(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr, GList **kw_list)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1232 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1233 GtkTreeIter iter = *iter_ptr;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1234 GtkTreeIter parent;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1235 keyword_tree_reset_recursive(keyword_tree, &iter, kw_list);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1236
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1237 if (!gtk_tree_model_iter_parent(keyword_tree, &parent, &iter)) return;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1238 iter = parent;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1239
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1240 while (keyword_tree_check_empty_children(keyword_tree, &iter, *kw_list))
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1241 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1242 GtkTreeIter parent;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1243 keyword_tree_reset1(keyword_tree, &iter, kw_list);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1244 if (!gtk_tree_model_iter_parent(keyword_tree, &parent, &iter)) return;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1245 iter = parent;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1246 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1247 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1248
1414
6ce1f7171d48 added a popup menu in keyword tree
nadvornik
parents: 1404
diff changeset
1249 void keyword_delete(GtkTreeStore *keyword_tree, GtkTreeIter *iter_ptr)
6ce1f7171d48 added a popup menu in keyword tree
nadvornik
parents: 1404
diff changeset
1250 {
1428
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1251 GList *list;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1252 GtkTreeIter child;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1253 while (gtk_tree_model_iter_children(GTK_TREE_MODEL(keyword_tree), &child, iter_ptr))
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1254 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1255 keyword_delete(keyword_tree, &child);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1256 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1257
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1258 meta_data_connect_mark_with_keyword(GTK_TREE_MODEL(keyword_tree), iter_ptr, -1);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1259
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1260 gtk_tree_model_get(GTK_TREE_MODEL(keyword_tree), iter_ptr, KEYWORD_COLUMN_HIDE_IN, &list, -1);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1261 g_list_free(list);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1262
1414
6ce1f7171d48 added a popup menu in keyword tree
nadvornik
parents: 1404
diff changeset
1263 gtk_tree_store_remove(keyword_tree, iter_ptr);
6ce1f7171d48 added a popup menu in keyword tree
nadvornik
parents: 1404
diff changeset
1264 }
6ce1f7171d48 added a popup menu in keyword tree
nadvornik
parents: 1404
diff changeset
1265
6ce1f7171d48 added a popup menu in keyword tree
nadvornik
parents: 1404
diff changeset
1266
1428
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1267 void keyword_hide_in(GtkTreeStore *keyword_tree, GtkTreeIter *iter, gpointer id)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1268 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1269 GList *list;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1270 gtk_tree_model_get(GTK_TREE_MODEL(keyword_tree), iter, KEYWORD_COLUMN_HIDE_IN, &list, -1);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1271 if (!g_list_find(list, id))
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1272 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1273 list = g_list_prepend(list, id);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1274 gtk_tree_store_set(keyword_tree, iter, KEYWORD_COLUMN_HIDE_IN, list, -1);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1275 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1276 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1277
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1278 void keyword_show_in(GtkTreeStore *keyword_tree, GtkTreeIter *iter, gpointer id)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1279 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1280 GList *list;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1281 gtk_tree_model_get(GTK_TREE_MODEL(keyword_tree), iter, KEYWORD_COLUMN_HIDE_IN, &list, -1);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1282 list = g_list_remove(list, id);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1283 gtk_tree_store_set(keyword_tree, iter, KEYWORD_COLUMN_HIDE_IN, list, -1);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1284 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1285
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1286 gboolean keyword_is_hidden_in(GtkTreeModel *keyword_tree, GtkTreeIter *iter, gpointer id)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1287 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1288 GList *list;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1289 gtk_tree_model_get(keyword_tree, iter, KEYWORD_COLUMN_HIDE_IN, &list, -1);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1290 return !!g_list_find(list, id);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1291 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1292
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1293 static gboolean keyword_show_all_in_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1294 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1295 keyword_show_in(GTK_TREE_STORE(model), iter, data);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1296 return FALSE;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1297 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1298
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1299 void keyword_show_all_in(GtkTreeStore *keyword_tree, gpointer id)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1300 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1301 gtk_tree_model_foreach(GTK_TREE_MODEL(keyword_tree), keyword_show_all_in_cb, id);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1302 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1303
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1304 static void keyword_hide_unset_in_recursive(GtkTreeStore *keyword_tree, GtkTreeIter *iter_ptr, gpointer id, GList *keywords)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1305 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1306 GtkTreeIter iter = *iter_ptr;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1307 while (TRUE)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1308 {
1456
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1309 if (!keyword_tree_is_set(GTK_TREE_MODEL(keyword_tree), &iter, keywords))
1428
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1310 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1311 keyword_hide_in(keyword_tree, &iter, id);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1312 /* no need to check children of hidden node */
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1313 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1314 else
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1315 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1316 GtkTreeIter child;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1317 if (gtk_tree_model_iter_children(GTK_TREE_MODEL(keyword_tree), &child, &iter))
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1318 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1319 keyword_hide_unset_in_recursive(keyword_tree, &child, id, keywords);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1320 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1321 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1322 if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(keyword_tree), &iter)) return;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1323 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1324 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1325
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1326 void keyword_hide_unset_in(GtkTreeStore *keyword_tree, gpointer id, GList *keywords)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1327 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1328 GtkTreeIter iter;
1487
d6061c019ceb fixed possible crash
nadvornik
parents: 1483
diff changeset
1329 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(keyword_tree), &iter)) return;
1428
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1330 keyword_hide_unset_in_recursive(keyword_tree, &iter, id, keywords);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1331 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1332
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1333 static gboolean keyword_show_set_in_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter_ptr, gpointer data)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1334 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1335 GtkTreeIter iter = *iter_ptr;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1336 GList *keywords = data;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1337 gpointer id = keywords->data;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1338 keywords = keywords->next; /* hack */
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1339 if (keyword_tree_is_set(model, &iter, keywords))
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1340 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1341 while (TRUE)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1342 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1343 GtkTreeIter parent;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1344 keyword_show_in(GTK_TREE_STORE(model), &iter, id);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1345 if (!gtk_tree_model_iter_parent(GTK_TREE_MODEL(keyword_tree), &parent, &iter)) break;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1346 iter = parent;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1347 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1348 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1349 return FALSE;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1350 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1351
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1352 void keyword_show_set_in(GtkTreeStore *keyword_tree, gpointer id, GList *keywords)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1353 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1354 /* hack: pass id to keyword_hide_unset_in_cb in the list */
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1355 keywords = g_list_prepend(keywords, id);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1356 gtk_tree_model_foreach(GTK_TREE_MODEL(keyword_tree), keyword_show_set_in_cb, keywords);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1357 keywords = g_list_delete_link(keywords, keywords);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1358 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1359
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1360
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1361 void keyword_tree_new(void)
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1362 {
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1363 if (keyword_tree) return;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1364
1428
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1365 keyword_tree = gtk_tree_store_new(KEYWORD_COLUMN_COUNT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_POINTER);
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1366 }
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1367
1542
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1368 static GtkTreeIter keyword_tree_default_append(GtkTreeStore *keyword_tree, GtkTreeIter *parent, const gchar *name, gboolean is_keyword)
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1369 {
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1370 GtkTreeIter iter;
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1371 gtk_tree_store_append(keyword_tree, &iter, parent);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1372 keyword_set(keyword_tree, &iter, name, is_keyword);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1373 return iter;
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1374 }
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1375
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1376 void keyword_tree_new_default(void)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1377 {
1593
7db2bc77d786 fixed keyword tree initialization
nadvornik
parents: 1590
diff changeset
1378 GtkTreeIter i1, i2, i3;
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1379
1593
7db2bc77d786 fixed keyword tree initialization
nadvornik
parents: 1590
diff changeset
1380 if (!keyword_tree) keyword_tree_new();
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1381
1542
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1382 i1 = keyword_tree_default_append(keyword_tree, NULL, _("People"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1383 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Family"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1384 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Free time"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1385 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Children"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1386 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Sport"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1387 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Culture"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1388 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Festival"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1389 i1 = keyword_tree_default_append(keyword_tree, NULL, _("Nature"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1390 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Animal"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1391 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Bird"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1392 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Insect"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1393 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Pets"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1394 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Wildlife"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1395 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Zoo"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1396 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Plant"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1397 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Tree"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1398 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Flower"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1399 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Water"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1400 i3 = keyword_tree_default_append(keyword_tree, &i2, _("River"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1401 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Lake"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1402 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Sea"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1403 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Landscape"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1404 i1 = keyword_tree_default_append(keyword_tree, NULL, _("Art"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1405 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Statue"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1406 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Painting"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1407 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Historic"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1408 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Modern"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1409 i1 = keyword_tree_default_append(keyword_tree, NULL, _("City"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1410 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Park"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1411 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Street"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1412 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Square"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1413 i1 = keyword_tree_default_append(keyword_tree, NULL, _("Architecture"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1414 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Buildings"), FALSE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1415 i3 = keyword_tree_default_append(keyword_tree, &i2, _("House"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1416 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Cathedral"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1417 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Palace"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1418 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Castle"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1419 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Bridge"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1420 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Interior"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1421 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Historic"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1422 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Modern"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1423 i1 = keyword_tree_default_append(keyword_tree, NULL, _("Places"), FALSE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1424 i1 = keyword_tree_default_append(keyword_tree, NULL, _("Conditions"), FALSE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1425 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Night"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1426 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Lights"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1427 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Reflections"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1428 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Sun"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1429 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Weather"), FALSE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1430 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Fog"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1431 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Rain"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1432 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Clouds"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1433 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Snow"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1434 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Sunny weather"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1435 i1 = keyword_tree_default_append(keyword_tree, NULL, _("Photo"), FALSE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1436 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Edited"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1437 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Detail"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1438 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Macro"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1439 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Portrait"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1440 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Black and White"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1441 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Perspective"), TRUE);
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1442 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1443
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
1444
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1445 static void keyword_tree_node_write_config(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr, GString *outstr, gint indent)
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1446 {
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1447 GtkTreeIter iter = *iter_ptr;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1448 while (TRUE)
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1449 {
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1450 GtkTreeIter children;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1451 gchar *name;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1452
1461
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1453 WRITE_NL(); WRITE_STRING("<keyword ");
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1454 name = keyword_get_name(keyword_tree, &iter);
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1455 write_char_option(outstr, indent, "name", name);
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1456 g_free(name);
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1457 write_bool_option(outstr, indent, "kw", keyword_get_is_keyword(keyword_tree, &iter));
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1458 if (gtk_tree_model_iter_children(keyword_tree, &children, &iter))
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1459 {
1461
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1460 WRITE_STRING(">");
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1461 indent++;
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1462 keyword_tree_node_write_config(keyword_tree, &children, outstr, indent);
1461
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1463 indent--;
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1464 WRITE_NL(); WRITE_STRING("</keyword>");
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1465 }
1461
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1466 else
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1467 {
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1468 WRITE_STRING("/>");
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1469 }
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1470 if (!gtk_tree_model_iter_next(keyword_tree, &iter)) return;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1471 }
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1472 }
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1473
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1474 void keyword_tree_write_config(GString *outstr, gint indent)
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1475 {
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1476 GtkTreeIter iter;
1461
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1477 WRITE_NL(); WRITE_STRING("<keyword_tree>");
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1478 indent++;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1479
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1480 if (keyword_tree && gtk_tree_model_get_iter_first(GTK_TREE_MODEL(keyword_tree), &iter))
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1481 {
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1482 keyword_tree_node_write_config(GTK_TREE_MODEL(keyword_tree), &iter, outstr, indent);
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1483 }
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1484 indent--;
1461
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1485 WRITE_NL(); WRITE_STRING("</keyword_tree>");
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1486 }
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1487
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1488 GtkTreeIter *keyword_add_from_config(GtkTreeStore *keyword_tree, GtkTreeIter *parent, const gchar **attribute_names, const gchar **attribute_values)
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1489 {
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1490 gchar *name = NULL;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1491 gboolean is_kw = TRUE;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1492
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1493 while (*attribute_names)
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1494 {
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1495 const gchar *option = *attribute_names++;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1496 const gchar *value = *attribute_values++;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1497
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1498 if (READ_CHAR_FULL("name", name)) continue;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1499 if (READ_BOOL_FULL("kw", is_kw)) continue;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1500
1464
1b3751ac4743 be more verbose on parse errors
nadvornik
parents: 1461
diff changeset
1501 log_printf("unknown attribute %s = %s\n", option, value);
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1502 }
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1503 if (name && name[0])
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1504 {
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1505 GtkTreeIter iter;
1465
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
1506 /* re-use existing keyword if any */
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
1507 if (!keyword_exists(GTK_TREE_MODEL(keyword_tree), parent, NULL, name, FALSE, &iter))
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
1508 {
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
1509 gtk_tree_store_append(keyword_tree, &iter, parent);
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
1510 }
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1511 keyword_set(keyword_tree, &iter, name, is_kw);
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1512 g_free(name);
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1513 return gtk_tree_iter_copy(&iter);
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1514 }
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1515 g_free(name);
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1516 return NULL;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1517 }
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1518
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
1519 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */