Deduplicate mark_to_selection and selection_to_mark
authorArkadiy Illarionov <qarkai@gmail.com>
Sun, 28 Apr 2024 15:13:56 +0000 (18:13 +0300)
committerColin Clark <colin.clark@cclark.uk>
Mon, 29 Apr 2024 09:34:28 +0000 (10:34 +0100)
src/filedata.cc
src/filedata.h
src/view-file/view-file-icon.cc
src/view-file/view-file-list.cc

index 3589331..9bc6613 100644 (file)
@@ -1921,6 +1921,34 @@ GList *file_data_filter_marks_list(GList *list, guint filter)
        return list;
 }
 
+gboolean file_data_mark_to_selection(FileData *fd, gint mark, MarkToSelectionMode mode, gboolean selected)
+{
+       gint n = mark - 1;
+       gboolean mark_val = file_data_get_mark(fd, n);
+
+       switch (mode)
+               {
+               case MTS_MODE_MINUS: return !mark_val && selected;
+               case MTS_MODE_SET: return mark_val;
+               case MTS_MODE_OR: return mark_val || selected;
+               case MTS_MODE_AND: return mark_val && selected;
+               }
+
+       return selected; // arbitrary value, we shouldn't get here
+}
+
+void file_data_selection_to_mark(FileData *fd, gint mark, SelectionToMarkMode mode)
+{
+       gint n = mark - 1;
+
+       switch (mode)
+               {
+               case STM_MODE_RESET: file_data_set_mark(fd, n, FALSE); break;
+               case STM_MODE_SET: file_data_set_mark(fd, n, TRUE); break;
+               case STM_MODE_TOGGLE: file_data_set_mark(fd, n, !file_data_get_mark(fd, n)); break;
+               }
+}
+
 gboolean file_data_filter_file_filter(FileData *fd, GRegex *filter)
 {
        return g_regex_match(filter, fd->name, static_cast<GRegexMatchFlags>(0), nullptr);
index d3af8ed..547a9fb 100644 (file)
@@ -210,6 +210,9 @@ void file_data_set_mark(FileData *fd, gint n, gboolean value);
 gboolean file_data_filter_marks(FileData *fd, guint filter);
 GList *file_data_filter_marks_list(GList *list, guint filter);
 
+gboolean file_data_mark_to_selection(FileData *fd, gint mark, MarkToSelectionMode mode, gboolean selected);
+void file_data_selection_to_mark(FileData *fd, gint mark, SelectionToMarkMode mode);
+
 gboolean file_data_filter_file_filter(FileData *fd, GRegex *filter);
 GList *file_data_filter_file_filter_list(GList *list, GRegex *filter);
 
index 1eedd5f..9bb913d 100644 (file)
@@ -832,65 +832,33 @@ void vficon_select_list(ViewFile *vf, GList *list)
 
 void vficon_mark_to_selection(ViewFile *vf, gint mark, MarkToSelectionMode mode)
 {
-       GList *work;
-       gint n = mark - 1;
-
        g_assert(mark >= 1 && mark <= FILEDATA_MARKS_SIZE);
 
-       work = vf->list;
-       while (work)
+       for (GList *work = vf->list; work; work = work->next)
                {
                auto fd = static_cast<FileData *>(work->data);
-               gboolean mark_val;
                gboolean selected;
 
                g_assert(fd->magick == FD_MAGICK);
 
-               mark_val = file_data_get_mark(fd, n);
-               selected = fd->selected & SELECTION_SELECTED;
-
-               switch (mode)
-                       {
-                       case MTS_MODE_SET: selected = mark_val;
-                               break;
-                       case MTS_MODE_OR: selected = mark_val || selected;
-                               break;
-                       case MTS_MODE_AND: selected = mark_val && selected;
-                               break;
-                       case MTS_MODE_MINUS: selected = !mark_val && selected;
-                               break;
-                       }
+               selected = file_data_mark_to_selection(fd, mark, mode, fd->selected & SELECTION_SELECTED);
 
                vficon_select_util(vf, fd, selected);
-
-               work = work->next;
                }
 }
 
 void vficon_selection_to_mark(ViewFile *vf, gint mark, SelectionToMarkMode mode)
 {
        GList *slist;
-       GList *work;
-       gint n = mark -1;
 
        g_assert(mark >= 1 && mark <= FILEDATA_MARKS_SIZE);
 
        slist = vficon_selection_get_list(vf);
-       work = slist;
-       while (work)
+       for (GList *work = slist; work; work = work->next)
                {
                auto fd = static_cast<FileData *>(work->data);
 
-               switch (mode)
-                       {
-                       case STM_MODE_SET: file_data_set_mark(fd, n, 1);
-                               break;
-                       case STM_MODE_RESET: file_data_set_mark(fd, n, 0);
-                               break;
-                       case STM_MODE_TOGGLE: file_data_set_mark(fd, n, !file_data_get_mark(fd, n));
-                               break;
-                       }
-               work = work->next;
+               file_data_selection_to_mark(fd, mark, mode);
                }
        filelist_free(slist);
 }
index 32c2f13..f38ab59 100644 (file)
@@ -1596,7 +1596,6 @@ void vflist_mark_to_selection(ViewFile *vf, gint mark, MarkToSelectionMode mode)
        GtkTreeIter iter;
        GtkTreeSelection *selection;
        gboolean valid;
-       gint n = mark - 1;
 
        g_assert(mark >= 1 && mark <= FILEDATA_MARKS_SIZE);
 
@@ -1607,24 +1606,10 @@ void vflist_mark_to_selection(ViewFile *vf, gint mark, MarkToSelectionMode mode)
        while (valid)
                {
                FileData *fd;
-               gboolean mark_val;
                gboolean selected;
                gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &fd, -1);
 
-               mark_val = file_data_get_mark(fd, n);
-               selected = gtk_tree_selection_iter_is_selected(selection, &iter);
-
-               switch (mode)
-                       {
-                       case MTS_MODE_SET: selected = mark_val;
-                               break;
-                       case MTS_MODE_OR: selected = mark_val || selected;
-                               break;
-                       case MTS_MODE_AND: selected = mark_val && selected;
-                               break;
-                       case MTS_MODE_MINUS: selected = !mark_val && selected;
-                               break;
-                       }
+               selected = file_data_mark_to_selection(fd, mark, mode, gtk_tree_selection_iter_is_selected(selection, &iter));
 
                if (selected)
                        gtk_tree_selection_select_iter(selection, &iter);
@@ -1640,15 +1625,12 @@ void vflist_selection_to_mark(ViewFile *vf, gint mark, SelectionToMarkMode mode)
        GtkTreeModel *store;
        GtkTreeSelection *selection;
        GList *slist;
-       GList *work;
-       gint n = mark - 1;
 
        g_assert(mark >= 1 && mark <= FILEDATA_MARKS_SIZE);
 
        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vf->listview));
        slist = gtk_tree_selection_get_selected_rows(selection, &store);
-       work = slist;
-       while (work)
+       for (GList *work = slist; work; work = work->next)
                {
                auto tpath = static_cast<GtkTreePath *>(work->data);
                FileData *fd;
@@ -1661,15 +1643,7 @@ void vflist_selection_to_mark(ViewFile *vf, gint mark, SelectionToMarkMode mode)
                   complete re-read of the directory - try to do only minimal update instead */
                file_data_unregister_notify_func(vf_notify_cb, vf); /* we don't need the notification */
 
-               switch (mode)
-                       {
-                       case STM_MODE_SET: file_data_set_mark(fd, n, 1);
-                               break;
-                       case STM_MODE_RESET: file_data_set_mark(fd, n, 0);
-                               break;
-                       case STM_MODE_TOGGLE: file_data_set_mark(fd, n, !file_data_get_mark(fd, n));
-                               break;
-                       }
+               file_data_selection_to_mark(fd, mark, mode);
 
                if (!file_data_filter_marks(fd, vf_marks_get_filter(vf))) /* file no longer matches the filter -> remove it */
                        {
@@ -1683,10 +1657,7 @@ void vflist_selection_to_mark(ViewFile *vf, gint mark, SelectionToMarkMode mode)
                        vflist_setup_iter_recursive(vf, GTK_TREE_STORE(store), &iter, fd->sidecar_files, nullptr, FALSE);
                        }
 
-
                file_data_register_notify_func(vf_notify_cb, vf, NOTIFY_PRIORITY_MEDIUM);
-
-               work = work->next;
                }
        g_list_free_full(slist, reinterpret_cast<GDestroyNotify>(gtk_tree_path_free));
 }