diff --git a/CMakeLists.txt b/CMakeLists.txt
index 67ab5754..1802b6a7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -247,6 +247,7 @@ set(advanced-scene-switcher_HEADERS
src/headers/macro.hpp
src/headers/macro-list-entry-widget.hpp
src/headers/macro-segment.hpp
+ src/headers/macro-segment-list.hpp
src/headers/macro-selection.hpp
src/headers/curl-helper.hpp
src/headers/hotkey.hpp
@@ -347,6 +348,7 @@ set(advanced-scene-switcher_SOURCES
src/macro.cpp
src/macro-list-entry-widget.cpp
src/macro-segment.cpp
+ src/macro-segment-list.cpp
src/macro-selection.cpp
src/macro-tab.cpp
src/curl-helper.cpp
diff --git a/forms/advanced-scene-switcher.ui b/forms/advanced-scene-switcher.ui
index 54e180b8..730f75ac 100644
--- a/forms/advanced-scene-switcher.ui
+++ b/forms/advanced-scene-switcher.ui
@@ -796,7 +796,7 @@
Qt::Vertical
-
+
0
@@ -809,67 +809,6 @@
0
- -
-
-
- true
-
-
-
-
- 0
- 0
- 792
- 188
-
-
-
-
- QLayout::SetMinAndMaxSize
-
-
-
-
-
- QLayout::SetMinAndMaxSize
-
-
-
-
-
- false
-
-
- AdvSceneSwitcher.macroTab.editConditionHelp
-
-
- Qt::AlignCenter
-
-
- true
-
-
-
- -
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 0
- 0
-
-
-
-
-
-
-
-
-
@@ -999,7 +938,7 @@
-
+
0
@@ -1012,64 +951,6 @@
0
- -
-
-
- true
-
-
-
-
- 0
- 0
- 792
- 188
-
-
-
-
- QLayout::SetMinAndMaxSize
-
-
-
-
-
-
-
-
- false
-
-
- AdvSceneSwitcher.macroTab.editActionHelp
-
-
- Qt::AlignCenter
-
-
- true
-
-
-
- -
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 0
- 0
-
-
-
-
-
-
-
-
-
diff --git a/src/headers/advanced-scene-switcher.hpp b/src/headers/advanced-scene-switcher.hpp
index f20cb465..87324651 100644
--- a/src/headers/advanced-scene-switcher.hpp
+++ b/src/headers/advanced-scene-switcher.hpp
@@ -6,6 +6,7 @@
#else
#include "ui_advanced-scene-switcher.h"
#endif
+#include "macro-segment-list.hpp"
#include "switcher-data-structs.hpp"
#include "platform-funcs.hpp"
@@ -282,6 +283,9 @@ public slots:
void on_close_clicked();
private:
+ MacroSegmentList *conditionsList = nullptr;
+ MacroSegmentList *actionsList = nullptr;
+
int currentConditionIdx = -1;
int currentActionIdx = -1;
};
diff --git a/src/headers/macro-segment-list.hpp b/src/headers/macro-segment-list.hpp
new file mode 100644
index 00000000..9b16f4b3
--- /dev/null
+++ b/src/headers/macro-segment-list.hpp
@@ -0,0 +1,25 @@
+#pragma once
+#include
+#include
+#include
+#include
+
+class MacroSegmentList : public QScrollArea {
+ Q_OBJECT
+
+public:
+ MacroSegmentList(QWidget *parent = nullptr);
+ void SetHelpMsg(const QString &msg);
+ void SetHelpMsgVisible(bool visible);
+ QVBoxLayout *ContentLayout() { return _contentLayout; }
+
+signals:
+ void SelectionChagned(int idx);
+
+protected:
+ void mousePressEvent(QMouseEvent *event);
+
+private:
+ QVBoxLayout *_contentLayout;
+ QLabel *_helpMsg;
+};
diff --git a/src/macro-action-edit.cpp b/src/macro-action-edit.cpp
index f59966e3..acac1988 100644
--- a/src/macro-action-edit.cpp
+++ b/src/macro-action-edit.cpp
@@ -162,7 +162,7 @@ void AdvSceneSwitcher::AddMacroAction(int idx)
}
macro->UpdateActionIndices();
- clearLayout(ui->macroEditActionLayout, idx);
+ clearLayout(actionsList->ContentLayout(), idx);
PopulateMacroActions(*macro, idx);
HighlightAction(idx);
}
@@ -184,7 +184,7 @@ void AdvSceneSwitcher::on_actionAdd_clicked()
AddMacroAction(currentActionIdx + 1);
}
MacroActionSelectionChanged(currentActionIdx + 1);
- ui->macroEditActionHelp->setVisible(false);
+ actionsList->SetHelpMsgVisible(false);
}
void AdvSceneSwitcher::RemoveMacroAction(int idx)
@@ -204,7 +204,7 @@ void AdvSceneSwitcher::RemoveMacroAction(int idx)
switcher->macroWaitCv.notify_all();
macro->UpdateActionIndices();
- clearLayout(ui->macroEditActionLayout, idx);
+ clearLayout(actionsList->ContentLayout(), idx);
PopulateMacroActions(*macro, idx);
}
@@ -255,16 +255,16 @@ void AdvSceneSwitcher::SwapActions(Macro *m, int pos1, int pos2)
auto a1 = m->Actions().begin() + pos1;
auto a2 = m->Actions().begin() + pos2;
- auto item1 = ui->macroEditActionLayout->takeAt(pos1);
- auto item2 = ui->macroEditActionLayout->takeAt(pos2 - 1);
+ auto item1 = actionsList->ContentLayout()->takeAt(pos1);
+ auto item2 = actionsList->ContentLayout()->takeAt(pos2 - 1);
deleteLayoutItem(item1);
deleteLayoutItem(item2);
auto widget1 = new MacroActionEdit(this, &(*a1), (*a1)->GetId());
auto widget2 = new MacroActionEdit(this, &(*a2), (*a2)->GetId());
ConnectControlSignals(widget1);
ConnectControlSignals(widget2);
- ui->macroEditActionLayout->insertWidget(pos1, widget1);
- ui->macroEditActionLayout->insertWidget(pos2, widget2);
+ actionsList->ContentLayout()->insertWidget(pos1, widget1);
+ actionsList->ContentLayout()->insertWidget(pos2, widget2);
}
void AdvSceneSwitcher::MoveMacroActionUp(int idx)
@@ -304,9 +304,9 @@ void AdvSceneSwitcher::MacroActionSelectionChanged(int idx)
return;
}
- for (int i = 0; i < ui->macroEditActionLayout->count(); ++i) {
+ for (int i = 0; i < actionsList->ContentLayout()->count(); ++i) {
auto widget = static_cast(
- ui->macroEditActionLayout->itemAt(i)->widget());
+ actionsList->ContentLayout()->itemAt(i)->widget());
if (widget) {
widget->SetSelected(i == idx);
}
diff --git a/src/macro-condition-edit.cpp b/src/macro-condition-edit.cpp
index 3507c06f..e5a026e6 100644
--- a/src/macro-condition-edit.cpp
+++ b/src/macro-condition-edit.cpp
@@ -290,7 +290,7 @@ void AdvSceneSwitcher::AddMacroCondition(int idx)
(*cond)->SetLogicType(logic);
macro->UpdateConditionIndices();
- clearLayout(ui->macroEditConditionLayout, idx);
+ clearLayout(conditionsList->ContentLayout(), idx);
PopulateMacroConditions(*macro, idx);
HighlightCondition(idx);
}
@@ -312,7 +312,7 @@ void AdvSceneSwitcher::on_conditionAdd_clicked()
AddMacroCondition(currentConditionIdx + 1);
}
MacroConditionSelectionChanged(currentConditionIdx + 1);
- ui->macroEditConditionHelp->setVisible(false);
+ conditionsList->SetHelpMsgVisible(false);
}
void AdvSceneSwitcher::RemoveMacroCondition(int idx)
@@ -335,7 +335,7 @@ void AdvSceneSwitcher::RemoveMacroCondition(int idx)
newRoot->SetLogicType(LogicType::ROOT_NONE);
}
- clearLayout(ui->macroEditConditionLayout, idx);
+ clearLayout(conditionsList->ContentLayout(), idx);
PopulateMacroConditions(*macro, idx);
}
@@ -395,8 +395,8 @@ void AdvSceneSwitcher::SwapConditions(Macro *m, int pos1, int pos2)
(*c2)->SetLogicType(logic1);
}
- auto item1 = ui->macroEditConditionLayout->takeAt(pos1);
- auto item2 = ui->macroEditConditionLayout->takeAt(pos2 - 1);
+ auto item1 = conditionsList->ContentLayout()->takeAt(pos1);
+ auto item2 = conditionsList->ContentLayout()->takeAt(pos2 - 1);
deleteLayoutItem(item1);
deleteLayoutItem(item2);
auto widget1 =
@@ -405,8 +405,8 @@ void AdvSceneSwitcher::SwapConditions(Macro *m, int pos1, int pos2)
new MacroConditionEdit(this, &(*c2), (*c2)->GetId(), false);
ConnectControlSignals(widget1);
ConnectControlSignals(widget2);
- ui->macroEditConditionLayout->insertWidget(pos1, widget1);
- ui->macroEditConditionLayout->insertWidget(pos2, widget2);
+ conditionsList->ContentLayout()->insertWidget(pos1, widget1);
+ conditionsList->ContentLayout()->insertWidget(pos2, widget2);
}
void AdvSceneSwitcher::MoveMacroConditionUp(int idx)
@@ -446,9 +446,9 @@ void AdvSceneSwitcher::MacroConditionSelectionChanged(int idx)
return;
}
- for (int i = 0; i < ui->macroEditConditionLayout->count(); ++i) {
+ for (int i = 0; i < conditionsList->ContentLayout()->count(); ++i) {
auto widget = static_cast(
- ui->macroEditConditionLayout->itemAt(i)->widget());
+ conditionsList->ContentLayout()->itemAt(i)->widget());
if (widget) {
widget->SetSelected(i == idx);
}
diff --git a/src/macro-segment-list.cpp b/src/macro-segment-list.cpp
new file mode 100644
index 00000000..b79ac797
--- /dev/null
+++ b/src/macro-segment-list.cpp
@@ -0,0 +1,44 @@
+#include "headers/macro-segment-list.hpp"
+
+#include
+#include
+#include
+
+MacroSegmentList::MacroSegmentList(QWidget *parent) : QScrollArea(parent)
+{
+ _contentLayout = new QVBoxLayout;
+ _helpMsg = new QLabel;
+ _helpMsg->setWordWrap(true);
+ _helpMsg->setAlignment(Qt::AlignCenter);
+
+ auto helperLayout = new QGridLayout();
+ helperLayout->addWidget(_helpMsg, 0, 0,
+ Qt::AlignHCenter | Qt::AlignVCenter);
+ helperLayout->addLayout(_contentLayout, 0, 0);
+ helperLayout->setSizeConstraint(QLayout::SetMinAndMaxSize);
+ auto layout = new QVBoxLayout;
+ layout->addLayout(helperLayout, 10);
+ layout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding,
+ QSizePolicy::Expanding));
+ auto wrapper = new QWidget;
+ wrapper->setLayout(layout);
+ setWidget(wrapper);
+ setWidgetResizable(true);
+}
+
+void MacroSegmentList::SetHelpMsg(const QString &msg)
+{
+ _helpMsg->setText(msg);
+}
+
+void MacroSegmentList::SetHelpMsgVisible(bool visible)
+{
+ _helpMsg->setVisible(visible);
+}
+
+void MacroSegmentList::mousePressEvent(QMouseEvent *event)
+{
+ if (event->button() == Qt::LeftButton) {
+ emit SelectionChagned(-1);
+ }
+}
diff --git a/src/macro-tab.cpp b/src/macro-tab.cpp
index eb10ed7d..3fab9a42 100644
--- a/src/macro-tab.cpp
+++ b/src/macro-tab.cpp
@@ -234,10 +234,9 @@ void AdvSceneSwitcher::PopulateMacroActions(Macro &m, uint32_t afterIdx)
auto newEntry = new MacroActionEdit(this, &actions[afterIdx],
actions[afterIdx]->GetId());
ConnectControlSignals(newEntry);
- ui->macroEditActionLayout->addWidget(newEntry);
- ui->macroEditActionHelp->setVisible(false);
+ actionsList->ContentLayout()->addWidget(newEntry);
}
- ui->macroEditActionHelp->setVisible(actions.size() == 0);
+ actionsList->SetHelpMsgVisible(actions.size() == 0);
}
void AdvSceneSwitcher::PopulateMacroConditions(Macro &m, uint32_t afterIdx)
@@ -249,11 +248,10 @@ void AdvSceneSwitcher::PopulateMacroConditions(Macro &m, uint32_t afterIdx)
this, &conditions[afterIdx],
conditions[afterIdx]->GetId(), root);
ConnectControlSignals(newEntry);
- ui->macroEditConditionLayout->addWidget(newEntry);
- ui->macroEditConditionHelp->setVisible(false);
+ conditionsList->ContentLayout()->addWidget(newEntry);
root = false;
}
- ui->macroEditConditionHelp->setVisible(conditions.size() == 0);
+ conditionsList->SetHelpMsgVisible(conditions.size() == 0);
}
void AdvSceneSwitcher::SetEditMacro(Macro &m)
@@ -266,8 +264,8 @@ void AdvSceneSwitcher::SetEditMacro(Macro &m)
ui->runMacroInParallel->setChecked(m.RunInParallel());
ui->runMacroOnChange->setChecked(m.MatchOnChange());
}
- clearLayout(ui->macroEditConditionLayout);
- clearLayout(ui->macroEditActionLayout);
+ clearLayout(conditionsList->ContentLayout());
+ clearLayout(actionsList->ContentLayout());
PopulateMacroConditions(m);
PopulateMacroActions(m);
@@ -279,7 +277,7 @@ void AdvSceneSwitcher::SetEditMacro(Macro &m)
void AdvSceneSwitcher::HighlightAction(int idx)
{
- auto item = ui->macroEditActionLayout->itemAt(idx);
+ auto item = actionsList->ContentLayout()->itemAt(idx);
if (!item) {
return;
}
@@ -292,7 +290,7 @@ void AdvSceneSwitcher::HighlightAction(int idx)
void AdvSceneSwitcher::HighlightCondition(int idx)
{
- auto item = ui->macroEditConditionLayout->itemAt(idx);
+ auto item = conditionsList->ContentLayout()->itemAt(idx);
if (!item) {
return;
}
@@ -364,14 +362,30 @@ void AdvSceneSwitcher::setupMacroTab()
ui->macroHelp->setVisible(false);
}
+ delete conditionsList;
+ conditionsList = new MacroSegmentList(this);
+ conditionsList->SetHelpMsg(
+ obs_module_text("AdvSceneSwitcher.macroTab.editConditionHelp"));
+ connect(conditionsList, &MacroSegmentList::SelectionChagned, this,
+ &AdvSceneSwitcher::MacroConditionSelectionChanged);
+ ui->macroConditionsLayout->insertWidget(0, conditionsList);
+
+ delete actionsList;
+ actionsList = new MacroSegmentList(this);
+ actionsList->SetHelpMsg(
+ obs_module_text("AdvSceneSwitcher.macroTab.editActionHelp"));
+ connect(actionsList, &MacroSegmentList::SelectionChagned, this,
+ &AdvSceneSwitcher::MacroActionSelectionChanged);
+ ui->macroActionsLayout->insertWidget(0, actionsList);
+
ui->macros->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->macros, &QWidget::customContextMenuRequested, this,
&AdvSceneSwitcher::ShowMacroContextMenu);
- ui->macroActions->setContextMenuPolicy(Qt::CustomContextMenu);
- connect(ui->macroActions, &QWidget::customContextMenuRequested, this,
+ actionsList->setContextMenuPolicy(Qt::CustomContextMenu);
+ connect(actionsList, &QWidget::customContextMenuRequested, this,
&AdvSceneSwitcher::ShowMacroActionsContextMenu);
- ui->macroConditions->setContextMenuPolicy(Qt::CustomContextMenu);
- connect(ui->macroConditions, &QWidget::customContextMenuRequested, this,
+ conditionsList->setContextMenuPolicy(Qt::CustomContextMenu);
+ connect(conditionsList, &QWidget::customContextMenuRequested, this,
&AdvSceneSwitcher::ShowMacroConditionsContextMenu);
ui->macroEdit->setDisabled(true);
@@ -396,7 +410,7 @@ void AdvSceneSwitcher::ShowMacroContextMenu(const QPoint &pos)
void AdvSceneSwitcher::ShowMacroActionsContextMenu(const QPoint &pos)
{
- QPoint globalPos = ui->macroActions->mapToGlobal(pos);
+ QPoint globalPos = actionsList->mapToGlobal(pos);
QMenu myMenu;
myMenu.addAction(obs_module_text("AdvSceneSwitcher.macroTab.expandAll"),
this, &AdvSceneSwitcher::ExpandAllActions);
@@ -412,7 +426,7 @@ void AdvSceneSwitcher::ShowMacroActionsContextMenu(const QPoint &pos)
void AdvSceneSwitcher::ShowMacroConditionsContextMenu(const QPoint &pos)
{
- QPoint globalPos = ui->macroConditions->mapToGlobal(pos);
+ QPoint globalPos = conditionsList->mapToGlobal(pos);
QMenu myMenu;
myMenu.addAction(obs_module_text("AdvSceneSwitcher.macroTab.expandAll"),
this, &AdvSceneSwitcher::ExpandAllConditions);
@@ -463,7 +477,7 @@ void AdvSceneSwitcher::ExpandAllActions()
if (!m) {
return;
}
- setCollapsedStateOfSegmentsIn(ui->macroEditActionLayout, false);
+ setCollapsedStateOfSegmentsIn(actionsList->ContentLayout(), false);
}
void AdvSceneSwitcher::ExpandAllConditions()
@@ -472,7 +486,7 @@ void AdvSceneSwitcher::ExpandAllConditions()
if (!m) {
return;
}
- setCollapsedStateOfSegmentsIn(ui->macroEditConditionLayout, false);
+ setCollapsedStateOfSegmentsIn(conditionsList->ContentLayout(), false);
}
void AdvSceneSwitcher::CollapseAllActions()
@@ -481,8 +495,7 @@ void AdvSceneSwitcher::CollapseAllActions()
if (!m) {
return;
}
- setCollapsedStateOfSegmentsIn(ui->macroEditActionLayout, true);
- ;
+ setCollapsedStateOfSegmentsIn(actionsList->ContentLayout(), true);
}
void AdvSceneSwitcher::CollapseAllConditions()
@@ -491,7 +504,7 @@ void AdvSceneSwitcher::CollapseAllConditions()
if (!m) {
return;
}
- setCollapsedStateOfSegmentsIn(ui->macroEditConditionLayout, true);
+ setCollapsedStateOfSegmentsIn(conditionsList->ContentLayout(), true);
}
void AdvSceneSwitcher::MinimizeActions()