From: Olaf Wintermann Date: Wed, 10 Jun 2026 16:20:50 +0000 (+0200) Subject: add main menu, add separate app init method X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=HEAD;p=note.git add main menu, add separate app init method --- diff --git a/application/src/main.rs b/application/src/main.rs index 81403b7..f6ad38c 100644 --- a/application/src/main.rs +++ b/application/src/main.rs @@ -113,12 +113,11 @@ struct App { impl Application for App { - fn on_startup(&mut self, app: &AppContext) { - //app.menu("File", |menu| { - // menu.item("Open").create(); - //}); - + fn on_init(&mut self, app: &AppContext) { + create_menubar(app); create_toolbar(app); + } + fn on_startup(&mut self, app: &AppContext) { self.on_new_window(app); } @@ -140,6 +139,13 @@ impl App { } } +fn create_menubar(app: &AppContext) { + app.menu("File", |menu| { + menu.item("New").action("new_note").create(); + menu.item("New Window").onclick(|_| new_app_window() ).create(); + }); +} + fn create_toolbar(app: &AppContext) { app.toolbar_item("new_notebook").icon(UiIconSet::NewFolder.as_str()).action("new_notebook").create(); app.toolbar_item("go_back").icon(UiIconSet::GoBack.as_str()).action("go_back").create(); diff --git a/ui-rs/src/ui/application.rs b/ui-rs/src/ui/application.rs index 3791efb..14cbe3e 100644 --- a/ui-rs/src/ui/application.rs +++ b/ui-rs/src/ui/application.rs @@ -39,6 +39,7 @@ pub trait AppActions { } pub trait Application: AppActions { + fn on_init(&mut self, _app: &AppContext) {} fn on_startup(&mut self, app: &AppContext); fn on_new_window(&mut self, _app: &AppContext) {} @@ -65,6 +66,7 @@ impl UiActions for NoAppData { extern "C" { fn ui_main(); + fn ui_oninit(callback: UiCallback, userdata: *mut c_void); fn ui_onstartup(callback: UiCallback, userdata: *mut c_void); fn ui_onnewwindow(callback: UiCallback, userdata: *mut c_void); fn ui_onexit(callback: UiCallback, userdata: *mut c_void); @@ -72,7 +74,8 @@ extern "C" { fn ui_newwindow(); } -extern "C" fn app_startup>(_event: *const UiEvent, data: *mut c_void) { +fn app_callback>(_event: *const UiEvent, data: *mut c_void, f: F) +where F: FnOnce(&mut A, &AppContext) { unsafe { let app_ptr = data as *mut A; let app_ref: &mut A = &mut *app_ptr; @@ -81,36 +84,35 @@ extern "C" fn app_startup>(_event: *co ctx: global_ctx, _marker: PhantomData, }; - app_ref.on_startup(&ctx); + f(app_ref, &ctx); } } -extern "C" fn app_new_window>(_event: *const UiEvent, data: *mut c_void) { - unsafe { - let app_ptr = data as *mut A; - let app_ref: &mut A = &mut *app_ptr; - let global_ctx = toolkit::UiContext::from_ptr(ui_global_context()); - let ctx = AppContext:: { - ctx: global_ctx, - _marker: PhantomData, - }; - app_ref.on_new_window(&ctx); - } +extern "C" fn app_init>(event: *const UiEvent, data: *mut c_void) { + app_callback(event, data, |app: &mut A, ctx| { + app.on_init(ctx); + }); } -extern "C" fn app_exit>(_event: *const UiEvent, data: *mut c_void) { - unsafe { - let app_ptr = data as *mut A; - let app_ref: &mut A = &mut *app_ptr; - let global_ctx = toolkit::UiContext::from_ptr(ui_global_context()); - let ctx = AppContext:: { - ctx: global_ctx, - _marker: PhantomData, - }; - app_ref.on_exit(&ctx); - } +extern "C" fn app_startup>(event: *const UiEvent, data: *mut c_void) { + app_callback(event, data, |app: &mut A, ctx| { + app.on_startup(ctx); + }); } +extern "C" fn app_new_window>(event: *const UiEvent, data: *mut c_void) { + app_callback(event, data, |app: &mut A, ctx| { + app.on_new_window(ctx); + }); +} + +extern "C" fn app_exit>(event: *const UiEvent, data: *mut c_void) { + app_callback(event, data, |app: &mut A, ctx| { + app.on_exit(ctx); + }); +} + + pub fn app_run(app: &mut A) where T: UiModel + UiActions, @@ -121,6 +123,7 @@ where app.init_actions(&ctx); let ptr: *mut A = app; let c_ptr: *mut c_void = ptr as *mut c_void; + ui_oninit(Some(app_init::), c_ptr); ui_onstartup(Some(app_startup::), c_ptr); ui_onnewwindow(Some(app_new_window::), c_ptr); ui_onexit(Some(app_exit::), c_ptr); diff --git a/ui-rs/src/ui/menu.rs b/ui-rs/src/ui/menu.rs index 9d84e23..b5b2c4c 100644 --- a/ui-rs/src/ui/menu.rs +++ b/ui-rs/src/ui/menu.rs @@ -135,6 +135,7 @@ pub struct MenuToggleItemBuilder { pub type ToggleItemCreate = unsafe extern "C" fn(*const UiMenuToggleItemArgs); + impl MenuItemBuilder { pub fn create(&mut self) { unsafe { diff --git a/ui/cocoa/AppDelegate.m b/ui/cocoa/AppDelegate.m index 690053f..d2415c2 100644 --- a/ui/cocoa/AppDelegate.m +++ b/ui/cocoa/AppDelegate.m @@ -37,8 +37,9 @@ @implementation AppDelegate - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { - ui_menu_init(); NSLog(@"toolkit applicationDidFinishLaunching"); + uic_application_init(NULL); + ui_menu_init(); uic_application_startup(NULL); } diff --git a/ui/common/app.c b/ui/common/app.c index e3bfd94..c1440ad 100644 --- a/ui/common/app.c +++ b/ui/common/app.c @@ -28,6 +28,8 @@ #include "app.h" +static ui_callback init_func; +static void *init_data; static ui_callback startup_func; static void *startup_data; static ui_callback newwindow_func; @@ -38,6 +40,11 @@ static ui_callback exit_func; void *exit_data; +void ui_oninit(ui_callback f, void *userdata) { + init_func = f; + init_data = userdata; +} + void ui_onstartup(ui_callback f, void *userdata) { startup_func = f; startup_data = userdata; @@ -58,6 +65,11 @@ void ui_onexit(ui_callback f, void *userdata) { exit_data = userdata; } +void uic_application_init(UiEvent *event) { + if(init_func) { + init_func(event, init_data); + } +} void uic_application_startup(UiEvent *event) { if(startup_func) { diff --git a/ui/common/app.h b/ui/common/app.h index 9176e85..14e55cf 100644 --- a/ui/common/app.h +++ b/ui/common/app.h @@ -35,6 +35,7 @@ extern "C" { #endif +void uic_application_init(UiEvent *event); void uic_application_startup(UiEvent *event); void uic_application_newwindow(UiEvent *event); void uic_application_open(UiEvent *event);