--- 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