add toolbar menu item (Cocoa)

Sat, 23 Aug 2025 11:45:10 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 23 Aug 2025 11:45:10 +0200
changeset 708
0598e70c6489
parent 707
e9f63774b0e0
child 709
131d38916ac7

add toolbar menu item (Cocoa)

make/xcode/toolkit/toolkit/main.m file | annotate | diff | comparison | revisions
ui/cocoa/Toolbar.h file | annotate | diff | comparison | revisions
ui/cocoa/Toolbar.m file | annotate | diff | comparison | revisions
ui/cocoa/menu.h file | annotate | diff | comparison | revisions
ui/cocoa/menu.m file | annotate | diff | comparison | revisions
--- a/make/xcode/toolkit/toolkit/main.m	Sat Aug 23 10:23:16 2025 +0200
+++ b/make/xcode/toolkit/toolkit/main.m	Sat Aug 23 11:45:10 2025 +0200
@@ -59,6 +59,10 @@
     printf("toolbar toggle button %d %d\n", event->intval, i);
 }
 
+static void action_menuitem(UiEvent *event, void *userdata) {
+    printf("menuitem\n");
+}
+
 void application_startup(UiEvent *event, void *data) {
     UiObject *obj = ui_window("My Window", NULL);
     //WindowData *wdata = ui_malloc(obj->ctx, sizeof(WindowData));
@@ -93,7 +97,7 @@
     
     // menu
     ui_menu("File") {
-        ui_menuitem(.label = "Test");
+        ui_menuitem(.label = "Test", .onclick = action_menuitem);
     }
     
     ui_menu("Edit") {
@@ -113,11 +117,16 @@
     ui_toolbar_item("item1", .label = "Test 1", .icon = "NSImageNameGoBackTemplate", .onclick = toolbar_action);
     ui_toolbar_item("item2", .label = "Test 2", .icon = "NSImageNameGoForwardTemplate", .onclick = toolbar_action);
     ui_toolbar_toggleitem("item3", .label = "Toggle", .icon = "NSImageNameActionTemplate", .varname = "tbtoggle", .onchange = toolbar_toggle);
+    ui_toolbar_menu("item4", .label = "Add", .icon = "NSImageNameAddTemplate") {
+        ui_menuitem(.label = "Test1");
+    }
     
+    ui_toolbar_add_default("item4", UI_TOOLBAR_LEFT);
     ui_toolbar_add_default("item3", UI_TOOLBAR_LEFT);
     ui_toolbar_add_default("item1", UI_TOOLBAR_LEFT);
     ui_toolbar_add_default("item2", UI_TOOLBAR_RIGHT);
     
+    
     ui_main();
     return 0;
 }
--- a/ui/cocoa/Toolbar.h	Sat Aug 23 10:23:16 2025 +0200
+++ b/ui/cocoa/Toolbar.h	Sat Aug 23 11:45:10 2025 +0200
@@ -71,6 +71,7 @@
 
 NSToolbarItem* ui_nstoolbaritem_create_item(UiObject *obj, UiToolbarItem *item, NSString *identifier);
 NSToolbarItem* ui_nstoolbaritem_create_toggle(UiObject *obj, UiToolbarToggleItem *item, NSString *identifier);
+NSToolbarItem* ui_nstoolbaritem_create_menu(UiObject *obj, UiToolbarMenuItem *item, NSString *identifier);
 
 int64_t ui_toolbar_seg_toggleitem_get(UiInteger *i);
 void ui_toolbar_seg_toggleitem_set(UiInteger *i, int64_t value);
--- a/ui/cocoa/Toolbar.m	Sat Aug 23 10:23:16 2025 +0200
+++ b/ui/cocoa/Toolbar.m	Sat Aug 23 11:45:10 2025 +0200
@@ -29,6 +29,7 @@
 #import "Toolbar.h"
 #import "EventData.h"
 #import "image.h"
+#import "menu.h"
 #import <objc/runtime.h>
 
 #include "../common/toolbar.h"
@@ -104,6 +105,9 @@
         case UI_TOOLBAR_TOGGLEITEM: {
             return ui_nstoolbaritem_create_toggle(_obj, (UiToolbarToggleItem*)item, itemIdentifier);
         }
+        case UI_TOOLBAR_MENU: {
+            return ui_nstoolbaritem_create_menu(_obj, (UiToolbarMenuItem*)item, itemIdentifier);
+        }
     }
     
     return nil;
@@ -151,7 +155,6 @@
         button.label = label;
     }
     if(item->args.icon) {
-        //button.image = [NSImage imageNamed: [[NSString alloc] initWithUTF8String:item->args.icon]];
         button.image = ui_cocoa_named_icon(item->args.icon);
     }
     
@@ -219,3 +222,24 @@
     i->value = value;
     [seg setSelected:value != 0 forSegment:0];
 }
+
+NSToolbarItem* ui_nstoolbaritem_create_menu(UiObject *obj, UiToolbarMenuItem *item, NSString *identifier) {
+    NSMenuToolbarItem *button = [[NSMenuToolbarItem alloc] initWithItemIdentifier: identifier];
+    button.bordered = YES;
+    
+    if(item->args.label) {
+        NSString *label = [[NSString alloc] initWithUTF8String:item->args.label];
+        button.paletteLabel = label;
+        button.label = label;
+    }
+    if(item->args.icon) {
+        button.image = ui_cocoa_named_icon(item->args.icon);
+    }
+    
+    NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
+    ui_add_menu_items(menu, 0, &item->menu);
+    
+    button.menu = menu;
+    
+    return button;
+}
--- a/ui/cocoa/menu.h	Sat Aug 23 10:23:16 2025 +0200
+++ b/ui/cocoa/menu.h	Sat Aug 23 11:45:10 2025 +0200
@@ -55,4 +55,6 @@
 void add_checkitemnv_widget(NSMenu *parent, int i, UiMenuItemI *item);
 void add_menuitem_list_widget(NSMenu *parent, int i, UiMenuItemI *item);
 
+void ui_add_menu_items(NSMenu *parent, int i, UiMenu *menu);
+
 NSArray* ui_get_binding_items(void);
--- a/ui/cocoa/menu.m	Sat Aug 23 10:23:16 2025 +0200
+++ b/ui/cocoa/menu.m	Sat Aug 23 11:45:10 2025 +0200
@@ -63,7 +63,7 @@
     /* UI_MENU_SEPARATOR       */ add_menuseparator_widget
 };
 
-static void add_menu_items(NSMenu *parent, int i, UiMenu *menu) {
+void ui_add_menu_items(NSMenu *parent, int i, UiMenu *menu) {
     UiMenuItemI *it = menu->items_begin;
     int index = 0;
     while(it) {
@@ -80,7 +80,7 @@
     NSMenuItem *menuItem = [parent addItemWithTitle:str action:nil keyEquivalent:@""];
     [parent setSubmenu:menu forItem:menuItem];
     
-    add_menu_items(menu, i, it);
+    ui_add_menu_items(menu, i, it);
 }
 
 void add_menuitem_widget(NSMenu *parent, int i, UiMenuItemI *item) {
@@ -154,7 +154,7 @@
             NSMenuItem *menuItem = [[NSApp mainMenu] insertItemWithTitle:str action:nil keyEquivalent:@"" atIndex:index];
             [[NSApp mainMenu] setSubmenu:menu forItem:menuItem];
             
-            add_menu_items(menu, 0, ls);
+            ui_add_menu_items(menu, 0, ls);
         }
         ls = (UiMenu*)ls->item.next;
         index++;

mercurial