settingsviewmodel.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include "settingsviewmodel.h"
  2. #include "services/modelsregister.h"
  3. #include "services/settingsservice.h"
  4. #include "models/basemodel.h"
  5. SettingsViewModel::SettingsViewModel(QObject *parent)
  6. : QAbstractListModel{parent}
  7. {
  8. m_items << SettingItem { tr("BeerLog service address"), "serverAddress", "text" }
  9. << SettingItem { tr("Selected user id"), "selectedUserId", "choice", "users" }
  10. << SettingItem { tr("Selected store"), "selectedStoreId", "choice", "stores" };
  11. QModelIndex selectedUserIdIndex = index(1);
  12. QModelIndex selectedStoreIdIndex = index(2);
  13. connect(settings(), &SettingsService::selectedUserIdChanged, this, [this, selectedUserIdIndex]() {
  14. emit dataChanged(selectedUserIdIndex, selectedUserIdIndex);
  15. });
  16. connect(settings(), &SettingsService::selectedStoreIdChanged, this, [this, selectedStoreIdIndex]() {
  17. emit dataChanged(selectedStoreIdIndex, selectedStoreIdIndex);
  18. });
  19. }
  20. int SettingsViewModel::rowCount(const QModelIndex &) const
  21. {
  22. return m_items.count();
  23. }
  24. QVariant SettingsViewModel::data(const QModelIndex &index, int role) const
  25. {
  26. if (!index.isValid()) {
  27. return {};
  28. }
  29. SettingItem item = m_items.at(index.row());
  30. switch (role) {
  31. case Roles::Title: return item.title;
  32. case Roles::Subtitle: return subtitle(item.propertyName, item.modelName);
  33. case Roles::Value: return settings()->property(item.propertyName.toLocal8Bit());
  34. case Roles::ControlType: return item.controlType;
  35. case Roles::Model: return model(item.modelName);
  36. default:
  37. break;
  38. }
  39. return {};
  40. }
  41. QHash<int, QByteArray> SettingsViewModel::roleNames() const
  42. {
  43. return QHash<int, QByteArray> {
  44. { Roles::Title, "title" },
  45. { Roles::Subtitle, "subtitle" },
  46. { Roles::Value, "value" },
  47. { Roles::ControlType, "control" },
  48. { Roles::Model, "choiceModel" }
  49. };
  50. }
  51. bool SettingsViewModel::setData(const QModelIndex &index, const QVariant &value, int role)
  52. {
  53. if (!index.isValid()) {
  54. return false;
  55. }
  56. if (Roles::Value != role) {
  57. return false;
  58. }
  59. SettingItem item = m_items.at(index.row());
  60. bool res = settings()->setProperty(item.propertyName.toLocal8Bit(), value);
  61. if (res) {
  62. emit dataChanged(index, index);
  63. }
  64. return res;
  65. }
  66. Qt::ItemFlags SettingsViewModel::flags(const QModelIndex &index) const
  67. {
  68. return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
  69. }
  70. SettingsService *SettingsViewModel::settings() const
  71. {
  72. return SettingsService::instance();
  73. }
  74. QVariant SettingsViewModel::model(const QString &modelName) const
  75. {
  76. BaseModel *model = modelName.isEmpty() ? nullptr : ModelsRegister::model(modelName);
  77. if (!model) {
  78. return {};
  79. }
  80. return model->items();
  81. }
  82. QVariant SettingsViewModel::subtitle(const QString &propertyName, const QString &modelName) const
  83. {
  84. BaseModel *model = modelName.isEmpty() ? nullptr : ModelsRegister::model(modelName);
  85. QVariant propertyValue = settings()->property(propertyName.toLocal8Bit());
  86. if (model) {
  87. return model->itemProperty(propertyValue.toString(), "name");
  88. }
  89. return propertyValue;
  90. }