* marks and orientation
*/
+static FileDataGetMarkFunc file_data_get_mark_func[FILEDATA_MARKS_SIZE];
+static FileDataSetMarkFunc file_data_set_mark_func[FILEDATA_MARKS_SIZE];
+static gpointer file_data_mark_func_data[FILEDATA_MARKS_SIZE];
gboolean file_data_get_mark(FileData *fd, gint n)
{
+ if (file_data_get_mark_func[n])
+ {
+ gboolean value = (file_data_get_mark_func[n])(fd, n, file_data_mark_func_data[n]);
+ if (!value != !(fd->marks & (1 << n))) fd->marks = fd->marks ^ (1 << n);
+ }
+
return !!(fd->marks & (1 << n));
}
guint file_data_get_marks(FileData *fd)
{
+ gint i;
+ for (i = 0; i < FILEDATA_MARKS_SIZE; i++) file_data_get_mark(fd, i);
return fd->marks;
}
guint old = fd->marks;
if (!value == !(fd->marks & (1 << n))) return;
+ if (file_data_set_mark_func[n])
+ {
+ (file_data_set_mark_func[n])(fd, n, value, file_data_mark_func_data[n]);
+ }
+
fd->marks = fd->marks ^ (1 << n);
if (old && !fd->marks) /* keep files with non-zero marks in memory */
gboolean file_data_filter_marks(FileData *fd, guint filter)
{
+ gint i;
+ for (i = 0; i < FILEDATA_MARKS_SIZE; i++) if (filter & (1 << i)) file_data_get_mark(fd, i);
return ((fd->marks & filter) == filter);
}
return list;
}
+static void file_data_notify_mark_func(gpointer key, gpointer value, gpointer user_data)
+{
+ FileData *fd = value;
+ file_data_increment_version(fd);
+ file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL);
+}
+
+gboolean file_data_register_mark_func(gint n, FileDataGetMarkFunc get_mark_func, FileDataSetMarkFunc set_mark_func, gpointer data)
+{
+ if (n < 0 || n >= FILEDATA_MARKS_SIZE) return FALSE;
+
+ file_data_get_mark_func[n] = get_mark_func;
+ file_data_set_mark_func[n] = set_mark_func;
+ file_data_mark_func_data[n] = data;
+
+ if (get_mark_func)
+ {
+ /* this effectively changes all known files */
+ g_hash_table_foreach(file_data_pool, file_data_notify_mark_func, NULL);
+ }
+
+ return TRUE;
+}
+
+void file_data_get_registered_mark_func(gint n, FileDataGetMarkFunc *get_mark_func, FileDataSetMarkFunc *set_mark_func, gpointer *data)
+{
+ if (get_mark_func) *get_mark_func = file_data_get_mark_func[n];
+ if (set_mark_func) *set_mark_func = file_data_set_mark_func[n];
+ if (data) *data = file_data_mark_func_data[n];
+}
+
gint file_data_get_user_orientation(FileData *fd)
{
return fd->user_orientation;
GList *filelist_sort_path(GList *list);
GList *filelist_recursive(FileData *dir_fd);
+typedef gboolean (* FileDataGetMarkFunc)(FileData *fd, gint n, gpointer data);
+typedef gboolean (* FileDataSetMarkFunc)(FileData *fd, gint n, gboolean value, gpointer data);
+gboolean file_data_register_mark_func(gint n, FileDataGetMarkFunc get_mark_func, FileDataSetMarkFunc set_mark_func, gpointer data);
+void file_data_get_registered_mark_func(gint n, FileDataGetMarkFunc *get_mark_func, FileDataSetMarkFunc *set_mark_func, gpointer *data);
+
+
gboolean file_data_get_mark(FileData *fd, gint n);
guint file_data_get_marks(FileData *fd);
void file_data_set_mark(FileData *fd, gint n, gboolean value);
return list;
}
+/*
+ * keywords to marks
+ */
+
+
+gboolean meta_data_get_keyword_mark(FileData *fd, gint n, gpointer data)
+{
+ GList *keywords;
+ gboolean found = FALSE;
+ if (metadata_read(fd, &keywords, NULL))
+ {
+ GList *work = keywords;
+
+ while (work)
+ {
+ gchar *kw = work->data;
+ work = work->next;
+
+ if (strcmp(kw, data) == 0)
+ {
+ found = TRUE;
+ break;
+ }
+ }
+ string_list_free(keywords);
+ }
+ return found;
+}
+
+gboolean meta_data_set_keyword_mark(FileData *fd, gint n, gboolean value, gpointer data)
+{
+ GList *keywords = NULL;
+ gboolean found = FALSE;
+ gboolean changed = FALSE;
+ GList *work;
+ metadata_read(fd, &keywords, NULL);
+
+ work = keywords;
+
+ while (work)
+ {
+ gchar *kw = work->data;
+
+ if (strcmp(kw, data) == 0)
+ {
+ found = TRUE;
+ if (!value)
+ {
+ changed = TRUE;
+ keywords = g_list_delete_link(keywords, work);
+ g_free(kw);
+ }
+ break;
+ }
+ work = work->next;
+ }
+ if (value && !found)
+ {
+ changed = TRUE;
+ keywords = g_list_append(keywords, g_strdup(data));
+ }
+
+ if (changed) metadata_write(fd, &keywords, NULL);
+
+ string_list_free(keywords);
+ return TRUE;
+}
+
+
/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
gboolean find_string_in_list(GList *list, const gchar *keyword);
GList *string_to_keywords_list(const gchar *text);
+gboolean meta_data_get_keyword_mark(FileData *fd, gint n, gpointer data);
+gboolean meta_data_set_keyword_mark(FileData *fd, gint n, gboolean value, gpointer data);
+
#endif
/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */