Add list-like controls to macro actions and conditions

This commit is contained in:
WarmUpTill
2022-02-13 19:29:08 +01:00
committed by WarmUpTill
parent 2c25bb4dd4
commit 955f308c59
7 changed files with 555 additions and 223 deletions

View File

@@ -120,8 +120,12 @@ public slots:
void on_macros_currentRowChanged(int idx);
void on_conditionAdd_clicked();
void on_conditionRemove_clicked();
void on_conditionUp_clicked();
void on_conditionDown_clicked();
void on_actionAdd_clicked();
void on_actionRemove_clicked();
void on_actionUp_clicked();
void on_actionDown_clicked();
void ShowMacroContextMenu(const QPoint &);
void ShowMacroActionsContextMenu(const QPoint &);
void ShowMacroConditionsContextMenu(const QPoint &);
@@ -132,10 +136,12 @@ public slots:
void CollapseAllConditions();
void MinimizeActions();
void MinimizeConditions();
void MacroActionSelectionChanged(int idx);
void AddMacroAction(int idx);
void RemoveMacroAction(int idx);
void MoveMacroActionUp(int idx);
void MoveMacroActionDown(int idx);
void MacroConditionSelectionChanged(int idx);
void AddMacroCondition(int idx);
void RemoveMacroCondition(int idx);
void MoveMacroConditionUp(int idx);
@@ -277,6 +283,8 @@ public slots:
void on_close_clicked();
private:
int currentConditionIdx = -1;
int currentActionIdx = -1;
};
/******************************************************************************

View File

@@ -42,6 +42,7 @@ public:
// list of actions and conditions
void SetFocusPolicyOfWidgets();
void SetCollapsed(bool collapsed);
void SetSelected(bool);
protected slots:
void HeaderInfoChanged(const QString &);
@@ -63,10 +64,12 @@ signals:
void RemoveAt(int idx);
void UpAt(int idx);
void DownAt(int idx);
void SelectionChagned(int idx);
protected:
void enterEvent(QEvent *e);
void leaveEvent(QEvent *e);
void mousePressEvent(QMouseEvent *event);
Section *_section;
QLabel *_headerInfo;

View File

@@ -87,7 +87,8 @@ MacroActionEdit::MacroActionEdit(QWidget *parent,
QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->setContentsMargins(0, 0, 0, 0);
if (switcher->useVerticalMacroControls) {
mainLayout->addWidget(_controls);
_controls->hide();
} else {
actionLayout->addWidget(_controls);
}
@@ -181,7 +182,16 @@ void AdvSceneSwitcher::on_actionAdd_clicked()
return;
}
AddMacroAction((int)macro->Actions().size());
if (currentActionIdx == -1) {
auto macro = getSelectedMacro();
if (!macro) {
return;
}
AddMacroAction((int)macro->Actions().size());
} else {
AddMacroAction(currentActionIdx + 1);
}
MacroActionSelectionChanged(currentActionIdx + 1);
ui->macroEditActionHelp->setVisible(false);
}
@@ -208,11 +218,33 @@ void AdvSceneSwitcher::RemoveMacroAction(int idx)
void AdvSceneSwitcher::on_actionRemove_clicked()
{
auto macro = getSelectedMacro();
if (!macro) {
if (currentActionIdx == -1) {
auto macro = getSelectedMacro();
if (!macro) {
return;
}
RemoveMacroAction((int)macro->Actions().size() - 1);
} else {
RemoveMacroAction(currentActionIdx);
}
MacroActionSelectionChanged(-1);
}
void AdvSceneSwitcher::on_actionUp_clicked()
{
if (currentActionIdx == -1) {
return;
}
RemoveMacroAction((int)macro->Actions().size() - 1);
MoveMacroActionUp(currentActionIdx);
MacroActionSelectionChanged(currentActionIdx - 1);
}
void AdvSceneSwitcher::on_actionDown_clicked()
{
if (currentActionIdx == -1) {
return;
}
MoveMacroActionDown(currentActionIdx);
MacroActionSelectionChanged(currentActionIdx + 1);
}
void AdvSceneSwitcher::SwapActions(Macro *m, int pos1, int pos2)
@@ -272,3 +304,25 @@ void AdvSceneSwitcher::MoveMacroActionDown(int idx)
SwapActions(macro, idx, idx + 1);
HighlightAction(idx + 1);
}
void AdvSceneSwitcher::MacroActionSelectionChanged(int idx)
{
auto macro = getSelectedMacro();
if (!macro) {
return;
}
for (int i = 0; i < ui->macroEditActionLayout->count(); ++i) {
auto widget = static_cast<MacroSegmentEdit *>(
ui->macroEditActionLayout->itemAt(i)->widget());
if (widget) {
widget->SetSelected(i == idx);
}
}
if (idx < 0 || idx >= macro->Actions().size()) {
currentActionIdx = -1;
} else {
currentActionIdx = idx;
}
}

View File

@@ -131,7 +131,7 @@ MacroConditionEdit::MacroConditionEdit(
QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->setContentsMargins(0, 0, 0, 0);
if (switcher->useVerticalMacroControls) {
mainLayout->addWidget(_controls);
_controls->hide();
} else {
conditionLayout->addWidget(_controls);
}
@@ -305,7 +305,16 @@ void AdvSceneSwitcher::on_conditionAdd_clicked()
return;
}
AddMacroCondition((int)macro->Conditions().size());
if (currentConditionIdx == -1) {
auto macro = getSelectedMacro();
if (!macro) {
return;
}
AddMacroCondition((int)macro->Conditions().size());
} else {
AddMacroCondition(currentConditionIdx + 1);
}
MacroConditionSelectionChanged(currentConditionIdx + 1);
ui->macroEditConditionHelp->setVisible(false);
}
@@ -335,11 +344,34 @@ void AdvSceneSwitcher::RemoveMacroCondition(int idx)
void AdvSceneSwitcher::on_conditionRemove_clicked()
{
auto macro = getSelectedMacro();
if (!macro) {
if (currentConditionIdx == -1) {
auto macro = getSelectedMacro();
if (!macro) {
return;
}
RemoveMacroCondition((int)macro->Conditions().size() - 1);
} else {
RemoveMacroCondition(currentConditionIdx);
}
MacroConditionSelectionChanged(-1);
}
void AdvSceneSwitcher::on_conditionUp_clicked()
{
if (currentConditionIdx == -1) {
return;
}
RemoveMacroCondition((int)macro->Conditions().size() - 1);
MoveMacroConditionUp(currentConditionIdx);
MacroConditionSelectionChanged(currentConditionIdx - 1);
}
void AdvSceneSwitcher::on_conditionDown_clicked()
{
if (currentConditionIdx == -1) {
return;
}
MoveMacroConditionDown(currentConditionIdx);
MacroConditionSelectionChanged(currentConditionIdx + 1);
}
void AdvSceneSwitcher::SwapConditions(Macro *m, int pos1, int pos2)
@@ -409,3 +441,25 @@ void AdvSceneSwitcher::MoveMacroConditionDown(int idx)
SwapConditions(macro, idx, idx + 1);
HighlightCondition(idx + 1);
}
void AdvSceneSwitcher::MacroConditionSelectionChanged(int idx)
{
auto macro = getSelectedMacro();
if (!macro) {
return;
}
for (int i = 0; i < ui->macroEditConditionLayout->count(); ++i) {
auto widget = static_cast<MacroSegmentEdit *>(
ui->macroEditConditionLayout->itemAt(i)->widget());
if (widget) {
widget->SetSelected(i == idx);
}
}
if (idx < 0 || idx >= macro->Conditions().size()) {
currentConditionIdx = -1;
} else {
currentConditionIdx = idx;
}
}

View File

@@ -4,6 +4,7 @@
#include <obs.hpp>
#include <QEvent>
#include <QMouseEvent>
#include <QLabel>
#include <QScrollBar>
@@ -169,6 +170,13 @@ void MacroSegmentEdit::leaveEvent(QEvent *)
_leaveTimer.start();
}
void MacroSegmentEdit::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton && Data()) {
emit SelectionChagned(Data()->GetIndex());
}
}
void MacroSegmentEdit::SetFocusPolicyOfWidgets()
{
QList<QWidget *> widgets = this->findChildren<QWidget *>();
@@ -187,3 +195,14 @@ void MacroSegmentEdit::SetCollapsed(bool collapsed)
{
_section->SetCollapsed(collapsed);
}
void MacroSegmentEdit::SetSelected(bool selected)
{
if (selected) {
_frame->setStyleSheet(
"#segmentFrame { border-width: 2px; border-style: dashed; border-radius: 4px; background-color: rgba(0,0,0,100); }");
} else {
_frame->setStyleSheet(
"#segmentFrame { border-style: none; border-radius: 4px; background-color: rgba(0,0,0,50); }");
}
}

View File

@@ -272,6 +272,9 @@ void AdvSceneSwitcher::SetEditMacro(Macro &m)
PopulateMacroConditions(m);
PopulateMacroActions(m);
ui->macroEdit->setDisabled(false);
currentActionIdx = -1;
currentConditionIdx = -1;
}
void AdvSceneSwitcher::HighlightAction(int idx)
@@ -300,16 +303,18 @@ void AdvSceneSwitcher::HighlightCondition(int idx)
PulseWidget(widget, QColor(Qt::green), QColor(0, 0, 0, 0), true);
}
void AdvSceneSwitcher::ConnectControlSignals(MacroActionEdit *c)
void AdvSceneSwitcher::ConnectControlSignals(MacroActionEdit *a)
{
connect(c, &MacroActionEdit::AddAt, this,
connect(a, &MacroActionEdit::AddAt, this,
&AdvSceneSwitcher::AddMacroAction);
connect(c, &MacroActionEdit::RemoveAt, this,
connect(a, &MacroActionEdit::RemoveAt, this,
&AdvSceneSwitcher::RemoveMacroAction);
connect(c, &MacroActionEdit::UpAt, this,
connect(a, &MacroActionEdit::UpAt, this,
&AdvSceneSwitcher::MoveMacroActionUp);
connect(c, &MacroActionEdit::DownAt, this,
connect(a, &MacroActionEdit::DownAt, this,
&AdvSceneSwitcher::MoveMacroActionDown);
connect(a, &MacroActionEdit::SelectionChagned, this,
&AdvSceneSwitcher::MacroActionSelectionChanged);
}
void AdvSceneSwitcher::ConnectControlSignals(MacroConditionEdit *c)
@@ -322,6 +327,8 @@ void AdvSceneSwitcher::ConnectControlSignals(MacroConditionEdit *c)
&AdvSceneSwitcher::MoveMacroConditionUp);
connect(c, &MacroConditionEdit::DownAt, this,
&AdvSceneSwitcher::MoveMacroConditionDown);
connect(c, &MacroActionEdit::SelectionChagned, this,
&AdvSceneSwitcher::MacroConditionSelectionChanged);
}
Macro *AdvSceneSwitcher::getSelectedMacro()