#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" }; } 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 SettingsViewModel::roleNames() const { return QHash { { 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; }