From f241928cc953636cfca41d62dc504e3e0e157c76 Mon Sep 17 00:00:00 2001 From: Alex Jbanca Date: Mon, 3 Jun 2024 11:51:49 +0300 Subject: [PATCH] chore(ConcatModel): Forward setData to proxy models This is a nice to have feature to allow ContactModel.sourceModel instances to implement setData --- ui/StatusQ/include/StatusQ/concatmodel.h | 1 + ui/StatusQ/src/concatmodel.cpp | 32 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/ui/StatusQ/include/StatusQ/concatmodel.h b/ui/StatusQ/include/StatusQ/concatmodel.h index bfd49c248c..7c73731484 100644 --- a/ui/StatusQ/include/StatusQ/concatmodel.h +++ b/ui/StatusQ/include/StatusQ/concatmodel.h @@ -67,6 +67,7 @@ public: // QAbstractItemModel interface int rowCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role) const override; + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; QHash roleNames() const override; // QQmlParserStatus interface diff --git a/ui/StatusQ/src/concatmodel.cpp b/ui/StatusQ/src/concatmodel.cpp index 197644c1f6..84534a478e 100644 --- a/ui/StatusQ/src/concatmodel.cpp +++ b/ui/StatusQ/src/concatmodel.cpp @@ -305,6 +305,38 @@ QVariant ConcatModel::data(const QModelIndex &index, int role) const return {}; } +bool ConcatModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (!checkIndex(index, CheckIndexOption::IndexIsValid)) + return false; + + auto row = index.row(); + + auto source = sourceForIndex(row); + if (source.first == nullptr) + return false; + + auto model = source.first->model(); + if (model == nullptr) + return false; + + auto sourcePosition = m_sources.indexOf(source.first); + if (sourcePosition == -1) + return false; + + auto& mapping = m_rolesMappingToSource[sourcePosition]; + auto it = mapping.find(role); + + if (it == mapping.end()) + return false; + + auto sourceIndex = model->index(source.second, 0); + if(!sourceIndex.isValid()) + return false; + + return model->setData(sourceIndex, value, it->second); +} + QHash ConcatModel::roleNames() const { return m_roleNames;