implement actions for toolbar items (Cocoa)

Wed, 03 Jun 2026 19:07:24 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 03 Jun 2026 19:07:24 +0200
changeset 1162
3a2bf1795579
parent 1161
6cac1a5b4c47
child 1163
a32411b88442

implement actions for toolbar items (Cocoa)

make/xcode/toolkit/toolkit.xcodeproj/project.pbxproj file | annotate | diff | comparison | revisions
ui/cocoa/Toolbar.m file | annotate | diff | comparison | revisions
--- a/make/xcode/toolkit/toolkit.xcodeproj/project.pbxproj	Tue Jun 02 20:14:14 2026 +0200
+++ b/make/xcode/toolkit/toolkit.xcodeproj/project.pbxproj	Wed Jun 03 19:07:24 2026 +0200
@@ -11,6 +11,7 @@
 		ED2F55AE2E34FAD800A84793 /* Toolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = ED2F55AD2E34FAD800A84793 /* Toolbar.m */; };
 		ED3EDBD82F96B1910096E507 /* action.m in Sources */ = {isa = PBXBuildFile; fileRef = ED3EDBD72F96B1910096E507 /* action.m */; };
 		ED3EDBF42F96B2F80096E507 /* action.c in Sources */ = {isa = PBXBuildFile; fileRef = ED3EDBF32F96B2F80096E507 /* action.c */; };
+		ED4AB28E2FD09446001B6C02 /* icons.c in Sources */ = {isa = PBXBuildFile; fileRef = ED4AB28D2FD09446001B6C02 /* icons.c */; };
 		ED52BFB02D86FC5D00FD8BE5 /* text.m in Sources */ = {isa = PBXBuildFile; fileRef = ED52BFAF2D86FC5D00FD8BE5 /* text.m */; };
 		ED6580EE2CFF19F900F5402F /* context.c in Sources */ = {isa = PBXBuildFile; fileRef = ED6580DD2CFF19F900F5402F /* context.c */; };
 		ED6580EF2CFF19F900F5402F /* menu.c in Sources */ = {isa = PBXBuildFile; fileRef = ED6580E12CFF19F900F5402F /* menu.c */; };
@@ -76,6 +77,8 @@
 		ED3EDBE12F96B2100096E507 /* action.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = action.h; path = ../../../ui/cocoa/action.h; sourceTree = "<absolute>"; };
 		ED3EDBF22F96B2F80096E507 /* action.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = action.h; path = ../../../ui/common/action.h; sourceTree = "<absolute>"; };
 		ED3EDBF32F96B2F80096E507 /* action.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = action.c; path = ../../../ui/common/action.c; sourceTree = "<absolute>"; };
+		ED4AB28C2FD09446001B6C02 /* icons.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = icons.h; path = /Users/olaf/Projekte/toolkit/ui/common/icons.h; sourceTree = "<absolute>"; };
+		ED4AB28D2FD09446001B6C02 /* icons.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = icons.c; path = /Users/olaf/Projekte/toolkit/ui/common/icons.c; sourceTree = "<absolute>"; };
 		ED52BFAE2D86FC5D00FD8BE5 /* text.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = text.h; path = ../../../ui/cocoa/text.h; sourceTree = "<absolute>"; };
 		ED52BFAF2D86FC5D00FD8BE5 /* text.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = text.m; path = ../../../ui/cocoa/text.m; sourceTree = "<absolute>"; };
 		ED6580AC2CFF122700F5402F /* toolkit.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = toolkit.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -251,6 +254,8 @@
 		ED6580D92CFF19DB00F5402F /* common */ = {
 			isa = PBXGroup;
 			children = (
+				ED4AB28C2FD09446001B6C02 /* icons.h */,
+				ED4AB28D2FD09446001B6C02 /* icons.c */,
 				ED3EDBF22F96B2F80096E507 /* action.h */,
 				ED3EDBF32F96B2F80096E507 /* action.c */,
 				ED67B50C2EEDB89300DA8FD6 /* app.h */,
@@ -496,6 +501,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				ED4AB28E2FD09446001B6C02 /* icons.c in Sources */,
 				ED679B0A2E5B266C001D4F71 /* label.m in Sources */,
 				ED6FB03D2E95466F006C6E8E /* args.c in Sources */,
 				ED6FB03E2E95466F006C6E8E /* container.c in Sources */,
--- a/ui/cocoa/Toolbar.m	Tue Jun 02 20:14:14 2026 +0200
+++ b/ui/cocoa/Toolbar.m	Wed Jun 03 19:07:24 2026 +0200
@@ -39,7 +39,21 @@
     
 }
 
+static void toolitem_set_enabled(void *item, int enabled) {
+    NSToolbarItem *i = (__bridge NSToolbarItem*)item;
+    i.enabled = enabled;
+}
 
+static void toolitem_bind_action(UiContext *ctx, NSToolbarItem *item, const char *action) {
+    if(action) {
+        void *widget = (__bridge void*)item;
+        uic_bind_action(ctx, action, widget, (ui_enablefunc)toolitem_set_enabled);
+        UiAction *ui_action = uic_resolve_action(ctx, action);
+        if(!ui_action) {
+            toolitem_set_enabled(widget, FALSE);
+        }
+    }
+}
 
 /* ---------------------      UiToolbar      --------------------- */
 
@@ -219,12 +233,14 @@
         button.image = ui_cocoa_named_icon(item->args.icon);
     }
     
-    if(item->args.onclick) {
+    if(item->args.onclick || item->args.action) {
         EventData *event = [[EventData alloc] init:item->args.onclick userdata:item->args.onclickdata action:item->args.action];
         event.obj = obj;
         button.target = event;
         button.action = @selector(handleEvent:);
         objc_setAssociatedObject(button, "eventdata", event, OBJC_ASSOCIATION_RETAIN);
+        
+        toolitem_bind_action(obj->ctx, button, item->args.action);
     }
     return button;
 }

mercurial