From b0e5975e36826d029cc3767b958e1fee603d5a84 Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Wed, 23 Jul 2025 21:33:23 +0200 Subject: [PATCH] remember last selected position --- mizunara/gtk-filesview.c | 37 ++++++++++++++++++++++++++++--------- mizunara/gtk-filesview.h | 1 + 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/mizunara/gtk-filesview.c b/mizunara/gtk-filesview.c index e6be860..aa6f024 100644 --- a/mizunara/gtk-filesview.c +++ b/mizunara/gtk-filesview.c @@ -113,6 +113,8 @@ static void mz_files_view_init(MzFilesView *self) { self->item_width = 180; self->item_height = 170; + self->last_cursor_index = -1; + gtk_widget_set_focusable(GTK_WIDGET(self), TRUE); // event handler @@ -313,6 +315,7 @@ void mz_files_view_snapshot(GtkWidget *widget, GtkSnapshot *snapshot) { int label_x_offset = (item_width - label_alloc.width) / 2; size_t selection_count = 0; + ssize_t selection_index = -1; int x = 0; int y = 0; @@ -335,6 +338,7 @@ void mz_files_view_snapshot(GtkWidget *widget, GtkSnapshot *snapshot) { gtk_snapshot_append_node(snapshot, highlight_clip_node); } else { view->items[i].isselected = 1; + selection_index = i; selection_count++; } } else if (view->update_selection == 1) { @@ -379,6 +383,9 @@ void mz_files_view_snapshot(GtkWidget *widget, GtkSnapshot *snapshot) { if(view->update_selection) { view->selection_count = selection_count; printf("selection_count: %d\n", (int)selection_count); + if(selection_count == 1) { + view->last_cursor_index = selection_index; + } } } @@ -707,16 +714,25 @@ static gboolean key_pressed( // find first selection ssize_t selx = -1; ssize_t sely = -1; - for(size_t i=0;inumitems;i++) { - if(view->items[i].isselected) { - if(selx == -1) { - selx = i % view->current_items_per_line; - sely = i / view->current_items_per_line; - break; + size_t selection_index = 0; + if(view->last_cursor_index >= -1) { + // get last position of item cursor + selection_index = view->last_cursor_index; + } else { + // find selection + for(size_t i=0;inumitems;i++) { + if(view->items[i].isselected) { + if(selx == -1) { + selection_index = i; + break; + } } } } + selx = selection_index % view->current_items_per_line; + sely = selection_index / view->current_items_per_line; + selx += x; sely += y; if(selx >= view->current_items_per_line) { @@ -732,14 +748,15 @@ static gboolean key_pressed( return TRUE; } - size_t selected_index = sely * view->current_items_per_line + selx; - if(selected_index < view->numitems) { + size_t new_selected_index = sely * view->current_items_per_line + selx; + if(new_selected_index < view->numitems) { // unselect all for(size_t i=0;inumitems;i++) { view->items[i].isselected = FALSE; } - view->items[selected_index].isselected = TRUE; + view->items[new_selected_index].isselected = TRUE; + view->last_cursor_index = new_selected_index; view->selection_count = 1; } } @@ -806,4 +823,6 @@ void mz_files_view_remove_items(MzFilesView *view) { gtk_widget_unparent(view->items[i].image); gtk_widget_unparent(view->items[i].label); } + view->selection_count = 0; + view->last_cursor_index = -1; } diff --git a/mizunara/gtk-filesview.h b/mizunara/gtk-filesview.h index 58bd152..09938c7 100644 --- a/mizunara/gtk-filesview.h +++ b/mizunara/gtk-filesview.h @@ -77,6 +77,7 @@ typedef struct MzFilesView { size_t numsections; size_t selection_count; + ssize_t last_cursor_index; int highlight_col; int highlight_row; -- 2.47.3