vficon_set_focus(vf, fd);
}
+void vficon_select_list(ViewFile *vf, GList *list)
+{
+ GList *work;
+ FileData *fd;
+
+ if (!list) return;
+
+ work = list;
+ while (work)
+ {
+ fd = work->data;
+ if (g_list_find(vf->list, fd))
+ {
+ VFICON(vf)->selection = g_list_append(VFICON(vf)->selection, fd);
+ vficon_selection_add(vf, fd, SELECTION_SELECTED, NULL);
+ }
+ work = work->next;
+ }
+}
+
void vficon_mark_to_selection(ViewFile *vf, gint mark, MarkToSelectionMode mode)
{
GList *work;
/* ensure focus row col are correct */
vficon_find_position(vf, VFICON(vf)->focus_fd, &VFICON(vf)->focus_row, &VFICON(vf)->focus_column);
#if GTK_CHECK_VERSION(3,0,0)
-/* FIXME: Refer to issue #467 on Github. The thumbnail position is not
+/** @FIXME Refer to issue #467 on Github. The thumbnail position is not
* preserved when the icon view is refreshed. Caused by an unknown call from
* the idle loop. This patch hides the problem.
*/
GList *list;
gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
- // TODO(xsdg): for loop here.
+ /** @todo (xsdg): for loop here. */
for (; list; list = list->next)
{
FileData *fd = list->data;
FileData *first_selected = NULL;
GList *new_filelist = NULL;
GList *new_fd_list = NULL;
+ GList *old_selected = NULL;
+ GtkTreePath *end_path = NULL;
+ GtkTreePath *start_path = NULL;
focus_fd = VFICON(vf)->focus_fd;
+ gtk_tree_view_get_visible_range(GTK_TREE_VIEW(vf->listview), &start_path, &end_path);
+
if (vf->dir_fd)
{
ret = filelist_read(vf->dir_fd, &new_filelist, NULL);
if (VFICON(vf)->selection)
{
+ old_selected = g_list_copy(VFICON(vf)->selection);
first_selected = VFICON(vf)->selection->data;
file_data_ref(first_selected);
g_list_free(VFICON(vf)->selection);
VFICON(vf)->selection = g_list_reverse(VFICON(vf)->selection);
+ /* Preserve the original selection order */
+ if (old_selected)
+ {
+ GList *reversed_old_selected;
+
+ reversed_old_selected = g_list_reverse(old_selected);
+ while (reversed_old_selected)
+ {
+ GList *tmp;
+ tmp = g_list_find(VFICON(vf)->selection, reversed_old_selected->data);
+ if (tmp)
+ {
+ VFICON(vf)->selection = g_list_remove_link(VFICON(vf)->selection, tmp);
+ VFICON(vf)->selection = g_list_concat(tmp, VFICON(vf)->selection);
+ }
+ reversed_old_selected = reversed_old_selected->next;
+ }
+ g_list_free(old_selected);
+ }
+
filelist_free(new_filelist);
vficon_populate(vf, TRUE, keep_position);
}
file_data_unref(first_selected);
- /* attempt to keep focus on same icon when refreshing */
- if (focus_fd && g_list_find(vf->list, focus_fd))
+ if (start_path)
{
- vficon_set_focus(vf, focus_fd);
+ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(vf->listview), start_path, NULL, FALSE, 0.0, 0.0);
}
+ gtk_tree_path_free(start_path);
+ gtk_tree_path_free(end_path);
+
return ret;
}