Choice model settings was added

This commit is contained in:
2023-04-10 19:24:25 +02:00
parent 25e8a3ea79
commit 4a52926be9
31 changed files with 938 additions and 227 deletions

View File

@@ -0,0 +1,72 @@
#include "ordersviewmodel.h"
#include <QDateTime>
OrdersViewModel::OrdersViewModel(QObject *parent)
: QAbstractListModel{parent}
{
connect(&m_ordersModel, &BaseModel::dataChanged, this, &OrdersViewModel::reload);
connect(&m_usersModel, &BaseModel::dataChanged, this, &OrdersViewModel::reload);
connect(&m_productsModel, &BaseModel::dataChanged, this, &OrdersViewModel::reload);
connect(&m_storesModel, &BaseModel::dataChanged, this, &OrdersViewModel::reload);
reload();
}
int OrdersViewModel::rowCount(const QModelIndex &) const
{
return m_model.count();
}
QVariant OrdersViewModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid()) {
return {};
}
return m_model.at(index.row()).toMap()[roleNames().value(role)];
}
QHash<int, QByteArray> OrdersViewModel::roleNames() const
{
return QHash<int, QByteArray> {
{ Roles::UserName, "userName" },
{ Roles::StoreName, "storeName" },
{ Roles::Date, "date" },
{ Roles::Time, "time"},
{ Roles::Amount, "amount" },
{ Roles::Products, "products" }
};
}
void OrdersViewModel::reload()
{
beginResetModel();
m_model.clear();
for (const QVariant &vOrder : m_ordersModel.orders()) {
QVariantMap order = vOrder.toMap();
QDateTime orderTime = QDateTime::fromSecsSinceEpoch(order.value("ts", 0).toDouble());
order["date"] = orderTime.date();
order["time"] = orderTime.time();
order["userName"] = m_usersModel.itemProperty(order["userId"].toString(), "name").toString();
order["storeName"] = m_storesModel.itemProperty(order["storeId"].toString(), "name").toString();
QVariantList prodModel;
for (const QVariant &prod : order["products"].toList()) {
QVariantMap product = prod.toMap();
product["product"] = m_productsModel.itemProperty(product.value("productId").toString(), "name");
prodModel << product;
}
order["products"] = prodModel;
m_model << order;
}
std::sort(m_model.begin(), m_model.end(), [](const QVariant &l, const QVariant &r) {
return l.toMap().value("ts").toDouble() < r.toMap().value("ts").toDouble();
});
endResetModel();
}

View File

@@ -0,0 +1,43 @@
#ifndef ORDERSVIEWMODEL_H
#define ORDERSVIEWMODEL_H
#include <QAbstractListModel>
#include "models/ordersmodel.h"
#include "models/usersmodel.h"
class OrdersViewModel : public QAbstractListModel
{
Q_OBJECT
public:
explicit OrdersViewModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent) const override;
QVariant data(const QModelIndex &index, int role) const override;
QHash<int, QByteArray> roleNames() const override;
signals:
void ordersChanged();
private:
enum Roles {
UserName = Qt::UserRole + 1,
StoreName,
Date,
Time,
Amount,
Products
};
void reload();
OrdersModel m_ordersModel;
UsersModel m_usersModel;
BaseModel m_productsModel = BaseModel("products", this);
BaseModel m_storesModel = BaseModel("stores", this);
QVariantList m_model;
};
#endif // ORDERSVIEWMODEL_H

View File

@@ -0,0 +1,78 @@
#include "productsviewmodel.h"
#include "services/settingsservice.h"
#include "models/ordersmodel.h"
ProductsViewModel::ProductsViewModel(QObject *parent)
: QObject{parent}
{
connect(&m_productsModel, &BaseModel::dataChanged, this, &ProductsViewModel::productsChanged);
}
QVariantList ProductsViewModel::products() const
{
return m_productsModel.items();
}
QVariantList ProductsViewModel::order() const
{
QVariantList res;
for (auto it = m_order.constBegin(); it != m_order.constEnd(); ++it) {
QVariantMap product = m_productsModel.item(it.key());
product["count"] = it.value().toMap().value("quantity").toDouble();
res << product;
}
return res;
}
float ProductsViewModel::orderSum() const
{
float res = 0.0;
for (auto it = m_order.constBegin(); it != m_order.constEnd(); ++it) {
QVariantMap product = m_productsModel.item(it.key());
float price = product.value("price", 0.0).toFloat();
float quantity = it.value().toMap().value("quantity").toDouble();
res += quantity * price;
}
return res;
}
void ProductsViewModel::setOrderValue(const QString &productId, float value)
{
if (value) {
float price = m_productsModel.itemProperty(productId, "price", 0.0).toFloat();
m_order[productId] = QVariantMap {
{ "productId", productId },
{ "quantity", value},
{ "price", price }
};
} else {
m_order.remove(productId);
}
emit orderChanged();
}
void ProductsViewModel::submitOrder()
{
OrdersModel model;
model.submitOrder(QVariantMap {
{ "userId", settings()->selectedUserId() },
{ "storeId", settings()->selectedStoreId() },
{ "products", m_order.values() },
{ "amount", orderSum() }
});
m_order.clear();
emit orderChanged();
}
SettingsService *ProductsViewModel::settings() const
{
return SettingsService::instance();
}

View File

@@ -0,0 +1,38 @@
#ifndef PRODUCTSVIEWMODEL_H
#define PRODUCTSVIEWMODEL_H
#include <QObject>
#include "models/basemodel.h"
class SettingsService;
class ProductsViewModel : public QObject
{
Q_OBJECT
Q_PROPERTY(QVariantList products READ products NOTIFY productsChanged)
Q_PROPERTY(QVariantList order READ order NOTIFY orderChanged)
Q_PROPERTY(float orderSum READ orderSum NOTIFY orderChanged)
public:
explicit ProductsViewModel(QObject *parent = nullptr);
QVariantList products() const;
QVariantList order() const;
float orderSum() const;
Q_INVOKABLE void setOrderValue(const QString &productId, float value);
Q_INVOKABLE void submitOrder();
signals:
void productsChanged();
void orderChanged();
private:
SettingsService *settings() const;
BaseModel m_productsModel = BaseModel("products", this);
QVariantMap m_order;
};
#endif // PRODUCTSVIEWMODEL_H

View File

@@ -0,0 +1,57 @@
#include "settingsviewmodel.h"
SettingsViewModel::SettingsViewModel(QObject *parent)
: QAbstractListModel{parent}
{
m_items << SettingItem { tr("BeerLog service address"), "serverAddress", "text" }
<< SettingItem { tr("Selected user id"), "selectedUserId", "choice", "users" }
<< SettingItem { tr("Selected store"), "selectedStoreId", "choice", "stores" };
m_models["users"] = new BaseModel("users", this);
m_models["stores"] = new BaseModel("stores", this);
}
int SettingsViewModel::rowCount(const QModelIndex &) const
{
return m_items.count();
}
QVariant SettingsViewModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid()) {
return {};
}
SettingItem item = m_items.at(index.row());
switch (role) {
case Roles::Title: return item.title;
case Roles::PropertyName: return item.propertyName;
case Roles::ControlType: return item.controlType;
case Roles::Model: return model(item.modelName);
default:
break;
}
return {};
}
QHash<int, QByteArray> SettingsViewModel::roleNames() const
{
return QHash<int, QByteArray> {
{ Roles::Title, "title" },
{ Roles::PropertyName, "name" },
{ Roles::ControlType, "control" },
{ Roles::Model, "choiceModel" }
};
}
QVariant SettingsViewModel::model(const QString &modelName) const
{
if (!m_models.contains(modelName)) {
return {};
}
return m_models[modelName]->items();
}

View File

@@ -0,0 +1,47 @@
#ifndef SETTINGSVIEWMODEL_H
#define SETTINGSVIEWMODEL_H
#include <QAbstractListModel>
#include "models/basemodel.h"
class SettingsViewModel : public QAbstractListModel
{
Q_OBJECT
public:
explicit SettingsViewModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent) const override;
QVariant data(const QModelIndex &index, int role) const override;
QHash<int, QByteArray> roleNames() const override;
private:
enum Roles {
Title = Qt::UserRole + 1,
PropertyName,
ControlType,
Model
};
struct SettingItem
{
QString title;
QString propertyName;
QString controlType;
QString modelName;
SettingItem(const QString &title, const QString &propertyName, const QString &controlType, const QString &modelName = {}) :
title(title),
propertyName(propertyName),
controlType(controlType),
modelName(modelName) {}
};
QVariant model(const QString &modelName) const;
QList<SettingItem> m_items;
QMap<QString, BaseModel *> m_models;
};
#endif // SETTINGSVIEWMODEL_H

View File

@@ -0,0 +1,38 @@
#include "storesviewmodel.h"
#include "services/settingsservice.h"
StoresViewModel::StoresViewModel(QObject *parent)
: QObject{parent}
{
connect(&m_storesModel, &BaseModel::dataChanged, this, &StoresViewModel::storesChanged);
connect(&m_storesModel, &BaseModel::dataChanged, this, &StoresViewModel::selectedStoreNameChanged);
connect(settings(), &SettingsService::selectedStoreIdChanged, this, &StoresViewModel::selectedStoreChanged);
connect(settings(), &SettingsService::selectedStoreIdChanged, this, &StoresViewModel::selectedStoreNameChanged);
}
QVariantList StoresViewModel::stores() const
{
return m_storesModel.items();
}
QString StoresViewModel::selectedStore() const
{
return settings()->selectedStoreId();
}
void StoresViewModel::setSelectedStore(const QString &newSelectedStore)
{
settings()->setSelectedStoreId(newSelectedStore);
}
QString StoresViewModel::selectedStoreName() const
{
return m_storesModel.itemProperty(selectedStore(), "name").toString();
}
SettingsService *StoresViewModel::settings() const
{
return SettingsService::instance();
}

View File

@@ -0,0 +1,36 @@
#ifndef STORESVIEWMODEL_H
#define STORESVIEWMODEL_H
#include <QObject>
#include "models/basemodel.h"
class SettingsService;
class StoresViewModel : public QObject
{
Q_OBJECT
Q_PROPERTY(QVariantList stores READ stores NOTIFY storesChanged)
Q_PROPERTY(QString selectedStore READ selectedStore WRITE setSelectedStore NOTIFY selectedStoreChanged)
Q_PROPERTY(QString selectedStoreName READ selectedStoreName NOTIFY selectedStoreNameChanged)
public:
explicit StoresViewModel(QObject *parent = nullptr);
QVariantList stores() const;
QString selectedStore() const;
void setSelectedStore(const QString &newSelectedStore);
QString selectedStoreName() const;
signals:
void storesChanged();
void selectedStoreChanged();
void selectedStoreNameChanged();
private:
SettingsService *settings() const;
BaseModel m_storesModel = BaseModel("stores", this);
};
#endif // STORESVIEWMODEL_H

View File

@@ -5,8 +5,8 @@
UsersViewModel::UsersViewModel(QObject *parent)
: QObject{parent}
{
connect(&m_usersModel, &AbstractModel::dataChanged, this, &UsersViewModel::usersChanged);
connect(&m_usersModel, &AbstractModel::dataChanged, this, &UsersViewModel::selectedUserNameChanged);
connect(&m_usersModel, &BaseModel::dataChanged, this, &UsersViewModel::usersChanged);
connect(&m_usersModel, &BaseModel::dataChanged, this, &UsersViewModel::selectedUserNameChanged);
connect(settings(), &SettingsService::selectedUserIdChanged, this, &UsersViewModel::selectedUserChanged);
connect(settings(), &SettingsService::selectedUserIdChanged, this, &UsersViewModel::selectedUserNameChanged);
@@ -24,16 +24,12 @@ QString UsersViewModel::selectedUser() const
void UsersViewModel::setSelectedUser(const QString &newSelectedUser)
{
if (selectedUser() == newSelectedUser) {
return;
}
settings()->setSelectedUserId(newSelectedUser);
}
QString UsersViewModel::selectedUserName() const
{
return m_usersModel.userName(selectedUser());
return m_usersModel.itemProperty(selectedUser(), "name").toString();
}
SettingsService *UsersViewModel::settings() const