diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 7219a949..e1ee65f2 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -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" diff --git a/src/macro-core/macro-dock.cpp b/src/macro-core/macro-dock.cpp index 22358db2..2ec51ec8 100644 --- a/src/macro-core/macro-dock.cpp +++ b/src/macro-core/macro-dock.cpp @@ -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(""); } @@ -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 diff --git a/src/macro-core/macro-dock.hpp b/src/macro-core/macro-dock.hpp index 298035db..471be2d2 100644 --- a/src/macro-core/macro-dock.hpp +++ b/src/macro-core/macro-dock.hpp @@ -3,6 +3,7 @@ #include #include +#include #include 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; diff --git a/src/macro-core/macro-properties.cpp b/src/macro-core/macro-properties.cpp index f87993e2..8cae76d4 100644 --- a/src/macro-core/macro-properties.cpp +++ b/src/macro-core/macro-properties.cpp @@ -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; } diff --git a/src/macro-core/macro-properties.hpp b/src/macro-core/macro-properties.hpp index 80905257..100dd097 100644 --- a/src/macro-core/macro-properties.hpp +++ b/src/macro-core/macro-properties.hpp @@ -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 diff --git a/src/macro-core/macro.cpp b/src/macro-core/macro.cpp index 76314ae7..9c6a1715 100644 --- a/src/macro-core/macro.cpp +++ b/src/macro-core/macro.cpp @@ -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( 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( obs_data_get_int(dockSettings, "area")); @@ -697,10 +709,12 @@ void Macro::EnableDock(bool value) // Create new dock widget auto window = static_cast(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) { diff --git a/src/macro-core/macro.hpp b/src/macro-core/macro.hpp index 6dde0382..fc31c5b7 100644 --- a/src/macro-core/macro.hpp +++ b/src/macro-core/macro.hpp @@ -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;