diff --git a/src/tuxclocker-qt/MainWindow.cpp b/src/tuxclocker-qt/MainWindow.cpp index df0f8aa..fbb171d 100644 --- a/src/tuxclocker-qt/MainWindow.cpp +++ b/src/tuxclocker-qt/MainWindow.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -30,6 +31,7 @@ Q_DECLARE_METATYPE(TCDBus::FlatTreeNode) DeviceModel *Globals::g_deviceModel; QStackedWidget *Globals::g_mainStack; QWidget *Globals::g_deviceBrowser; +SettingsData Globals::g_settingsData; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { qDBusRegisterMetaType(); @@ -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); } diff --git a/src/tuxclocker-qt/Utils.cpp b/src/tuxclocker-qt/Utils.cpp index 88eb69a..95a04b4 100644 --- a/src/tuxclocker-qt/Utils.cpp +++ b/src/tuxclocker-qt/Utils.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -45,6 +46,48 @@ void traverseModel( } } +std::optional fromAssignablePath(DeviceModel &model, NodePath path) { + QModelIndex assIndex{}; + // Find index from assignable path + auto cb = [&](auto model, auto index, int row) -> std::optional { + auto ifaceIndex = model->index(row, DeviceModel::InterfaceColumn, index); + auto assProxyV = ifaceIndex.data(DeviceModel::AssignableProxyRole); + + if (assProxyV.isValid()) { + auto assProxy = qvariant_cast(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 settings) { + QVector 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); diff --git a/src/tuxclocker-qt/Utils.hpp b/src/tuxclocker-qt/Utils.hpp index c28ec56..4b775b5 100644 --- a/src/tuxclocker-qt/Utils.hpp +++ b/src/tuxclocker-qt/Utils.hpp @@ -2,6 +2,7 @@ #include +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); } // namespace Utils diff --git a/src/tuxclocker-qt/data/DeviceModel.cpp b/src/tuxclocker-qt/data/DeviceModel.cpp index b256327..27ac927 100644 --- a/src/tuxclocker-qt/data/DeviceModel.cpp +++ b/src/tuxclocker-qt/data/DeviceModel.cpp @@ -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()); } diff --git a/src/tuxclocker-qt/data/DeviceModelDelegate.hpp b/src/tuxclocker-qt/data/DeviceModelDelegate.hpp index db6b72b..3ff3a03 100644 --- a/src/tuxclocker-qt/data/DeviceModelDelegate.hpp +++ b/src/tuxclocker-qt/data/DeviceModelDelegate.hpp @@ -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); protected: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; @@ -39,7 +41,6 @@ private: bool subtreeHasAssignableDefaults(QAbstractItemModel *, const QModelIndex &); QVector subtreeAssignableDefaults( QAbstractItemModel *, const QModelIndex &); - static void setAssignableDefaults(QAbstractItemModel *, QVector); FunctionEditor *m_functionEditor; QAction *m_parametrize; diff --git a/src/tuxclocker-qt/widgets/Settings.cpp b/src/tuxclocker-qt/widgets/Settings.cpp index ab700bd..4fe1042 100644 --- a/src/tuxclocker-qt/widgets/Settings.cpp +++ b/src/tuxclocker-qt/widgets/Settings.cpp @@ -9,8 +9,6 @@ #include #include -SettingsData Globals::g_settingsData; - Settings::Settings(QWidget *parent) : QWidget(parent) { qRegisterMetaTypeStreamOperators>("QVector>"); @@ -141,6 +139,7 @@ void Settings::writeSettings(SettingsData data) { } SettingsData Settings::readSettings() { + qRegisterMetaTypeStreamOperators>("QVector>"); QSettings s{"tuxclocker"}; std::optional profile;