From c4396e03a7af167e56f70cd919924ac4e823b1e9 Mon Sep 17 00:00:00 2001 From: JohannMG Date: Tue, 19 Nov 2019 16:57:49 -0800 Subject: [PATCH] UI: Create UI Validation Helper Class Pull UI validation and its helpers to their own class. This class will be used to validate forms and perform UI-action checks such as checking stream keys aren't empty and in this diff now holds the logic to ensure there is a source before the person starts a stream. --- UI/CMakeLists.txt | 2 ++ UI/ui-validation.cpp | 56 ++++++++++++++++++++++++++++++++++++++++ UI/ui-validation.hpp | 15 +++++++++++ UI/window-basic-main.cpp | 50 +++-------------------------------- UI/window-basic-main.hpp | 2 -- 5 files changed, 77 insertions(+), 48 deletions(-) create mode 100644 UI/ui-validation.cpp create mode 100644 UI/ui-validation.hpp diff --git a/UI/CMakeLists.txt b/UI/CMakeLists.txt index ae007eac0..9ef923abd 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 000000000..596aab656 --- /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 000000000..161d7a168 --- /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 51a0d539b..dabdb701c 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 83e0ca08c..935e553ba 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; -- GitLab