feat: add Files app selection marquee, Properties dialog for multiple files

This commit is contained in:
2026-05-26 18:27:31 +02:00
parent c1d3d05c34
commit f2ca3956b0
8 changed files with 553 additions and 70 deletions
@@ -70,11 +70,22 @@ struct FileManagerState {
int drive_indices[64]; // drive number or special-folder index for Computer view entries
int drive_kinds[64]; // kernel BlockDeviceKind for FM_ENTRY_DRIVE entries (4 = USB MSC)
// Clipboard
char clipboard_path[256];
bool clipboard_has_data;
// Clipboard (supports multiple paths from a marquee selection)
char clipboard_paths[64][256];
int clipboard_count;
bool clipboard_is_cut;
// Multi-selection (grid view marquee selection)
bool multi_selected[64];
int multi_count;
// Marquee drag state. Coordinates are stored in content space:
// x is local_x (window content relative)
// y is rel_y (local_y - list_y + scroll_offset), so anchor follows scroll
bool marquee_active;
int marquee_start_x, marquee_start_y;
int marquee_cur_x, marquee_cur_y;
// Context menu
bool ctx_open;
int ctx_x, ctx_y;
@@ -217,7 +228,11 @@ void filemanager_delete_selected(FileManagerState* fm);
void filemanager_open_ctx_menu(FileManagerState* fm, int local_x, int local_y, int target_idx);
void filemanager_close_ctx_menu(FileManagerState* fm);
void filemanager_show_properties(FileManagerState* fm, int target_idx);
void filemanager_show_multi_properties(FileManagerState* fm,
const int* indices, int count);
void filemanager_show_directory_delete_confirmation(FileManagerState* fm, int target_idx);
void filemanager_show_bulk_delete_confirmation(FileManagerState* fm,
const int* indices, int count);
void filemanager_push_history(FileManagerState* fm);
void filemanager_navigate(FileManagerState* fm, const char* name);
@@ -239,6 +254,12 @@ int filemanager_grid_row_y(FileManagerState* fm, int row, int cols);
int filemanager_grid_content_height(FileManagerState* fm, int cols);
int filemanager_grid_index_at(FileManagerState* fm, int cols, int x, int rel_y);
// Selection helpers
void filemanager_clear_multi_selection(FileManagerState* fm);
// Fill out with selected entry indices. Returns count. Uses multi_selected if
// non-empty, otherwise falls back to fm->selected (0 or 1 results).
int filemanager_collect_selection(const FileManagerState* fm, int* out, int max);
void filemanager_draw_header(Canvas& c, FileManagerState* fm, Color toolbar_color, Color btn_bg);
void filemanager_on_draw(Window* win, Framebuffer& fb);
void filemanager_on_mouse(Window* win, MouseEvent& ev);