]> uap-core.de Git - note.git/commitdiff
implement itemlist createui arg main
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Tue, 25 Aug 2026 18:56:53 +0000 (20:56 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Tue, 25 Aug 2026 18:56:53 +0000 (20:56 +0200)
application/attachment.c
application/attachment.h
ui-rs/src/ui/container.rs
ui/gtk/container.c
ui/gtk/container.h
ui/ui/container.h

index 604f65053bfa8d89aa79ea8b728a4e462c2e4075..32ae9068cb2ef99a4e93698563783cec219e4762 100644 (file)
@@ -140,7 +140,7 @@ cxmutstr attachment_file_load(const CxAllocator *a, const char *path) {
  * itemlist create_ui function
  * used by the note horizontal attachments list
  */
-void attachment_item(UiObject *obj, int index, void *elm, void *userdata) {
+void attachment_item(UiObject *obj, UiList *list, int index, void *elm, void *userdata) {
     Attachment *attachment = elm;
       
     if(attachment->type == NOTE_ATTACHMENT_IMAGE) {
index b738fb7fdd427729dcdf7eee52ac12c3d250a1e3..734dd55b2f529a80880bcb87270b6d57a825f5a6 100644 (file)
@@ -58,7 +58,7 @@ cxmutstr attachment_file_load(const CxAllocator *a, const char *path);
 /*
  * create UI for an attachment item
  */
-void attachment_item(UiObject *obj, int index, void *elm, void *userdata);
+void attachment_item(UiObject *obj, UiList *list, int index, void *elm, void *userdata);
 
 void action_attachment_clicked(UiEvent *event, void *userdata);
 
index 45b2c2e858ef5b38cca7d6cea064963df76ef6ee..a71d767a6bb5e6233af18ed398069898b8a8c7a7 100644 (file)
@@ -33,7 +33,7 @@ use std::ffi::{c_char, c_int, c_void};
 use std::ffi::CString;
 use std::marker::PhantomData;
 use crate::ui::ffi::*;
-use crate::ui::{ffi, getvalue_wrapper, toolkit, Button, GetValueWrapper};
+use crate::ui::{ffi, getvalue_wrapper, toolkit, Button, GetValueWrapper, ListValue};
 use crate::ui::widget::Widget;
 
 #[macro_export]
@@ -1320,7 +1320,20 @@ impl<'a, T> TabViewBuilder<'a, T> {
 
 /* -------------------------------- ItemList Container -------------------------------- */
 
-pub type CreateUiFunc = extern "C" fn(obj: *mut ffi::UiObject, row: c_int, elm: *mut c_void, userdata: *mut c_void);
+type CreateUiFunc = extern "C" fn(obj: *mut ffi::UiObject, list: *mut ffi::UiList, row: c_int, elm: *mut c_void, userdata: *mut c_void);
+
+struct CreateUiWrapper<D, T> {
+    callback: Box<dyn Fn(&mut toolkit::UiObject<D>, &T, i32)>
+}
+
+extern "C" fn createui_wrapper<D, T>(obj_ptr: *mut ffi::UiObject, _list: *mut ffi::UiList, row: c_int, elm_ptr: *mut c_void, userdata: *mut c_void) {
+    let wrapper = unsafe { &*(userdata as *const CreateUiWrapper<D, T> ) };
+    let elm = unsafe { &*(elm_ptr as *const T) };
+
+    let mut obj: toolkit::UiObject<D> = toolkit::UiObject::from_ptr(obj_ptr);
+    (wrapper.callback)(&mut obj, elm, row);
+}
+
 
 pub struct ItemListContainerBuilder<'a, T, C> {
     args: *mut UiItemListContainerArgs,
@@ -1464,10 +1477,13 @@ impl<'a, T, C> ItemListContainerBuilder<'a, T, C> {
         self
     }
 
-    pub fn getvalue<F>(&mut self, f: F) -> &mut Self
-    where F: Fn(&C, i32, i32) + 'static {
+    pub fn createui<F>(&mut self, f: F) -> &mut Self
+    where F: Fn(&mut toolkit::UiObject<T>, &C, i32) + 'static {
         unsafe {
-            // TODO
+            let wrapper = Box::new(CreateUiWrapper { callback: Box::new(f) });
+            let ptr = self.obj.ctx.reg_box(wrapper);
+            ui_itemlist_container_args_set_create_ui(self.args, createui_wrapper::<T, C>);
+            ui_itemlist_container_args_set_userdata(self.args, ptr as *mut c_void);
         }
         self
     }
index 5174dc6faa0a1d4050f334f3171527b7875e971d..2a90e44523d1c2c45d4c8d7a118c10411092c404 100644 (file)
@@ -1303,7 +1303,7 @@ static void update_itemlist(UiList *list, int c) {
             UiLayout layout = {0};
             ui_box_container_add(ct->container, obj->widget, &layout);
             if(ct->create_ui) {
-                ct->create_ui(obj, index, elm, ct->userdata);
+                ct->create_ui(obj, list, index, elm, ct->userdata);
             }
             cxMapPut(new_items, key, obj);
         }
index 352b50ea01cf6f729eea6aeb96a2f87b8dfe07e2..a4396d70ffc00add9a079949361232195cdc707d 100644 (file)
@@ -135,7 +135,7 @@ typedef struct UiGtkItemListContainer {
     UiObject *parent;
     GtkWidget *widget;
     UiContainerPrivate *container;
-    void (*create_ui)(UiObject *, int, void *, void *);
+    void (*create_ui)(UiObject *, UiList *, int, void *, void *);
     void *userdata;
     UiSubContainerType subcontainer;
     CxMap *current_items;
index 0e8ee9926d21b8c69a816414fa34f16864c21fe9..fbd6c03cc681b3ea3fc6900490092fc06e914652 100644 (file)
@@ -217,7 +217,7 @@ typedef struct UiSplitPaneArgs {
     const int *visibility_states;
 } UiSplitPaneArgs;
 
-typedef void (*ui_create_ui_func)(UiObject *, int, void *, void *);
+typedef void (*ui_create_ui_func)(UiObject *, UiList *, int, void *, void *);
 
 typedef struct UiItemListContainerArgs {
     UiBool fill;
@@ -246,14 +246,14 @@ typedef struct UiItemListContainerArgs {
     UiList *value;
     const char *varname;
     /*
-     * void create_ui(UiObject *obj, int index, void *elm, void *userdata)
+     * void create_ui(UiObject *obj, UiList *, int index, void *elm, void *userdata)
      * 
      * UI constructor for each list element
      * 
      * This callback is executed for each list element. A new UiObject is
      * created for every item.
      */
-    void (*create_ui)(UiObject *, int, void *, void *);
+    void (*create_ui)(UiObject *, UiList *, int, void *, void *);
     void *userdata;
     
     /*