]> uap-core.de Git - mizunara.git/commitdiff
remember last selected position
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 23 Jul 2025 19:33:23 +0000 (21:33 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 23 Jul 2025 19:33:23 +0000 (21:33 +0200)
mizunara/gtk-filesview.c
mizunara/gtk-filesview.h

index e6be860ac08c1eb3ac287f46eaf9bf7b41aa3093..aa6f02497143144e091011b14d784a7acab6ad76 100644 (file)
@@ -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;i<view->numitems;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;i<view->numitems;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;i<view->numitems;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;
 }
index 58bd152ea350fbd78533041e300419353ca19a1b..09938c7061a1b4f75408cf104f55e0f654936035 100644 (file)
@@ -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;