# HG changeset patch # User Olaf Wintermann # Date 1755942310 -7200 # Node ID 0598e70c64892f8a9bb5ae18a66f2791bd3fbf86 # Parent e9f63774b0e0bd2c299fb650373e36affc064e4f add toolbar menu item (Cocoa) diff -r e9f63774b0e0 -r 0598e70c6489 make/xcode/toolkit/toolkit/main.m --- 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; } diff -r e9f63774b0e0 -r 0598e70c6489 ui/cocoa/Toolbar.h --- 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); diff -r e9f63774b0e0 -r 0598e70c6489 ui/cocoa/Toolbar.m --- 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 #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; +} diff -r e9f63774b0e0 -r 0598e70c6489 ui/cocoa/menu.h --- 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); diff -r e9f63774b0e0 -r 0598e70c6489 ui/cocoa/menu.m --- 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++;