diff --git a/API/api.cpp b/API/api.cpp index 3be7e04..296270c 100644 --- a/API/api.cpp +++ b/API/api.cpp @@ -290,7 +290,8 @@ void API::addAsset(const QString& title, const QString& icon, const QJSValue &fi request.setRawHeader("Authorization", "Bearer " + accessToken.toUtf8()); QNetworkReply* reply = network.post(request, params.toString(QUrl::FullyEncoded).toUtf8()); connect(reply, &QNetworkReply::finished, - std::bind(&API::onAssetAdded, this, reply, finished) + this, std::bind(&API::onAssetAdded, this, reply, finished), + Qt::QueuedConnection ); } @@ -313,18 +314,16 @@ void API::sendPoll(bool clear) { if (clear) url.setQuery(QUrlQuery({{"clearCache", "all"}})); - QByteArray authorizationHeader = "Bearer " + accessToken.toUtf8(); QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader, json); - request.setRawHeader("Authorization", authorizationHeader); + request.setRawHeader("Authorization", "Bearer " + accessToken.toUtf8()); request.setTransferTimeout(30000); pollReply = std::unique_ptr(network.get(request)); connect( pollReply.get(), &QNetworkReply::finished, - this, &API::onPollFinished, - Qt::QueuedConnection - ); + this, &API::onPollFinished, Qt::QueuedConnection + ); } void API::onPollFinished() { @@ -371,40 +370,33 @@ void API::onPollFinished() { bool API::handleChanges(const QVariantMap& changes) { QVariantMap::ConstIterator itr = changes.constFind("system"); - if (itr != changes.constEnd()) { - const QVariant& vsys = itr.value(); - if (vsys.canConvert()) { - const QVariantMap& sys = qast(vsys); - QVariantMap::ConstIterator invItr = sys.constFind("invalidate"); - if (invItr != sys.constEnd()) { - const QVariant& vinv = invItr.value(); - if (vinv.canConvert() && vinv.toBool()) - resetAllModels(); - } + if (itr != changes.constEnd() && itr.value().canConvert()) { + const QVariantMap& sys = qast(itr.value()); + QVariantMap::ConstIterator invItr = sys.constFind("invalidate"); + if (invItr != sys.constEnd()) { + const QVariant& vinv = invItr.value(); + if (vinv.canConvert() && vinv.toBool()) + resetAllModels(); } } itr = changes.constFind("assets"); - if (itr != changes.constEnd()) { - const QVariant& vassets = itr.value(); - if (vassets.canConvert()) { - const QVariantMap& assets = qast(vassets); - QVariantMap::ConstIterator aItr = assets.constFind("invalidate"); - if (aItr != assets.constEnd()) { - const QVariant& vinv = aItr.value(); - if (vinv.canConvert() && vinv.toBool()) - API::assets.clear(); - } + if (itr != changes.constEnd() && itr.value().canConvert()) { + const QVariantMap& assets = qast(itr.value()); + QVariantMap::ConstIterator aItr = assets.constFind("invalidate"); + if (aItr != assets.constEnd()) { + const QVariant& vinv = aItr.value(); + if (vinv.canConvert() && vinv.toBool()) + API::assets.clear(); + } - aItr = assets.constFind("added"); - if (aItr != assets.constEnd()) { - const QVariant& vadd = aItr.value(); - std::deque added; - if (!Models::Assets::deserialize(qast(itr.value()), added)) - qDebug() << "Error deserializng added assets"; - else - API::assets.addAssets(added); - } + aItr = assets.constFind("added"); + if (aItr != assets.constEnd() && aItr.value().canConvert()) { + std::deque added; + if (!Models::Assets::deserialize(qast(aItr.value()), added)) + qDebug() << "Error deserializng added assets"; + else + API::assets.addAssets(added); } } @@ -428,14 +420,13 @@ void API::requestAssets() { qDebug() << "Requesting assets..."; QUrl url = createUrl("/listAssets"); - QByteArray authorizationHeader = "Bearer " + accessToken.toUtf8(); QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader, json); - request.setRawHeader("Authorization", authorizationHeader); + request.setRawHeader("Authorization", "Bearer " + accessToken.toUtf8()); QNetworkReply* reply = network.get(request); connect( - pollReply.get(), &QNetworkReply::finished, + reply, &QNetworkReply::finished, this, std::bind(&API::responseAssets, this, reply) ); } diff --git a/API/models/assets.cpp b/API/models/assets.cpp index cad42f9..481adc8 100644 --- a/API/models/assets.cpp +++ b/API/models/assets.cpp @@ -82,6 +82,7 @@ void Models::Assets::fetchMore (const QModelIndex& parent) { return; state = State::requesting; + emit requestAssets(); } QVariant Models::Assets::data (const QModelIndex& index, int role) const { @@ -116,7 +117,7 @@ bool Models::Assets::deserialize (const QVariantList& from, std::deque& o asset.title = ser.value("title").toString(); asset.icon = ser.value("icon").toString(); asset.archived = ser.value("archived").toBool(); - asset.id = ser.value("archived").toUInt(); + asset.id = ser.value("id").toUInt(); } return true; diff --git a/API/models/assets.h b/API/models/assets.h index 0daf656..212a124 100644 --- a/API/models/assets.h +++ b/API/models/assets.h @@ -22,6 +22,7 @@ struct Asset { class Assets : public QAbstractListModel { Q_OBJECT QML_ELEMENT + QML_SINGLETON public: explicit Assets (QObject* parent = nullptr); diff --git a/qml/Application/Assets.qml b/qml/Application/Assets.qml index 95b23d6..2ad654c 100644 --- a/qml/Application/Assets.qml +++ b/qml/Application/Assets.qml @@ -3,16 +3,20 @@ import QtQuick import QtQuick.Controls +import QtQuick.Layouts -import magpie.API +import magpie.Models as Models +import magpie.Components as Components Item { signal add - Column { + ColumnLayout { + id: column anchors.fill: parent Label { + id: label text: "This is Assets screen" font { pixelSize: 24 @@ -21,12 +25,12 @@ Item { } ListView { - anchors.centerIn: parent - model: API.assets - delegate: Rectangle { - Text { - text: title - } + id: listView + Layout.fillHeight: true + Layout.fillWidth: true + model: Models.Assets + delegate: Components.AssetLine { + height: 20 } } } diff --git a/qml/Components/AssetLine.qml b/qml/Components/AssetLine.qml new file mode 100644 index 0000000..a0a5ee9 --- /dev/null +++ b/qml/Components/AssetLine.qml @@ -0,0 +1,26 @@ +// SPDX-FileCopyrightText: 2023 Yury Gubich +// SPDX-License-Identifier: GPL-3.0-or-later + +import QtQuick +import QtQuick.Controls + +Rectangle { + id: line + required property string title + required property string icon + + Row { + anchors.fill: parent + IconLabel { + anchors.verticalCenter: parent.verticalCenter + icon.name: line.icon + width: parent.height + height: parent.height + } + + Text { + anchors.verticalCenter: parent.verticalCenter + text: title + } + } +} diff --git a/qml/Components/CMakeLists.txt b/qml/Components/CMakeLists.txt index 1827691..2ddc094 100644 --- a/qml/Components/CMakeLists.txt +++ b/qml/Components/CMakeLists.txt @@ -10,6 +10,7 @@ qt_add_qml_module(magpieComponents NO_PLUGIN QML_FILES Modal.qml + AssetLine.qml ) target_link_libraries(magpie PRIVATE magpieComponents) diff --git a/qml/Forms/AddAsset.qml b/qml/Forms/AddAsset.qml index 9f5b150..52f528b 100644 --- a/qml/Forms/AddAsset.qml +++ b/qml/Forms/AddAsset.qml @@ -66,7 +66,7 @@ Item { Button { text: qsTr("Create") - onClicked: inner.send(titleField.text, titleField.text, colorField.text) + onClicked: inner.send(titleField.text, iconField.text, colorField.text) } } @@ -79,7 +79,7 @@ Item { return; titleField.text = title; - titleField.text = icon; + iconField.text = icon; colorField.text = color; modal.inProgress = true; diff --git a/root.cpp b/root.cpp index a844fee..5226e39 100644 --- a/root.cpp +++ b/root.cpp @@ -38,9 +38,9 @@ Root::Root(const QUrl& root, int& argc, char* argv[]) : connect(&api, &API::addressChanged, this, &Root::onAPIAddressChanged); connect(&api, &API::storeTokens, this, &Root::onStoreTokens); - qmlRegisterSingletonType("magpie.API", 1, 0, "API", [this] (QQmlEngine *engine, QJSEngine *scriptEngine) { - return &api; - }); + qmlRegisterSingletonInstance("magpie.API", 1, 0, "API", &api); + + qmlRegisterSingletonInstance("magpie.Models", 1, 0, "Assets", &api.assets); engine.addImportPath(":/"); engine.load(root);