Wed, 03 Jun 2026 20:19:27 +0200
implement textarea events (Cocoa)
| ui/cocoa/text.h | file | annotate | diff | comparison | revisions | |
| ui/cocoa/text.m | file | annotate | diff | comparison | revisions |
--- a/ui/cocoa/text.h Wed Jun 03 19:58:39 2026 +0200 +++ b/ui/cocoa/text.h Wed Jun 03 20:19:27 2026 +0200 @@ -48,6 +48,22 @@ char* ui_textfield_get(UiString *s); void ui_textfield_set(UiString *s, const char *value); + +@interface TextAreaDelegate: NSObject<NSTextViewDelegate, NSTextDelegate> + +@property UiObject *obj; +@property UiVar *var; +@property ui_callback onchange; +@property void *onchangedata; +@property NSString *onchange_action; +@property ui_callback ontextchanged; +@property void *ontextchangeddata; +@property NSString *ontextchanged_action; + +- (id)init:(UiObject*)obj var:(UiVar*)var args:(UiTextAreaArgs*)args; + +@end + @interface TextFieldDelegate : NSObject<NSTextFieldDelegate> @property UiObject *obj;
--- a/ui/cocoa/text.m Wed Jun 03 19:58:39 2026 +0200 +++ b/ui/cocoa/text.m Wed Jun 03 20:19:27 2026 +0200 @@ -72,6 +72,10 @@ text->remove = ui_textarea_remove; } + if(args->onchange || args->ontextchanged || args->onchange_action || args->ontextchanged_action) { + + } + return (__bridge void*)scrollview; } @@ -269,6 +273,110 @@ +@implementation TextAreaDelegate + +- (id)init:(UiObject*)obj var:(UiVar*)var args:(UiTextAreaArgs*)args { + self.onchange = args->onchange; + self.onchangedata = args->onchangedata; + if(args->onchange_action) { + self.onchange_action = [[NSString alloc]initWithUTF8String:args->onchange_action]; + } + self.ontextchanged = args->ontextchanged; + self.ontextchangeddata = args->ontextchangeddata; + if(args->ontextchanged_action) { + self.ontextchanged_action = [[NSString alloc]initWithUTF8String:args->ontextchanged_action]; + } + self.obj = obj; + self.var = var; + return self; +} + +- (BOOL) textView:(NSTextView *) textView + shouldChangeTextInRange:(NSRange) affectedCharRange + replacementString:(NSString *) replacementString { + + if(_onchange == nil && _onchange_action == nil) { + return YES; + } + + UiEvent event; + event.obj = _obj; + event.window = event.obj->window; + event.document = event.obj->ctx->document; + event.intval = 0; + event.set = ui_get_setop(); + // event data not set yet + + if(affectedCharRange.length > 0) { + UiTextChangeEventData eventdata; + eventdata.type = UI_TEXT_DELETE; + eventdata.begin = (int)affectedCharRange.location; + eventdata.end = (int)(affectedCharRange.location + affectedCharRange.length); + eventdata.text = NULL; + eventdata.length = 0; + + event.eventdata = &eventdata; + event.eventdatatype = UI_EVENT_DATA_TEXT_CHANGED; + + if(_onchange) { + _onchange(&event, _onchangedata); + } + + if(_onchange_action) { + uic_action_callback(&event, _onchange_action.UTF8String); + } + } + + if(replacementString.length > 0) { + UiTextChangeEventData eventdata; + eventdata.type = UI_TEXT_INSERT; + eventdata.begin = (int)affectedCharRange.location; + eventdata.end = 0; + eventdata.text = replacementString.UTF8String; + eventdata.length = (int)replacementString.length; + + event.eventdata = &eventdata; + event.eventdatatype = UI_EVENT_DATA_TEXT_CHANGED; + + if(_onchange) { + _onchange(&event, _onchangedata); + } + + if(_onchange_action) { + uic_action_callback(&event, _onchange_action.UTF8String); + } + } + + return YES; +} + +- (void) textDidChange:(NSNotification *) notification { + UiEvent event; + event.obj = _obj; + event.window = event.obj->window; + event.document = event.obj->ctx->document; + if(_var) { + event.eventdata = _var->value; + event.eventdatatype = UI_EVENT_DATA_TEXT_VALUE; + } else { + event.eventdata = NULL; + event.eventdatatype = 0; + } + event.intval = 0; + event.set = ui_get_setop(); + + if(_ontextchanged) { + _ontextchanged(&event, _ontextchangeddata); + } + + if(_ontextchanged_action) { + uic_action_callback(&event, _ontextchanged_action.UTF8String); + } +} + +@end + + /* -------------------------- TextField -------------------------- */ static void textfield_geteventdata(id sender, UiVar *var, void **eventdata, int *eventdatatype, int *value) {