annotate src/metadata.c @ 1667:ece97f3f2305

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 f7183cf53efa
children 9e168ba1b0b9
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"
1241
8cb82b33cab8 fixed includes
nadvornik
parents: 1240
diff changeset
26 #include "layout.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
1598
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
35 static const gchar *group_keys[] = { /* tags that will be written to all files in a group, options->metadata.sync_grouped_files */
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
36 "Xmp.dc.title",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
37 "Xmp.photoshop.Urgency",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
38 "Xmp.photoshop.Category",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
39 "Xmp.photoshop.SupplementalCategory",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
40 "Xmp.dc.subject",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
41 "Xmp.iptc.Location",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
42 "Xmp.photoshop.Instruction",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
43 "Xmp.photoshop.DateCreated",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
44 "Xmp.dc.creator",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
45 "Xmp.photoshop.AuthorsPosition",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
46 "Xmp.photoshop.City",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
47 "Xmp.photoshop.State",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
48 "Xmp.iptc.CountryCode",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
49 "Xmp.photoshop.Country",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
50 "Xmp.photoshop.TransmissionReference",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
51 "Xmp.photoshop.Headline",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
52 "Xmp.photoshop.Credit",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
53 "Xmp.photoshop.Source",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
54 "Xmp.dc.rights",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
55 "Xmp.dc.description",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
diff changeset
56 "Xmp.photoshop.CaptionWriter",
7de9a6897060 extended the list of grouped metadata tags
nadvornik
parents: 1595
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);
1665
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
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
30e207ac22e4 added a status bar button for writting metadata immediately
nadvornik
parents: 1238
diff changeset
82 layout_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
30e207ac22e4 added a status bar button for writting metadata immediately
nadvornik
parents: 1238
diff changeset
110 layout_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
1231
ca8ccf0c3e81 added done callback to utilops
nadvornik
parents: 1228
diff changeset
130 gboolean metadata_write_queue_confirm(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
1231
ca8ccf0c3e81 added done callback to utilops
nadvornik
parents: 1228
diff changeset
146 file_util_write_metadata(NULL, to_approve, NULL, done_func, done_data);
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
147
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
148 filelist_free(to_approve);
1214
31402ecb2aed write metadata after timeout, image change or dir change
nadvornik
parents: 1211
diff changeset
149
31402ecb2aed write metadata after timeout, image change or dir change
nadvornik
parents: 1211
diff changeset
150 return (metadata_write_queue != NULL);
31402ecb2aed write metadata after timeout, image change or dir change
nadvornik
parents: 1211
diff changeset
151 }
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
152
1214
31402ecb2aed write metadata after timeout, image change or dir change
nadvornik
parents: 1211
diff changeset
153 static gboolean metadata_write_queue_idle_cb(gpointer data)
31402ecb2aed write metadata after timeout, image change or dir change
nadvornik
parents: 1211
diff changeset
154 {
1231
ca8ccf0c3e81 added done callback to utilops
nadvornik
parents: 1228
diff changeset
155 metadata_write_queue_confirm(NULL, NULL);
1523
24a12aa0cb54 Fix up event source ids type: gint -> guint.
zas_
parents: 1509
diff changeset
156 metadata_write_idle_id = 0;
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
157 return FALSE;
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
158 }
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1204
diff changeset
159
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
160 gboolean metadata_write_perform(FileData *fd)
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
161 {
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
162 gboolean success;
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
163 ExifData *exif;
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
164
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
165 g_assert(fd->change);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
166
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
167 if (fd->change->dest &&
1228
4d5587c4bf56 fixed writting of legacy metadata
nadvornik
parents: 1225
diff changeset
168 strcmp(extension_from_path(fd->change->dest), GQ_CACHE_EXT_METADATA) == 0)
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
169 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
170 success = metadata_legacy_write(fd);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
171 if (success) metadata_legacy_delete(fd, fd->change->dest);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
172 return success;
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
173 }
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
174
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
175 /* write via exiv2 */
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
176 /* 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
177 or read metadata from file and apply fd->modified_xmp
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
178 metadata are read also if the file was modified meanwhile */
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
179 exif = exif_read_fd(fd);
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
180 if (!exif) return FALSE;
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
181
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
182 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
183 exif_free_fd(fd, exif);
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1208
diff changeset
184
1255
71a75a53dde7 do not ignore newly created sidecars
nadvornik
parents: 1244
diff changeset
185 if (fd->change->dest)
71a75a53dde7 do not ignore newly created sidecars
nadvornik
parents: 1244
diff changeset
186 /* 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
187 (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
188 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
189 store the metadata in the cache)
71a75a53dde7 do not ignore newly created sidecars
nadvornik
parents: 1244
diff changeset
190 FIXME: this does not catch new sidecars created by independent external programs
71a75a53dde7 do not ignore newly created sidecars
nadvornik
parents: 1244
diff changeset
191 */
71a75a53dde7 do not ignore newly created sidecars
nadvornik
parents: 1244
diff changeset
192 file_data_unref(file_data_new_simple(fd->change->dest));
71a75a53dde7 do not ignore newly created sidecars
nadvornik
parents: 1244
diff changeset
193
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
194 if (success) metadata_legacy_delete(fd, fd->change->dest);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
195 return success;
1204
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
196 }
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
197
1240
30e207ac22e4 added a status bar button for writting metadata immediately
nadvornik
parents: 1238
diff changeset
198 gint metadata_queue_length(void)
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 return g_list_length(metadata_write_queue);
30e207ac22e4 added a status bar button for writting metadata immediately
nadvornik
parents: 1238
diff changeset
201 }
30e207ac22e4 added a status bar button for writting metadata immediately
nadvornik
parents: 1238
diff changeset
202
1234
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
203 static gboolean metadata_check_key(const gchar *keys[], const gchar *key)
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
204 {
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
205 const gchar **k = keys;
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
206
1243
5106f40597a3 fixed possible segfault
nadvornik
parents: 1241
diff changeset
207 while (*k)
1234
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
208 {
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
209 if (strcmp(key, *k) == 0) return TRUE;
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
210 k++;
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 return FALSE;
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
213 }
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
214
1567
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
215 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
216 {
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
217 if (!fd->modified_xmp) return FALSE;
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 g_hash_table_remove(fd->modified_xmp, key);
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 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
222 {
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
223 metadata_write_queue_remove(fd);
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 else
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
226 {
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
227 /* reread the metadata to restore the original value */
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
228 file_data_increment_version(fd);
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
229 file_data_send_notification(fd, NOTIFY_REREAD);
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
230 }
1568
678009e94efe fixed return from metadata_write_revert
nadvornik
parents: 1567
diff changeset
231 return TRUE;
1567
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
232 }
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
233
1234
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
234 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
235 {
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
236 if (!fd->modified_xmp)
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
237 {
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
238 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
239 }
1234
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
240 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
241 if (fd->exif)
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
242 {
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
243 exif_update_metadata(fd->exif, key, values);
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
244 }
1204
fa91098e4949 queue metadata and write them in an idle callback
nadvornik
parents: 1203
diff changeset
245 metadata_write_queue_add(fd);
1218
46e4fda574dd improved buffering and notifications
nadvornik
parents: 1214
diff changeset
246 file_data_increment_version(fd);
1432
cf4029d10d38 improved notification system
nadvornik
parents: 1429
diff changeset
247 file_data_send_notification(fd, NOTIFY_METADATA);
1218
46e4fda574dd improved buffering and notifications
nadvornik
parents: 1214
diff changeset
248
1234
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
249 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
250 {
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
251 GList *work = fd->sidecar_files;
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 while (work)
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
254 {
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
255 FileData *sfd = work->data;
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
256 work = work->next;
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 if (filter_file_class(sfd->extension, FORMAT_CLASS_META)) continue;
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 metadata_write_list(sfd, key, values);
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 }
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
263
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
264
1203
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
265 return TRUE;
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
266 }
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 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
269 {
1234
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
270 GList *list = g_list_append(NULL, g_strdup(value));
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
271 gboolean ret = metadata_write_list(fd, key, list);
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
272 string_list_free(list);
31f50c1b6a9a write keywords and comments with separate functions
nadvornik
parents: 1231
diff changeset
273 return ret;
1203
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
274 }
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
275
1567
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
276 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
277 {
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
278 gchar string[50];
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
279
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
280 g_snprintf(string, sizeof(string), "%ld", value);
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
281 return metadata_write_string(fd, key, string);
c776b1310ca6 added an option to write image orientation to the metadata
nadvornik
parents: 1542
diff changeset
282 }
1203
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1194
diff changeset
283
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
284 /*
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 * keyword / comment read/write
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
287 *-------------------------------------------------------------------
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
288 */
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
289
1665
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
290 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
291 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
292 SecureSaveInfo *ssi;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
293
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
294 ssi = secure_open(path);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
295 if (!ssi) return FALSE;
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, "#%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
298
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
299 secure_fprintf(ssi, "[keywords]\n");
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
300 while (keywords && secsave_errno == SS_ERR_NONE)
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
301 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
302 const gchar *word = keywords->data;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
303 keywords = keywords->next;
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_fprintf(ssi, "%s\n", word);
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_fputc(ssi, '\n');
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
308
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
309 secure_fprintf(ssi, "[comment]\n");
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
310 secure_fprintf(ssi, "%s\n", (comment) ? comment : "");
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 secure_fprintf(ssi, "#end\n");
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 return (secure_close(ssi) == 0);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
315 }
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 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
318 {
1434
b106af9689db More gboolean.
zas_
parents: 1432
diff changeset
319 gboolean success = FALSE;
b106af9689db More gboolean.
zas_
parents: 1432
diff changeset
320 gchar *metadata_pathl;
1665
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
321 gpointer keywords;
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
322 gpointer comment_l;
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
323 gboolean have_keywords;
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
324 gboolean have_comment;
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
325 const gchar *comment;
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
326 GList *orig_keywords = NULL;
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
327 gchar *orig_comment = NULL;
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 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
330
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
331 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
332
1665
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
333 if (!fd->modified_xmp) return TRUE;
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
334
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
335 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
336
1665
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
337 have_keywords = g_hash_table_lookup_extended(fd->modified_xmp, KEYWORD_KEY, NULL, &keywords);
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
338 have_comment = g_hash_table_lookup_extended(fd->modified_xmp, COMMENT_KEY, NULL, &comment_l);
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
339 comment = comment_l ? ((GList *)comment_l)->data : NULL;
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
340
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
341 if (!have_keywords || !have_comment) metadata_file_read(metadata_pathl, &orig_keywords, &orig_comment);
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
342
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
343 success = metadata_file_write(metadata_pathl,
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
344 have_keywords ? (GList *)keywords : orig_keywords,
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
345 have_comment ? comment : orig_comment);
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
346
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
347 g_free(metadata_pathl);
1665
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
348 g_free(orig_comment);
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
349 string_list_free(orig_keywords);
f7183cf53efa fixed writting to gqview legacy format
nadvornik
parents: 1598
diff changeset
350
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
351 return success;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
352 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
353
1434
b106af9689db More gboolean.
zas_
parents: 1432
diff changeset
354 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
355 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
356 FILE *f;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
357 gchar s_buf[1024];
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
358 MetadataKey key = MK_NONE;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
359 GList *list = NULL;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
360 GString *comment_build = NULL;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
361
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
362 f = fopen(path, "r");
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
363 if (!f) return FALSE;
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 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
366 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
367 gchar *ptr = s_buf;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
368
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
369 if (*ptr == '#') continue;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
370 if (*ptr == '[' && key != MK_COMMENT)
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 gchar *keystr = ++ptr;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
373
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
374 key = MK_NONE;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
375 while (*ptr != ']' && *ptr != '\n' && *ptr != '\0') 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 if (*ptr == ']')
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
378 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
379 *ptr = '\0';
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
380 if (g_ascii_strcasecmp(keystr, "keywords") == 0)
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
381 key = MK_KEYWORDS;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
382 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
383 key = MK_COMMENT;
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 continue;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
386 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
387
1347
79937bc55f3a Add missing space between switch and first parenthesis.
zas_
parents: 1340
diff changeset
388 switch (key)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
389 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
390 case MK_NONE:
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
391 break;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
392 case MK_KEYWORDS:
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
393 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
394 while (*ptr != '\n' && *ptr != '\0') ptr++;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
395 *ptr = '\0';
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
396 if (strlen(s_buf) > 0)
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 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
399
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
400 list = g_list_prepend(list, kw);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
401 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
402 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
403 break;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
404 case MK_COMMENT:
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
405 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
406 g_string_append(comment_build, s_buf);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
407 break;
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 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
410
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
411 fclose(f);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
412
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
413 if (keywords)
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 *keywords = g_list_reverse(list);
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 else
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 string_list_free(list);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
420 }
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
421
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
422 if (comment_build)
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 if (comment)
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
425 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
426 gint len;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
427 gchar *ptr = comment_build->str;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
428
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
429 /* strip leading and trailing newlines */
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
430 while (*ptr == '\n') ptr++;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
431 len = strlen(ptr);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
432 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
433 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
434 if (len > 0)
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 gchar *text = g_strndup(ptr, len);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
437
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
438 *comment = utf8_validate_or_convert(text);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
439 g_free(text);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
440 }
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 g_string_free(comment_build, TRUE);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
443 }
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 return TRUE;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
446 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
447
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
448 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
449 {
1191
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
450 gchar *metadata_path;
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
451 gchar *metadata_pathl;
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
452 if (!fd) return;
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
453
1191
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
454 metadata_path = cache_find_location(CACHE_TYPE_METADATA, fd->path);
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
455 if (metadata_path && (!except || strcmp(metadata_path, except) != 0))
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
456 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
457 metadata_pathl = path_from_utf8(metadata_path);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
458 unlink(metadata_pathl);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
459 g_free(metadata_pathl);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
460 g_free(metadata_path);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
461 }
1667
ece97f3f2305 fixes for a built without Exiv2
nadvornik
parents: 1665
diff changeset
462
ece97f3f2305 fixes for a built without Exiv2
nadvornik
parents: 1665
diff changeset
463 #ifdef HAVE_EXIV2
ece97f3f2305 fixes for a built without Exiv2
nadvornik
parents: 1665
diff changeset
464 /* without exiv2: do not delete xmp metadata because we are not able to convert it,
ece97f3f2305 fixes for a built without Exiv2
nadvornik
parents: 1665
diff changeset
465 just ignore it */
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
466 metadata_path = cache_find_location(CACHE_TYPE_XMP_METADATA, fd->path);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
467 if (metadata_path && (!except || strcmp(metadata_path, except) != 0))
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
468 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
469 metadata_pathl = path_from_utf8(metadata_path);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
470 unlink(metadata_pathl);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
471 g_free(metadata_pathl);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
472 g_free(metadata_path);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
473 }
1667
ece97f3f2305 fixes for a built without Exiv2
nadvornik
parents: 1665
diff changeset
474 #endif
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
475 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
476
1434
b106af9689db More gboolean.
zas_
parents: 1432
diff changeset
477 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
478 {
1191
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
479 gchar *metadata_path;
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
480 gchar *metadata_pathl;
1434
b106af9689db More gboolean.
zas_
parents: 1432
diff changeset
481 gboolean success = FALSE;
b106af9689db More gboolean.
zas_
parents: 1432
diff changeset
482
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
483 if (!fd) return FALSE;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
484
1191
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
485 metadata_path = cache_find_location(CACHE_TYPE_METADATA, fd->path);
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
486 if (!metadata_path) return FALSE;
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 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
489
1191
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
490 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
491
1191
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
492 g_free(metadata_pathl);
bb02d0e2a573 Rename most comment_*() functions to more appropriate metadata_*().
zas_
parents: 1178
diff changeset
493 g_free(metadata_path);
1178
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 return success;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
496 }
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 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
499 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
500 GList *work = list;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
501 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
502 GList *newlist = NULL;
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 while (work)
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 gchar *key = work->data;
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 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
509 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
510 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
511 newlist = g_list_prepend(newlist, key);
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 work = work->next;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
514 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
515
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
516 g_hash_table_destroy(hashtable);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
517 g_list_free(list);
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 return g_list_reverse(newlist);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
520 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
521
1288
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
522 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
523 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
524 ExifData *exif;
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
525 GList *list = NULL;
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
526 if (!fd) return NULL;
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
527
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
528 /* unwritten data overide everything */
1288
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
529 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
530 {
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
531 list = g_hash_table_lookup(fd->modified_xmp, key);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
532 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
533 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
534
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
535 /*
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
536 Legacy metadata file is the primary source if it exists.
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
537 Merging the lists does not make much sense, because the existence of
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
538 legacy metadata file indicates that the other metadata sources are not
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
539 writable and thus it would not be possible to delete the keywords
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
540 that comes from the image file.
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
541 */
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
542 if (strcmp(key, KEYWORD_KEY) == 0)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
543 {
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
544 if (metadata_legacy_read(fd, &list, NULL)) return list;
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
545 }
1504
1e2737565cb7 Cleanup.
zas_
parents: 1487
diff changeset
546 else if (strcmp(key, COMMENT_KEY) == 0)
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
547 {
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
548 gchar *comment = NULL;
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
549 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
550 }
1504
1e2737565cb7 Cleanup.
zas_
parents: 1487
diff changeset
551 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
552 {
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1465
diff changeset
553 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
554 }
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1465
diff changeset
555
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
556 exif = exif_read_fd(fd); /* this is cached, thus inexpensive */
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
557 if (!exif) return NULL;
1288
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
558 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
559 exif_free_fd(fd, exif);
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
560 return list;
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
561 }
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 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
564 {
1288
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
565 GList *string_list = metadata_read_list(fd, key, format);
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
566 if (string_list)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
567 {
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
568 gchar *str = string_list->data;
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
569 string_list->data = NULL;
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
570 string_list_free(string_list);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
571 return str;
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
572 }
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
573 return NULL;
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
574 }
1288
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 metadata_read_int(FileData *fd, const gchar *key, guint64 fallback)
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
577 {
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
578 guint64 ret;
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
579 gchar *endptr;
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
580 gchar *string = metadata_read_string(fd, key, METADATA_PLAIN);
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
581 if (!string) return fallback;
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
582
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
583 ret = g_ascii_strtoull(string, &endptr, 10);
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
584 if (string == endptr) ret = fallback;
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
585 g_free(string);
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
586 return ret;
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
587 }
1509
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 metadata_read_GPS_coord(FileData *fd, const gchar *key, gdouble fallback)
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
590 {
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
591 gdouble coord;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
592 gchar *endptr;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
593 gdouble deg, min, sec;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
594 gboolean ok = FALSE;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
595 gchar *string = metadata_read_string(fd, key, METADATA_PLAIN);
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
596 if (!string) return fallback;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
597
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
598 deg = g_ascii_strtod(string, &endptr);
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
599 if (*endptr == ',')
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
600 {
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
601 min = g_ascii_strtod(endptr + 1, &endptr);
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
602 if (*endptr == ',')
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
603 sec = g_ascii_strtod(endptr + 1, &endptr);
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
604 else
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
605 sec = 0.0;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
606
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
607
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
608 if (*endptr == 'S' || *endptr == 'W' || *endptr == 'N' || *endptr == 'E')
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
609 {
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
610 coord = deg + min /60.0 + sec / 3600.0;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
611 ok = TRUE;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
612 if (*endptr == 'S' || *endptr == 'W') coord = -coord;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
613 }
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
614 }
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
615
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
616 if (!ok)
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
617 {
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
618 coord = fallback;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
619 log_printf("unable to parse GPS coordinate '%s'\n", string);
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
620 }
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
621
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
622 g_free(string);
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
623 return coord;
e70bbc97acc5 added metadata_read_GPS_coord
nadvornik
parents: 1504
diff changeset
624 }
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
625
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
626 gboolean metadata_append_string(FileData *fd, const gchar *key, const char *value)
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
627 {
1288
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
628 gchar *str = metadata_read_string(fd, key, METADATA_PLAIN);
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
629
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
630 if (!str)
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
631 {
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
632 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
633 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
634 else
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
635 {
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
636 gchar *new_string = g_strconcat(str, value, NULL);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
637 gboolean ret = metadata_write_string(fd, key, new_string);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
638 g_free(str);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
639 g_free(new_string);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
640 return ret;
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
641 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
642 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
643
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
644 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
645 {
1288
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
646 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
647
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
648 if (!list)
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 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
651 }
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
652 else
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
653 {
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
654 gboolean ret;
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
655 list = g_list_concat(list, string_list_copy(values));
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
656 list = remove_duplicate_strings_from_list(list);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
657
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
658 ret = metadata_write_list(fd, key, list);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
659 string_list_free(list);
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
660 return ret;
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
661 }
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
662 }
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 *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
665 {
1340
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
666 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
667
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
668 while (list)
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
669 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
670 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
671
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
672 if (haystack)
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
673 {
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
674 gboolean equal;
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
675 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
676
1340
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
677 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
678 g_free(haystack_casefold);
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
679
1340
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
680 if (equal)
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
681 {
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
682 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
683 return haystack;
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
684 }
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
685 }
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
686
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
687 list = list->next;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
688 }
1340
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
689
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
690 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
691 return NULL;
361120a66609 Use g_utf8_casefold() to compare keywords, uppercased/lowercased keywords are now matched against predefined list.
zas_
parents: 1288
diff changeset
692 }
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
693
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 #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
696
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
697 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
698 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
699 GList *list = NULL;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
700 const gchar *ptr = text;
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 while (*ptr != '\0')
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
703 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
704 const gchar *begin;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
705 gint l = 0;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
706
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
707 while (KEYWORDS_SEPARATOR(*ptr)) ptr++;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
708 begin = ptr;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
709 while (*ptr != '\0' && !KEYWORDS_SEPARATOR(*ptr))
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
710 {
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
711 ptr++;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
712 l++;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
713 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
714
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
715 /* trim starting and ending whitespaces */
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
716 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
717 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
718
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
719 if (l > 0)
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 gchar *keyword = g_strndup(begin, l);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
722
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
723 /* 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
724 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
725 list = g_list_append(list, keyword);
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
726 else
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
727 g_free(keyword);
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 }
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 return list;
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
732 }
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
733
1222
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 * keywords to marks
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
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
738
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
739 gboolean meta_data_get_keyword_mark(FileData *fd, gint n, gpointer data)
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
740 {
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
741 /* FIXME: do not use global keyword_tree */
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
742 GList *path = data;
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
743 GList *keywords;
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
744 gboolean found = FALSE;
1288
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
745 keywords = metadata_read_list(fd, KEYWORD_KEY, METADATA_PLAIN);
1238
947e603a52c6 simplified metadata interface, dropped metadata_read,
nadvornik
parents: 1234
diff changeset
746 if (keywords)
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
747 {
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
748 GtkTreeIter iter;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
749 if (keyword_tree_get_iter(GTK_TREE_MODEL(keyword_tree), &iter, path) &&
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
750 keyword_tree_is_set(GTK_TREE_MODEL(keyword_tree), &iter, keywords))
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
751 found = TRUE;
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
752
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 return found;
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
755 }
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
756
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
757 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
758 {
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
759 GList *path = data;
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
760 GList *keywords = NULL;
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
761 GtkTreeIter iter;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
762
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
763 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
764
1288
10073464e6aa use metadata_read_* functions where possible
nadvornik
parents: 1284
diff changeset
765 keywords = metadata_read_list(fd, KEYWORD_KEY, METADATA_PLAIN);
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 (!!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
768 {
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
769 if (value)
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 keyword_tree_set(GTK_TREE_MODEL(keyword_tree), &iter, &keywords);
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
772 }
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
773 else
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
774 {
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
775 keyword_tree_reset(GTK_TREE_MODEL(keyword_tree), &iter, &keywords);
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
776 }
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
777 metadata_write_list(fd, KEYWORD_KEY, keywords);
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
778 }
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
779
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
780 string_list_free(keywords);
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
781 return TRUE;
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
782 }
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
783
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
784
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
785
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
786 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
787 {
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
788
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
789 FileDataGetMarkFunc get_mark_func;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
790 FileDataSetMarkFunc set_mark_func;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
791 gpointer mark_func_data;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
792
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
793 gint 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 for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
796 {
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
797 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
798 if (get_mark_func == meta_data_get_keyword_mark)
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
799 {
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
800 GtkTreeIter old_kw_iter;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
801 GList *old_path = mark_func_data;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
802
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
803 if (keyword_tree_get_iter(keyword_tree, &old_kw_iter, old_path) &&
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
804 (i == mark || /* release any previous connection of given mark */
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
805 keyword_compare(keyword_tree, &old_kw_iter, kw_iter) == 0)) /* or given keyword */
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
806 {
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
807 file_data_register_mark_func(i, NULL, NULL, NULL, NULL);
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
808 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
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
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
813
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
814 if (mark >= 0 && mark < FILEDATA_MARKS_SIZE)
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
815 {
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
816 GList *path;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
817 gchar *mark_str;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
818 path = keyword_tree_get_path(keyword_tree, kw_iter);
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
819 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
820
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
821 mark_str = g_strdup_printf("%d", mark + 1);
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
822 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
823 g_free(mark_str);
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
824 }
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
825 }
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
826
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1414
diff changeset
827
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
828 /*
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 * keyword tree
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
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 GtkTreeStore *keyword_tree;
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 *keyword_get_name(GtkTreeModel *keyword_tree, GtkTreeIter *iter)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
839 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
840 gchar *name;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
841 gtk_tree_model_get(keyword_tree, iter, KEYWORD_COLUMN_NAME, &name, -1);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
842 return name;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
843 }
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 *keyword_get_casefold(GtkTreeModel *keyword_tree, GtkTreeIter *iter)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
846 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
847 gchar *casefold;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
848 gtk_tree_model_get(keyword_tree, iter, KEYWORD_COLUMN_CASEFOLD, &casefold, -1);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
849 return casefold;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
850 }
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 keyword_get_is_keyword(GtkTreeModel *keyword_tree, GtkTreeIter *iter)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
853 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
854 gboolean is_keyword;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
855 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
856 return is_keyword;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
857 }
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 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
860 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
861 gchar *casefold = g_utf8_casefold(name, -1);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
862 gtk_tree_store_set(keyword_tree, iter, KEYWORD_COLUMN_MARK, "",
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
863 KEYWORD_COLUMN_NAME, name,
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
864 KEYWORD_COLUMN_CASEFOLD, casefold,
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
865 KEYWORD_COLUMN_IS_KEYWORD, is_keyword, -1);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
866 g_free(casefold);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
867 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
868
1396
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
869 gboolean keyword_compare(GtkTreeModel *keyword_tree, GtkTreeIter *a, GtkTreeIter *b)
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
870 {
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
871 GtkTreePath *pa = gtk_tree_model_get_path(keyword_tree, a);
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
872 GtkTreePath *pb = gtk_tree_model_get_path(keyword_tree, b);
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
873 gint ret = gtk_tree_path_compare(pa, pb);
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
874 gtk_tree_path_free(pa);
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
875 gtk_tree_path_free(pb);
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
876 return ret;
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
877 }
58f0b4586c8c dnd fixes
nadvornik
parents: 1392
diff changeset
878
1429
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
879 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
880 {
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
881 GtkTreeIter parent_a;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
882 GtkTreeIter parent_b;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
883
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
884 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
885 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
886
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
887 if (valid_pa && valid_pb)
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 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
890 }
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
891 else
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 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
894 }
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
895 }
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
896
1465
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
897 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
898 {
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
899 GtkTreeIter parent;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
900 GtkTreeIter iter;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
901 gboolean toplevel = FALSE;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
902 gboolean ret;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
903 gchar *casefold;
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 if (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 parent = *parent_ptr;
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 else if (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 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
912 }
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
913 else
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 toplevel = TRUE;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
916 }
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 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
919
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
920 casefold = g_utf8_casefold(name, -1);
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
921 ret = FALSE;
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 while (TRUE)
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
924 {
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
925 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
926 {
1592
69abb57139f0 use "keywords" instead of "tags" in option name, it is more consistent
nadvornik
parents: 1568
diff changeset
927 if (options->metadata.keywords_case_sensitive)
1540
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
928 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
929 gchar *iter_name = keyword_get_name(keyword_tree, &iter);
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
930 ret = strcmp(name, iter_name) == 0;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
931 g_free(iter_name);
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 else
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
934 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
935 gchar *iter_casefold = keyword_get_casefold(keyword_tree, &iter);
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
936 ret = strcmp(casefold, iter_casefold) == 0;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
937 g_free(iter_casefold);
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
938 } // if (options->metadata.tags_cas...
1429
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
939 }
1465
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
940 if (ret)
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
941 {
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
942 if (result) *result = iter;
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
943 break;
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
944 }
1429
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
945 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
946 }
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
947 g_free(casefold);
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
948 return ret;
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
949 }
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
950
985366bccfb8 do not allow to add keywords with the same name as siblings
nadvornik
parents: 1428
diff changeset
951
1392
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
952 void keyword_copy(GtkTreeStore *keyword_tree, GtkTreeIter *to, GtkTreeIter *from)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
953 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
954
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
955 gchar *mark, *name, *casefold;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
956 gboolean is_keyword;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
957
1428
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
958 /* do not copy KEYWORD_COLUMN_HIDE_IN, it fully shows the new subtree */
1392
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
959 gtk_tree_model_get(GTK_TREE_MODEL(keyword_tree), from, KEYWORD_COLUMN_MARK, &mark,
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
960 KEYWORD_COLUMN_NAME, &name,
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
961 KEYWORD_COLUMN_CASEFOLD, &casefold,
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
962 KEYWORD_COLUMN_IS_KEYWORD, &is_keyword, -1);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
963
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
964 gtk_tree_store_set(keyword_tree, to, KEYWORD_COLUMN_MARK, mark,
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
965 KEYWORD_COLUMN_NAME, name,
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
966 KEYWORD_COLUMN_CASEFOLD, casefold,
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
967 KEYWORD_COLUMN_IS_KEYWORD, is_keyword, -1);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
968 g_free(mark);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
969 g_free(name);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
970 g_free(casefold);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
971 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
972
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
973 void keyword_copy_recursive(GtkTreeStore *keyword_tree, GtkTreeIter *to, GtkTreeIter *from)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
974 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
975 GtkTreeIter from_child;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
976
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
977 keyword_copy(keyword_tree, to, from);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
978
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
979 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
980
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
981 while (TRUE)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
982 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
983 GtkTreeIter to_child;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
984 gtk_tree_store_append(keyword_tree, &to_child, to);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
985 keyword_copy_recursive(keyword_tree, &to_child, &from_child);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
986 if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(keyword_tree), &from_child)) return;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
987 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
988 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
989
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
990 void keyword_move_recursive(GtkTreeStore *keyword_tree, GtkTreeIter *to, GtkTreeIter *from)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
991 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
992 keyword_copy_recursive(keyword_tree, to, from);
1428
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
993 keyword_delete(keyword_tree, from);
1392
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
994 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
995
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
996 GList *keyword_tree_get_path(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
997 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
998 GList *path = NULL;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
999 GtkTreeIter iter = *iter_ptr;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1000
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1001 while (TRUE)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1002 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1003 GtkTreeIter parent;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1004 path = g_list_prepend(path, keyword_get_name(keyword_tree, &iter));
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1005 if (!gtk_tree_model_iter_parent(keyword_tree, &parent, &iter)) break;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1006 iter = parent;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1007 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1008 return path;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1009 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1010
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1011 gboolean keyword_tree_get_iter(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr, GList *path)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1012 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1013 GtkTreeIter iter;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1014
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1015 if (!gtk_tree_model_get_iter_first(keyword_tree, &iter)) return FALSE;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1016
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1017 while (TRUE)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1018 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1019 GtkTreeIter children;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1020 while (TRUE)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1021 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1022 gchar *name = keyword_get_name(keyword_tree, &iter);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1023 if (strcmp(name, path->data) == 0) break;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1024 g_free(name);
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1025 if (!gtk_tree_model_iter_next(keyword_tree, &iter)) return FALSE;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1026 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1027 path = path->next;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1028 if (!path)
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1029 {
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1030 *iter_ptr = iter;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1031 return TRUE;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1032 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1033
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1034 if (!gtk_tree_model_iter_children(keyword_tree, &children, &iter)) return FALSE;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1035 iter = children;
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1036 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1037 }
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1038
d1b32a69b40a dnd in keywords tree
nadvornik
parents: 1391
diff changeset
1039
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1040 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
1041 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1042 if (!casefold_list) return FALSE;
1456
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 if (!keyword_get_is_keyword(keyword_tree, &iter))
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1045 {
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1046 /* 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
1047 GtkTreeIter child;
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1048 if (!gtk_tree_model_iter_children(keyword_tree, &child, &iter))
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1049 return FALSE; /* this should happen only on empty helpers */
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 while (TRUE)
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1052 {
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1053 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
1054 if (!gtk_tree_model_iter_next(keyword_tree, &child)) return FALSE;
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1055 }
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1056 }
1391
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 while (TRUE)
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 GtkTreeIter parent;
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 if (keyword_get_is_keyword(keyword_tree, &iter))
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1063 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1064 GList *work = casefold_list;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1065 gboolean found = FALSE;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1066 gchar *iter_casefold = keyword_get_casefold(keyword_tree, &iter);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1067 while (work)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1068 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1069 const gchar *casefold = work->data;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1070 work = work->next;
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 if (strcmp(iter_casefold, casefold) == 0)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1073 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1074 found = TRUE;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1075 break;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1076 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1077 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1078 g_free(iter_casefold);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1079 if (!found) return FALSE;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1080 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1081
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1082 if (!gtk_tree_model_iter_parent(keyword_tree, &parent, &iter)) return TRUE;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1083 iter = parent;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1084 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1085 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1086
1540
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1087 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
1088 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1089 if (!kw_list) return FALSE;
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 if (!keyword_get_is_keyword(keyword_tree, &iter))
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1092 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1093 /* 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
1094 GtkTreeIter child;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1095 if (!gtk_tree_model_iter_children(keyword_tree, &child, &iter))
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1096 return FALSE; /* this should happen only on empty helpers */
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 while (TRUE)
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1099 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1100 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
1101 if (!gtk_tree_model_iter_next(keyword_tree, &child)) return FALSE;
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 }
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 while (TRUE)
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 GtkTreeIter parent;
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 if (keyword_get_is_keyword(keyword_tree, &iter))
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1110 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1111 GList *work = kw_list;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1112 gboolean found = FALSE;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1113 gchar *iter_name = keyword_get_name(keyword_tree, &iter);
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1114 while (work)
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1115 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1116 const gchar *name = work->data;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1117 work = work->next;
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 if (strcmp(iter_name, name) == 0)
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1120 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1121 found = TRUE;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1122 break;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1123 }
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1124 }
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1125 g_free(iter_name);
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1126 if (!found) return FALSE;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1127 }
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1128
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1129 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
1130 iter = parent;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1131 }
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1132 }
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1133
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1134 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
1135 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1136 gboolean ret;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1137 GList *casefold_list = NULL;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1138 GList *work;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1139
1592
69abb57139f0 use "keywords" instead of "tags" in option name, it is more consistent
nadvornik
parents: 1568
diff changeset
1140 if (options->metadata.keywords_case_sensitive)
1540
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 ret = keyword_tree_is_set_casefull(keyword_tree, *iter, kw_list);
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1143 }
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1144 else
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1145 {
1540
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1146 work = kw_list;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1147 while (work)
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1148 {
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1149 const gchar *kw = work->data;
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1150 work = work->next;
1428
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1151
1540
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1152 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
1153 }
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 ret = keyword_tree_is_set_casefold(keyword_tree, *iter, casefold_list);
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1156
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1157 string_list_free(casefold_list);
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1158 }
1540
286ed7c6cae6 Allow to configure case handling of keywords
mow
parents: 1523
diff changeset
1159
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1160 return ret;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1161 }
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 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
1164 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1165 GtkTreeIter iter = *iter_ptr;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1166 while (TRUE)
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 GtkTreeIter parent;
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 if (keyword_get_is_keyword(keyword_tree, &iter))
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1171 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1172 gchar *name = keyword_get_name(keyword_tree, &iter);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1173 if (!find_string_in_list_utf8nocase(*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 *kw_list = g_list_append(*kw_list, name);
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 else
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 g_free(name);
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 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1182
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1183 if (!gtk_tree_model_iter_parent(keyword_tree, &parent, &iter)) return;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1184 iter = parent;
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 }
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 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
1189 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1190 gchar *found;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1191 gchar *name;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1192 if (!keyword_get_is_keyword(keyword_tree, iter)) return;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1193
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1194 name = keyword_get_name(keyword_tree, iter);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1195 found = find_string_in_list_utf8nocase(*kw_list, name);
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 if (found)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1198 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1199 *kw_list = g_list_remove(*kw_list, found);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1200 g_free(found);
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 g_free(name);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1203 }
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 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
1206 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1207 GtkTreeIter child;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1208 keyword_tree_reset1(keyword_tree, iter, kw_list);
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 if (!gtk_tree_model_iter_children(keyword_tree, &child, iter)) return;
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 while (TRUE)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1213 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1214 keyword_tree_reset_recursive(keyword_tree, &child, kw_list);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1215 if (!gtk_tree_model_iter_next(keyword_tree, &child)) return;
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 }
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 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
1220 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1221 GtkTreeIter iter;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1222
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1223 if (!gtk_tree_model_iter_children(keyword_tree, &iter, parent))
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1224 return TRUE; /* this should happen only on empty helpers */
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1225
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1226 while (TRUE)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1227 {
1457
5c0ecb2ebbc5 simplified code
nadvornik
parents: 1456
diff changeset
1228 if (keyword_tree_is_set(keyword_tree, &iter, kw_list)) return FALSE;
5c0ecb2ebbc5 simplified code
nadvornik
parents: 1456
diff changeset
1229 if (!gtk_tree_model_iter_next(keyword_tree, &iter)) return TRUE;
1391
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 }
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 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
1234 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1235 GtkTreeIter iter = *iter_ptr;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1236 GtkTreeIter parent;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1237 keyword_tree_reset_recursive(keyword_tree, &iter, kw_list);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1238
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1239 if (!gtk_tree_model_iter_parent(keyword_tree, &parent, &iter)) return;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1240 iter = parent;
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 while (keyword_tree_check_empty_children(keyword_tree, &iter, *kw_list))
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1243 {
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1244 GtkTreeIter parent;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1245 keyword_tree_reset1(keyword_tree, &iter, kw_list);
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1246 if (!gtk_tree_model_iter_parent(keyword_tree, &parent, &iter)) return;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1247 iter = parent;
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1248 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1249 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1250
1414
6ce1f7171d48 added a popup menu in keyword tree
nadvornik
parents: 1404
diff changeset
1251 void keyword_delete(GtkTreeStore *keyword_tree, GtkTreeIter *iter_ptr)
6ce1f7171d48 added a popup menu in keyword tree
nadvornik
parents: 1404
diff changeset
1252 {
1428
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1253 GList *list;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1254 GtkTreeIter child;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1255 while (gtk_tree_model_iter_children(GTK_TREE_MODEL(keyword_tree), &child, iter_ptr))
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1256 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1257 keyword_delete(keyword_tree, &child);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1258 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1259
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1260 meta_data_connect_mark_with_keyword(GTK_TREE_MODEL(keyword_tree), iter_ptr, -1);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1261
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1262 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
1263 g_list_free(list);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1264
1414
6ce1f7171d48 added a popup menu in keyword tree
nadvornik
parents: 1404
diff changeset
1265 gtk_tree_store_remove(keyword_tree, iter_ptr);
6ce1f7171d48 added a popup menu in keyword tree
nadvornik
parents: 1404
diff changeset
1266 }
6ce1f7171d48 added a popup menu in keyword tree
nadvornik
parents: 1404
diff changeset
1267
6ce1f7171d48 added a popup menu in keyword tree
nadvornik
parents: 1404
diff changeset
1268
1428
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1269 void keyword_hide_in(GtkTreeStore *keyword_tree, GtkTreeIter *iter, gpointer id)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1270 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1271 GList *list;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1272 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
1273 if (!g_list_find(list, id))
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1274 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1275 list = g_list_prepend(list, id);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1276 gtk_tree_store_set(keyword_tree, iter, KEYWORD_COLUMN_HIDE_IN, list, -1);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1277 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1278 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1279
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1280 void keyword_show_in(GtkTreeStore *keyword_tree, GtkTreeIter *iter, gpointer id)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1281 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1282 GList *list;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1283 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
1284 list = g_list_remove(list, id);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1285 gtk_tree_store_set(keyword_tree, iter, KEYWORD_COLUMN_HIDE_IN, list, -1);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1286 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1287
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1288 gboolean keyword_is_hidden_in(GtkTreeModel *keyword_tree, GtkTreeIter *iter, gpointer id)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1289 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1290 GList *list;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1291 gtk_tree_model_get(keyword_tree, iter, KEYWORD_COLUMN_HIDE_IN, &list, -1);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1292 return !!g_list_find(list, id);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1293 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1294
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1295 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
1296 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1297 keyword_show_in(GTK_TREE_STORE(model), iter, data);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1298 return FALSE;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1299 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1300
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1301 void keyword_show_all_in(GtkTreeStore *keyword_tree, gpointer id)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1302 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1303 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
1304 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1305
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1306 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
1307 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1308 GtkTreeIter iter = *iter_ptr;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1309 while (TRUE)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1310 {
1456
b24391991f7f improved expanding and hiding of helper keywords
nadvornik
parents: 1434
diff changeset
1311 if (!keyword_tree_is_set(GTK_TREE_MODEL(keyword_tree), &iter, keywords))
1428
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1312 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1313 keyword_hide_in(keyword_tree, &iter, id);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1314 /* no need to check children of hidden node */
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1315 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1316 else
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1317 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1318 GtkTreeIter child;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1319 if (gtk_tree_model_iter_children(GTK_TREE_MODEL(keyword_tree), &child, &iter))
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1320 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1321 keyword_hide_unset_in_recursive(keyword_tree, &child, id, keywords);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1322 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1323 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1324 if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(keyword_tree), &iter)) return;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1325 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1326 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1327
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1328 void keyword_hide_unset_in(GtkTreeStore *keyword_tree, gpointer id, GList *keywords)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1329 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1330 GtkTreeIter iter;
1487
d6061c019ceb fixed possible crash
nadvornik
parents: 1483
diff changeset
1331 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
1332 keyword_hide_unset_in_recursive(keyword_tree, &iter, id, keywords);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1333 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1334
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1335 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
1336 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1337 GtkTreeIter iter = *iter_ptr;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1338 GList *keywords = data;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1339 gpointer id = keywords->data;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1340 keywords = keywords->next; /* hack */
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1341 if (keyword_tree_is_set(model, &iter, keywords))
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1342 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1343 while (TRUE)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1344 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1345 GtkTreeIter parent;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1346 keyword_show_in(GTK_TREE_STORE(model), &iter, id);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1347 if (!gtk_tree_model_iter_parent(GTK_TREE_MODEL(keyword_tree), &parent, &iter)) break;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1348 iter = parent;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1349 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1350 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1351 return FALSE;
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1352 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1353
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1354 void keyword_show_set_in(GtkTreeStore *keyword_tree, gpointer id, GList *keywords)
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1355 {
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1356 /* hack: pass id to keyword_hide_unset_in_cb in the list */
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1357 keywords = g_list_prepend(keywords, id);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1358 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
1359 keywords = g_list_delete_link(keywords, keywords);
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1360 }
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1361
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1362
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1363 void keyword_tree_new(void)
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1364 {
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1365 if (keyword_tree) return;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1366
1428
3019f5d3a3c7 added keyword tree filtering
nadvornik
parents: 1425
diff changeset
1367 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
1368 }
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1369
1542
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1370 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
1371 {
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1372 GtkTreeIter iter;
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1373 gtk_tree_store_append(keyword_tree, &iter, parent);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1374 keyword_set(keyword_tree, &iter, name, is_keyword);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1375 return iter;
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1376 }
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1377
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1378 void keyword_tree_new_default(void)
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1379 {
1595
9e2111452988 fixed keyword tree initialization
nadvornik
parents: 1592
diff changeset
1380 GtkTreeIter i1, i2, i3;
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1381
1595
9e2111452988 fixed keyword tree initialization
nadvornik
parents: 1592
diff changeset
1382 if (!keyword_tree) keyword_tree_new();
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1383
1542
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1384 i1 = keyword_tree_default_append(keyword_tree, NULL, _("People"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1385 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Family"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1386 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Free time"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1387 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Children"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1388 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Sport"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1389 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Culture"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1390 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Festival"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1391 i1 = keyword_tree_default_append(keyword_tree, NULL, _("Nature"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1392 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Animal"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1393 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Bird"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1394 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Insect"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1395 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Pets"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1396 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Wildlife"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1397 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Zoo"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1398 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Plant"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1399 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Tree"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1400 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Flower"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1401 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Water"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1402 i3 = keyword_tree_default_append(keyword_tree, &i2, _("River"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1403 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Lake"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1404 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Sea"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1405 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Landscape"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1406 i1 = keyword_tree_default_append(keyword_tree, NULL, _("Art"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1407 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Statue"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1408 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Painting"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1409 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Historic"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1410 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Modern"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1411 i1 = keyword_tree_default_append(keyword_tree, NULL, _("City"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1412 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Park"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1413 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Street"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1414 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Square"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1415 i1 = keyword_tree_default_append(keyword_tree, NULL, _("Architecture"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1416 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Buildings"), FALSE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1417 i3 = keyword_tree_default_append(keyword_tree, &i2, _("House"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1418 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Cathedral"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1419 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Palace"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1420 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Castle"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1421 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Bridge"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1422 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Interior"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1423 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Historic"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1424 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Modern"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1425 i1 = keyword_tree_default_append(keyword_tree, NULL, _("Places"), FALSE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1426 i1 = keyword_tree_default_append(keyword_tree, NULL, _("Conditions"), FALSE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1427 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Night"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1428 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Lights"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1429 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Reflections"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1430 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Sun"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1431 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Weather"), FALSE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1432 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Fog"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1433 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Rain"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1434 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Clouds"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1435 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Snow"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1436 i3 = keyword_tree_default_append(keyword_tree, &i2, _("Sunny weather"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1437 i1 = keyword_tree_default_append(keyword_tree, NULL, _("Photo"), FALSE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1438 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Edited"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1439 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Detail"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1440 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Macro"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1441 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Portrait"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1442 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Black and White"), TRUE);
ddb7aefb45cb improved default keyword tree
nadvornik
parents: 1540
diff changeset
1443 i2 = keyword_tree_default_append(keyword_tree, &i1, _("Perspective"), TRUE);
1391
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1444 }
9e0df7903581 implemented keywords editor as described at
nadvornik
parents: 1347
diff changeset
1445
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1220
diff changeset
1446
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1447 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
1448 {
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1449 GtkTreeIter iter = *iter_ptr;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1450 while (TRUE)
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1451 {
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1452 GtkTreeIter children;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1453 gchar *name;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1454
1461
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1455 WRITE_NL(); WRITE_STRING("<keyword ");
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1456 name = keyword_get_name(keyword_tree, &iter);
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1457 write_char_option(outstr, indent, "name", name);
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1458 g_free(name);
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1459 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
1460 if (gtk_tree_model_iter_children(keyword_tree, &children, &iter))
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1461 {
1461
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1462 WRITE_STRING(">");
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1463 indent++;
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1464 keyword_tree_node_write_config(keyword_tree, &children, outstr, indent);
1461
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1465 indent--;
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1466 WRITE_NL(); WRITE_STRING("</keyword>");
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1467 }
1461
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1468 else
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1469 {
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1470 WRITE_STRING("/>");
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1471 }
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1472 if (!gtk_tree_model_iter_next(keyword_tree, &iter)) return;
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 }
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 void keyword_tree_write_config(GString *outstr, gint indent)
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1477 {
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1478 GtkTreeIter iter;
1461
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1479 WRITE_NL(); WRITE_STRING("<keyword_tree>");
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1480 indent++;
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 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
1483 {
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1484 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
1485 }
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1486 indent--;
1461
e015b6573d36 improved config file formatting
nadvornik
parents: 1457
diff changeset
1487 WRITE_NL(); WRITE_STRING("</keyword_tree>");
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1488 }
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 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
1491 {
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1492 gchar *name = NULL;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1493 gboolean is_kw = TRUE;
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 while (*attribute_names)
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1496 {
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1497 const gchar *option = *attribute_names++;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1498 const gchar *value = *attribute_values++;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1499
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1500 if (READ_CHAR_FULL("name", name)) continue;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1501 if (READ_BOOL_FULL("kw", is_kw)) continue;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1502
1464
1b3751ac4743 be more verbose on parse errors
nadvornik
parents: 1461
diff changeset
1503 log_printf("unknown attribute %s = %s\n", option, value);
1404
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 if (name && name[0])
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1506 {
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1507 GtkTreeIter iter;
1465
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
1508 /* re-use existing keyword if any */
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
1509 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
1510 {
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
1511 gtk_tree_store_append(keyword_tree, &iter, parent);
400ecfc3d8b1 do not add duplicate keywords from config file
nadvornik
parents: 1464
diff changeset
1512 }
1404
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1513 keyword_set(keyword_tree, &iter, name, is_kw);
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1514 g_free(name);
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1515 return gtk_tree_iter_copy(&iter);
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1516 }
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1517 g_free(name);
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1518 return NULL;
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1519 }
de06d83e1adc save and restore the keyword tree
nadvornik
parents: 1396
diff changeset
1520
1178
f6449c17306b Move comments/keywords read and write stuff to new metadata.{c,h}.
zas_
parents:
diff changeset
1521 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */