From: Vladimir Nadvornik Date: Wed, 3 Jun 2009 20:05:19 +0000 (+0000) Subject: regroup sidecar files when an operation on partial group is finished X-Git-Tag: v1.0.0~180 X-Git-Url: http://geeqie.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=21b5ebf3430ded75165d2b4caf8baef41dce6bae;p=geeqie.git regroup sidecar files when an operation on partial group is finished --- diff --git a/src/filedata.c b/src/filedata.c index 890547a62..68dc7778d 100644 --- a/src/filedata.c +++ b/src/filedata.c @@ -1429,6 +1429,8 @@ void file_data_free_ci(FileData *fd) if (!fdci) return; file_data_planned_change_remove(fd); + + if (fdci->regroup_when_finished) file_data_disable_grouping(fd, FALSE); g_free(fdci->source); g_free(fdci->dest); @@ -1438,6 +1440,12 @@ void file_data_free_ci(FileData *fd) fd->change = NULL; } +void file_data_set_regroup_when_finished(FileData *fd, gboolean enable) +{ + FileDataChangeInfo *fdci = fd->change; + if (!fdci) return; + fdci->regroup_when_finished = enable; +} static gboolean file_data_sc_add_ci(FileData *fd, FileDataChangeType type) { @@ -2373,7 +2381,7 @@ static gboolean file_data_list_dump(GList *list) } #endif -GList *file_data_process_groups(GList *list) +GList *file_data_process_groups_in_selection(GList *list, GList **ungrouped_list) { GList *out = NULL; GList *work = list; @@ -2385,7 +2393,13 @@ GList *file_data_process_groups(GList *list) work = work->next; if (!file_data_list_contains_whole_group(list, fd)) + { file_data_disable_grouping(fd, TRUE); + if (ungrouped_list) + { + *ungrouped_list = g_list_prepend(*ungrouped_list, file_data_ref(fd)); + } + } } /* remove sidecars from the list, diff --git a/src/filedata.h b/src/filedata.h index e6662857d..7a602fd7f 100644 --- a/src/filedata.h +++ b/src/filedata.h @@ -118,6 +118,7 @@ gboolean file_data_apply_ci(FileData *fd); void file_data_free_ci(FileData *fd); void file_data_free_ci_list(GList *fd_list); +void file_data_set_regroup_when_finished(FileData *fd, gboolean enable); gint file_data_sc_verify_ci(FileData *fd); @@ -126,7 +127,7 @@ gboolean file_data_sc_apply_ci(FileData *fd); void file_data_sc_free_ci(FileData *fd); void file_data_sc_free_ci_list(GList *fd_list); -GList *file_data_process_groups(GList *list); +GList *file_data_process_groups_in_selection(GList *list, GList **ungrouped); typedef void (*FileDataNotifyFunc)(FileData *fd, NotifyType type, gpointer data); diff --git a/src/typedefs.h b/src/typedefs.h index d626530b4..80f3fc61a 100644 --- a/src/typedefs.h +++ b/src/typedefs.h @@ -450,6 +450,7 @@ struct _FileDataChangeInfo { gchar *source; gchar *dest; gint error; + gboolean regroup_when_finished; }; struct _FileData { diff --git a/src/utilops.c b/src/utilops.c index 34099c9b6..1a733cede 100644 --- a/src/utilops.c +++ b/src/utilops.c @@ -1919,24 +1919,41 @@ static void file_util_write_metadata_details_dialog(UtilityData *ud, FileData *f g_free(message2); } + +static void file_util_mark_ungrouped_files(GList *work) +{ + while (work) + { + FileData *fd = work->data; + file_data_set_regroup_when_finished(fd, TRUE); + work = work->next; + } +} + static void file_util_delete_full(FileData *source_fd, GList *source_list, GtkWidget *parent, UtilityPhase phase) { UtilityData *ud; GList *flist = filelist_copy(source_list); + GList *ungrouped = NULL; if (source_fd) flist = g_list_append(flist, file_data_ref(source_fd)); if (!flist) return; - flist = file_data_process_groups(flist); + flist = file_data_process_groups_in_selection(flist, &ungrouped); if (!file_data_sc_add_ci_delete_list(flist)) { file_util_warn_op_in_progress(_("File deletion failed")); + file_data_disable_grouping_list(ungrouped, FALSE); filelist_free(flist); + filelist_free(ungrouped); return; } + + file_util_mark_ungrouped_files(ungrouped); + filelist_free(ungrouped); ud = file_util_data_new(UTILITY_TYPE_DELETE); @@ -2005,25 +2022,30 @@ static void file_util_write_metadata_full(FileData *source_fd, GList *source_lis file_util_dialog_run(ud); } - static void file_util_move_full(FileData *source_fd, GList *source_list, const gchar *dest_path, GtkWidget *parent, UtilityPhase phase) { UtilityData *ud; GList *flist = filelist_copy(source_list); + GList *ungrouped = NULL; if (source_fd) flist = g_list_append(flist, file_data_ref(source_fd)); if (!flist) return; - flist = file_data_process_groups(flist); + flist = file_data_process_groups_in_selection(flist, &ungrouped); if (!file_data_sc_add_ci_move_list(flist, dest_path)) { file_util_warn_op_in_progress(_("Move failed")); + file_data_disable_grouping_list(ungrouped, FALSE); filelist_free(flist); + filelist_free(ungrouped); return; } + + file_util_mark_ungrouped_files(ungrouped); + filelist_free(ungrouped); ud = file_util_data_new(UTILITY_TYPE_MOVE); @@ -2051,21 +2073,27 @@ static void file_util_copy_full(FileData *source_fd, GList *source_list, const g { UtilityData *ud; GList *flist = filelist_copy(source_list); + GList *ungrouped = NULL; if (source_fd) flist = g_list_append(flist, file_data_ref(source_fd)); if (!flist) return; - flist = file_data_process_groups(flist); + flist = file_data_process_groups_in_selection(flist, &ungrouped); if (!file_data_sc_add_ci_copy_list(flist, dest_path)) { file_util_warn_op_in_progress(_("Copy failed")); + file_data_disable_grouping_list(ungrouped, FALSE); filelist_free(flist); + filelist_free(ungrouped); return; } + file_util_mark_ungrouped_files(ungrouped); + filelist_free(ungrouped); + ud = file_util_data_new(UTILITY_TYPE_COPY); ud->phase = phase; @@ -2092,21 +2120,27 @@ static void file_util_rename_full(FileData *source_fd, GList *source_list, const { UtilityData *ud; GList *flist = filelist_copy(source_list); + GList *ungrouped = NULL; if (source_fd) flist = g_list_append(flist, file_data_ref(source_fd)); if (!flist) return; - flist = file_data_process_groups(flist); + flist = file_data_process_groups_in_selection(flist, &ungrouped); if (!file_data_sc_add_ci_rename_list(flist, dest_path)) { file_util_warn_op_in_progress(_("Rename failed")); + file_data_disable_grouping_list(ungrouped, FALSE); filelist_free(flist); + filelist_free(ungrouped); return; } + file_util_mark_ungrouped_files(ungrouped); + filelist_free(ungrouped); + ud = file_util_data_new(UTILITY_TYPE_RENAME); ud->phase = phase; @@ -2133,6 +2167,7 @@ static void file_util_start_editor_full(const gchar *key, FileData *source_fd, G { UtilityData *ud; GList *flist; + GList *ungrouped = NULL; if (editor_no_param(key)) { @@ -2148,15 +2183,20 @@ static void file_util_start_editor_full(const gchar *key, FileData *source_fd, G if (!flist) return; - flist = file_data_process_groups(flist); + flist = file_data_process_groups_in_selection(flist, &ungrouped); if (!file_data_sc_add_ci_unspecified_list(flist, dest_path)) { file_util_warn_op_in_progress(_("Can't run external editor")); + file_data_disable_grouping_list(ungrouped, FALSE); filelist_free(flist); + filelist_free(ungrouped); return; } + file_util_mark_ungrouped_files(ungrouped); + filelist_free(ungrouped); + if (editor_is_filter(key)) ud = file_util_data_new(UTILITY_TYPE_FILTER); else