Files
beerlog/viewmodels/settingsviewmodel.cpp

112 lines
3.1 KiB
C++

#include "settingsviewmodel.h"
#include "services/modelsregister.h"
#include "services/settingsservice.h"
#include "models/basemodel.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" };
QModelIndex selectedUserIdIndex = index(1);
QModelIndex selectedStoreIdIndex = index(2);
connect(settings(), &SettingsService::selectedUserIdChanged, this, [this, selectedUserIdIndex]() {
emit dataChanged(selectedUserIdIndex, selectedUserIdIndex);
});
connect(settings(), &SettingsService::selectedStoreIdChanged, this, [this, selectedStoreIdIndex]() {
emit dataChanged(selectedStoreIdIndex, selectedStoreIdIndex);
});
}
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::Subtitle: return subtitle(item.propertyName, item.modelName);
case Roles::Value: return settings()->property(item.propertyName.toLocal8Bit());
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::Subtitle, "subtitle" },
{ Roles::Value, "value" },
{ Roles::ControlType, "control" },
{ Roles::Model, "choiceModel" }
};
}
bool SettingsViewModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (!index.isValid()) {
return false;
}
if (Roles::Value != role) {
return false;
}
SettingItem item = m_items.at(index.row());
bool res = settings()->setProperty(item.propertyName.toLocal8Bit(), value);
if (res) {
emit dataChanged(index, index);
}
return res;
}
Qt::ItemFlags SettingsViewModel::flags(const QModelIndex &index) const
{
return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
}
SettingsService *SettingsViewModel::settings() const
{
return SettingsService::instance();
}
QVariant SettingsViewModel::model(const QString &modelName) const
{
BaseModel *model = modelName.isEmpty() ? nullptr : ModelsRegister::model(modelName);
if (!model) {
return {};
}
return model->items();
}
QVariant SettingsViewModel::subtitle(const QString &propertyName, const QString &modelName) const
{
BaseModel *model = modelName.isEmpty() ? nullptr : ModelsRegister::model(modelName);
QVariant propertyValue = settings()->property(propertyName.toLocal8Bit());
if (model) {
return model->itemProperty(propertyValue.toString(), "name");
}
return propertyValue;
}