ui/qt/model.cpp

changeset 579
810b848e2e4f
parent 577
c2e854820922
child 581
7486347f73cf
--- a/ui/qt/model.cpp	Sun Apr 20 10:56:50 2025 +0200
+++ b/ui/qt/model.cpp	Mon Apr 21 11:03:17 2025 +0200
@@ -29,13 +29,34 @@
 #include "model.h"
 
 
-ListModel::ListModel(UiObject *obj, QListView *view, UiVar *var, ui_getvaluefunc getvalue, ui_callback f, void *userdata){
+ListModel::ListModel(UiObject *obj, QListView *view, UiVar *var, ui_getvaluefunc getvalue){
     this->obj = obj;
     this->view = view;
     this->var = var;
     this->getvalue = getvalue;
-    this->callback = f;
-    this->userdata = userdata;
+    this->onactivate = nullptr;
+    this->onactivatedata = nullptr;
+    this->onselection = nullptr;
+    this->onselectiondata = nullptr;
+}
+
+void ListModel::setActivationCallback(ui_callback f, void *userdata) {
+    onactivate = f;
+    onactivatedata = userdata;
+}
+
+void ListModel::setSelectionCallback(ui_callback f, void *userdata) {
+    onselection = f;
+    onselectiondata = userdata;
+}
+
+void ListModel::update(int row) {
+    if(row >= 0) {
+        this->update(row);
+    } else {
+        this->beginResetModel();
+        this->endResetModel();
+    }
 }
 
 int ListModel::rowCount(const QModelIndex& parent) const {
@@ -56,7 +77,66 @@
 }
 
 void ListModel::selectionChanged(const QItemSelection& selected, const QItemSelection& deselected) {
+    UiListSelection sel = ui_selection_model_to_selection(view->selectionModel());
     
+    UiEvent event;
+    event.obj = obj;
+    event.window = obj->window;
+    event.document = obj->ctx->document;
+    event.eventdata = &sel;
+    event.intval = sel.count;
+    event.set = ui_get_setop();
+    
+    if(onactivate) {
+        onactivate(&event, onactivatedata);
+    }
+    if(onselection) {
+        onselection(&event, onselectiondata);
+    }
+    
+    free(sel.rows);
 }
 
 
+
+
+UiListSelection ui_selection_model_to_selection(QItemSelectionModel *model) {
+    UiListSelection sel;
+    sel.rows = NULL;
+    sel.count = 0;
+    
+    if(model->hasSelection()) {
+        QModelIndexList indices = model->selectedIndexes();
+        sel.count = indices.count();
+        sel.rows = (int*)calloc(sel.count, sizeof(int));
+        
+        int i = 0;
+        for (const QModelIndex &index : indices) {
+            sel.rows[i++] = index.row();
+        }
+    }
+    
+    return sel;
+}
+
+/* ---------------------- UiList implementation -----------------------------*/
+
+void ui_listmodel_update(UiList *list, int row) {
+    ListModel *model = (ListModel*)list->obj;
+    model->update(row);
+}
+
+void ui_listmodel_setselection(UiList *list, UiListSelection sel) {
+    ListModel *model = (ListModel*)list->obj;
+    QItemSelection selection;
+    for (int i=0;i<sel.count;i++) {
+        QModelIndex index = model->index(sel.rows[i]);
+        selection.select(index, index);
+    }
+    model->view->selectionModel()->select(selection, QItemSelectionModel::ClearAndSelect);
+}
+
+UiListSelection ui_listmodel_getselection(UiList *list) {
+    ListModel *model = (ListModel*)list->obj;
+    return ui_selection_model_to_selection(model->view->selectionModel());
+}

mercurial