From e89343b03eafefb9cf6563dbdfd3cb72502f459a Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sun, 12 Jun 2022 14:59:43 +0200 Subject: [PATCH] Fix crash when deleting last macro A crash could occur if the last macro was deleted and the highlighting of macro segments was enabled due to the macro segments already being deleted while the widgets representing these segments were not --- src/macro-action-edit.cpp | 2 +- src/macro-condition-edit.cpp | 2 +- src/macro-tab.cpp | 9 ++++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/macro-action-edit.cpp b/src/macro-action-edit.cpp index 2660cf9a..15de914d 100644 --- a/src/macro-action-edit.cpp +++ b/src/macro-action-edit.cpp @@ -220,11 +220,11 @@ void AdvSceneSwitcher::RemoveMacroAction(int idx) { std::lock_guard lock(switcher->m); + actionsList->Remove(idx); macro->Actions().erase(macro->Actions().begin() + idx); switcher->abortMacroWait = true; switcher->macroWaitCv.notify_all(); macro->UpdateActionIndices(); - actionsList->Remove(idx); SetActionData(*macro); } MacroActionSelectionChanged(-1); diff --git a/src/macro-condition-edit.cpp b/src/macro-condition-edit.cpp index 10aed481..f1596fe8 100644 --- a/src/macro-condition-edit.cpp +++ b/src/macro-condition-edit.cpp @@ -437,13 +437,13 @@ void AdvSceneSwitcher::RemoveMacroCondition(int idx) { std::lock_guard lock(switcher->m); + conditionsList->Remove(idx); macro->Conditions().erase(macro->Conditions().begin() + idx); macro->UpdateConditionIndices(); if (idx == 0 && macro->Conditions().size() > 0) { auto newRoot = macro->Conditions().at(0); newRoot->SetLogicType(LogicType::ROOT_NONE); } - conditionsList->Remove(idx); SetConditionData(*macro); } MacroConditionSelectionChanged(-1); diff --git a/src/macro-tab.cpp b/src/macro-tab.cpp index bfd6b2e0..e42be71b 100644 --- a/src/macro-tab.cpp +++ b/src/macro-tab.cpp @@ -98,12 +98,13 @@ void AdvSceneSwitcher::on_macroRemove_clicked() if (!item) { return; } + int idx = ui->macros->currentRow(); + delete item; QString name; { std::lock_guard lock(switcher->m); switcher->abortMacroWait = true; switcher->macroWaitCv.notify_all(); - int idx = ui->macros->currentRow(); QString::fromStdString(switcher->macros[idx]->Name()); switcher->macros.erase(switcher->macros.begin() + idx); for (auto &m : switcher->macros) { @@ -111,8 +112,6 @@ void AdvSceneSwitcher::on_macroRemove_clicked() } } - delete item; - if (ui->macros->count() == 0) { ui->macroHelp->setVisible(true); } @@ -360,6 +359,10 @@ void AdvSceneSwitcher::on_macros_currentRowChanged(int idx) if (idx == -1) { SetMacroEditAreaDisabled(true); + conditionsList->Clear(); + actionsList->Clear(); + conditionsList->SetHelpMsgVisible(true); + actionsList->SetHelpMsgVisible(true); return; }