load assignable settings from profile on startup

This commit is contained in:
Jussi Kuokkanen
2023-09-15 14:33:44 +03:00
parent 401b31fccd
commit 560453bacf
6 changed files with 53 additions and 3 deletions

View File

@@ -16,6 +16,7 @@
#include <QString>
#include <QTreeView>
#include <QVector>
#include <DeviceModelDelegate.hpp>
#include <Globals.hpp>
#include <Tree.hpp>
#include <Utils.hpp>
@@ -30,6 +31,7 @@ Q_DECLARE_METATYPE(TCDBus::FlatTreeNode<TCDBus::DeviceNode>)
DeviceModel *Globals::g_deviceModel;
QStackedWidget *Globals::g_mainStack;
QWidget *Globals::g_deviceBrowser;
SettingsData Globals::g_settingsData;
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
qDBusRegisterMetaType<TCDBus::DeviceNode>();
@@ -69,7 +71,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
Globals::g_deviceBrowser = browser;
Globals::g_deviceModel = model;
Globals::g_mainStack = stack;
Globals::g_settingsData = Settings::readSettings();
Utils::setModelAssignableSettings(*model, Globals::g_settingsData.assignableSettings);
Utils::writeAssignableDefaults(*model);
}

View File

@@ -2,6 +2,7 @@
#include <AssignableProxy.hpp>
#include <DeviceModel.hpp>
#include <DeviceModelDelegate.hpp>
#include <functional>
#include <QDebug>
#include <QSettings>
@@ -45,6 +46,48 @@ void traverseModel(
}
}
std::optional<QModelIndex> fromAssignablePath(DeviceModel &model, NodePath path) {
QModelIndex assIndex{};
// Find index from assignable path
auto cb = [&](auto model, auto index, int row) -> std::optional<QModelIndex> {
auto ifaceIndex = model->index(row, DeviceModel::InterfaceColumn, index);
auto assProxyV = ifaceIndex.data(DeviceModel::AssignableProxyRole);
if (assProxyV.isValid()) {
auto assProxy = qvariant_cast<AssignableProxy *>(assProxyV);
if (assProxy->dbusPath() == path) {
assIndex = ifaceIndex;
return std::nullopt;
}
}
return model->index(row, DeviceModel::NameColumn, index);
};
traverseModel(cb, &model);
if (!assIndex.isValid()) {
qWarning("Couldn't find assignable with path %s from model!", qPrintable(path));
return std::nullopt;
}
return assIndex;
}
// Write profile's assignable settings to model
void setModelAssignableSettings(DeviceModel &model, QVector<AssignableSetting> settings) {
QVector<AssignableDefaultData> assSettings;
for (auto &setting : settings) {
auto index = fromAssignablePath(model, setting.assignablePath);
if (index.has_value())
assSettings.append(AssignableDefaultData{
.index = index.value(),
.defaultValue = setting.value,
});
}
// TODO: misleading name when used here!
DeviceModelDelegate::setAssignableDefaults(&model, assSettings);
}
void writeAssignableDefaults(DeviceModel &model) {
ModelTraverseCallback cb = [](QAbstractItemModel *model, QModelIndex index, int row) {
auto ifaceIndex = model->index(row, DeviceModel::InterfaceColumn, index);

View File

@@ -2,6 +2,7 @@
#include <DeviceModel.hpp>
class AssignableSetting;
class SettingsData;
namespace Utils {
@@ -18,5 +19,6 @@ void traverseModel(
const ModelTraverseCallback &, QAbstractItemModel *, const QModelIndex &parent = QModelIndex());
void writeAssignableDefaults(DeviceModel &model);
void writeAssignableSetting(SettingsData, QVariant value, NodePath assignablePath);
void setModelAssignableSettings(DeviceModel &model, QVector<AssignableSetting>);
} // namespace Utils

View File

@@ -178,6 +178,7 @@ QStandardItem *DeviceModel::createAssignable(
if (success) {
// Write successfully changed value to settings
// TODO: parametrization won't be saved here
Utils::writeAssignableSetting(
Globals::g_settingsData, proxy->targetValue(), proxy->dbusPath());
}

View File

@@ -26,6 +26,8 @@ public:
QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
bool editorEvent(QEvent *, QAbstractItemModel *, const QStyleOptionViewItem &,
const QModelIndex &) override;
static void setAssignableDefaults(QAbstractItemModel *, QVector<AssignableDefaultData>);
protected:
void paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const override;
@@ -39,7 +41,6 @@ private:
bool subtreeHasAssignableDefaults(QAbstractItemModel *, const QModelIndex &);
QVector<AssignableDefaultData> subtreeAssignableDefaults(
QAbstractItemModel *, const QModelIndex &);
static void setAssignableDefaults(QAbstractItemModel *, QVector<AssignableDefaultData>);
FunctionEditor *m_functionEditor;
QAction *m_parametrize;

View File

@@ -9,8 +9,6 @@
#include <QSettings>
#include <Utils.hpp>
SettingsData Globals::g_settingsData;
Settings::Settings(QWidget *parent) : QWidget(parent) {
qRegisterMetaTypeStreamOperators<QVector<QString>>("QVector<QString>>");
@@ -141,6 +139,7 @@ void Settings::writeSettings(SettingsData data) {
}
SettingsData Settings::readSettings() {
qRegisterMetaTypeStreamOperators<QVector<QString>>("QVector<QString>>");
QSettings s{"tuxclocker"};
std::optional<QString> profile;