--- a/ui/cocoa/text.m Sat Apr 05 17:57:04 2025 +0200 +++ b/ui/cocoa/text.m Sun Jul 20 22:04:39 2025 +0200 @@ -31,7 +31,7 @@ #import "Container.h" #import <objc/runtime.h> -UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args) { +UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) { NSTextView *textview = [[NSTextView alloc] init]; textview.autoresizingMask = NSViewWidthSizable; textview.minSize = NSMakeSize(0, 0); @@ -44,5 +44,161 @@ UiLayout layout = UI_INIT_LAYOUT(args); ui_container_add(obj, scrollview, &layout, TRUE); + + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_TEXT); + if(var) { + UiText *text = var->value; + text->obj = (__bridge void*)textview; + ui_textarea_restore(text); + + text->save = ui_textarea_save; + text->destroy = ui_textarea_destroy; + text->restore = ui_textarea_restore; + text->set = ui_textarea_set; + text->get = ui_textarea_get; + text->getsubstr = ui_textarea_getsubstr; + text->insert = ui_textarea_insert; + text->setposition = ui_textarea_setposition; + text->position = ui_textarea_position; + text->setselection = ui_textarea_setselection; + text->selection = ui_textarea_selection; + text->length = ui_textarea_length; + text->remove = ui_textarea_remove; + } + return (__bridge void*)scrollview; } + + + + +void ui_textarea_save(UiText *text) { + +} + +void ui_textarea_destroy(UiText *text) { + (void)(__bridge_transfer NSTextStorage*)text->data1; +} + +void ui_textarea_restore(UiText *text) { + NSTextView *textview = (__bridge NSTextView*)text->obj; + NSTextStorage *textStorage; + if(text->data1) { + textStorage = (__bridge NSTextStorage*)text->data1; + + } else { + textStorage = [[NSTextStorage alloc] init]; + } + [textview.layoutManager replaceTextStorage:textStorage]; + text->data1 = (__bridge_retained void*)textStorage; +} + +void ui_textarea_set(UiText *text, const char *str) { + +} + +char* ui_textarea_get(UiText *text) { + return NULL; +} + +char* ui_textarea_getsubstr(UiText *text, int begin, int end) { + return NULL; +} + +void ui_textarea_insert(UiText *text, int pos, char *str) { + +} + +void ui_textarea_setposition(UiText *text, int pos) { + +} + +int ui_textarea_position(UiText *text) { + return 0; +} + +void ui_textarea_setselection(UiText *text, int begin, int end) { + +} + +void ui_textarea_selection(UiText *text, int *begin, int *end) { + +} + +int ui_textarea_length(UiText *text) { + return 0; +} + +void ui_textarea_remove(UiText *text, int begin, int end) { + +} + + + +/* -------------------------- TextField -------------------------- */ + +static UIWIDGET textfield_create(UiObject *obj, UiTextFieldArgs *args, BOOL password, BOOL frameless) { + NSTextField *textfield; + if(password) { + textfield = [[NSSecureTextField alloc] init]; + } else { + textfield = [[NSTextField alloc] init]; + } + + if(frameless) { + [textfield setBezeled: NO]; + } + + UiLayout layout = UI_INIT_LAYOUT(args); + ui_container_add(obj, textfield, &layout, FALSE); + + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING); + if(var) { + UiString *s = var->value; + if(s->value.ptr) { + textfield.stringValue = [[NSString alloc] initWithUTF8String:s->value.ptr]; + if(s->value.free) { + s->value.free(s->value.ptr); + } + } + s->obj = (__bridge void*)textfield; + s->get = ui_textfield_get; + s->set = ui_textfield_set; + } + + return (__bridge void*)textfield; +} + +UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs *args) { + return textfield_create(obj, args, FALSE, FALSE); +} + +UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs *args) { + return textfield_create(obj, args, FALSE, TRUE); +} + +UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs *args) { + return textfield_create(obj, args, TRUE, FALSE); +} + +char* ui_textfield_get(UiString *s) { + NSTextField *textfield = (__bridge NSTextField*)s->obj; + NSString *str = textfield.stringValue; + const char *cstr = str.UTF8String; + if(s->value.free) { + s->value.free(s->value.ptr); + } + s->value.ptr = strdup(cstr); + s->value.free = free; + return s->value.ptr; +} + +void ui_textfield_set(UiString *s, const char *value) { + if(s->value.free) { + s->value.free(s->value.ptr); + } + s->value.ptr = NULL; + s->value.free = NULL; + NSTextField *textfield = (__bridge NSTextField*)s->obj; + textfield.stringValue = [[NSString alloc] initWithUTF8String:value]; +}