mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-10-01 22:08:37 -05:00
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
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
25
src/headers/macro-segment-list.hpp
Normal file
25
src/headers/macro-segment-list.hpp
Normal file
@@ -0,0 +1,25 @@
|
||||
#pragma once
|
||||
#include <QWidget>
|
||||
#include <QScrollArea>
|
||||
#include <QVBoxLayout>
|
||||
#include <QLabel>
|
||||
|
||||
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;
|
||||
};
|
||||
@@ -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<MacroSegmentEdit *>(
|
||||
ui->macroEditActionLayout->itemAt(i)->widget());
|
||||
actionsList->ContentLayout()->itemAt(i)->widget());
|
||||
if (widget) {
|
||||
widget->SetSelected(i == idx);
|
||||
}
|
||||
|
||||
@@ -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<MacroSegmentEdit *>(
|
||||
ui->macroEditConditionLayout->itemAt(i)->widget());
|
||||
conditionsList->ContentLayout()->itemAt(i)->widget());
|
||||
if (widget) {
|
||||
widget->SetSelected(i == idx);
|
||||
}
|
||||
|
||||
44
src/macro-segment-list.cpp
Normal file
44
src/macro-segment-list.cpp
Normal file
@@ -0,0 +1,44 @@
|
||||
#include "headers/macro-segment-list.hpp"
|
||||
|
||||
#include <QGridLayout>
|
||||
#include <QSpacerItem>
|
||||
#include <QMouseEvent>
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user