]> uap-core.de Git - note.git/commitdiff
add sublist implementation main
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Tue, 21 Apr 2026 19:18:24 +0000 (21:18 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Tue, 21 Apr 2026 19:18:24 +0000 (21:18 +0200)
ui-rs/src/ui/list.rs
ui-rs/src/ui/toolkit.rs
ui/cocoa/EventData.h
ui/cocoa/EventData.m
ui/cocoa/Toolbar.m
ui/cocoa/action.h
ui/cocoa/action.m
ui/cocoa/button.m
ui/cocoa/menu.m
ui/cocoa/window.m
ui/common/types.c

index eee2c4c0fb41f8f5925b6a4c80b7e2332d54c4ae..a667220ffc18c855f01fdb99d7ebbb05712e1eed 100644 (file)
@@ -680,6 +680,35 @@ impl Drop for TableModel {
 }
 
 
+// SubList implementation
+
+impl<E> SubList<E> {
+    pub fn new() -> Self {
+        unsafe {
+            SubList {
+                handle: ui_sublist_new(),
+                list: toolkit::UiList::new()
+            }
+        }
+    }
+
+    pub fn set_header(&mut self, title: &str) {
+        let cstr = CString::new(title).unwrap();
+        unsafe {
+            ui_sublist_set_header(self.handle, cstr.as_ptr());
+        }
+    }
+}
+
+impl<E> Drop for SubList<E> {
+    fn drop(&mut self) {
+        unsafe {
+            ui_sublist_free(self.handle);
+        }
+    }
+}
+
+
 /* ------------------------------- getvalue func wrapper -------------------------------- */
 
 type GetValueFunc = extern "C" fn(list: *const ffi::UiList, elm_ptr: *const c_void, row: i32, col: i32, wrapper: *const c_void, free: *mut bool) -> *mut c_void;
@@ -822,4 +851,9 @@ extern "C" {
     fn ui_sourcelist_args_set_states(args: *mut UiSourceListArgs, states: *const c_int, numstates: c_int);
     fn ui_sourcelist_args_set_visibility_states(args: *mut UiSourceListArgs, states: *const c_int, numstates: c_int);
     fn ui_sourcelist_args_free(args: *mut UiSourceListArgs);
+
+    fn ui_sublist_new() -> *mut ffi::UiSubList;
+    fn ui_sublist_set_value(list: *mut ffi::UiSubList, value: *mut ffi::UiList);
+    fn ui_sublist_set_header(list: *mut ffi::UiSubList, header: *const c_char);
+    fn ui_sublist_free(list: *mut ffi::UiSubList);
 }
\ No newline at end of file
index 982a351f306db73b0697cfc76e2d5edd4fb86ae5..4a5b8e8d1c48c0cf7f234ad4fe460a29b56e51d3 100644 (file)
@@ -302,6 +302,15 @@ impl UiInteger {
 
 
 impl<T> UiList<T> {
+    pub fn new() -> UiList<T> {
+        let mut list: UiList<T> = Self::default();
+        let ctx = UiContext {
+            ptr: std::ptr::null_mut(),
+        };
+        list.init(&ctx, None);
+        list
+    }
+
     pub fn data(&mut self) -> &mut Vec<T> {
         self.data.as_mut()
     }
index 4ee89f3e11e512b842e669f2acb6cc403c5c5e3f..603b87c64e5a81033307e8fc060fbaf13cc5658f 100644 (file)
@@ -37,11 +37,12 @@ typedef void(*get_eventdata_func)(id sender, UiVar *var, void **eventdata, int *
 @property int                vartype;
 @property ui_callback        callback;
 @property void               *userdata;
+@property NSString           *action;
 @property void               *data;
 @property int                value;
 @property get_eventdata_func get_eventdata;
 
-- (EventData*)init:(ui_callback)cb userdata:(void*)userdata;
+- (EventData*)init:(ui_callback)cb userdata:(void*)userdata action:(const char*)action;
 
 - (void)handleEvent:(id)sender;
 
index 1df6d9b4f5123c414ae1e129e96daf7c1d0908d3..c7e95ecbfaf0d4b456012a31bd8b1828a578344e 100644 (file)
  */
 
 #import "EventData.h"
+#import "action.h"
 
 #import <objc/runtime.h>
 
 
 @implementation EventData
 
-- (EventData*)init:(ui_callback)cb userdata:(void*)userdata {
+- (EventData*)init:(ui_callback)cb userdata:(void*)userdata action:(const char*)action {
     _callback = cb;
     _userdata = userdata;
+    if(action != nil) {
+        _action = [[NSString alloc]initWithUTF8String:action];
+    }
     return self;
 }
 
 - (void)handleEvent:(id)sender {
-    if(_callback) {
-        UiEvent event;
-        event.obj = self.obj;
-        event.window = event.obj->window;
-        event.document = event.obj->ctx->document;
-        event.eventdata = self.data;
-        event.intval = self.value;
-        event.set = ui_get_setop();
+    UiEvent event;
+    event.obj = self.obj;
+    event.window = event.obj->window;
+    event.document = event.obj->ctx->document;
+    event.eventdata = self.data;
+    event.intval = self.value;
+    event.set = ui_get_setop();
+    
+    if(_callback != nil) {
         self.callback(&event, self.userdata);
     }
+    
+    if(_action != nil) {
+        uic_action_callback(&event, self.action.UTF8String);
+    }
 }
 
 - (void)handleEventWithEventData:(id)sender {
index 8ab2ad83afa97042c7dfdd6ee0c1c067aaf007ca..cf03ced59342c3e5a52334fdc109400d6fd2be25 100644 (file)
@@ -220,7 +220,7 @@ NSToolbarItem* ui_nstoolbaritem_create_item(UiObject *obj, UiToolbarItem *item,
     }
     
     if(item->args.onclick) {
-        EventData *event = [[EventData alloc] init:item->args.onclick userdata:item->args.onclickdata];
+        EventData *event = [[EventData alloc] init:item->args.onclick userdata:item->args.onclickdata action:item->args.action];
         event.obj = obj;
         button.target = event;
         button.action = @selector(handleEvent:);
index e0398a06f23c06ea573b6be98dc1c89747abc88d..4d9d19f9138ac8f06903f22e592e04a543ab1a2b 100644 (file)
@@ -28,3 +28,7 @@
 
 #include "../ui/toolkit.h"
 #include "../common/action.h"
+
+#import "widget.h"
+
+void ui_cocoa_view_bind_action(UiContext *ctx, NSView *view, const char *action);
index 80f0a4298605ad8d1bd8089f7f9bf2854e8844f9..943341a3aa99d5219e7e9a5f991a73c4d52fb78e 100644 (file)
@@ -51,3 +51,15 @@ void ui_add_action_with_accelerator(
     
     // TODO: accelerator
 }
+
+
+void ui_cocoa_view_bind_action(UiContext *ctx, NSView *view, const char *action) {
+    if(action) {
+        void *widget = (__bridge void*)view;
+        uic_bind_action(ctx, action, widget, (ui_enablefunc)ui_set_enabled);
+        UiAction *ui_action = uic_resolve_action(ctx, action);
+        if(!ui_action) {
+            ui_set_enabled(widget, FALSE);
+        }
+    }
+}
index 03c636727842461ad4049f2f79f0bee442747013..70ee28ce2f7ea2993e1a0854c1d4bd5016a5e1b5 100644 (file)
@@ -30,6 +30,7 @@
 #import "EventData.h"
 #import "container.h"
 #import "image.h"
+#import "action.h"
 #import <objc/runtime.h>
 
 #import <cx/buffer.h>
@@ -47,7 +48,7 @@ UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args) {
     }
     
     if(args->onclick) {
-        EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata];
+        EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata action:args->action];
         event.obj = obj;
         button.target = event;
         button.action = @selector(handleEvent:);
@@ -88,8 +89,8 @@ UIWIDGET togglebutton_create(UiObject* obj, UiToggleArgs *args, enum NSButtonTyp
         i->set = ui_togglebutton_set;
     }
     
-    if(args->onchange) {
-        EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata];
+    if(args->onchange || args->action) {
+        EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata action:args->action];
         event.get_eventdata = togglebutton_eventdata;
         event.obj = obj;
         event.var = var;
@@ -97,6 +98,8 @@ UIWIDGET togglebutton_create(UiObject* obj, UiToggleArgs *args, enum NSButtonTyp
         button.target = event;
         button.action = @selector(handleEventWithEventData:);
         objc_setAssociatedObject(button, "eventdata", event, OBJC_ASSOCIATION_RETAIN);
+        
+        ui_cocoa_view_bind_action(obj->ctx, button, args->action);
     }
     
     UiLayout layout = UI_INIT_LAYOUT(args);
@@ -149,8 +152,8 @@ UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) {
         i->set = ui_switch_set;
     }
     
-    if(args->onchange) {
-        EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata];
+    if(args->onchange || args->action) {
+        EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata action:args->action];
         event.get_eventdata = switch_eventdata;
         event.obj = obj;
         event.var = var;
@@ -158,6 +161,7 @@ UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) {
         button.target = event;
         button.action = @selector(handleEventWithEventData:);
         objc_setAssociatedObject(button, "eventdata", event, OBJC_ASSOCIATION_RETAIN);
+        ui_cocoa_view_bind_action(obj->ctx, button, args->action);
     }
     
     UiLayout layout = UI_INIT_LAYOUT(args);
@@ -238,18 +242,19 @@ UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs *args) {
         objc_setAssociatedObject(button, "radiogroup", buttons, OBJC_ASSOCIATION_RETAIN);
     }
     
-    if(args->onchange || var) {
-        EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata];
+    if(args->onchange || args->action || var) {
+        EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata action:args->action];
         event.get_eventdata = radiobutton_eventdata;
         event.obj = obj;
         event.var = var;
         event.vartype = UI_VAR_INTEGER;
         button.target = event;
         
-        
         button.action = @selector(handleEventWithEventData:);
         
         objc_setAssociatedObject(button, "eventdata", event, OBJC_ASSOCIATION_RETAIN);
+        
+        ui_cocoa_view_bind_action(obj->ctx, button, args->action);
     }
     
     UiLayout layout = UI_INIT_LAYOUT(args);
index eae8a50960689564dd88e24415cbffdf9c415166..100fb562b75a4dd5f4e073cc6c07d3dee9f4528e 100644 (file)
@@ -112,7 +112,7 @@ void add_menuitem_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item
     NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuItemAction) keyEquivalent:@""];
     
     if(it->callback) {
-        EventData *event = [[EventData alloc] init:it->callback userdata:it->userdata];
+        EventData *event = [[EventData alloc] init:it->callback userdata:it->userdata action:it->action];
         if(obj) {
             event.obj = obj;
             menuItem.target = event;
index 7d89edd198c70cd5af06b744f007c8bc7eb81bef..094638713441969a0e47f73ffab93993849e4491 100644 (file)
@@ -343,7 +343,7 @@ UiObject *ui_dialog_window_create(UiObject *parent, UiDialogWindowArgs *args) {
             [lbutton1.leadingAnchor constraintEqualToAnchor:buttonArea.leadingAnchor constant:0]
         ]];
         
-        EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata];
+        EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata action:nil];
         event.obj = obj;
         event.value = 1;
         lbutton1.target = event;
@@ -363,7 +363,7 @@ UiObject *ui_dialog_window_create(UiObject *parent, UiDialogWindowArgs *args) {
             [lbutton2.leadingAnchor constraintEqualToAnchor:anchor constant:off]
         ]];
         
-        EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata];
+        EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata action:nil];
         event.obj = obj;
         event.value = 2;
         lbutton2.target = event;
@@ -382,7 +382,7 @@ UiObject *ui_dialog_window_create(UiObject *parent, UiDialogWindowArgs *args) {
             [rbutton4.trailingAnchor constraintEqualToAnchor:buttonArea.trailingAnchor constant:0]
         ]];
         
-        EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata];
+        EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata action:nil];
         event.obj = obj;
         event.value = 2;
         rbutton4.target = event;
@@ -402,7 +402,7 @@ UiObject *ui_dialog_window_create(UiObject *parent, UiDialogWindowArgs *args) {
             [rbutton3.trailingAnchor constraintEqualToAnchor:anchor constant:off]
         ]];
         
-        EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata];
+        EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata action:nil];
         event.obj = obj;
         event.value = 2;
         rbutton3.target = event;
index ea6a3781bdb33917007020a864a6fa5da3400651..c4b51cefbaa2170b7737360eb0516138fcb8028e 100644 (file)
@@ -110,7 +110,6 @@ void uic_ucx_list_init(UiContext *ctx, UiList *list, void *unused) {
 
 void uic_ucx_list_destroy(UiContext *ctx, UiList *list, void *unused) {
     cxListFree(list->data);
-    ui_free(ctx, list);
 }
 
 UiList* ui_list_new(UiContext *ctx, const char *name) {
@@ -118,11 +117,11 @@ UiList* ui_list_new(UiContext *ctx, const char *name) {
 }
 
 UiList* ui_list_new2(UiContext *ctx, const char *name, ui_list_init_func listinit, void *userdata) {
-    UiList *list = cxMalloc(ctx->mp->allocator, sizeof(UiList));
+    UiList *list = ui_malloc(ctx, sizeof(UiList));
     memset(list, 0, sizeof(UiList));
     listinit(ctx, list, userdata);
     
-    if(name) {
+    if(name && ctx) {
         uic_reg_var(ctx, name, UI_VAR_LIST, list);
     }
     
@@ -137,7 +136,7 @@ void ui_list_free(UiContext *ctx, UiList *list) {
     } else {
         default_list_destroy(ctx, list, default_list_destroy_userdata);
     }
-    
+    ui_free(ctx, list);
 }
 
 void* ui_list_first(UiList *list) {