ui/cocoa/menu.m

changeset 108
77254bd6dccb
parent 103
6606616eca9f
child 109
c3dfcb8f0be7
--- a/ui/cocoa/menu.m	Sat Apr 05 17:57:04 2025 +0200
+++ b/ui/cocoa/menu.m	Sun Jul 20 22:04:39 2025 +0200
@@ -30,9 +30,27 @@
 #import <stdlib.h>
 #import <string.h>
 #import <stdarg.h>
+#import <objc/runtime.h>
 
 #import "menu.h"
 #import "window.h"
+#import "EventData.h"
+
+#pragma GCC diagnostic ignored "-Wundeclared-selector"
+#pragma clang diagnostic ignored "-Wundeclared-selector"
+
+// holds all items that need bindings
+// value type: MenuItem*
+static NSMutableArray *bindingItems;
+
+@implementation MenuItem
+
+- (MenuItem*)init:(int)itId {
+    self.itemId = [[NSString alloc] initWithFormat:@"item%d", itId];
+    return self;
+}
+
+@end
 
 static ui_menu_add_f createMenuItem[] = {
     /* UI_MENU                 */ add_menu_widget,
@@ -67,20 +85,51 @@
 
 void add_menuitem_widget(NSMenu *parent, int i, UiMenuItemI *item) {
     UiMenuItem *it = (UiMenuItem*)item;
+    
     NSString *str = [[NSString alloc] initWithUTF8String:it->label];
-    NSMenuItem *menuItem = [parent addItemWithTitle:str action:nil keyEquivalent:@""];
+    NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuItemAction:) keyEquivalent:@""];
+    
+    if(it->callback) {
+        EventData *event = [[EventData alloc] init:it->callback userdata:it->userdata];
+        objc_setAssociatedObject(menuItem, "eventdata", event, OBJC_ASSOCIATION_RETAIN);
+    }
 }
 
 void add_menuseparator_widget(NSMenu *parent, int i, UiMenuItemI *item) {
-    
+    NSMenuItem *menuItem = [NSMenuItem separatorItem];
+    [parent addItem:menuItem];
 }
 
+static int nItem = 0;
+
 void add_checkitem_widget(NSMenu *parent, int i, UiMenuItemI *item) {
+    UiMenuCheckItem *it = (UiMenuCheckItem*)item;
     
+    NSString *str = [[NSString alloc] initWithUTF8String:it->label];
+    NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuCheckItemAction:) keyEquivalent:@""];
+    
+    MenuItem *mItem = [[MenuItem alloc] init:nItem++];
+    mItem.callback = it->callback;
+    mItem.userdata = it->userdata;
+    mItem.checkItem = it;
+    
+    objc_setAssociatedObject(menuItem, "menuitem", mItem, OBJC_ASSOCIATION_RETAIN);
+    [bindingItems addObject:mItem];
 }
 
 void add_radioitem_widget(NSMenu *parent, int index, UiMenuItemI *item) {
+    UiMenuRadioItem *it = (UiMenuRadioItem*)item;
     
+    NSString *str = [[NSString alloc] initWithUTF8String:it->label];
+    NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuRadioItemAction:) keyEquivalent:@""];
+    
+    MenuItem *mItem = [[MenuItem alloc] init:nItem++];
+    mItem.callback = it->callback;
+    mItem.userdata = it->userdata;
+    mItem.radioItem = it;
+    
+    objc_setAssociatedObject(menuItem, "menuitem", mItem, OBJC_ASSOCIATION_RETAIN);
+    [bindingItems addObject:mItem];
 }
 
 void add_checkitemnv_widget(NSMenu *parent, int i, UiMenuItemI *item) {
@@ -93,17 +142,25 @@
 
 
 void ui_menu_init(void) {
+    bindingItems = [[NSMutableArray alloc] init];
+    
     UiMenu *menus_begin = uic_get_menu_list();
     UiMenu *ls = menus_begin;
+    int index = 1;
     while(ls) {
         if(ls->item.type == UI_MENU) {
             NSString *str = [[NSString alloc] initWithUTF8String:ls->label];
             NSMenu *menu = [[NSMenu alloc] initWithTitle: str];
-            NSMenuItem *menuItem = [[NSApp mainMenu] addItemWithTitle:str action:nil keyEquivalent:@""];
+            NSMenuItem *menuItem = [[NSApp mainMenu] insertItemWithTitle:str action:nil keyEquivalent:@"" atIndex:index];
             [[NSApp mainMenu] setSubmenu:menu forItem:menuItem];
             
             add_menu_items(menu, 0, ls);
         }
         ls = (UiMenu*)ls->item.next;
+        index++;
     }
 }
+
+NSArray* ui_get_binding_items(void) {
+    return bindingItems;
+}

mercurial