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:
WarmUpTill 2022-02-17 22:13:22 +01:00 committed by WarmUpTill
parent 584fe4b3b6
commit 352dac5e32
8 changed files with 129 additions and 160 deletions

View File

@ -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

View File

@ -796,7 +796,7 @@
<enum>Qt::Vertical</enum>
</property>
<widget class="QWidget" name="widget_2" native="true">
<layout class="QVBoxLayout" name="verticalLayout_37">
<layout class="QVBoxLayout" name="macroConditionsLayout">
<property name="leftMargin">
<number>0</number>
</property>
@ -809,67 +809,6 @@
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QScrollArea" name="macroConditions">
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents_2">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>792</width>
<height>188</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_35" stretch="10,0">
<property name="sizeConstraint">
<enum>QLayout::SetMinAndMaxSize</enum>
</property>
<item>
<layout class="QGridLayout" name="gridLayout_27">
<property name="sizeConstraint">
<enum>QLayout::SetMinAndMaxSize</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="macroEditConditionHelp">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>AdvSceneSwitcher.macroTab.editConditionHelp</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<layout class="QVBoxLayout" name="macroEditConditionLayout"/>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_12">
<property name="leftMargin">
@ -999,7 +938,7 @@
</layout>
</widget>
<widget class="QWidget" name="widget" native="true">
<layout class="QVBoxLayout" name="verticalLayout_34">
<layout class="QVBoxLayout" name="macroActionsLayout">
<property name="leftMargin">
<number>0</number>
</property>
@ -1012,64 +951,6 @@
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QScrollArea" name="macroActions">
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents_3">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>792</width>
<height>188</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_33" stretch="10,0">
<property name="sizeConstraint">
<enum>QLayout::SetMinAndMaxSize</enum>
</property>
<item>
<layout class="QGridLayout" name="gridLayout_25">
<item row="0" column="0">
<widget class="QLabel" name="macroEditActionHelp">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>AdvSceneSwitcher.macroTab.editActionHelp</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<layout class="QVBoxLayout" name="macroEditActionLayout"/>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_21">
<property name="leftMargin">

View File

@ -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;
};

View 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;
};

View File

@ -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);
}

View File

@ -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);
}

View 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);
}
}

View File

@ -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()