Reuse macro segment widgets if possible

This commit is contained in:
WarmUpTill 2022-03-25 23:01:22 +01:00 committed by WarmUpTill
parent 5a78c99703
commit e61539a878
5 changed files with 65 additions and 47 deletions

View File

@ -48,6 +48,7 @@ private slots:
void DurationUnitChanged(DurationUnit unit);
private:
void SetLogicSelection();
MacroSegment *Data();
QComboBox *_logicSelection;

View File

@ -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;

View File

@ -170,12 +170,12 @@ void AdvSceneSwitcher::AddMacroAction(int idx)
obs_data_release(data);
}
macro->UpdateActionIndices();
actionsList->Insert(
idx,
new MacroActionEdit(this, &macro->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<MacroActionEdit *>(
actionsList->ContentLayout()->takeAt(pos1)->widget());
auto widget2 = static_cast<MacroActionEdit *>(
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);
}

View File

@ -161,11 +161,24 @@ bool MacroConditionEdit::IsRootNode()
return _isRoot;
}
void MacroConditionEdit::SetLogicSelection()
{
auto logic = (*_entryData)->GetLogicType();
if (IsRootNode()) {
_logicSelection->setCurrentIndex(static_cast<int>(logic));
} else {
_logicSelection->setCurrentIndex(static_cast<int>(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<int>(logic));
} else {
_logicSelection->setCurrentIndex(static_cast<int>(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, &macro->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<std::mutex> 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<MacroConditionEdit *>(
conditionsList->ContentLayout()->takeAt(pos1)->widget());
auto widget2 = static_cast<MacroConditionEdit *>(
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<MacroConditionEdit *>(
conditionsList->WidgetAt(from))
->SetRootNode(true);
macro->Conditions().at(0)->SetLogicType(LogicType::AND);
static_cast<MacroConditionEdit *>(
conditionsList->WidgetAt(0))
->SetRootNode(false);
}
if (from == 0) {
condition->SetLogicType(LogicType::AND);
static_cast<MacroConditionEdit *>(
conditionsList->WidgetAt(from))
->SetRootNode(false);
macro->Conditions().at(1)->SetLogicType(
LogicType::ROOT_NONE);
static_cast<MacroConditionEdit *>(
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);
}

View File

@ -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;