ui/cocoa/text.m

changeset 1102
c4883a63929b
parent 1086
33395e907ff6
--- a/ui/cocoa/text.m	Wed Apr 22 10:07:54 2026 +0200
+++ b/ui/cocoa/text.m	Wed Apr 22 19:29:26 2026 +0200
@@ -29,6 +29,7 @@
 #import "text.h"
 #import "EventData.h"
 #import "container.h"
+#import "action.h"
 #import <objc/runtime.h>
 
 UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) {
@@ -186,6 +187,10 @@
 
 /* -------------------------- TextField -------------------------- */
 
+static void textfield_geteventdata(id sender, UiVar *var, void **eventdata, int *eventdatatype, int *value) {
+    
+}
+
 static UIWIDGET textfield_create(UiObject *obj, UiTextFieldArgs *args, BOOL password, BOOL frameless) {
     NSTextField *textfield;
     if(password) {
@@ -222,6 +227,27 @@
         s->set = ui_textfield_set;
     }
     
+    if(args->onactivate || args->onactivate_action) {
+        EventData *event = [[EventData alloc] init:args->onactivate userdata:args->onactivatedata action:args->onactivate_action];
+        event.get_eventdata = textfield_geteventdata;
+        event.obj = obj;
+        textfield.target = event;
+        textfield.action = @selector(handleEventWithEventData:);
+        objc_setAssociatedObject(textfield, "eventdata", event, OBJC_ASSOCIATION_RETAIN);
+        ui_cocoa_view_bind_action(obj->ctx, textfield, args->onactivate_action);
+    }
+    
+    if(args->onchange || args->onchange_action) {
+        TextFieldDelegate *tfd = [[TextFieldDelegate alloc]init:obj var:var];
+        tfd.onchange = args->onchange;
+        tfd.onchangedata = args->onchangedata;
+        if(args->onchange_action) {
+            tfd.onchange_action = [[NSString alloc]initWithUTF8String:args->onchange_action];
+        }
+        objc_setAssociatedObject(textfield, "delegate", tfd, OBJC_ASSOCIATION_RETAIN);
+        textfield.delegate = tfd;
+    }
+    
     return (__bridge void*)textfield;
 }
 
@@ -306,3 +332,41 @@
     NSRange selectedRange = [editor selectedRange];
     return (int)selectedRange.location;
 }
+
+
+/* -------------------- textfield delegate -------------------- */
+
+@implementation TextFieldDelegate
+
+- (id)init:(UiObject*)obj var:(UiVar*)var {
+    self.obj = obj;
+    self.var = var;
+    return self;
+}
+
+- (void)controlTextDidChange:(NSNotification *)obj {
+    UiString *value = _var ? _var->value : NULL;
+    
+    UiEvent e;
+    e.obj = _obj;
+    e.window = e.obj->window;
+    e.document = e.obj->ctx->document;
+    e.eventdata = value;
+    e.eventdatatype = value ? UI_EVENT_DATA_STRING_VALUE : 0;
+    e.intval = 0;
+    e.set = ui_get_setop();
+    
+    if(_onchange) {
+        _onchange(&e, _onchangedata);
+    }
+    
+    if(_var) {
+        ui_notify_evt(value->observers, &e);
+    }
+    
+    if(_onchange_action) {
+        uic_action_callback(&e, _onchange_action.UTF8String);
+    }
+}
+
+@end

mercurial