diff --git a/API/api.cpp b/API/api.cpp index fca3177..ba0b6b3 100644 --- a/API/api.cpp +++ b/API/api.cpp @@ -15,6 +15,7 @@ #include "requests/currencies.h" #include "requests/addasset.h" #include "requests/deleteasset.h" +#include "requests/updateasset.h" API::API (Models::Magpie& magpie, QObject* parent): QObject(parent), @@ -136,7 +137,17 @@ API::RequestId API::updateAsset ( const QColor& color, Models::Currency::ID currency, const QJSValue& finished -) {} +) { + qDebug() << "Updating asset..."; + if (magpie.getState() != Models::Magpie::Authenticated) + return callCallback(finished, "Can not update assets in current state"), 0; + + auto update = std::make_unique(id, title, icon, color, currency, magpie.getAddress()); + update->setAuthorizationToken(magpie.getAccessToken()); + connect(update.get(), &Request::UpdateAsset::success, std::bind(&API::callCallback, this, finished, QString(), QJSValueList{QJSValue(true)})); + connect(update.get(), &Request::UpdateAsset::error, std::bind(&API::callCallback, this, finished, std::placeholders::_1, QJSValueList{QJSValue(false)})); + return registerAndSend(std::move(update)); +} API::RequestId API::deleteAsset (unsigned int id, const QJSValue& finished) { qDebug() << "Deleting asset..."; diff --git a/API/api.h b/API/api.h index 335e4f5..de840f5 100644 --- a/API/api.h +++ b/API/api.h @@ -47,6 +47,14 @@ public slots: Models::Currency::ID currency, const QJSValue& finished = QJSValue() ); + RequestId updateAsset( + Models::Asset::ID id, + const QString& title, + const QString& icon, + const QColor& color, + Models::Currency::ID currency, + const QJSValue& finished = QJSValue() + ); RequestId deleteAsset(unsigned int id, const QJSValue& finished = QJSValue()); private slots: diff --git a/models/assets.cpp b/models/assets.cpp index 635eb02..9173f4d 100644 --- a/models/assets.cpp +++ b/models/assets.cpp @@ -57,6 +57,20 @@ void Models::Assets::remove (Asset::ID id) { endRemoveRows(); } +void Models::Assets::change (const Asset& asset) { + int index = getIndexByID(asset.id); + if (index == -1) + throw std::runtime_error("An attempt to change non existing Asset in asset model"); + + records[index] = asset; + emit dataChanged(createIndex(index, 0, &records[index]), createIndex(index, 0, &records[index])); +} + +void Models::Assets::change (const std::deque& assets) { + for (const Asset& asset : assets) + change(asset); +} + Models::Asset Models::Assets::get (Asset::ID id) const { int index = getIndexByID(id); if (index == -1) @@ -163,7 +177,7 @@ QVariantMap Models::Assets::getAssetByIndex (int index) const { return result; QModelIndex idx = createIndex(index, 0, &records[index]); - for (int role = Roles::Title; role != Roles::ID; ++role) + for (int role = Roles::Title; role <= Roles::ID; ++role) result[roles[role]] = data(idx, role); return result; diff --git a/models/assets.h b/models/assets.h index 5e2fe18..f63c36c 100644 --- a/models/assets.h +++ b/models/assets.h @@ -47,6 +47,8 @@ public: void add (const Asset& asset); void add (const std::deque& assets); void remove (Asset::ID id); + void change (const Asset& asset); + void change (const std::deque& assets); Asset get(Asset::ID id) const; diff --git a/models/magpie.cpp b/models/magpie.cpp index 22ccf82..c7e87c8 100644 --- a/models/magpie.cpp +++ b/models/magpie.cpp @@ -221,6 +221,15 @@ bool Models::Magpie::handleAssetChanges (const QVariantMap& changes) { } } + aItr = changes.constFind("changed"); + if (aItr != changes.constEnd() && aItr.value().canConvert()) { + std::deque changes; + if (!Models::Assets::deserialize(qast(aItr.value()), changes)) + qDebug() << "Error deserializng changed assets"; + else + assets.change(changes); + } + return true; } diff --git a/qml/Components/AssetLine.qml b/qml/Components/AssetLine.qml index fec4948..5569e05 100644 --- a/qml/Components/AssetLine.qml +++ b/qml/Components/AssetLine.qml @@ -63,6 +63,7 @@ Item { Button { id: editButton text: qsTr("Edit") + icon.name: "entry-edit" flat: true height: parent.height onClicked: edit(assetID) @@ -71,9 +72,12 @@ Item { Button { id: deleteButton text: qsTr("Delete") - flat: true + icon.name: "delete" height: parent.height onClicked: remove(assetID) + palette { //unfortunately doesn't work anymore + button: "red" + } } } }