impl Application<MainWindow> for App {
- fn on_init(&mut self, app: &AppContext<MainWindow>) {
+ fn on_startup(&mut self, app: &AppContext<MainWindow>) {
create_menubar(app);
create_toolbar(app);
- }
- fn on_startup(&mut self, app: &AppContext<MainWindow>) {
+
self.on_new_window(app);
}
}
};
self.selected_index = Some(selected_index);
+ let is_new = note.is_new();
let nav = NavigationItem { collection_id: self.collection_id, note_id: Some(note.id.clone()) };
let doc = if let Some(doc) = ¬e.model {
if let Some(mut nb) = self.doc_ref.get_doc() {
nb.ctx.attach(&doc);
- nb.ctx.call_action("textarea_focus");
+ if is_new {
+ nb.ctx.call_action("textarea_focus");
+ }
self.selected_note = Some(doc);
if add_to_nav {
}
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);
}
}
-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_startup<T: UiModel + UiActions, A: Application<T>>(event: *const UiEvent, data: *mut c_void) {
app_callback(event, data, |app: &mut A, ctx| {
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);
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
NSLog(@"toolkit applicationDidFinishLaunching");
- uic_application_init(NULL);
- ui_menu_init();
uic_application_startup(NULL);
+ // The menu init func can be called multiple times and is also called
+ // when a new window is created
+ // The only usecase for calling init here is, that an application might not
+ // open a window on startup, but wants a working menubar
+ ui_menu_init();
}
- (void)applicationWillTerminate:(NSNotification *)aNotification {
}
+static BOOL menu_is_initialized = NO;
+
void ui_menu_init(void) {
- bindingItems = [[NSMutableArray alloc] init];
-
UiMenu *menus_begin = uic_get_menu_list();
UiMenu *ls = menus_begin;
+
+ if(menu_is_initialized || !ls) {
+ return;
+ }
+ menu_is_initialized = YES;
+
+ bindingItems = [[NSMutableArray alloc] init];
+
int index = 1;
while(ls) {
if(ls->item.type == UI_MENU) {
#import "WindowManager.h"
#import "BoxContainer.h"
#import "EventData.h"
+#import "menu.h"
#import <objc/runtime.h>
}
static UiObject* create_window(const char *title, BOOL simple, BOOL sidebar, BOOL splitview) {
+ ui_menu_init();
UiObject *obj = uic_object_new_toplevel();
int width = window_default_width;
#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;
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;
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) {
startup_func(event, startup_data);
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);