]> uap-core.de Git - note.git/commitdiff
add main menu, add separate app init method main
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 10 Jun 2026 16:20:50 +0000 (18:20 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 10 Jun 2026 16:20:50 +0000 (18:20 +0200)
application/src/main.rs
ui-rs/src/ui/application.rs
ui-rs/src/ui/menu.rs
ui/cocoa/AppDelegate.m
ui/common/app.c
ui/common/app.h

index 81403b7dd6ea201917c197ee723aae05f7e9cdcb..f6ad38c775bbedf7e221d73a583950f2ec36c5c7 100644 (file)
@@ -113,12 +113,11 @@ struct App {
 
 
 impl Application<MainWindow> for App {
-    fn on_startup(&mut self, app: &AppContext<MainWindow>) {
-        //app.menu("File", |menu| {
-        //    menu.item("Open").create();
-        //});
-
+    fn on_init(&mut self, app: &AppContext<MainWindow>) {
+        create_menubar(app);
         create_toolbar(app);
+    }
+    fn on_startup(&mut self, app: &AppContext<MainWindow>) {
         self.on_new_window(app);
     }
 
@@ -140,6 +139,13 @@ impl App {
     }
 }
 
+fn create_menubar(app: &AppContext<MainWindow>) {
+    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<MainWindow>) {
     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();
index 3791efbd829d58724b2415166dc21d4382a78260..14cbe3e2f0404a6010692b734d7d110bd1f97a75 100644 (file)
@@ -39,6 +39,7 @@ pub trait AppActions<T: UiModel + UiActions> {
 }
 
 pub trait Application<T: UiModel + UiActions>: AppActions<T> {
+    fn on_init(&mut self, _app: &AppContext<T>) {}
     fn on_startup(&mut self, app: &AppContext<T>);
 
     fn on_new_window(&mut self, _app: &AppContext<T>) {}
@@ -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<T: UiModel + UiActions, A: Application<T>>(_event: *const UiEvent, data: *mut c_void) {
+fn app_callback<F, T: UiModel + UiActions, A: Application<T>>(_event: *const UiEvent, data: *mut c_void, f: F)
+where F: FnOnce(&mut A, &AppContext<T>) {
     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<T: UiModel + UiActions, A: Application<T>>(_event: *co
             ctx: global_ctx,
             _marker: PhantomData,
         };
-        app_ref.on_startup(&ctx);
+        f(app_ref, &ctx);
     }
 }
 
-extern "C" fn app_new_window<T: UiModel + UiActions, A: Application<T>>(_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::<T> {
-            ctx: global_ctx,
-            _marker: PhantomData,
-        };
-        app_ref.on_new_window(&ctx);
-    }
+extern "C" fn app_init<T: UiModel + UiActions, A: Application<T>>(event: *const UiEvent, data: *mut c_void) {
+    app_callback(event, data, |app: &mut A, ctx| {
+        app.on_init(ctx);
+    });
 }
 
-extern "C" fn app_exit<T: UiModel + UiActions, A: Application<T>>(_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::<T> {
-            ctx: global_ctx,
-            _marker: PhantomData,
-        };
-        app_ref.on_exit(&ctx);
-    }
+extern "C" fn app_startup<T: UiModel + UiActions, A: Application<T>>(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<T: UiModel + UiActions, A: Application<T>>(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<T: UiModel + UiActions, A: Application<T>>(event: *const UiEvent, data: *mut c_void) {
+    app_callback(event, data, |app: &mut A, ctx| {
+        app.on_exit(ctx);
+    });
+}
+
+
 pub fn app_run<T, A>(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::<T, A>), c_ptr);
         ui_onstartup(Some(app_startup::<T, A>), c_ptr);
         ui_onnewwindow(Some(app_new_window::<T, A>), c_ptr);
         ui_onexit(Some(app_exit::<T, A>), c_ptr);
index 9d84e235328c73859bee020dc2ce5428c46b5f36..b5b2c4c68e8cc3e28cf10d249a77d7e56db731e2 100644 (file)
@@ -135,6 +135,7 @@ pub struct MenuToggleItemBuilder<T: UiModel + UiActions> {
 
 pub type ToggleItemCreate = unsafe extern "C" fn(*const UiMenuToggleItemArgs);
 
+
 impl<T: UiModel + UiActions> MenuItemBuilder<T> {
     pub fn create(&mut self) {
         unsafe {
index 690053f991a3f37c5fc044b118f5794212b88662..d2415c24a3badf68871959725b9e8ddebd162e7a 100644 (file)
@@ -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);
 }
 
index e3bfd94037d4935355f18738df6ca465e32ab6b0..c1440adf4bfc75ffcd34e5f70c5101277debb55c 100644 (file)
@@ -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) {
index 9176e85f8f99e2466e9c8a068835cf41accea6d8..14e55cf1fd44b8a4742a6892304d3055d6a0f64d 100644 (file)
@@ -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);