From 955f308c59f9aade40e209f656897a9776fc10a0 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sun, 13 Feb 2022 19:29:08 +0100 Subject: [PATCH] Add list-like controls to macro actions and conditions --- forms/advanced-scene-switcher.ui | 603 ++++++++++++++++-------- src/headers/advanced-scene-switcher.hpp | 8 + src/headers/macro-segment.hpp | 3 + src/macro-action-edit.cpp | 64 ++- src/macro-condition-edit.cpp | 64 ++- src/macro-segment.cpp | 19 + src/macro-tab.cpp | 17 +- 7 files changed, 555 insertions(+), 223 deletions(-) diff --git a/forms/advanced-scene-switcher.ui b/forms/advanced-scene-switcher.ui index 3b136777..a3b4f8f2 100644 --- a/forms/advanced-scene-switcher.ui +++ b/forms/advanced-scene-switcher.ui @@ -765,7 +765,7 @@ AdvSceneSwitcher.macroTab.edit - + @@ -819,218 +819,405 @@ Qt::Vertical - - - true - - - - - 0 - 0 - 792 - 218 - + + + + 0 - - - QLayout::SetMinAndMaxSize - - - - - QLayout::SetMinAndMaxSize + + 0 + + + 0 + + + 0 + + + + + true + + + + + 0 + 0 + 792 + 188 + - - - - false - - - AdvSceneSwitcher.macroTab.editConditionHelp - - - Qt::AlignCenter - - - true - - - - - - - - - - - - Qt::Vertical - - - - 0 - 0 - - - - - - - - - - - 22 - 22 - - - - true - - - addIconSmall - - - - - - - - 22 - 22 - - - - true - - - removeIconSmall - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - + + + QLayout::SetMinAndMaxSize + + + + + QLayout::SetMinAndMaxSize + + + + + false + + + AdvSceneSwitcher.macroTab.editConditionHelp + + + Qt::AlignCenter + + + true + + + + + + + + + + + + Qt::Vertical + + + + 0 + 0 + + + + + + + + + + + + 9 + + + + + + 22 + 22 + + + + true + + + addIconSmall + + + + + + + + 22 + 22 + + + + true + + + removeIconSmall + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 5 + 20 + + + + + + + + Qt::Vertical + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 5 + 20 + + + + + + + + + 22 + 22 + + + + + + + true + + + upArrowIconSmall + + + + + + + + 22 + 22 + + + + true + + + downArrowIconSmall + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + - - - true - - - - - 0 - 0 - 792 - 218 - + + + + 0 - - - QLayout::SetMinAndMaxSize - - - - - - - false - - - AdvSceneSwitcher.macroTab.editActionHelp - - - Qt::AlignCenter - - - true - - - - - - - - - - - - Qt::Vertical + + 0 + + + 0 + + + 0 + + + + + true + + + + + 0 + 0 + 792 + 188 + - - - 0 - 0 - - - - - - - - - - - 22 - 22 - - - - true - - - addIconSmall - - - - - - - - 22 - 22 - - - - true - - - removeIconSmall - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - + + + QLayout::SetMinAndMaxSize + + + + + + + false + + + AdvSceneSwitcher.macroTab.editActionHelp + + + Qt::AlignCenter + + + true + + + + + + + + + + + + Qt::Vertical + + + + 0 + 0 + + + + + + + + + + + + 9 + + + + + + 22 + 22 + + + + true + + + addIconSmall + + + + + + + + 22 + 22 + + + + true + + + removeIconSmall + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 5 + 20 + + + + + + + + Qt::Vertical + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 5 + 20 + + + + + + + + + 22 + 22 + + + + true + + + upArrowIconSmall + + + + + + + + 22 + 22 + + + + true + + + downArrowIconSmall + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + diff --git a/src/headers/advanced-scene-switcher.hpp b/src/headers/advanced-scene-switcher.hpp index e70cf2f4..e85e615e 100644 --- a/src/headers/advanced-scene-switcher.hpp +++ b/src/headers/advanced-scene-switcher.hpp @@ -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; }; /****************************************************************************** diff --git a/src/headers/macro-segment.hpp b/src/headers/macro-segment.hpp index cc534f05..dd566777 100644 --- a/src/headers/macro-segment.hpp +++ b/src/headers/macro-segment.hpp @@ -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; diff --git a/src/macro-action-edit.cpp b/src/macro-action-edit.cpp index c31ede5f..bb91ecf5 100644 --- a/src/macro-action-edit.cpp +++ b/src/macro-action-edit.cpp @@ -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( + ui->macroEditActionLayout->itemAt(i)->widget()); + if (widget) { + widget->SetSelected(i == idx); + } + } + + if (idx < 0 || idx >= macro->Actions().size()) { + currentActionIdx = -1; + } else { + currentActionIdx = idx; + } +} diff --git a/src/macro-condition-edit.cpp b/src/macro-condition-edit.cpp index 80a0c886..cea0c7a8 100644 --- a/src/macro-condition-edit.cpp +++ b/src/macro-condition-edit.cpp @@ -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( + ui->macroEditConditionLayout->itemAt(i)->widget()); + if (widget) { + widget->SetSelected(i == idx); + } + } + + if (idx < 0 || idx >= macro->Conditions().size()) { + currentConditionIdx = -1; + } else { + currentConditionIdx = idx; + } +} diff --git a/src/macro-segment.cpp b/src/macro-segment.cpp index 273a6514..0272f49d 100644 --- a/src/macro-segment.cpp +++ b/src/macro-segment.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -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 widgets = this->findChildren(); @@ -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); }"); + } +} diff --git a/src/macro-tab.cpp b/src/macro-tab.cpp index 18090bba..bc077120 100644 --- a/src/macro-tab.cpp +++ b/src/macro-tab.cpp @@ -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()