diff --git a/demo/CMakeLists.txt b/demo/CMakeLists.txt index e19cbb4..7590ae9 100644 --- a/demo/CMakeLists.txt +++ b/demo/CMakeLists.txt @@ -25,7 +25,7 @@ add_custom_command( add_custom_target(rust_target DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/rust/${RUST_TARGET_DIR}/librust.a") list(APPEND DemoLibs "${CMAKE_CURRENT_SOURCE_DIR}/rust/${RUST_TARGET_DIR}/librust.a") -list(APPEND DemoLibs Qt5::Widgets Qt5::Svg) +list(APPEND DemoLibs Qt5::Widgets Qt5::Svg pthread dl) if (Qt5Quick_FOUND) list(APPEND DemoLibs Qt5::Quick) endif() diff --git a/demo/src/Bindings.cpp b/demo/src/Bindings.cpp index 5a4d9bd..7fe128b 100644 --- a/demo/src/Bindings.cpp +++ b/demo/src/Bindings.cpp @@ -177,23 +177,25 @@ Qt::ItemFlags FibonacciList::flags(const QModelIndex &i) const auto flags = QAbstractItemModel::flags(i); return flags; } -QVariant FibonacciList::data(const QModelIndex &index, int role) const +QVariant FibonacciList::result(int row) const { QVariant v; + v = fibonacci_list_data_result(m_d, row); + return v; +} + +QVariant FibonacciList::data(const QModelIndex &index, int role) const +{ Q_ASSERT(rowCount(index.parent()) > index.row()); - QString s; - QByteArray b; switch (index.column()) { case 0: switch (role) { case Qt::DisplayRole: case Qt::UserRole + 0: - v = fibonacci_list_data_result(m_d, index.row()); - break; + return result(index.row()); } - break; } - return v; + return QVariant(); } QHash FibonacciList::roleNames() const { QHash names = QAbstractItemModel::roleNames(); @@ -318,75 +320,96 @@ Qt::ItemFlags FileSystemTree::flags(const QModelIndex &i) const auto flags = QAbstractItemModel::flags(i); return flags; } -QVariant FileSystemTree::data(const QModelIndex &index, int role) const +QVariant FileSystemTree::fileIcon(const QModelIndex& index) const { QVariant v; - Q_ASSERT(rowCount(index.parent()) > index.row()); - QString s; QByteArray b; + file_system_tree_data_file_icon(m_d, index.internalId(), &b, set_qbytearray); + if (!b.isNull()) v.setValue(b); + return v; +} +QVariant FileSystemTree::fileName(const QModelIndex& index) const +{ + QVariant v; + QString s; + file_system_tree_data_file_name(m_d, index.internalId(), &s, set_qstring); + if (!s.isNull()) v.setValue(s); + return v; +} +QVariant FileSystemTree::filePath(const QModelIndex& index) const +{ + QVariant v; + QString s; + file_system_tree_data_file_path(m_d, index.internalId(), &s, set_qstring); + if (!s.isNull()) v.setValue(s); + return v; +} +QVariant FileSystemTree::filePermissions(const QModelIndex& index) const +{ + QVariant v; + v = file_system_tree_data_file_permissions(m_d, index.internalId()); + return v; +} +QVariant FileSystemTree::fileSize(const QModelIndex& index) const +{ + QVariant v; + v = file_system_tree_data_file_size(m_d, index.internalId()); + return v; +} +QVariant FileSystemTree::fileType(const QModelIndex& index) const +{ + QVariant v; + v = file_system_tree_data_file_type(m_d, index.internalId()); + return v; +} + +QVariant FileSystemTree::data(const QModelIndex &index, int role) const +{ + Q_ASSERT(rowCount(index.parent()) > index.row()); switch (index.column()) { case 0: switch (role) { case Qt::DecorationRole: case Qt::UserRole + 0: - file_system_tree_data_file_icon(m_d, index.internalId(), &b, set_qbytearray); - if (!b.isNull()) v.setValue(b); - break; + return fileIcon(index); case Qt::DisplayRole: case Qt::UserRole + 1: - file_system_tree_data_file_name(m_d, index.internalId(), &s, set_qstring); - if (!s.isNull()) v.setValue(s); - break; + return fileName(index); case Qt::UserRole + 2: - file_system_tree_data_file_path(m_d, index.internalId(), &s, set_qstring); - if (!s.isNull()) v.setValue(s); - break; + return filePath(index); case Qt::UserRole + 3: - v = file_system_tree_data_file_permissions(m_d, index.internalId()); - break; + return filePermissions(index); case Qt::UserRole + 4: - v = file_system_tree_data_file_size(m_d, index.internalId()); - break; + return fileSize(index); case Qt::UserRole + 5: - v = file_system_tree_data_file_type(m_d, index.internalId()); - break; + return fileType(index); } - break; case 1: switch (role) { case Qt::DisplayRole: case Qt::UserRole + 4: - v = file_system_tree_data_file_size(m_d, index.internalId()); - break; + return fileSize(index); } - break; case 2: switch (role) { case Qt::DisplayRole: case Qt::UserRole + 2: - file_system_tree_data_file_path(m_d, index.internalId(), &s, set_qstring); - if (!s.isNull()) v.setValue(s); - break; + return filePath(index); } - break; case 3: switch (role) { case Qt::DisplayRole: case Qt::UserRole + 3: - v = file_system_tree_data_file_permissions(m_d, index.internalId()); - break; + return filePermissions(index); } - break; case 4: switch (role) { case Qt::DisplayRole: case Qt::UserRole + 5: - v = file_system_tree_data_file_type(m_d, index.internalId()); - break; + return fileType(index); } - break; } - return v; + return QVariant(); } QHash FileSystemTree::roleNames() const { QHash names = QAbstractItemModel::roleNames(); @@ -520,60 +543,90 @@ Qt::ItemFlags Processes::flags(const QModelIndex &i) const auto flags = QAbstractItemModel::flags(i); return flags; } -QVariant Processes::data(const QModelIndex &index, int role) const +QVariant Processes::cmd(const QModelIndex& index) const { QVariant v; - Q_ASSERT(rowCount(index.parent()) > index.row()); QString s; - QByteArray b; + processes_data_cmd(m_d, index.internalId(), &s, set_qstring); + if (!s.isNull()) v.setValue(s); + return v; +} +QVariant Processes::cpuPercentage(const QModelIndex& index) const +{ + QVariant v; + v = processes_data_cpu_percentage(m_d, index.internalId()); + return v; +} +QVariant Processes::cpuUsage(const QModelIndex& index) const +{ + QVariant v; + v = processes_data_cpu_usage(m_d, index.internalId()); + return v; +} +QVariant Processes::memory(const QModelIndex& index) const +{ + QVariant v; + v = processes_data_memory(m_d, index.internalId()); + return v; +} +QVariant Processes::name(const QModelIndex& index) const +{ + QVariant v; + QString s; + processes_data_name(m_d, index.internalId(), &s, set_qstring); + if (!s.isNull()) v.setValue(s); + return v; +} +QVariant Processes::pid(const QModelIndex& index) const +{ + QVariant v; + v = processes_data_pid(m_d, index.internalId()); + return v; +} +QVariant Processes::uid(const QModelIndex& index) const +{ + QVariant v; + v = processes_data_uid(m_d, index.internalId()); + return v; +} + +QVariant Processes::data(const QModelIndex &index, int role) const +{ + Q_ASSERT(rowCount(index.parent()) > index.row()); switch (index.column()) { case 0: switch (role) { case Qt::UserRole + 0: - processes_data_cmd(m_d, index.internalId(), &s, set_qstring); - if (!s.isNull()) v.setValue(s); - break; + return cmd(index); case Qt::UserRole + 1: - v = processes_data_cpu_percentage(m_d, index.internalId()); - break; + return cpuPercentage(index); case Qt::UserRole + 2: - v = processes_data_cpu_usage(m_d, index.internalId()); - break; + return cpuUsage(index); case Qt::UserRole + 3: - v = processes_data_memory(m_d, index.internalId()); - break; + return memory(index); case Qt::DisplayRole: case Qt::UserRole + 4: - processes_data_name(m_d, index.internalId(), &s, set_qstring); - if (!s.isNull()) v.setValue(s); - break; + return name(index); case Qt::ToolTipRole: case Qt::UserRole + 5: - v = processes_data_pid(m_d, index.internalId()); - break; + return pid(index); case Qt::UserRole + 6: - v = processes_data_uid(m_d, index.internalId()); - break; + return uid(index); } - break; case 1: switch (role) { case Qt::DisplayRole: case Qt::UserRole + 2: - v = processes_data_cpu_usage(m_d, index.internalId()); - break; + return cpuUsage(index); } - break; case 2: switch (role) { case Qt::DisplayRole: case Qt::UserRole + 3: - v = processes_data_memory(m_d, index.internalId()); - break; + return memory(index); } - break; } - return v; + return QVariant(); } QHash Processes::roleNames() const { QHash names = QAbstractItemModel::roleNames(); @@ -692,36 +745,41 @@ Qt::ItemFlags TimeSeries::flags(const QModelIndex &i) const } return flags; } -QVariant TimeSeries::data(const QModelIndex &index, int role) const +QVariant TimeSeries::input(int row) const { QVariant v; + v = time_series_data_input(m_d, row); + return v; +} +QVariant TimeSeries::result(int row) const +{ + QVariant v; + v = time_series_data_result(m_d, row); + return v; +} + +QVariant TimeSeries::data(const QModelIndex &index, int role) const +{ Q_ASSERT(rowCount(index.parent()) > index.row()); - QString s; - QByteArray b; switch (index.column()) { case 0: switch (role) { case Qt::DisplayRole: case Qt::EditRole: case Qt::UserRole + 0: - v = time_series_data_input(m_d, index.row()); - break; + return input(index.row()); case Qt::UserRole + 1: - v = time_series_data_result(m_d, index.row()); - break; + return result(index.row()); } - break; case 1: switch (role) { case Qt::DisplayRole: case Qt::EditRole: case Qt::UserRole + 1: - v = time_series_data_result(m_d, index.row()); - break; + return result(index.row()); } - break; } - return v; + return QVariant(); } QHash TimeSeries::roleNames() const { QHash names = QAbstractItemModel::roleNames(); diff --git a/demo/src/Bindings.h b/demo/src/Bindings.h index cea7be3..9a26abc 100644 --- a/demo/src/Bindings.h +++ b/demo/src/Bindings.h @@ -109,6 +109,7 @@ signals: private: QHash, QVariant> m_headerData; void initHeaderData(); + QVariant result(int row) const; signals: }; @@ -149,6 +150,12 @@ signals: private: QHash, QVariant> m_headerData; void initHeaderData(); + QVariant fileIcon(const QModelIndex& index) const; + QVariant fileName(const QModelIndex& index) const; + QVariant filePath(const QModelIndex& index) const; + QVariant filePermissions(const QModelIndex& index) const; + QVariant fileSize(const QModelIndex& index) const; + QVariant fileType(const QModelIndex& index) const; signals: void pathChanged(); }; @@ -190,6 +197,13 @@ signals: private: QHash, QVariant> m_headerData; void initHeaderData(); + QVariant cmd(const QModelIndex& index) const; + QVariant cpuPercentage(const QModelIndex& index) const; + QVariant cpuUsage(const QModelIndex& index) const; + QVariant memory(const QModelIndex& index) const; + QVariant name(const QModelIndex& index) const; + QVariant pid(const QModelIndex& index) const; + QVariant uid(const QModelIndex& index) const; signals: void activeChanged(); }; @@ -228,6 +242,8 @@ signals: private: QHash, QVariant> m_headerData; void initHeaderData(); + QVariant input(int row) const; + QVariant result(int row) const; signals: }; #endif // BINDINGS_H diff --git a/demo/src/SortedModel.h b/demo/src/SortedModel.h index 7e9e571..f488b63 100644 --- a/demo/src/SortedModel.h +++ b/demo/src/SortedModel.h @@ -8,7 +8,7 @@ class SortedModel : public QSortFilterProxyModel { Q_OBJECT public: SortedModel() :QSortFilterProxyModel() {} - bool filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const; + bool filterAcceptsRow(int source_row, const QModelIndex & source_parent) const; Q_INVOKABLE QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const { return QSortFilterProxyModel::data(index, role); } diff --git a/src/cpp.cpp b/src/cpp.cpp index 1c7438b..96baaab 100644 --- a/src/cpp.cpp +++ b/src/cpp.cpp @@ -35,7 +35,7 @@ QString cGetType(const BindingTypeProperties& type) { return type.name + "*, " + type.name.toLower() + "_set"; } -void writeHeaderItemModel(QTextStream& h) { +void writeHeaderItemModel(QTextStream& h, const Object& o) { h << QString(R"( int columnCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; @@ -58,6 +58,19 @@ private: QHash, QVariant> m_headerData; void initHeaderData(); )"); + for (auto ip: o.itemProperties) { + if (o.type == ObjectType::List) { + h << QString(" QVariant %1(int row) const;\n").arg(ip.name); + } else { + h << QString(" QVariant %1(const QModelIndex& index) const;\n").arg(ip.name); + } +/* + if (ip.write) { + r << QString(" fn set_%1(&mut self, item: usize, %2) -> bool;\n") + .arg(snakeCase(ip.name), rustType(ip)); + } +*/ + } } bool isColumnWrite(const Object& o, int col) { @@ -224,14 +237,39 @@ Qt::ItemFlags %1::flags(const QModelIndex &i) const cpp << " flags |= Qt::ItemIsEditable;\n }\n"; } } - cpp << QString(R"( return flags; -} + cpp << " return flags;\n}\n"; + for (auto ip: o.itemProperties) { + QString idx = index; + if (o.type == ObjectType::List) { + idx = ", row"; + cpp << QString("QVariant %1::%2(int row) const\n{\n") + .arg(o.name, ip.name); + } else { + cpp << QString("QVariant %1::%2(const QModelIndex& index) const\n{\n") + .arg(o.name, ip.name); + } + cpp << " QVariant v;\n"; + if (ip.type.name == "QString") { + cpp << " QString s;\n"; + cpp << QString(" %1_data_%2(m_d%4, &s, set_%3);\n") + .arg(lcname, snakeCase(ip.name), ip.type.name.toLower(), idx); + cpp << " if (!s.isNull()) v.setValue(s);\n"; + } else if (ip.type.name == "QByteArray") { + cpp << " QByteArray b;\n"; + cpp << QString(" %1_data_%2(m_d%4, &b, set_%3);\n") + .arg(lcname, snakeCase(ip.name), ip.type.name.toLower(), idx); + cpp << " if (!b.isNull()) v.setValue(b);\n"; + } else { + cpp << QString(" v = %1_data_%2(m_d%3);\n") + .arg(lcname, snakeCase(ip.name), idx); + } + cpp << " return v;\n"; + cpp << "}\n"; + } + cpp << QString(R"( QVariant %1::data(const QModelIndex &index, int role) const { - QVariant v; Q_ASSERT(rowCount(index.parent()) > index.row()); - QString s; - QByteArray b; switch (index.column()) { )").arg(o.name); @@ -249,24 +287,15 @@ QVariant %1::data(const QModelIndex &index, int role) const cpp << QString(" case Qt::%1:\n").arg(metaRoles.valueToKey(role)); } cpp << QString(" case Qt::UserRole + %1:\n").arg(i); - if (ip.type.name == "QString") { - cpp << QString(" %1_data_%2(m_d%4, &s, set_%3);\n") - .arg(lcname, snakeCase(ip.name), ip.type.name.toLower(), index); - cpp << " if (!s.isNull()) v.setValue(s);\n"; - } else if (ip.type.name == "QByteArray") { - cpp << QString(" %1_data_%2(m_d%4, &b, set_%3);\n") - .arg(lcname, snakeCase(ip.name), ip.type.name.toLower(), index); - cpp << " if (!b.isNull()) v.setValue(b);\n"; + if (o.type == ObjectType::List) { + cpp << QString(" return %1(index.row());\n").arg(ip.name); } else { - cpp << QString(" v = %1_data_%2(m_d%3);\n") - .arg(lcname, snakeCase(ip.name), index); + cpp << QString(" return %1(index);\n").arg(ip.name); } - cpp << " break;\n"; } cpp << " }\n"; - cpp << " break;\n"; } - cpp << " }\n return v;\n}\n"; + cpp << " }\n return QVariant();\n}\n"; cpp << "QHash " << o.name << "::roleNames() const {\n"; cpp << " QHash names = QAbstractItemModel::roleNames();\n"; for (int i = 0; i < o.itemProperties.size(); ++i) { @@ -388,7 +417,7 @@ public: } } if (baseType(o) == "QAbstractItemModel") { - writeHeaderItemModel(h); + writeHeaderItemModel(h, o); } h << "signals:" << endl; for (auto p: o.properties) { diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 0a10d39..d8c28d8 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -40,6 +40,7 @@ function(rust_test NAME DIRECTORY) Qt5::Core Qt5::Test "${DIR}/${RUST_TARGET_DIR}/librust.a" + pthread dl ) set_property(TARGET ${NAME} APPEND PROPERTY AUTOGEN_TARGET_DEPENDS "${SRC}/${NAME}_rust.h" diff --git a/tests/test_list_rust.cpp b/tests/test_list_rust.cpp index c6742d2..68fe1c1 100644 --- a/tests/test_list_rust.cpp +++ b/tests/test_list_rust.cpp @@ -115,25 +115,28 @@ Qt::ItemFlags Persons::flags(const QModelIndex &i) const } return flags; } -QVariant Persons::data(const QModelIndex &index, int role) const +QVariant Persons::userName(int row) const { QVariant v; - Q_ASSERT(rowCount(index.parent()) > index.row()); QString s; - QByteArray b; + persons_data_user_name(m_d, row, &s, set_qstring); + if (!s.isNull()) v.setValue(s); + return v; +} + +QVariant Persons::data(const QModelIndex &index, int role) const +{ + Q_ASSERT(rowCount(index.parent()) > index.row()); switch (index.column()) { case 0: switch (role) { case Qt::DisplayRole: case Qt::EditRole: case Qt::UserRole + 0: - persons_data_user_name(m_d, index.row(), &s, set_qstring); - if (!s.isNull()) v.setValue(s); - break; + return userName(index.row()); } - break; } - return v; + return QVariant(); } QHash Persons::roleNames() const { QHash names = QAbstractItemModel::roleNames(); diff --git a/tests/test_list_rust.h b/tests/test_list_rust.h index d6cf4de..5bf5872 100644 --- a/tests/test_list_rust.h +++ b/tests/test_list_rust.h @@ -40,6 +40,7 @@ signals: private: QHash, QVariant> m_headerData; void initHeaderData(); + QVariant userName(int row) const; signals: }; #endif // TEST_LIST_RUST_H diff --git a/tests/test_tree_rust.cpp b/tests/test_tree_rust.cpp index 9a9ed94..ec4218d 100644 --- a/tests/test_tree_rust.cpp +++ b/tests/test_tree_rust.cpp @@ -133,25 +133,28 @@ Qt::ItemFlags Persons::flags(const QModelIndex &i) const } return flags; } -QVariant Persons::data(const QModelIndex &index, int role) const +QVariant Persons::userName(const QModelIndex& index) const { QVariant v; - Q_ASSERT(rowCount(index.parent()) > index.row()); QString s; - QByteArray b; + persons_data_user_name(m_d, index.internalId(), &s, set_qstring); + if (!s.isNull()) v.setValue(s); + return v; +} + +QVariant Persons::data(const QModelIndex &index, int role) const +{ + Q_ASSERT(rowCount(index.parent()) > index.row()); switch (index.column()) { case 0: switch (role) { case Qt::DisplayRole: case Qt::EditRole: case Qt::UserRole + 0: - persons_data_user_name(m_d, index.internalId(), &s, set_qstring); - if (!s.isNull()) v.setValue(s); - break; + return userName(index); } - break; } - return v; + return QVariant(); } QHash Persons::roleNames() const { QHash names = QAbstractItemModel::roleNames(); diff --git a/tests/test_tree_rust.h b/tests/test_tree_rust.h index cae5111..b9eab8d 100644 --- a/tests/test_tree_rust.h +++ b/tests/test_tree_rust.h @@ -40,6 +40,7 @@ signals: private: QHash, QVariant> m_headerData; void initHeaderData(); + QVariant userName(const QModelIndex& index) const; signals: }; #endif // TEST_TREE_RUST_H