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);
}
}
}
+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();
}
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>) {}
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);
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;
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,
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);