Choice model settings was added
This commit is contained in:
72
viewmodels/ordersviewmodel.cpp
Normal file
72
viewmodels/ordersviewmodel.cpp
Normal 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();
|
||||
}
|
||||
43
viewmodels/ordersviewmodel.h
Normal file
43
viewmodels/ordersviewmodel.h
Normal 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
|
||||
78
viewmodels/productsviewmodel.cpp
Normal file
78
viewmodels/productsviewmodel.cpp
Normal 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();
|
||||
}
|
||||
38
viewmodels/productsviewmodel.h
Normal file
38
viewmodels/productsviewmodel.h
Normal 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
|
||||
57
viewmodels/settingsviewmodel.cpp
Normal file
57
viewmodels/settingsviewmodel.cpp
Normal 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();
|
||||
}
|
||||
47
viewmodels/settingsviewmodel.h
Normal file
47
viewmodels/settingsviewmodel.h
Normal 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
|
||||
38
viewmodels/storesviewmodel.cpp
Normal file
38
viewmodels/storesviewmodel.cpp
Normal 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();
|
||||
}
|
||||
36
viewmodels/storesviewmodel.h
Normal file
36
viewmodels/storesviewmodel.h
Normal 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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user