implement ui_getvaluefunc2 (QT)

Wed, 25 Jun 2025 22:14:25 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 25 Jun 2025 22:14:25 +0200
changeset 634
14016ce0a434
parent 633
4c6ba81d319e
child 635
2995d8b86cc3

implement ui_getvaluefunc2 (QT)

ui/qt/list.cpp file | annotate | diff | comparison | revisions
ui/qt/model.cpp file | annotate | diff | comparison | revisions
ui/qt/model.h file | annotate | diff | comparison | revisions
--- a/ui/qt/list.cpp	Wed Jun 25 21:59:36 2025 +0200
+++ b/ui/qt/list.cpp	Wed Jun 25 22:14:25 2025 +0200
@@ -37,17 +37,32 @@
     return column == 0 ? elm : NULL;
 }
 
+static void* getvalue_wrapper(UiList *list, void *elm, int row, int col, void *userdata) {
+    ui_getvaluefunc getvalue = (ui_getvaluefunc)userdata;
+    return getvalue(elm, col);
+}
 
 UIWIDGET ui_listview_create(UiObject* obj, UiListArgs *args) {
     UiContainerPrivate *ctn = ui_obj_container(obj);
     UI_APPLY_LAYOUT(ctn->layout, args);
     
     QListView *view = new QListView();
+    ui_getvaluefunc2 getvalue = nullptr;
+    void *getvaluedata = nullptr;
+    if(args->getvalue2) {
+        getvalue = args->getvalue2;
+        getvaluedata = args->getvalue2data;
+    } else if(args->getvalue) {
+        getvalue = getvalue_wrapper;
+        getvaluedata = (void*)args->getvalue;
+    } else {
+        getvalue = getvalue_wrapper;
+        getvaluedata = (void*)ui_strmodel_getvalue;
+    }
     
-    ui_getvaluefunc getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue;
     UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST);
     
-    ListModel *model = new ListModel(obj, view, var, getvalue);
+    ListModel *model = new ListModel(obj, view, var, getvalue, getvaluedata);
     view->setModel(model);
     
     if(var) {
--- a/ui/qt/model.cpp	Wed Jun 25 21:59:36 2025 +0200
+++ b/ui/qt/model.cpp	Wed Jun 25 22:14:25 2025 +0200
@@ -28,12 +28,21 @@
 
 #include "model.h"
 
+static void* model_getvalue(UiModel *model, UiList *list, void *elm, int row, int col) {
+    if(model->getvalue2) {
+        return model->getvalue2(list, elm, row, col, model->getvalue2data);
+    } else if(model->getvalue) {
+        return model->getvalue(elm, col);
+    }
+    return NULL;
+}
 
-ListModel::ListModel(UiObject *obj, QListView *view, UiVar *var, ui_getvaluefunc getvalue){
+ListModel::ListModel(UiObject *obj, QListView *view, UiVar *var, ui_getvaluefunc2 getvalue, void *getvaluedata){
     this->obj = obj;
     this->view = view;
     this->var = var;
     this->getvalue = getvalue;
+    this->getvaluedata = getvaluedata;
     this->onactivate = nullptr;
     this->onactivatedata = nullptr;
     this->onselection = nullptr;
@@ -69,7 +78,7 @@
         UiList *ls = (UiList*)var->value;
         void *rowData = ls->get(ls, index.row());
         if(rowData && getvalue) {
-            void *value = getvalue(rowData, 0);
+            void *value = getvalue(ls, rowData, index.row(), 0, getvaluedata);
             if(value) {
                 return QString::fromUtf8((char*)value); 
             }
@@ -144,9 +153,9 @@
     if(role == Qt::DisplayRole) {
         UiList *ls = (UiList*)var->value;
         void *rowData = ls->get(ls, index.row());
-        if(rowData && model->getvalue) {
+        if(rowData) {
             int col = index.column();
-            void *value = model->getvalue(rowData, col);
+            void *value = model_getvalue(model, ls, rowData, index.row(), col);
             if(value) {
                 UiModelType type = model->types[col];
                 switch(type) {
--- a/ui/qt/model.h	Wed Jun 25 21:59:36 2025 +0200
+++ b/ui/qt/model.h	Wed Jun 25 22:14:25 2025 +0200
@@ -44,7 +44,8 @@
 class ListModel : public QAbstractListModel {
     Q_OBJECT
     
-    ui_getvaluefunc getvalue;
+    ui_getvaluefunc2 getvalue;
+    void *getvaluedata;
     ui_callback onactivate;
     void        *onactivatedata;
     ui_callback onselection;
@@ -55,7 +56,7 @@
     UiVar       *var;
     QListView   *view;
     
-    ListModel(UiObject *obj, QListView *view, UiVar *var, ui_getvaluefunc getvalue);
+    ListModel(UiObject *obj, QListView *view, UiVar *var, ui_getvaluefunc2 getvalue, void *getvaluedata);
     
     void setActivationCallback(ui_callback f, void *userdata);
     void setSelectionCallback(ui_callback f, void *userdata);

mercurial