diff --git a/src/headers/macro-condition-edit.hpp b/src/headers/macro-condition-edit.hpp index 8e1ac4aa..264d7291 100644 --- a/src/headers/macro-condition-edit.hpp +++ b/src/headers/macro-condition-edit.hpp @@ -48,6 +48,7 @@ private slots: void DurationUnitChanged(DurationUnit unit); private: + void SetLogicSelection(); MacroSegment *Data(); QComboBox *_logicSelection; diff --git a/src/headers/macro-segment-list.hpp b/src/headers/macro-segment-list.hpp index ef578341..f753f3f6 100644 --- a/src/headers/macro-segment-list.hpp +++ b/src/headers/macro-segment-list.hpp @@ -15,6 +15,7 @@ public: virtual ~MacroSegmentList(); void SetHelpMsg(const QString &msg); void SetHelpMsgVisible(bool visible); + MacroSegmentEdit *WidgetAt(int idx); void Insert(int idx, QWidget *widget); void Add(QWidget *widget); void Remove(int idx); @@ -47,7 +48,6 @@ private: bool IsInListArea(const QPoint &); QRect GetContentItemRectWithPadding(int idx); void HideLastDropLine(); - MacroSegmentEdit *WidgetAt(int idx); int _dragPosition = -1; int _dropLineIdx = -1; diff --git a/src/macro-action-edit.cpp b/src/macro-action-edit.cpp index 1590dc80..921beb87 100644 --- a/src/macro-action-edit.cpp +++ b/src/macro-action-edit.cpp @@ -170,12 +170,12 @@ void AdvSceneSwitcher::AddMacroAction(int idx) obs_data_release(data); } macro->UpdateActionIndices(); + actionsList->Insert( + idx, + new MacroActionEdit(this, ¯o->Actions()[idx], id)); + SetActionData(*macro); } - - actionsList->Clear(idx); - PopulateMacroActions(*macro, idx); HighlightAction(idx); - SetActionData(*macro); } void AdvSceneSwitcher::on_actionAdd_clicked() @@ -217,11 +217,10 @@ void AdvSceneSwitcher::RemoveMacroAction(int idx) switcher->abortMacroWait = true; switcher->macroWaitCv.notify_all(); macro->UpdateActionIndices(); + actionsList->Remove(idx); + SetActionData(*macro); } - - actionsList->Clear(idx); - PopulateMacroActions(*macro, idx); - SetActionData(*macro); + MacroActionSelectionChanged(-1); } void AdvSceneSwitcher::on_actionRemove_clicked() @@ -271,12 +270,13 @@ void AdvSceneSwitcher::SwapActions(Macro *m, int pos1, int pos2) auto a1 = m->Actions().begin() + pos1; auto a2 = m->Actions().begin() + pos2; - actionsList->Remove(pos1); - actionsList->Remove(pos2 - 1); - auto widget1 = new MacroActionEdit(this, &(*a1), (*a1)->GetId()); - auto widget2 = new MacroActionEdit(this, &(*a2), (*a2)->GetId()); - actionsList->Insert(pos1, widget1); - actionsList->Insert(pos2, widget2); + auto widget1 = static_cast( + actionsList->ContentLayout()->takeAt(pos1)->widget()); + auto widget2 = static_cast( + actionsList->ContentLayout()->takeAt(pos2 - 1)->widget()); + actionsList->Insert(pos1, widget2); + actionsList->Insert(pos2, widget1); + SetActionData(*m); } void AdvSceneSwitcher::MoveMacroActionUp(int idx) @@ -344,9 +344,8 @@ void AdvSceneSwitcher::MacroActionReorder(int to, int from) auto action = macro->Actions().at(from); macro->Actions().erase(macro->Actions().begin() + from); macro->Actions().insert(macro->Actions().begin() + to, action); + macro->UpdateActionIndices(); + SetActionData(*macro); } - - macro->UpdateActionIndices(); HighlightAction(to); - SetActionData(*macro); } diff --git a/src/macro-condition-edit.cpp b/src/macro-condition-edit.cpp index 83953550..2c179b38 100644 --- a/src/macro-condition-edit.cpp +++ b/src/macro-condition-edit.cpp @@ -161,11 +161,24 @@ bool MacroConditionEdit::IsRootNode() return _isRoot; } +void MacroConditionEdit::SetLogicSelection() +{ + auto logic = (*_entryData)->GetLogicType(); + if (IsRootNode()) { + _logicSelection->setCurrentIndex(static_cast(logic)); + } else { + _logicSelection->setCurrentIndex(static_cast(logic) - + logic_root_offset); + } +} + void MacroConditionEdit::SetRootNode(bool root) { + _isRoot = root; const QSignalBlocker blocker(_logicSelection); _logicSelection->clear(); populateLogicSelection(_logicSelection, root); + SetLogicSelection(); } void MacroConditionEdit::UpdateEntryData(const std::string &id) @@ -178,13 +191,7 @@ void MacroConditionEdit::UpdateEntryData(const std::string &id) this, SLOT(HeaderInfoChanged(const QString &))); HeaderInfoChanged( QString::fromStdString((*_entryData)->GetShortDesc())); - auto logic = (*_entryData)->GetLogicType(); - if (IsRootNode()) { - _logicSelection->setCurrentIndex(static_cast(logic)); - } else { - _logicSelection->setCurrentIndex(static_cast(logic) - - logic_root_offset); - } + SetLogicSelection(); _section->SetContent(widget, (*_entryData)->GetCollapsed()); _dur->setVisible(MacroConditionFactory::UsesDurationConstraint(id)); @@ -300,12 +307,13 @@ void AdvSceneSwitcher::AddMacroCondition(int idx) } (*cond)->SetLogicType(logic); macro->UpdateConditionIndices(); + conditionsList->Insert( + idx, + new MacroConditionEdit(this, ¯o->Conditions()[idx], + id, idx == 0)); + SetConditionData(*macro); } - - conditionsList->Clear(idx); - PopulateMacroConditions(*macro, idx); HighlightCondition(idx); - SetConditionData(*macro); } void AdvSceneSwitcher::on_conditionAdd_clicked() @@ -345,16 +353,14 @@ void AdvSceneSwitcher::RemoveMacroCondition(int idx) std::lock_guard lock(switcher->m); 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); } - - conditionsList->Clear(idx); - PopulateMacroConditions(*macro, idx); - SetConditionData(*macro); + MacroConditionSelectionChanged(-1); } void AdvSceneSwitcher::on_conditionRemove_clicked() @@ -413,14 +419,15 @@ void AdvSceneSwitcher::SwapConditions(Macro *m, int pos1, int pos2) (*c2)->SetLogicType(logic1); } - conditionsList->Remove(pos1); - conditionsList->Remove(pos2 - 1); - auto widget1 = - new MacroConditionEdit(this, &(*c1), (*c1)->GetId(), root); - auto widget2 = - new MacroConditionEdit(this, &(*c2), (*c2)->GetId(), false); - conditionsList->Insert(pos1, widget1); - conditionsList->Insert(pos2, widget2); + auto widget1 = static_cast( + conditionsList->ContentLayout()->takeAt(pos1)->widget()); + auto widget2 = static_cast( + conditionsList->ContentLayout()->takeAt(pos2 - 1)->widget()); + conditionsList->Insert(pos1, widget2); + conditionsList->Insert(pos2, widget1); + SetConditionData(*m); + widget2->SetRootNode(root); + widget1->SetRootNode(false); } void AdvSceneSwitcher::MoveMacroConditionUp(int idx) @@ -488,19 +495,32 @@ void AdvSceneSwitcher::MacroConditionReorder(int to, int from) auto condition = macro->Conditions().at(from); if (to == 0) { condition->SetLogicType(LogicType::ROOT_NONE); + static_cast( + conditionsList->WidgetAt(from)) + ->SetRootNode(true); macro->Conditions().at(0)->SetLogicType(LogicType::AND); + static_cast( + conditionsList->WidgetAt(0)) + ->SetRootNode(false); } if (from == 0) { condition->SetLogicType(LogicType::AND); + static_cast( + conditionsList->WidgetAt(from)) + ->SetRootNode(false); macro->Conditions().at(1)->SetLogicType( LogicType::ROOT_NONE); + static_cast( + conditionsList->WidgetAt(1)) + ->SetRootNode(true); } macro->Conditions().erase(macro->Conditions().begin() + from); macro->Conditions().insert(macro->Conditions().begin() + to, condition); + macro->UpdateConditionIndices(); + conditionsList->ContentLayout()->insertItem( + to, conditionsList->ContentLayout()->takeAt(from)); + SetConditionData(*macro); } - - macro->UpdateConditionIndices(); HighlightCondition(to); - SetConditionData(*macro); } diff --git a/src/macro-segment-list.cpp b/src/macro-segment-list.cpp index cfadf34d..13b24d43 100644 --- a/src/macro-segment-list.cpp +++ b/src/macro-segment-list.cpp @@ -415,8 +415,6 @@ void MacroSegmentList::dropEvent(QDropEvent *event) if (dropPosition == -1) { return; } - _contentLayout->insertItem( - dropPosition, _contentLayout->takeAt(_dragPosition)); emit Reorder(dropPosition, _dragPosition); } _dragPosition = -1;