merge

Fri, 08 Aug 2025 21:20:08 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 08 Aug 2025 21:20:08 +0200
changeset 689
2a739c195296
parent 688
a3a057c0a0b6 (current diff)
parent 687
d43b4fcd3d8c (diff)
child 690
c1fc788d982d

merge

--- a/make/xcode/toolkit/toolkit/main.m	Fri Aug 08 21:19:36 2025 +0200
+++ b/make/xcode/toolkit/toolkit/main.m	Fri Aug 08 21:20:08 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	Fri Aug 08 21:19:36 2025 +0200
+++ b/ui/cocoa/Toolbar.m	Fri Aug 08 21:20:08 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	Fri Aug 08 21:19:36 2025 +0200
+++ b/ui/cocoa/image.h	Fri Aug 08 21:20:08 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	Fri Aug 08 21:19:36 2025 +0200
+++ b/ui/cocoa/image.m	Fri Aug 08 21:20:08 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/text.m	Fri Aug 08 21:19:36 2025 +0200
+++ b/ui/cocoa/text.m	Fri Aug 08 21:20:08 2025 +0200
@@ -85,7 +85,6 @@
     NSTextStorage *textStorage;
     if(text->data1) {
         textStorage = (__bridge NSTextStorage*)text->data1;
-        
     } else {
         textStorage = [[NSTextStorage alloc] init];
     }
@@ -94,43 +93,83 @@
 }
 
 void ui_textarea_set(UiText *text, const char *str) {
-    
+    NSTextView *textview = (__bridge NSTextView*)text->obj;
+    if(text->value.free) {
+        text->value.free(text->value.ptr);
+    }
+    text->value.ptr = strdup(str);
+    text->value.free = free;
+    textview.string = [[NSString alloc] initWithUTF8String:str];
 }
 
 char* ui_textarea_get(UiText *text) {
-    return NULL;
+    NSTextView *textview = (__bridge NSTextView*)text->obj;
+    if(text->value.free) {
+        text->value.free(text->value.ptr);
+    }
+    text->value.ptr = strdup(textview.string.UTF8String);
+    text->value.free = free;
+    return text->value.ptr;
 }
 
 char* ui_textarea_getsubstr(UiText *text, int begin, int end) {
-    return NULL;
+    NSTextView *textview = (__bridge NSTextView*)text->obj;
+    NSString *str = textview.string;
+    NSRange range = NSMakeRange(begin, end-begin);
+    NSString *sub = [str substringWithRange:range];
+    return strdup(sub.UTF8String);
 }
 
 void ui_textarea_insert(UiText *text, int pos, char *str) {
-    
+    NSTextView *textview = (__bridge NSTextView*)text->obj;
+    NSString *s = [[NSString alloc] initWithUTF8String:str];
+    NSAttributedString *attributedStr = [[NSAttributedString alloc] initWithString:s];
+    [textview.textStorage insertAttributedString:attributedStr atIndex:pos];
 }
 
 void ui_textarea_setposition(UiText *text, int pos) {
-    
+    NSTextView *textview = (__bridge NSTextView*)text->obj;
+    NSRange range = NSMakeRange(pos, 0);
+    [textview setSelectedRange:range];
 }
 
 int ui_textarea_position(UiText *text) {
-    return 0;
+    NSTextView *textview = (__bridge NSTextView*)text->obj;
+    NSRange range = textview.selectedRange;
+    return (int)range.location;
 }
 
 void ui_textarea_setselection(UiText *text, int begin, int end) {
-    
+    NSTextView *textview = (__bridge NSTextView*)text->obj;
+    NSRange range = NSMakeRange(begin, end-begin);
+    [textview setSelectedRange:range];
 }
 
 void ui_textarea_selection(UiText *text, int *begin, int *end) {
-    
+    NSTextView *textview = (__bridge NSTextView*)text->obj;
+    NSRange range = textview.selectedRange;
+    if(begin) {
+        *begin = (int)range.location;
+    }
+    if(end) {
+        *end = (int)(range.location+range.length);
+    }
 }
 
 int ui_textarea_length(UiText *text) {
-    return 0;
+    NSTextView *textview = (__bridge NSTextView*)text->obj;
+    return (int)textview.string.length;
 }
 
 void ui_textarea_remove(UiText *text, int begin, int end) {
+    NSTextView *textview = (__bridge NSTextView*)text->obj;
     
+    if (begin < 0 || end < begin || end > textview.string.length) {
+        return;
+    }
+    
+    NSRange range = NSMakeRange(begin, end - begin);
+    [[textview textStorage] deleteCharactersInRange:range];
 }
 
 
--- a/ui/cocoa/toolkit.m	Fri Aug 08 21:19:36 2025 +0200
+++ b/ui/cocoa/toolkit.m	Fri Aug 08 21:20:08 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