From c34308f74390954528a709949a2db07fde4ebef9 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Thu, 21 Oct 2021 23:14:09 +0200 Subject: [PATCH] Fix scroll position being lost when adding or removing macro segments --- src/headers/advanced-scene-switcher.hpp | 2 + src/headers/utility.hpp | 2 +- src/macro-action-edit.cpp | 16 ++----- src/macro-condition-edit.cpp | 20 ++------ src/macro-tab.cpp | 62 +++++++++++++------------ src/utility.cpp | 4 +- 6 files changed, 46 insertions(+), 60 deletions(-) diff --git a/src/headers/advanced-scene-switcher.hpp b/src/headers/advanced-scene-switcher.hpp index b79f41b1..8abdf617 100644 --- a/src/headers/advanced-scene-switcher.hpp +++ b/src/headers/advanced-scene-switcher.hpp @@ -52,6 +52,8 @@ public: void SetEditMacro(Macro &m); void HighlightAction(int idx); void HighlightCondition(int idx); + void PopulateMacroActions(Macro &m, int afterIdx = 0); + void PopulateMacroConditions(Macro &m, int afterIdx = 0); void ConnectControlSignals(MacroActionEdit *); void ConnectControlSignals(MacroConditionEdit *); void SwapActions(Macro *m, int pos1, int pos2); diff --git a/src/headers/utility.hpp b/src/headers/utility.hpp index bc5d4aff..2cff5fd4 100644 --- a/src/headers/utility.hpp +++ b/src/headers/utility.hpp @@ -44,7 +44,7 @@ void placeWidgets(std::string text, QBoxLayout *layout, std::unordered_map placeholders, bool addStretch = true); void deleteLayoutItem(QLayoutItem *item); -void clearLayout(QLayout *layout); +void clearLayout(QLayout *layout, int afterIdx = 0); QMetaObject::Connection PulseWidget(QWidget *widget, QColor startColor, QColor = QColor(0, 0, 0, 0), QString specifier = "QLabel ", diff --git a/src/macro-action-edit.cpp b/src/macro-action-edit.cpp index 07084c4b..2d80baa6 100644 --- a/src/macro-action-edit.cpp +++ b/src/macro-action-edit.cpp @@ -152,12 +152,8 @@ void AdvSceneSwitcher::AddMacroAction(int idx) } macro->UpdateActionIndices(); - // All entry pointers in existing edit widgets after the new entry will - // be invalidated by adding the new entry so we have to recreate them - // and because I am lazy I am recreating every widget. - // - // If performance should become a concern this has to be revisited. - SetEditMacro(*macro); + clearLayout(ui->macroEditActionLayout, idx); + PopulateMacroActions(*macro, idx); HighlightAction(idx); } @@ -189,12 +185,8 @@ void AdvSceneSwitcher::RemoveMacroAction(int idx) switcher->macroWaitCv.notify_one(); macro->UpdateActionIndices(); - // All entry pointers in existing edit widgets after the new entry will - // be invalidated by adding the new entry so we have to recreate them - // and because I am lazy I am recreating every widget. - // - // If performance should become a concern this has to be revisited. - SetEditMacro(*macro); + clearLayout(ui->macroEditActionLayout, idx); + PopulateMacroActions(*macro, idx); } void AdvSceneSwitcher::on_actionRemove_clicked() diff --git a/src/macro-condition-edit.cpp b/src/macro-condition-edit.cpp index 1854e255..631b4994 100644 --- a/src/macro-condition-edit.cpp +++ b/src/macro-condition-edit.cpp @@ -276,12 +276,8 @@ void AdvSceneSwitcher::AddMacroCondition(int idx) (*cond)->SetLogicType(logic); macro->UpdateConditionIndices(); - // All entry pointers in existing edit widgets after the new entry will - // be invalidated by adding the new entry so we have to recreate them - // and because I am lazy I am recreating every widget. - // - // If performance should become a concern this has to be revisited. - SetEditMacro(*macro); + clearLayout(ui->macroEditConditionLayout, idx); + PopulateMacroConditions(*macro, idx); HighlightCondition(idx); } @@ -311,21 +307,13 @@ void AdvSceneSwitcher::RemoveMacroCondition(int idx) macro->Conditions().erase(macro->Conditions().begin() + idx); macro->UpdateConditionIndices(); - if (macro->Conditions().size() == 0) { - ui->macroEditConditionHelp->setVisible(true); - } - if (idx == 0 && macro->Conditions().size() > 0) { auto newRoot = macro->Conditions().at(0); newRoot->SetLogicType(LogicType::ROOT_NONE); } - // All entry pointers in existing edit widgets after the new entry will - // be invalidated by adding the new entry so we have to recreate them - // and because I am lazy I am recreating every widget. - // - // If performance should become a concern this has to be revisited. - SetEditMacro(*macro); + clearLayout(ui->macroEditConditionLayout, idx); + PopulateMacroConditions(*macro, idx); } void AdvSceneSwitcher::on_conditionRemove_clicked() diff --git a/src/macro-tab.cpp b/src/macro-tab.cpp index 09de882f..87d29d3c 100644 --- a/src/macro-tab.cpp +++ b/src/macro-tab.cpp @@ -170,42 +170,46 @@ void AdvSceneSwitcher::on_macroName_editingFinished() emit MacroRenamed(oldName, newName); } +void AdvSceneSwitcher::PopulateMacroActions(Macro &m, int afterIdx) +{ + bool root = afterIdx == 0; + auto &actions = m.Actions(); + for (; afterIdx < actions.size(); afterIdx++) { + auto newEntry = new MacroActionEdit(this, &actions[afterIdx], + actions[afterIdx]->GetId()); + ConnectControlSignals(newEntry); + ui->macroEditActionLayout->addWidget(newEntry); + ui->macroEditActionHelp->setVisible(false); + root = false; + } + ui->macroEditActionHelp->setVisible(actions.size() == 0); +} + +void AdvSceneSwitcher::PopulateMacroConditions(Macro &m, int afterIdx) +{ + bool root = afterIdx == 0; + auto &conditions = m.Conditions(); + for (; afterIdx < conditions.size(); afterIdx++) { + auto newEntry = new MacroConditionEdit( + this, &conditions[afterIdx], + conditions[afterIdx]->GetId(), root); + ConnectControlSignals(newEntry); + ui->macroEditConditionLayout->addWidget(newEntry); + ui->macroEditConditionHelp->setVisible(false); + root = false; + } + ui->macroEditConditionHelp->setVisible(conditions.size() == 0); +} + void AdvSceneSwitcher::SetEditMacro(Macro &m) { ui->macroName->setText(m.Name().c_str()); clearLayout(ui->macroEditConditionLayout); clearLayout(ui->macroEditActionLayout); - bool root = true; - for (auto &c : m.Conditions()) { - auto newEntry = - new MacroConditionEdit(this, &c, c->GetId(), root); - ConnectControlSignals(newEntry); - ui->macroEditConditionLayout->addWidget(newEntry); - ui->macroEditConditionHelp->setVisible(false); - root = false; - } - - for (auto &a : m.Actions()) { - auto newEntry = new MacroActionEdit(this, &a, a->GetId()); - ConnectControlSignals(newEntry); - ui->macroEditActionLayout->addWidget(newEntry); - ui->macroEditActionHelp->setVisible(false); - } - + PopulateMacroConditions(m); + PopulateMacroActions(m); ui->macroEdit->setDisabled(false); - - if (m.Conditions().size() == 0) { - ui->macroEditConditionHelp->setVisible(true); - } else { - ui->macroEditConditionHelp->setVisible(false); - } - - if (m.Actions().size() == 0) { - ui->macroEditActionHelp->setVisible(true); - } else { - ui->macroEditActionHelp->setVisible(false); - } } void AdvSceneSwitcher::HighlightAction(int idx) diff --git a/src/utility.cpp b/src/utility.cpp index 65bc9058..1c1fede5 100644 --- a/src/utility.cpp +++ b/src/utility.cpp @@ -213,10 +213,10 @@ void deleteLayoutItem(QLayoutItem *item) } } -void clearLayout(QLayout *layout) +void clearLayout(QLayout *layout, int afterIdx) { QLayoutItem *item; - while ((item = layout->takeAt(0))) { + while (item = layout->takeAt(afterIdx)) { if (item->layout()) { clearLayout(item->layout()); delete item->layout();