diff --git a/UI/CMakeLists.txt b/UI/CMakeLists.txt index ae007eac00f6a20ace68fb17a4c612e224f5fc97..9ef923abd07e717db9e2477798e792107e37d554 100644 --- a/UI/CMakeLists.txt +++ b/UI/CMakeLists.txt @@ -245,6 +245,7 @@ set(obs_SOURCES combobox-ignorewheel.cpp spinbox-ignorewheel.cpp record-button.cpp + ui-validation.cpp url-push-button.cpp volume-control.cpp adv-audio-control.cpp @@ -302,6 +303,7 @@ set(obs_HEADERS menu-button.hpp mute-checkbox.hpp record-button.hpp + ui-validation.hpp url-push-button.hpp volume-control.hpp adv-audio-control.hpp diff --git a/UI/ui-validation.cpp b/UI/ui-validation.cpp new file mode 100644 index 0000000000000000000000000000000000000000..596aab65605cb7f5bdc5be30a1fe74ac33fd482f --- /dev/null +++ b/UI/ui-validation.cpp @@ -0,0 +1,56 @@ +#include "ui-validation.hpp" + +#include +#include +#include +#include + +#include + +static int CountVideoSources() +{ + int count = 0; + auto countSources = [](void *param, obs_source_t *source) { + if (!source) + return true; + + uint32_t flags = obs_source_get_output_flags(source); + if ((flags & OBS_SOURCE_VIDEO) != 0) + (*reinterpret_cast(param))++; + + return true; + }; + + obs_enum_sources(countSources, &count); + return count; +} + +bool UIValidation::NoSourcesConfirmation(QWidget *parent) +{ + // There are sources, don't need confirmation + if (CountVideoSources() != 0) + return true; + + // Ignore no video if no parent is visible to alert on + if (!parent->isVisible()) + return true; + + QString msg = QTStr("NoSources.Text"); + msg += "\n\n"; + msg += QTStr("NoSources.Text.AddSource"); + + QMessageBox messageBox(parent); + messageBox.setWindowTitle(QTStr("NoSources.Title")); + messageBox.setText(msg); + + QAbstractButton *yesButton = + messageBox.addButton(QTStr("Yes"), QMessageBox::YesRole); + messageBox.addButton(QTStr("No"), QMessageBox::NoRole); + messageBox.setIcon(QMessageBox::Question); + messageBox.exec(); + + if (messageBox.clickedButton() != yesButton) + return false; + else + return true; +} diff --git a/UI/ui-validation.hpp b/UI/ui-validation.hpp new file mode 100644 index 0000000000000000000000000000000000000000..161d7a1681e6a35d9321a402ea23b8a862e363fd --- /dev/null +++ b/UI/ui-validation.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +class UIValidation : public QObject { + Q_OBJECT + +public: + // Shows alert box notifying there are no video sources + // Returns true if user clicks "Yes" + // Returns false if user clicks "No" + // Blocks UI + static bool NoSourcesConfirmation(QWidget *parent); +}; diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 51a0d539b30130fe8506da95859f78f0afd1dec6..dabdb701cb25f81c2e97351980d78c28041ae60f 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -54,6 +54,7 @@ #include "display-helpers.hpp" #include "volume-control.hpp" #include "remote-text.hpp" +#include "ui-validation.hpp" #include #include @@ -163,25 +164,6 @@ static void AddExtraModulePaths() extern obs_frontend_callbacks *InitializeAPIInterface(OBSBasic *main); -static int CountVideoSources() -{ - int count = 0; - - auto countSources = [](void *param, obs_source_t *source) { - if (!source) - return true; - - uint32_t flags = obs_source_get_output_flags(source); - if ((flags & OBS_SOURCE_VIDEO) != 0) - (*reinterpret_cast(param))++; - - return true; - }; - - obs_enum_sources(countSources, &count); - return count; -} - void assignDockToggle(QDockWidget *dock, QAction *action) { auto handleWindowToggle = [action](bool vis) { @@ -5600,7 +5582,7 @@ void OBSBasic::StartReplayBuffer() if (disableOutputsRef) return; - if (!NoSourcesConfirmation()) { + if (!UIValidation::NoSourcesConfirmation(this)) { replayBufferButton->setChecked(false); return; } @@ -5745,30 +5727,6 @@ void OBSBasic::ReplayBufferStop(int code) OnDeactivate(); } -bool OBSBasic::NoSourcesConfirmation() -{ - if (CountVideoSources() == 0 && isVisible()) { - QString msg; - msg = QTStr("NoSources.Text"); - msg += "\n\n"; - msg += QTStr("NoSources.Text.AddSource"); - - QMessageBox messageBox(this); - messageBox.setWindowTitle(QTStr("NoSources.Title")); - messageBox.setText(msg); - QAbstractButton *Yes = messageBox.addButton( - QTStr("Yes"), QMessageBox::YesRole); - messageBox.addButton(QTStr("No"), QMessageBox::NoRole); - messageBox.setIcon(QMessageBox::Question); - messageBox.exec(); - - if (messageBox.clickedButton() != Yes) - return false; - } - - return true; -} - void OBSBasic::on_streamButton_clicked() { if (outputHandler->StreamingActive()) { @@ -5791,7 +5749,7 @@ void OBSBasic::on_streamButton_clicked() StopStreaming(); } else { - if (!NoSourcesConfirmation()) { + if (!UIValidation::NoSourcesConfirmation(this)) { ui->streamButton->setChecked(false); return; } @@ -5852,7 +5810,7 @@ void OBSBasic::on_recordButton_clicked() } StopRecording(); } else { - if (!NoSourcesConfirmation()) { + if (!UIValidation::NoSourcesConfirmation(this)) { ui->recordButton->setChecked(false); return; } diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index 83e0ca08c7c4051b83f17abd37f553ae207cd1bd..935e553baf141578b7703cebb56adaa030163999 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -456,8 +456,6 @@ private: void ReceivedIntroJson(const QString &text); - bool NoSourcesConfirmation(); - #ifdef BROWSER_AVAILABLE QList> extraBrowserDocks; QList> extraBrowserDockActions;