Add support for adding status labels to macro docks

This commit is contained in:
WarmUpTill 2023-06-08 12:28:26 +02:00 committed by WarmUpTill
parent a7ccfc3282
commit 18e19fb6c8
7 changed files with 189 additions and 9 deletions

View File

@ -107,13 +107,18 @@ AdvSceneSwitcher.macroTab.currentDisableHotkeys="Register hotkeys to control the
AdvSceneSwitcher.macroTab.currentRegisterDock="Register dock widget to control the pause state of selected macro or run it manually"
AdvSceneSwitcher.macroTab.currentDockAddRunButton="Add button to run the macro"
AdvSceneSwitcher.macroTab.currentDockAddPauseButton="Add button to pause or unpause the macro"
AdvSceneSwitcher.macroTab.currentDockAddStatusLabel="Add status label"
AdvSceneSwitcher.macroTab.currentDockButtonText.run="Run button text:"
AdvSceneSwitcher.macroTab.currentDockButtonText.pause="Pause button text:"
AdvSceneSwitcher.macroTab.currentDockButtonText.unpause="Unpause button text:"
AdvSceneSwitcher.macroTab.currentDockStatusText.true="Conditions true text:"
AdvSceneSwitcher.macroTab.currentDockStatusText.false="Conditions false text:"
AdvSceneSwitcher.macroDock.pause="Pause"
AdvSceneSwitcher.macroDock.unpause="Unpause"
AdvSceneSwitcher.macroDock.run="Run"
AdvSceneSwitcher.macroDock.statusLabel.true="Conditions are true."
AdvSceneSwitcher.macroDock.statusLabel.false="Conditions are false."
; Macro List
AdvSceneSwitcher.macroList.deleted="deleted"

View File

@ -8,18 +8,24 @@ namespace advss {
MacroDock::MacroDock(Macro *m, QWidget *parent, const QString &runButtonText,
const QString &pauseButtonText,
const QString &unpauseButtonText)
const QString &unpauseButtonText,
const QString &conditionsTrueText,
const QString &conditionsFalseText)
: OBSDock(parent),
_pauseButtonText(pauseButtonText),
_unpauseButtonText(unpauseButtonText),
_conditionsTrueText(conditionsTrueText),
_conditionsFalseText(conditionsFalseText),
_run(new QPushButton(runButtonText)),
_pauseToggle(new QPushButton()),
_statusText(new QLabel(conditionsFalseText)),
_macro(m)
{
if (_macro) {
setWindowTitle(QString::fromStdString(_macro->Name()));
_run->setVisible(_macro->DockHasRunButton());
_pauseToggle->setVisible(_macro->DockHasPauseButton());
_statusText->setVisible(_macro->DockHasStatusLabel());
} else {
setWindowTitle("<deleted macro>");
}
@ -34,12 +40,16 @@ MacroDock::MacroDock(Macro *m, QWidget *parent, const QString &runButtonText,
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(_run);
layout->addWidget(_pauseToggle);
layout->addWidget(_statusText);
QWidget::connect(&_timer, SIGNAL(timeout()), this,
SLOT(UpdatePauseText()));
QWidget::connect(&_timer, SIGNAL(timeout()), this,
SLOT(UpdateStatusText()));
_timer.start(1000);
UpdatePauseText();
UpdateStatusText();
// QFrame wrapper is necessary to avoid dock being partially
// transparent
@ -85,6 +95,23 @@ void MacroDock::SetUnpauseButtonText(const QString &text)
UpdatePauseText();
}
void MacroDock::ShowStatusLabel(bool value)
{
_statusText->setVisible(value);
}
void MacroDock::SetConditionsTrueText(const QString &text)
{
_conditionsTrueText = text;
UpdateStatusText();
}
void MacroDock::SetConditionsFalseText(const QString &text)
{
_conditionsFalseText = text;
UpdateStatusText();
}
void MacroDock::RunClicked()
{
if (!_macro) {
@ -119,4 +146,14 @@ void MacroDock::UpdatePauseText()
: _pauseButtonText);
}
void MacroDock::UpdateStatusText()
{
if (!_macro) {
return;
}
_statusText->setText(_macro->Matched() ? _conditionsTrueText
: _conditionsFalseText);
}
} // namespace advss

View File

@ -3,6 +3,7 @@
#include <QPushButton>
#include <QTimer>
#include <QLabel>
#include <memory>
namespace advss {
@ -15,24 +16,33 @@ class MacroDock : public OBSDock {
public:
MacroDock(Macro *, QWidget *parent, const QString &runButtonText,
const QString &pauseButtonText,
const QString &unpauseButtonText);
const QString &unpauseButtonText,
const QString &conditionsTrueText,
const QString &conditionsFalseText);
void SetName(const QString &);
void ShowRunButton(bool);
void SetRunButtonText(const QString &);
void ShowPauseButton(bool);
void SetPauseButtonText(const QString &);
void SetUnpauseButtonText(const QString &);
void ShowStatusLabel(bool);
void SetConditionsTrueText(const QString &);
void SetConditionsFalseText(const QString &);
private slots:
void RunClicked();
void PauseToggleClicked();
void UpdatePauseText();
void UpdateStatusText();
private:
QString _pauseButtonText;
QString _unpauseButtonText;
QString _conditionsTrueText;
QString _conditionsFalseText;
QPushButton *_run;
QPushButton *_pauseToggle;
QLabel *_statusText;
QTimer _timer;

View File

@ -74,9 +74,13 @@ MacroPropertiesDialog::MacroPropertiesDialog(QWidget *parent,
"AdvSceneSwitcher.macroTab.currentDockAddRunButton"))),
_currentMacroDockAddPauseButton(new QCheckBox(obs_module_text(
"AdvSceneSwitcher.macroTab.currentDockAddPauseButton"))),
_currentMacroDockAddStatusLabel(new QCheckBox(obs_module_text(
"AdvSceneSwitcher.macroTab.currentDockAddStatusLabel"))),
_runButtonText(new QLineEdit()),
_pauseButtonText(new QLineEdit()),
_unpauseButtonText(new QLineEdit()),
_conditionsTrueStatusText(new QLineEdit()),
_conditionsFalseStatusText(new QLineEdit()),
_dockOptions(new QGroupBox(
obs_module_text("AdvSceneSwitcher.macroTab.dockSettings"))),
_dockLayout(new QGridLayout())
@ -127,6 +131,23 @@ MacroPropertiesDialog::MacroPropertiesDialog(QWidget *parent,
row, 1);
_dockLayout->addWidget(_unpauseButtonText, row, 2);
_unpauseButtonTextRow = row;
row++;
_dockLayout->addWidget(_currentMacroDockAddStatusLabel, row, 1, 1, 2);
row++;
_dockLayout->addWidget(
new QLabel(obs_module_text(
"AdvSceneSwitcher.macroTab.currentDockStatusText.true")),
row, 1);
_dockLayout->addWidget(_conditionsTrueStatusText, row, 2);
_conditionsTrueTextRow = row;
row++;
_dockLayout->addWidget(
new QLabel(obs_module_text(
"AdvSceneSwitcher.macroTab.currentDockStatusText.false")),
row, 1);
_dockLayout->addWidget(_conditionsFalseStatusText, row, 2);
_conditionsFalseTextRow = row;
_dockOptions->setLayout(_dockLayout);
QDialogButtonBox *buttonbox = new QDialogButtonBox(
@ -141,6 +162,8 @@ MacroPropertiesDialog::MacroPropertiesDialog(QWidget *parent,
&MacroPropertiesDialog::RunButtonEnableChanged);
connect(_currentMacroDockAddPauseButton, &QCheckBox::stateChanged, this,
&MacroPropertiesDialog::PauseButtonEnableChanged);
connect(_currentMacroDockAddStatusLabel, &QCheckBox::stateChanged, this,
&MacroPropertiesDialog::StatusLabelEnableChanged);
auto layout = new QVBoxLayout;
layout->addWidget(highlightOptions);
@ -164,20 +187,31 @@ MacroPropertiesDialog::MacroPropertiesDialog(QWidget *parent,
_currentMacroDockAddRunButton->setChecked(macro->DockHasRunButton());
_currentMacroDockAddPauseButton->setChecked(
macro->DockHasPauseButton());
_currentMacroDockAddStatusLabel->setChecked(
macro->DockHasStatusLabel());
_runButtonText->setText(QString::fromStdString(macro->RunButtonText()));
_pauseButtonText->setText(
QString::fromStdString(macro->PauseButtonText()));
_unpauseButtonText->setText(
QString::fromStdString(macro->UnpauseButtonText()));
_conditionsTrueStatusText->setText(
QString::fromStdString(macro->ConditionsTrueStatusText()));
_conditionsFalseStatusText->setText(
QString::fromStdString(macro->ConditionsFalseStatusText()));
_currentMacroDockAddRunButton->setVisible(dockEnabled);
_currentMacroDockAddPauseButton->setVisible(dockEnabled);
_currentMacroDockAddStatusLabel->setVisible(dockEnabled);
setGridLayoutRowVisible(_dockLayout, _runButtonTextRow,
dockEnabled && macro->DockHasRunButton());
setGridLayoutRowVisible(_dockLayout, _pauseButtonTextRow,
dockEnabled && macro->DockHasPauseButton());
setGridLayoutRowVisible(_dockLayout, _unpauseButtonTextRow,
dockEnabled && macro->DockHasPauseButton());
setGridLayoutRowVisible(_dockLayout, _conditionsTrueTextRow,
dockEnabled && macro->DockHasStatusLabel());
setGridLayoutRowVisible(_dockLayout, _conditionsFalseTextRow,
dockEnabled && macro->DockHasStatusLabel());
MinimizeSizeOfColumn(_dockLayout, 0);
Resize();
}
@ -186,9 +220,22 @@ void MacroPropertiesDialog::DockEnableChanged(int enabled)
{
_currentMacroDockAddRunButton->setVisible(enabled);
_currentMacroDockAddPauseButton->setVisible(enabled);
setGridLayoutRowVisible(_dockLayout, _runButtonTextRow, enabled);
setGridLayoutRowVisible(_dockLayout, _pauseButtonTextRow, enabled);
setGridLayoutRowVisible(_dockLayout, _unpauseButtonTextRow, enabled);
_currentMacroDockAddStatusLabel->setVisible(enabled);
setGridLayoutRowVisible(
_dockLayout, _runButtonTextRow,
enabled && _currentMacroDockAddRunButton->isChecked());
setGridLayoutRowVisible(
_dockLayout, _pauseButtonTextRow,
enabled && _currentMacroDockAddPauseButton->isChecked());
setGridLayoutRowVisible(
_dockLayout, _unpauseButtonTextRow,
enabled && _currentMacroDockAddPauseButton->isChecked());
setGridLayoutRowVisible(
_dockLayout, _conditionsTrueTextRow,
enabled && _currentMacroDockAddStatusLabel->isChecked());
setGridLayoutRowVisible(
_dockLayout, _conditionsFalseTextRow,
enabled && _currentMacroDockAddStatusLabel->isChecked());
Resize();
}
@ -205,6 +252,13 @@ void MacroPropertiesDialog::PauseButtonEnableChanged(int enabled)
Resize();
}
void MacroPropertiesDialog::StatusLabelEnableChanged(int enabled)
{
setGridLayoutRowVisible(_dockLayout, _conditionsTrueTextRow, enabled);
setGridLayoutRowVisible(_dockLayout, _conditionsFalseTextRow, enabled);
Resize();
}
void MacroPropertiesDialog::Resize()
{
_dockOptions->adjustSize();
@ -238,11 +292,17 @@ bool MacroPropertiesDialog::AskForSettings(QWidget *parent,
dialog._currentMacroDockAddRunButton->isChecked());
macro->SetDockHasPauseButton(
dialog._currentMacroDockAddPauseButton->isChecked());
macro->SetDockHasStatusLabel(
dialog._currentMacroDockAddStatusLabel->isChecked());
macro->SetRunButtonText(dialog._runButtonText->text().toStdString());
macro->SetPauseButtonText(
dialog._pauseButtonText->text().toStdString());
macro->SetUnpauseButtonText(
dialog._unpauseButtonText->text().toStdString());
macro->SetConditionsTrueStatusText(
dialog._conditionsTrueStatusText->text().toStdString());
macro->SetConditionsFalseStatusText(
dialog._conditionsFalseStatusText->text().toStdString());
return true;
}

View File

@ -35,6 +35,7 @@ private slots:
void DockEnableChanged(int);
void RunButtonEnableChanged(int);
void PauseButtonEnableChanged(int);
void StatusLabelEnableChanged(int);
private:
void Resize();
@ -48,15 +49,20 @@ private:
QCheckBox *_currentMacroRegisterDock;
QCheckBox *_currentMacroDockAddRunButton;
QCheckBox *_currentMacroDockAddPauseButton;
QCheckBox *_currentMacroDockAddStatusLabel;
QLineEdit *_runButtonText;
QLineEdit *_pauseButtonText;
QLineEdit *_unpauseButtonText;
QLineEdit *_conditionsTrueStatusText;
QLineEdit *_conditionsFalseStatusText;
QGroupBox *_dockOptions;
QGridLayout *_dockLayout;
int _runButtonTextRow = -1;
int _pauseButtonTextRow = -1;
int _unpauseButtonTextRow = -1;
int _conditionsTrueTextRow = -1;
int _conditionsFalseTextRow = -1;
};
} // namespace advss

View File

@ -606,12 +606,17 @@ void Macro::SaveDockSettings(obs_data_t *obj) const
}
obs_data_set_bool(dockSettings, "hasRunButton", _dockHasRunButton);
obs_data_set_bool(dockSettings, "hasPauseButton", _dockHasPauseButton);
obs_data_set_bool(dockSettings, "hasStatusLabel", _dockHasStatusLabel);
obs_data_set_string(dockSettings, "runButtonText",
_runButtonText.c_str());
obs_data_set_string(dockSettings, "pauseButtonText",
_pauseButtonText.c_str());
obs_data_set_string(dockSettings, "unpauseButtonText",
_unpauseButtonText.c_str());
obs_data_set_string(dockSettings, "conditionsTrueStatusText",
_conditionsTrueStatusText.c_str());
obs_data_set_string(dockSettings, "conditionsFalseStatusText",
_conditionsFalseStatusText.c_str());
if (_dock) {
auto window = static_cast<QMainWindow *>(
obs_frontend_get_main_window());
@ -658,11 +663,18 @@ void Macro::LoadDockSettings(obs_data_t *obj)
_pauseButtonText = obs_data_get_string(dockSettings, "pauseButtonText");
_unpauseButtonText =
obs_data_get_string(dockSettings, "unpauseButtonText");
_conditionsTrueStatusText =
obs_data_get_string(dockSettings, "conditionsTrueStatusText");
_conditionsFalseStatusText =
obs_data_get_string(dockSettings, "conditionsFalseStatusText");
if (dockEnabled) {
_dockHasRunButton =
obs_data_get_bool(dockSettings, "hasRunButton");
_dockHasPauseButton =
obs_data_get_bool(dockSettings, "hasPauseButton");
_dockHasStatusLabel =
obs_data_get_bool(dockSettings, "hasStatusLabel");
_dockIsFloating = obs_data_get_bool(dockSettings, "isFloating");
_dockArea = static_cast<Qt::DockWidgetArea>(
obs_data_get_int(dockSettings, "area"));
@ -697,10 +709,12 @@ void Macro::EnableDock(bool value)
// Create new dock widget
auto window =
static_cast<QMainWindow *>(obs_frontend_get_main_window());
_dock = new MacroDock(this, window,
QString::fromStdString(_runButtonText),
QString::fromStdString(_pauseButtonText),
QString::fromStdString(_unpauseButtonText));
_dock = new MacroDock(
this, window, QString::fromStdString(_runButtonText),
QString::fromStdString(_pauseButtonText),
QString::fromStdString(_unpauseButtonText),
QString::fromStdString(_conditionsTrueStatusText),
QString::fromStdString(_conditionsFalseStatusText));
SetDockWidgetName(); // Used by OBS to restore position
// Register new dock
@ -741,6 +755,15 @@ void Macro::SetDockHasPauseButton(bool value)
_dock->ShowPauseButton(value);
}
void Macro::SetDockHasStatusLabel(bool value)
{
_dockHasStatusLabel = value;
if (!_dock) {
return;
}
_dock->ShowStatusLabel(value);
}
void Macro::SetRunButtonText(const std::string &text)
{
_runButtonText = text;
@ -768,6 +791,34 @@ void Macro::SetUnpauseButtonText(const std::string &text)
_dock->SetUnpauseButtonText(QString::fromStdString(text));
}
void Macro::SetConditionsTrueStatusText(const std::string &text)
{
_conditionsTrueStatusText = text;
if (!_dock) {
return;
}
_dock->SetConditionsTrueText(QString::fromStdString(text));
}
std::string Macro::ConditionsTrueStatusText() const
{
return _conditionsTrueStatusText;
}
void Macro::SetConditionsFalseStatusText(const std::string &text)
{
_conditionsFalseStatusText = text;
if (!_dock) {
return;
}
_dock->SetConditionsFalseText(QString::fromStdString(text));
}
std::string Macro::ConditionsFalseStatusText() const
{
return _conditionsFalseStatusText;
}
void Macro::RemoveDock()
{
if (_dock) {

View File

@ -89,12 +89,18 @@ public:
bool DockHasRunButton() const { return _dockHasRunButton; }
void SetDockHasPauseButton(bool value);
bool DockHasPauseButton() const { return _dockHasPauseButton; }
void SetDockHasStatusLabel(bool value);
bool DockHasStatusLabel() const { return _dockHasStatusLabel; }
std::string RunButtonText() const { return _runButtonText; }
void SetRunButtonText(const std::string &text);
std::string PauseButtonText() const { return _pauseButtonText; }
void SetPauseButtonText(const std::string &text);
std::string UnpauseButtonText() const { return _unpauseButtonText; }
void SetUnpauseButtonText(const std::string &text);
void SetConditionsTrueStatusText(const std::string &text);
std::string ConditionsTrueStatusText() const;
void SetConditionsFalseStatusText(const std::string &text);
std::string ConditionsFalseStatusText() const;
private:
void SetupHotkeys();
@ -143,12 +149,17 @@ private:
bool _registerDock = false;
bool _dockHasRunButton = true;
bool _dockHasPauseButton = true;
bool _dockHasStatusLabel = false;
std::string _runButtonText =
obs_module_text("AdvSceneSwitcher.macroDock.run");
std::string _pauseButtonText =
obs_module_text("AdvSceneSwitcher.macroDock.pause");
std::string _unpauseButtonText =
obs_module_text("AdvSceneSwitcher.macroDock.unpause");
std::string _conditionsTrueStatusText =
obs_module_text("AdvSceneSwitcher.macroDock.statusLabel.true");
std::string _conditionsFalseStatusText =
obs_module_text("AdvSceneSwitcher.macroDock.statusLabel.false");
bool _dockIsFloating = true;
bool _dockIsVisible = false;
Qt::DockWidgetArea _dockArea;