From 352dac5e32572b519051ed76201a3977e73c3153 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Thu, 17 Feb 2022 22:13:22 +0100 Subject: [PATCH] Add MacroSegmentList to allow deselecting items Previously once a macro segement was selected you could only deselect it by clicking on different macro segment, thus never allowing the user to deselect all macro segments --- CMakeLists.txt | 2 + forms/advanced-scene-switcher.ui | 123 +----------------------- src/headers/advanced-scene-switcher.hpp | 4 + src/headers/macro-segment-list.hpp | 25 +++++ src/macro-action-edit.cpp | 18 ++-- src/macro-condition-edit.cpp | 18 ++-- src/macro-segment-list.cpp | 44 +++++++++ src/macro-tab.cpp | 55 +++++++---- 8 files changed, 129 insertions(+), 160 deletions(-) create mode 100644 src/headers/macro-segment-list.hpp create mode 100644 src/macro-segment-list.cpp 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()