From 1c6aa88b09136f29f2b2c065b14fc8dba8bd8ce3 Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Fri, 7 Aug 2026 21:07:30 +0200 Subject: [PATCH] implement FileList event type --- application/note/src/main.rs | 3 +++ application/note/src/notebook.rs | 16 ++++++++++++++++ ui-rs/src/ui/event.rs | 23 +++++++++++++++++++---- ui-rs/src/ui/ffi.rs | 8 +++++++- 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/application/note/src/main.rs b/application/note/src/main.rs index f18e762..fc5a96e 100644 --- a/application/note/src/main.rs +++ b/application/note/src/main.rs @@ -172,6 +172,9 @@ fn create_toolbar(app: &AppContext) { app.toolbar_appmenu(|menu|{ menu.item("New Window").onclick(|_| new_app_window() ).create(); menu.separator(); + menu.item("New Note").action("new_note").create(); + menu.item("Add File").action("new_file_note").create(); + menu.separator(); menu.item("Rename").action("note_rename").create(); menu.item("Delete").action("delete_note").create(); menu.item("Edit Title").action("note_edit_title").create(); diff --git a/application/note/src/notebook.rs b/application/note/src/notebook.rs index 0ed2269..14712cb 100644 --- a/application/note/src/notebook.rs +++ b/application/note/src/notebook.rs @@ -295,6 +295,22 @@ impl Notebook { self.notes.select_with_event(0, true); } + #[action] + pub fn new_file_note(&mut self, event: &ActionEvent) { + println!("new file note"); + + let Some(doc) = self.doc_ref.get_doc() else { + return; + }; + let proxy = doc.doc_proxy(); + + if let Some(obj) = &event.obj { + obj.openfile_dialog(false, move|event|{ + + }); + } + } + #[action(NavigationItem)] pub fn navigate_to_note(&mut self, _event: &mut ActionEvent, nav: &NavigationItem) { //println!("navigate to note"); diff --git a/ui-rs/src/ui/event.rs b/ui-rs/src/ui/event.rs index 139e7f5..8d85131 100644 --- a/ui-rs/src/ui/event.rs +++ b/ui-rs/src/ui/event.rs @@ -86,7 +86,7 @@ pub enum EventType<'a> { ListElement, Dnd, SubList(&'a mut SubListEvent), - FileList, + FileList(&'a Vec), TypedObject(&'a mut dyn Any) } @@ -105,7 +105,7 @@ enum EventTypeData { ListElement, Dnd, SubList(SubListEvent), - FileList, + FileList(Vec), TypedObject(*mut Box) } @@ -184,7 +184,22 @@ fn get_event_data(e: *const ffi::UiEvent) -> EventTypeData { } UiEventType::FileList => { // filelist - EventTypeData::Null + let filelist: *mut ffi::UiFileList = ptr.cast(); + let filelist = unsafe { &*filelist }; + let mut files = Vec::with_capacity(filelist.nfiles as usize); + + for i in 0..filelist.nfiles { + let file_ptr = unsafe { *filelist.files.add(i as usize) }; + + if !file_ptr.is_null() { + let file = unsafe { CStr::from_ptr(file_ptr) } + .to_string_lossy() + .into_owned(); + + files.push(file); + } + } + EventTypeData::FileList(files) }, UiEventType::TypedObject => { unsafe { @@ -217,7 +232,7 @@ fn get_event_type<'a>(data: &'a mut EventTypeData) -> EventType<'a> { EventTypeData::ListElement => EventType::ListElement, EventTypeData::Dnd => EventType::Dnd, EventTypeData::SubList(s) => EventType::SubList( s ), - EventTypeData::FileList => EventType::FileList, + EventTypeData::FileList(ls) => EventType::FileList( ls ), EventTypeData::TypedObject(ptr) => unsafe { let boxed: &mut Box = ptr.as_mut().unwrap(); let any: &mut dyn Any = boxed.as_mut(); diff --git a/ui-rs/src/ui/ffi.rs b/ui-rs/src/ui/ffi.rs index 1f9579f..d97c15d 100644 --- a/ui-rs/src/ui/ffi.rs +++ b/ui-rs/src/ui/ffi.rs @@ -28,7 +28,7 @@ #![allow(dead_code)] -use std::ffi::{c_int, c_void}; +use std::ffi::{c_char, c_int, c_void}; #[repr(C)] @@ -256,3 +256,9 @@ pub struct UiImageViewerArgs { pub struct UiWebviewArgs { _private: [u8; 0], } + +#[repr(C)] +pub struct UiFileList { + pub files: *mut *mut c_char, + pub nfiles: libc::size_t, +} \ No newline at end of file -- 2.52.0