diff --git a/CMakeLists.txt b/CMakeLists.txt index fc371ef..8155fd2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,7 @@ set(PROJECT_SOURCES viewmodels/productsviewmodel.h viewmodels/productsviewmodel.cpp viewmodels/ordersviewmodel.h viewmodels/ordersviewmodel.cpp viewmodels/settingsviewmodel.h viewmodels/settingsviewmodel.cpp + viewmodels/restsviewmodel.h viewmodels/restsviewmodel.cpp services/beerservice.h services/beerservice.cpp services/settingsservice.h services/settingsservice.cpp services/modelsregister.h services/modelsregister.cpp diff --git a/beerlog_ru_RU.ts b/beerlog_ru_RU.ts index d76162e..c965b32 100644 --- a/beerlog_ru_RU.ts +++ b/beerlog_ru_RU.ts @@ -17,16 +17,24 @@ ProductsView - + Summary: %1 Итого: %1 - + Order Заказать + + RestsView + + + Rests + Остатки + + SettingsView @@ -61,38 +69,43 @@ - + BeerLog v0.1 - + Online В сети - + Offline Не в сети - + Orders Заказы - + + Rests + Остатки + + + Settings Настройки - - + + Quit Выход - + Realy quit the application? Действительно выйти из приложения? diff --git a/main.cpp b/main.cpp index f5342f2..aee057f 100644 --- a/main.cpp +++ b/main.cpp @@ -11,6 +11,7 @@ #include "viewmodels/productsviewmodel.h" #include "viewmodels/ordersviewmodel.h" #include "viewmodels/storesviewmodel.h" +#include "viewmodels/restsviewmodel.h" #include "viewmodels/settingsviewmodel.h" #include "services/beerservice.h" @@ -51,6 +52,7 @@ int main(int argc, char *argv[]) qmlRegisterType("ru.ded.beerlog", 1, 0, "ProductsViewModel"); qmlRegisterType("ru.ded.beerlog", 1, 0, "OrdersViewModel"); qmlRegisterType("ru.ded.beerlog", 1, 0, "StoresViewModel"); + qmlRegisterType("ru.ded.beerlog", 1, 0, "RestsViewModel"); qmlRegisterType("ru.ded.beerlog", 1, 0, "SettingsViewModel"); engine.load(url); diff --git a/qml/Views/ProductsView.qml b/qml/Views/ProductsView.qml index a40e38c..1e2e80a 100644 --- a/qml/Views/ProductsView.qml +++ b/qml/Views/ProductsView.qml @@ -12,6 +12,7 @@ Page { RowLayout { anchors.fill: parent + anchors.margins: 10 ListView { id: productsList diff --git a/qml/Views/RestsView.qml b/qml/Views/RestsView.qml new file mode 100644 index 0000000..78488f9 --- /dev/null +++ b/qml/Views/RestsView.qml @@ -0,0 +1,43 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import ru.ded.beerlog 1.0 + +Page { + + title: qsTr("Rests") + + RestsViewModel { + id: restsModel + } + + ListView { + id: restsList + + anchors.fill: parent + anchors.margins: 10 + + model: restsModel.products + + delegate: ItemDelegate { + width: restsList.width + + text: modelData.title + + TextField { + anchors.right: parent.right + + validator: DoubleValidator { + bottom: 0.0 + top: 1000.0 + } + + height: parent.height + + text: modelData.rest + + onEditingFinished: restsModel.setProductRest(modelData.productId, text) + } + } + } +} diff --git a/qml/main.qml b/qml/main.qml index d751a1f..54bca75 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -83,6 +83,7 @@ ApplicationWindow { readonly property var actions: { "orders": () => { stackView.openPage("Views/OrdersView.qml") }, + "rests": () => { stackView.openPage("Views/RestsView.qml") }, "settings": () => { stackView.openPage("Views/SettingsView.qml") }, "quit": () => { Qt.quit() } } @@ -99,6 +100,10 @@ ApplicationWindow { title: qsTr("Orders") action: "orders" } + ListElement { + title: qsTr("Rests") + action: "rests" + } ListElement { title: qsTr("Settings") action: "settings" diff --git a/qml/qml.qrc b/qml/qml.qrc index a582786..41da06f 100644 --- a/qml/qml.qrc +++ b/qml/qml.qrc @@ -6,5 +6,6 @@ Views/OrdersView.qml Views/SettingsView.qml Views/ProductsView.qml + Views/RestsView.qml diff --git a/viewmodels/restsviewmodel.cpp b/viewmodels/restsviewmodel.cpp new file mode 100644 index 0000000..acd1c75 --- /dev/null +++ b/viewmodels/restsviewmodel.cpp @@ -0,0 +1,69 @@ +#include "restsviewmodel.h" + +#include "models/basemodel.h" +#include "services/settingsservice.h" + +RestsViewModel::RestsViewModel(QObject *parent) + : QObject{parent} +{ + connect(m_restsModel, &BaseModel::dataChanged, this, &RestsViewModel::reloadRests); + connect(m_productsModel, &BaseModel::dataChanged, this, &RestsViewModel::productsChanged); + connect(settings(), &SettingsService::selectedStoreIdChanged, this, &RestsViewModel::productsChanged); + + reloadRests(); +} + +QVariantList RestsViewModel::products() const +{ + QVariantList res; + + const QString storeId = settings()->selectedStoreId(); + const QVariantList products = m_productsModel->items(); + for (const QVariant &product : products) { + QString productId = product.toMap().value("id").toString(); + QVariantMap rest = m_rests.value(storeId).value(productId).toMap(); + res << QVariantMap { + { "productId", productId }, + { "title", m_productsModel->itemProperty(productId, "name").toString() }, + { "rest", rest.value("rest", 0.0).toFloat() } + }; + } + + return res; +} + +void RestsViewModel::setProductRest(const QString &productId, float rest) +{ + QString storeId = settings()->selectedStoreId(); + QVariantMap productRest = m_rests.value(storeId).value(productId).toMap(); + productRest["rest"] = rest; + productRest["storeId"] = storeId; + productRest["productId"] = productId; + QString restId = productRest.value("id").toString(); + if (restId.isEmpty()) { + m_restsModel->addItem(productRest); + } else { + m_restsModel->modifyItem(restId, productRest); + } +} + +SettingsService *RestsViewModel::settings() const +{ + return SettingsService::instance(); +} + +void RestsViewModel::reloadRests() +{ + m_rests.clear(); + + const QVariantList rests = m_restsModel->items(); + for (const QVariant &varRest : rests) { + QVariantMap rest = varRest.toMap(); + QString storeId = rest.value("storeId").toString(); + QVariantMap storeRests = m_rests.value(storeId); + storeRests[rest.value("productId").toString()] = rest; + m_rests[storeId] = storeRests; + } + + emit productsChanged(); +} diff --git a/viewmodels/restsviewmodel.h b/viewmodels/restsviewmodel.h new file mode 100644 index 0000000..953e722 --- /dev/null +++ b/viewmodels/restsviewmodel.h @@ -0,0 +1,35 @@ +#ifndef RESTSVIEWMODEL_H +#define RESTSVIEWMODEL_H + +#include + +#include "services/modelsregister.h" + +class SettingsService; +class RestsViewModel : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QVariantList products READ products NOTIFY productsChanged) + +public: + explicit RestsViewModel(QObject *parent = nullptr); + + QVariantList products() const; + + Q_INVOKABLE void setProductRest(const QString &productId, float rest); + +signals: + void productsChanged(); + +private: + SettingsService *settings() const; + void reloadRests(); + + BaseModel *m_productsModel = ModelsRegister::model("products"); + BaseModel *m_restsModel = ModelsRegister::model("rests"); + + QMap m_rests; +}; + +#endif // RESTSVIEWMODEL_H