implement ui_dialog_create (Cocoa)

Sun, 07 Sep 2025 08:28:30 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 07 Sep 2025 08:28:30 +0200
changeset 750
7b627710c155
parent 749
0f052f6f532c
child 751
41286f7f8433

implement ui_dialog_create (Cocoa)

make/xcode/toolkit/toolkit/main.m file | annotate | diff | comparison | revisions
ui/cocoa/window.m file | annotate | diff | comparison | revisions
--- a/make/xcode/toolkit/toolkit/main.m	Sat Sep 06 12:40:04 2025 +0200
+++ b/make/xcode/toolkit/toolkit/main.m	Sun Sep 07 08:28:30 2025 +0200
@@ -67,6 +67,7 @@
 
 static void toolbar_action(UiEvent *event, void *userdata) {
     printf("toolbar item\n");
+    ui_dialog(event->obj, .title = "Error", .content = "Error Message", .input = TRUE, .button1_label = "Add", .button2_label = "Remove", .closebutton_label = "Close");
 }
 
 static void toolbar_toggle(UiEvent *event, void *userdata) {
--- a/ui/cocoa/window.m	Sat Sep 06 12:40:04 2025 +0200
+++ b/ui/cocoa/window.m	Sun Sep 07 08:28:30 2025 +0200
@@ -154,3 +154,74 @@
         ui_filelist_free(flist);
     }];
 }
+
+/* ------------------------------------- Dialog ------------------------------------- */
+
+void ui_dialog_create(UiObject *parent, UiDialogArgs *args) {
+    NSAlert *dialog = [[NSAlert alloc] init];
+    
+    if(args->title) {
+        dialog.messageText = [[NSString alloc]initWithUTF8String:args->title];
+    }
+    if(args->content) {
+        dialog.informativeText = [[NSString alloc]initWithUTF8String:args->content];
+    }
+    NSTextField *textfield = nil;
+    if(args->input) {
+        NSRect frame = NSMakeRect(0,0,300,22);
+        textfield = args->password ? [[NSSecureTextField alloc] initWithFrame:frame] : [[NSTextField alloc]initWithFrame:frame];
+        if(args->input_value) {
+            textfield.stringValue = [[NSString alloc]initWithUTF8String:args->input_value];
+        }
+        dialog.accessoryView = textfield;
+    }
+    
+    int b = 0;
+    int b1 = -1;
+    int b2 = -1;
+    if(args->button1_label) {
+        [dialog addButtonWithTitle:[[NSString alloc]initWithUTF8String:args->button1_label]];
+        b1 = b++;
+    }
+    if(args->button2_label) {
+        [dialog addButtonWithTitle:[[NSString alloc]initWithUTF8String:args->button2_label]];
+        b2 = b;
+    }
+    if(args->closebutton_label) {
+        [dialog addButtonWithTitle:[[NSString alloc]initWithUTF8String:args->closebutton_label]];
+    }
+    
+    ui_callback callback = args->result;
+    void *userdata = args->resultdata;
+    
+    NSWindow *window = (__bridge NSWindow*)parent->wobj;
+    [dialog beginSheetModalForWindow:window completionHandler:^(NSModalResponse returnCode) {
+        UiEvent event;
+        event.obj = parent;
+        event.window = event.obj->window;
+        event.document = event.obj->ctx->document;
+        event.eventdata = NULL;
+        event.eventdatatype = 0;
+        event.set = 0;
+        event.intval = 0;
+        
+        long ret = returnCode - NSAlertFirstButtonReturn;
+        if(ret == b1) {
+            event.intval = 1;
+        } else if(ret == b2) {
+            event.intval = 2;
+        }
+        
+        NSString *value = nil;
+        if(textfield) {
+            value = textfield.stringValue;
+            event.eventdata = (void*)value.UTF8String;
+            event.eventdatatype = UI_EVENT_DATA_STRING;
+        }
+        
+        if(callback) {
+            callback(&event, userdata);
+        }
+    }];
+    
+}

mercurial