fd->mode = st->st_mode;
fd->ref = 1;
fd->magick = FD_MAGICK;
+ fd->exifdate = 0;
+ fd->rating = 0;
if (disable_sidecars) fd->disable_grouping = TRUE;
return fd;
}
-void init_exif_time_data(GList *files)
-{
- FileData *file;
- DEBUG_1("%s init_exif_time_data: ...", get_exec_time());
- while (files)
- {
- file = files->data;
-
- if (file)
- file->exifdate = 0;
-
- files = files->next;
- }
-}
-
void read_exif_time_data(FileData *file)
{
if (file->exifdate > 0)
}
}
+void set_rating_data(GList *files)
+{
+ gchar *rating_str;
+ DEBUG_1("%s set_rating_data: ...", get_exec_time());
+
+ while (files)
+ {
+ FileData *file = files->data;
+ rating_str = metadata_read_string(file, RATING_KEY, METADATA_PLAIN);
+ if (rating_str )
+ {
+ file->rating = atoi(rating_str);
+ g_free(rating_str);
+ }
+ files = files->next;
+ }
+}
+
FileData *file_data_new_no_grouping(const gchar *path_utf8)
{
struct stat st;
g_free(fd->original_path);
g_free(fd->collate_key_name);
g_free(fd->collate_key_name_nocase);
+ g_free(fd->extended_extension);
if (fd->thumb_pixbuf) g_object_unref(fd->thumb_pixbuf);
histmap_free(fd->histmap);
target->sidecar_files = g_list_remove(target->sidecar_files, sfd);
sfd->parent = NULL;
+ g_free(sfd->extended_extension);
+ sfd->extended_extension = NULL;
file_data_unref(target);
file_data_unref(sfd);
if (fa->exifdate > fb->exifdate) return 1;
/* fall back to name */
break;
+ case SORT_RATING:
+ if (fa->rating < fb->rating) return -1;
+ if (fa->rating > fb->rating) return 1;
+ /* fall back to name */
+ break;
#ifdef HAVE_STRVERSCMP
case SORT_NUMBER:
ret = strverscmp(fa->name, fb->name);
{
set_exif_time_data(list);
}
+ if (method == SORT_RATING)
+ {
+ set_rating_data(list);
+ }
return filelist_sort_full(list, method, ascend, (GCompareFunc) filelist_sort_file_cb);
}
list = g_hash_table_lookup(basename_hash, basename);
+ if (!list)
+ {
+ DEBUG_1("TG: basename_hash not found for %s",fd->path);
+ const gchar *parent_extension = registered_extension_from_path(basename);
+
+ if (parent_extension)
+ {
+ DEBUG_1("TG: parent extension %s",parent_extension);
+ gchar *parent_basename = g_strndup(basename, parent_extension - basename);
+ DEBUG_1("TG: parent basename %s",parent_basename);
+ FileData *parent_fd = g_hash_table_lookup(file_data_pool, basename);
+ if (parent_fd)
+ {
+ DEBUG_1("TG: parent fd found");
+ list = g_hash_table_lookup(basename_hash, parent_basename);
+ if (!g_list_find(list, parent_fd))
+ {
+ DEBUG_1("TG: parent fd doesn't fit");
+ g_free(parent_basename);
+ list = NULL;
+ }
+ else
+ {
+ g_free(basename);
+ basename = parent_basename;
+ fd->extended_extension = g_strconcat(parent_extension, fd->extension, NULL);
+ }
+ }
+ }
+ }
+
if (!g_list_find(list, fd))
{
list = g_list_insert_sorted(list, file_data_ref(fd), file_data_sort_by_ext);
return list;
}
+static void file_data_basename_hash_insert_cb(gpointer fd, gpointer basename_hash)
+{
+ file_data_basename_hash_insert((GHashTable *)basename_hash, (FileData *)fd);
+}
+
static void file_data_basename_hash_remove_list(gpointer key, gpointer value, gpointer data)
{
filelist_free((GList *)value);
gchar *pathl;
GList *dlist = NULL;
GList *flist = NULL;
+ GList *xmp_files = NULL;
gint (*stat_func)(const gchar *path, struct stat *buf);
GHashTable *basename_hash = NULL;
flist = g_list_prepend(flist, fd);
if (fd->sidecar_priority && !fd->disable_grouping)
{
- file_data_basename_hash_insert(basename_hash, fd);
+ if (strcmp(fd->extension, ".xmp") != 0)
+ file_data_basename_hash_insert(basename_hash, fd);
+ else
+ xmp_files = g_list_append(xmp_files, fd);
}
}
}
g_free(pathl);
+ if (xmp_files)
+ {
+ g_list_foreach(xmp_files,file_data_basename_hash_insert_cb,basename_hash);
+ g_list_free(xmp_files);
+ }
+
if (dirs) *dirs = dlist;
if (files)
}
if (basename_hash) file_data_basename_hash_free(basename_hash);
- // Call a separate function to initialize the exif datestamps for the found files..
- if (files) init_exif_time_data(*files);
-
return TRUE;
}
if (!file_data_can_write_sidecar(fd)) return NULL;
work = fd->parent ? fd->parent->sidecar_files : fd->sidecar_files;
+ gchar *extended_extension = g_strconcat(fd->parent ? fd->parent->extension : fd->extension, ".xmp", NULL);
while (work)
{
FileData *sfd = work->data;
work = work->next;
- if (g_ascii_strcasecmp(sfd->extension, ".xmp") == 0)
+ if (g_ascii_strcasecmp(sfd->extension, ".xmp") == 0 || g_ascii_strcasecmp(sfd->extension, extended_extension) == 0)
{
sidecar_path = g_strdup(sfd->path);
break;
}
}
+ g_free(extended_extension);
if (!existing_only && !sidecar_path)
{
- gchar *base = g_strndup(fd->path, fd->extension - fd->path);
- sidecar_path = g_strconcat(base, ".xmp", NULL);
- g_free(base);
+ if (options->metadata.sidecar_extended_name)
+ sidecar_path = g_strconcat(fd->path, ".xmp", NULL);
+ else
+ {
+ gchar *base = g_strndup(fd->path, fd->extension - fd->path);
+ sidecar_path = g_strconcat(base, ".xmp", NULL);
+ g_free(base);
+ }
}
return sidecar_path;
file_data_mark_func_data[n] = data;
file_data_destroy_mark_func[n] = notify;
- if (get_mark_func)
+ if (get_mark_func && file_data_pool)
{
/* this effectively changes all known files */
g_hash_table_foreach(file_data_pool, file_data_notify_mark_func, NULL);
static void file_data_update_ci_dest_preserve_ext(FileData *fd, const gchar *dest_path)
{
- const gchar *extension = extension_from_path(fd->change->source);
+ const gchar *extension = registered_extension_from_path(fd->change->source);
gchar *base = remove_extension_from_path(dest_path);
gchar *old_path = fd->change->dest;
- fd->change->dest = g_strconcat(base, extension, NULL);
+ fd->change->dest = g_strconcat(base, fd->extended_extension ? fd->extended_extension : extension, NULL);
file_data_update_planned_change_hash(fd, old_path, fd->change->dest);
g_free(old_path);
if (!same)
{
- const gchar *dest_ext = extension_from_path(fd->change->dest);
+ const gchar *dest_ext = registered_extension_from_path(fd->change->dest);
if (!dest_ext) dest_ext = "";
if (!options->file_filter.disable_file_extension_checks)
{