diff --git a/demo/src/Bindings.cpp b/demo/src/Bindings.cpp index b42866e..a2f2ae8 100644 --- a/demo/src/Bindings.cpp +++ b/demo/src/Bindings.cpp @@ -221,6 +221,17 @@ QVariant FibonacciList::data(const QModelIndex &index, int role) const return QVariant(); } +int FibonacciList::role(const char* name) const { + auto names = roleNames(); + auto i = names.constBegin(); + while (i != names.constEnd()) { + if (i.value() == name) { + return i.key(); + } + ++i; + } + return -1; +} QHash FibonacciList::roleNames() const { QHash names = QAbstractItemModel::roleNames(); names.insert(Qt::UserRole + 0, "fibonacciNumber"); @@ -435,6 +446,17 @@ QVariant FileSystemTree::data(const QModelIndex &index, int role) const return QVariant(); } +int FileSystemTree::role(const char* name) const { + auto names = roleNames(); + auto i = names.constBegin(); + while (i != names.constEnd()) { + if (i.value() == name) { + return i.key(); + } + ++i; + } + return -1; +} QHash FileSystemTree::roleNames() const { QHash names = QAbstractItemModel::roleNames(); names.insert(Qt::UserRole + 0, "fileIcon"); @@ -648,6 +670,17 @@ QVariant Processes::data(const QModelIndex &index, int role) const return QVariant(); } +int Processes::role(const char* name) const { + auto names = roleNames(); + auto i = names.constBegin(); + while (i != names.constEnd()) { + if (i.value() == name) { + return i.key(); + } + ++i; + } + return -1; +} QHash Processes::roleNames() const { QHash names = QAbstractItemModel::roleNames(); names.insert(Qt::UserRole + 0, "cmd"); @@ -856,6 +889,17 @@ QVariant TimeSeries::data(const QModelIndex &index, int role) const return QVariant(); } +int TimeSeries::role(const char* name) const { + auto names = roleNames(); + auto i = names.constBegin(); + while (i != names.constEnd()) { + if (i.value() == name) { + return i.key(); + } + ++i; + } + return -1; +} QHash TimeSeries::roleNames() const { QHash names = QAbstractItemModel::roleNames(); names.insert(Qt::UserRole + 0, "cos"); diff --git a/demo/src/Bindings.h b/demo/src/Bindings.h index cd60549..5acdef5 100644 --- a/demo/src/Bindings.h +++ b/demo/src/Bindings.h @@ -99,6 +99,7 @@ public: void fetchMore(const QModelIndex &parent) override; Qt::ItemFlags flags(const QModelIndex &index) const override; void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; + int role(const char* name) const; QHash roleNames() const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override; @@ -143,6 +144,7 @@ public: void fetchMore(const QModelIndex &parent) override; Qt::ItemFlags flags(const QModelIndex &index) const override; void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; + int role(const char* name) const; QHash roleNames() const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override; @@ -192,6 +194,7 @@ public: void fetchMore(const QModelIndex &parent) override; Qt::ItemFlags flags(const QModelIndex &index) const override; void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; + int role(const char* name) const; QHash roleNames() const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override; @@ -239,6 +242,7 @@ public: void fetchMore(const QModelIndex &parent) override; Qt::ItemFlags flags(const QModelIndex &index) const override; void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; + int role(const char* name) const; QHash roleNames() const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override; diff --git a/src/cpp.cpp b/src/cpp.cpp index 829f2da..0974ddb 100644 --- a/src/cpp.cpp +++ b/src/cpp.cpp @@ -82,6 +82,7 @@ void writeHeaderItemModel(QTextStream& h, const Object& o) { void fetchMore(const QModelIndex &parent) override; Qt::ItemFlags flags(const QModelIndex &index) const override; void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; + int role(const char* name) const; QHash roleNames() const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override; @@ -451,6 +452,17 @@ Qt::ItemFlags %1::flags(const QModelIndex &i) const cpp << " }\n"; } cpp << " }\n return QVariant();\n}\n\n"; + cpp << "int " << o.name << "::role(const char* name) const {\n"; + cpp << " auto names = roleNames();\n"; + cpp << " auto i = names.constBegin();\n"; + cpp << " while (i != names.constEnd()) {\n"; + cpp << " if (i.value() == name) {\n"; + cpp << " return i.key();\n"; + cpp << " }\n"; + cpp << " ++i;\n"; + cpp << " }\n"; + cpp << " return -1;\n"; + cpp << "}\n"; cpp << "QHash " << o.name << "::roleNames() const {\n"; cpp << " QHash names = QAbstractItemModel::roleNames();\n"; for (int i = 0; i < o.itemProperties.size(); ++i) { diff --git a/tests/test_list.cpp b/tests/test_list.cpp index 91abe08..7ef552d 100644 --- a/tests/test_list.cpp +++ b/tests/test_list.cpp @@ -72,8 +72,8 @@ void TestRustList::testAccessByDefaultRole() // GIVEN NoRole norole; QSignalSpy spy(&norole, &NoRole::dataChanged); - auto ageRole = Qt::UserRole + 0; - auto nameRole = Qt::UserRole + 1; + auto ageRole = norole.role("userAge"); + auto nameRole = norole.role("userName"); // WHEN const QModelIndex index(norole.index(0,0)); diff --git a/tests/test_list_rust.cpp b/tests/test_list_rust.cpp index c7d0c92..8f5b3db 100644 --- a/tests/test_list_rust.cpp +++ b/tests/test_list_rust.cpp @@ -154,6 +154,17 @@ QVariant NoRole::data(const QModelIndex &index, int role) const return QVariant(); } +int NoRole::role(const char* name) const { + auto names = roleNames(); + auto i = names.constBegin(); + while (i != names.constEnd()) { + if (i.value() == name) { + return i.key(); + } + ++i; + } + return -1; +} QHash NoRole::roleNames() const { QHash names = QAbstractItemModel::roleNames(); names.insert(Qt::UserRole + 0, "userAge"); @@ -314,6 +325,17 @@ QVariant Persons::data(const QModelIndex &index, int role) const return QVariant(); } +int Persons::role(const char* name) const { + auto names = roleNames(); + auto i = names.constBegin(); + while (i != names.constEnd()) { + if (i.value() == name) { + return i.key(); + } + ++i; + } + return -1; +} QHash Persons::roleNames() const { QHash names = QAbstractItemModel::roleNames(); names.insert(Qt::UserRole + 0, "userName"); diff --git a/tests/test_list_rust.h b/tests/test_list_rust.h index 6630ef1..6088a66 100644 --- a/tests/test_list_rust.h +++ b/tests/test_list_rust.h @@ -31,6 +31,7 @@ public: void fetchMore(const QModelIndex &parent) override; Qt::ItemFlags flags(const QModelIndex &index) const override; void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; + int role(const char* name) const; QHash roleNames() const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override; @@ -74,6 +75,7 @@ public: void fetchMore(const QModelIndex &parent) override; Qt::ItemFlags flags(const QModelIndex &index) const override; void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; + int role(const char* name) const; QHash roleNames() const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override; diff --git a/tests/test_list_types_rust.cpp b/tests/test_list_types_rust.cpp index acb5579..ca7d877 100644 --- a/tests/test_list_types_rust.cpp +++ b/tests/test_list_types_rust.cpp @@ -485,6 +485,17 @@ QVariant List::data(const QModelIndex &index, int role) const return QVariant(); } +int List::role(const char* name) const { + auto names = roleNames(); + auto i = names.constBegin(); + while (i != names.constEnd()) { + if (i.value() == name) { + return i.key(); + } + ++i; + } + return -1; +} QHash List::roleNames() const { QHash names = QAbstractItemModel::roleNames(); names.insert(Qt::UserRole + 0, "boolean"); diff --git a/tests/test_list_types_rust.h b/tests/test_list_types_rust.h index 6379994..b73b788 100644 --- a/tests/test_list_types_rust.h +++ b/tests/test_list_types_rust.h @@ -30,6 +30,7 @@ public: void fetchMore(const QModelIndex &parent) override; Qt::ItemFlags flags(const QModelIndex &index) const override; void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; + int role(const char* name) const; QHash roleNames() const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override; diff --git a/tests/test_tree_rust.cpp b/tests/test_tree_rust.cpp index 73fd80b..87ee8f3 100644 --- a/tests/test_tree_rust.cpp +++ b/tests/test_tree_rust.cpp @@ -151,6 +151,17 @@ QVariant Persons::data(const QModelIndex &index, int role) const return QVariant(); } +int Persons::role(const char* name) const { + auto names = roleNames(); + auto i = names.constBegin(); + while (i != names.constEnd()) { + if (i.value() == name) { + return i.key(); + } + ++i; + } + return -1; +} QHash Persons::roleNames() const { QHash names = QAbstractItemModel::roleNames(); names.insert(Qt::UserRole + 0, "userName"); diff --git a/tests/test_tree_rust.h b/tests/test_tree_rust.h index c884fc2..ee45939 100644 --- a/tests/test_tree_rust.h +++ b/tests/test_tree_rust.h @@ -30,6 +30,7 @@ public: void fetchMore(const QModelIndex &parent) override; Qt::ItemFlags flags(const QModelIndex &index) const override; void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; + int role(const char* name) const; QHash roleNames() const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override;