add support for toolbar icons (Cocoa)

Sun, 03 Aug 2025 12:26:06 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 03 Aug 2025 12:26:06 +0200
changeset 687
d43b4fcd3d8c
parent 686
1e2f3a44d455
child 689
2a739c195296

add support for toolbar icons (Cocoa)

make/xcode/toolkit/toolkit/main.m file | annotate | diff | comparison | revisions
ui/cocoa/Toolbar.m file | annotate | diff | comparison | revisions
ui/cocoa/image.h file | annotate | diff | comparison | revisions
ui/cocoa/image.m file | annotate | diff | comparison | revisions
ui/cocoa/toolkit.m file | annotate | diff | comparison | revisions
--- a/make/xcode/toolkit/toolkit/main.m	Sun Aug 03 10:53:58 2025 +0200
+++ b/make/xcode/toolkit/toolkit/main.m	Sun Aug 03 12:26:06 2025 +0200
@@ -34,6 +34,10 @@
     printf("button click\n");
 }
 
+static void toolbar_action(UiEvent *event, void *userdata) {
+    printf("toolbar item\n");
+}
+
 void application_startup(UiEvent *event, void *data) {
     UiObject *obj = ui_window("My Window", NULL);
     
@@ -80,11 +84,11 @@
         }
     }
     
-    ui_toolbar_item("item1", .label = "Test 1");
-    ui_toolbar_item("item2", .label = "Test 2");
+    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_add_default("item1", UI_TOOLBAR_LEFT);
-    ui_toolbar_add_default("item1", UI_TOOLBAR_RIGHT);
+    ui_toolbar_add_default("item2", UI_TOOLBAR_RIGHT);
     
     ui_main();
     return 0;
--- a/ui/cocoa/Toolbar.m	Sun Aug 03 10:53:58 2025 +0200
+++ b/ui/cocoa/Toolbar.m	Sun Aug 03 12:26:06 2025 +0200
@@ -28,6 +28,7 @@
 
 #import "Toolbar.h"
 #import "EventData.h"
+#import "image.h"
 #import <objc/runtime.h>
 
 #include "../common/toolbar.h"
@@ -111,20 +112,17 @@
 @end
 
 NSToolbarItem* ui_nstoolbaritem_create_item(UiObject *obj, UiToolbarItem *item, NSString *identifier) {
-    NSToolbarItem *tbItem = [[NSToolbarItem alloc] initWithItemIdentifier: identifier];
-    
-    NSButton *button = [[NSButton alloc] init];
-    tbItem.view = button;
+    NSToolbarItem *button = [[NSToolbarItem alloc] initWithItemIdentifier: identifier];
+    button.bordered = YES;
     
     if(item->args.label) {
         NSString *label = [[NSString alloc] initWithUTF8String:item->args.label];
-        [tbItem setLabel:label];
-        if(!item->args.icon) {
-            button.title = label;
-        }
+        button.paletteLabel = label;
+        button.label = label;
     }
     if(item->args.icon) {
-        button.image = [NSImage imageNamed: [[NSString alloc] initWithUTF8String:item->args.icon]];
+        //button.image = [NSImage imageNamed: [[NSString alloc] initWithUTF8String:item->args.icon]];
+        button.image = ui_cocoa_named_icon(item->args.icon);
     }
     
     if(item->args.onclick) {
@@ -134,7 +132,7 @@
         button.action = @selector(handleEvent:);
         objc_setAssociatedObject(button, "eventdata", event, OBJC_ASSOCIATION_RETAIN);
     }
-    return tbItem;
+    return button;
 }
 
 NSToolbarItem* ui_nstoolbaritem_create_toggle(UiObject *obj, UiToolbarToggleItem *item, NSString *identifier) {
--- a/ui/cocoa/image.h	Sun Aug 03 10:53:58 2025 +0200
+++ b/ui/cocoa/image.h	Sun Aug 03 12:26:06 2025 +0200
@@ -29,3 +29,7 @@
 #include "../ui/image.h"
 
 #include "Container.h"
+
+void ui_icon_init(void);
+
+NSImage* ui_cocoa_named_icon(const char *name);
--- a/ui/cocoa/image.m	Sun Aug 03 10:53:58 2025 +0200
+++ b/ui/cocoa/image.m	Sun Aug 03 12:26:06 2025 +0200
@@ -28,6 +28,35 @@
 
 #import "image.h"
 
+static NSDictionary *standardIconNames;
+
+void ui_icon_init(void) {
+    standardIconNames = @{
+        @"NSImageNameActionTemplate": NSImageNameActionTemplate,
+        @"NSImageNameAddTemplate": NSImageNameAddTemplate,
+        @"NSImageNameAdvanced": NSImageNameAdvanced,
+        @"NSImageNameApplicationIcon": NSImageNameApplicationIcon,
+        @"NSImageNameBluetoothTemplate": NSImageNameBluetoothTemplate,
+        @"NSImageNameBonjour": NSImageNameBonjour,
+        @"NSImageNameBookmarksTemplate": NSImageNameBookmarksTemplate,
+        @"NSImageNameCaution": NSImageNameCaution,
+        // TODO
+        @"NSImageNameRefreshTemplate": NSImageNameRefreshTemplate,
+        @"NSImageNameFolder": NSImageNameFolder,
+        @"NSImageNameGoForwardTemplate": NSImageNameGoForwardTemplate,
+        @"NSImageNameGoBackTemplate": NSImageNameGoBackTemplate
+    };
+}
+
+NSImage* ui_cocoa_named_icon(const char *name) {
+    NSString *imageName = [[NSString alloc] initWithUTF8String:name];
+    NSString *imgName = [standardIconNames objectForKey:imageName];
+    if(imgName) {
+        imageName = imgName;
+    }
+    return [NSImage imageNamed:imageName];
+}
+
 
 void ui_image_ref(UIIMAGE img) {
     // TODO
--- a/ui/cocoa/toolkit.m	Sun Aug 03 10:53:58 2025 +0200
+++ b/ui/cocoa/toolkit.m	Sun Aug 03 12:26:06 2025 +0200
@@ -34,6 +34,7 @@
 #include "../common/toolbar.h"
 #include "../common/threadpool.h"
 
+#import "image.h"
 #import "menu.h"
 #import "Toolbar.h"
 
@@ -72,7 +73,9 @@
     //[NSBundle loadNibNamed:@"MainMenu" owner:NSApp ];
     //[[NSBundle mainBundle] loadNibNamed:@"MainMenu" owner:NSApp topLevelObjects:&topLevelObjects];
     
+    ui_icon_init();
     ui_toolbar_init();
+    
 }
 
 const char* ui_appname() {

mercurial