Browse Source

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.
JohannMG 6 years ago
parent
commit
c4396e03a7
5 changed files with 77 additions and 48 deletions
  1. 2 0
      UI/CMakeLists.txt
  2. 56 0
      UI/ui-validation.cpp
  3. 15 0
      UI/ui-validation.hpp
  4. 4 46
      UI/window-basic-main.cpp
  5. 0 2
      UI/window-basic-main.hpp

+ 2 - 0
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

+ 56 - 0
UI/ui-validation.cpp

@@ -0,0 +1,56 @@
+#include "ui-validation.hpp"
+
+#include <obs.hpp>
+#include <QString>
+#include <QMessageBox>
+#include <QPushButton>
+
+#include <obs-app.hpp>
+
+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<int *>(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;
+}

+ 15 - 0
UI/ui-validation.hpp

@@ -0,0 +1,15 @@
+#pragma once
+
+#include <QObject>
+#include <QWidget>
+
+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);
+};

+ 4 - 46
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 <fstream>
 #include <sstream>
 
@@ -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<int *>(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;
 		}

+ 0 - 2
UI/window-basic-main.hpp

@@ -456,8 +456,6 @@ private:
 
 	void ReceivedIntroJson(const QString &text);
 
-	bool NoSourcesConfirmation();
-
 #ifdef BROWSER_AVAILABLE
 	QList<QSharedPointer<QDockWidget>> extraBrowserDocks;
 	QList<QSharedPointer<QAction>> extraBrowserDockActions;