diff --git a/config-dialog.cpp b/config-dialog.cpp
index 9e73e4c..189b097 100644
--- a/config-dialog.cpp
+++ b/config-dialog.cpp
@@ -173,7 +173,28 @@ OBSBasicSettings::OBSBasicSettings(QMainWindow *parent) : QDialog(parent)
if (outputDialog->exec() == QDialog::Accepted) {
// got a result
- blog(LOG_WARNING, "[Aitum Multistream] output accepted");
+ blog(LOG_WARNING, "[Aitum Multistream] output accepted %s %s %s", outputDialog->outputName.toUtf8().constData(), outputDialog->outputServer.toUtf8().constData(), outputDialog->outputKey.toUtf8().constData());
+
+ // create a new output
+ if (!settings)
+ return;
+ auto outputs = obs_data_get_array(settings, "outputs");
+ if (!outputs) {
+ outputs = obs_data_array_create();
+ obs_data_set_array(settings, "outputs", outputs);
+ }
+ auto s = obs_data_create();
+
+ // Set the info from the output dialog
+ obs_data_set_string(s, "name", outputDialog->outputName.toUtf8().constData());
+ obs_data_set_string(s, "stream_server", outputDialog->outputServer.toUtf8().constData());
+ obs_data_set_string(s, "stream_key", outputDialog->outputKey.toUtf8().constData());
+
+ obs_data_array_push_back(outputs, s);
+ obs_data_array_release(outputs);
+ AddServer(mainOutputsLayout, s);
+ obs_data_release(s);
+
} else {
blog(LOG_WARNING, "[Aitum Multistream] output rejected");
}
diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini
index d26b959..4600be0 100644
--- a/data/locale/en-US.ini
+++ b/data/locale/en-US.ini
@@ -35,6 +35,6 @@ OtherService="Other Service"
TwitchServiceInfo="Please complete the following fields to add a new Twitch output."
TwitchServer="Twitch Server"
-TwitchServerInfo="Pick your closest Twitch ingest server.\nYou can find your closest/recommended server by clicking here."
+TwitchServerInfo="Pick your closest Twitch ingest server.\nYou can find your closest/recommended server by clicking here."
TwitchStreamKey="Twitch Stream Key"
TwitchStreamKeyInfo="Please enter your stream key, you can find this on your Twitch Creator Dashboard."
diff --git a/output-dialog.cpp b/output-dialog.cpp
index b7bd0b4..e154c1c 100644
--- a/output-dialog.cpp
+++ b/output-dialog.cpp
@@ -22,6 +22,56 @@ void OutputDialog::resetOutputs() {
outputKey = QString("");
}
+// For when we're done
+void OutputDialog::acceptOutputs() {
+ accept();
+}
+
+// For validating the current values and then updating the confirm button state
+void OutputDialog::validateOutputs(QPushButton *confirmButton) {
+
+ if (outputName.isEmpty()) {
+ confirmButton->setEnabled(false);
+ } else if (outputServer.isEmpty()) {
+ confirmButton->setEnabled(false);
+ } else if (outputKey.isEmpty()) {
+ confirmButton->setEnabled(false);
+ } else {
+ confirmButton->setEnabled(true);
+ }
+
+}
+
+// Helper for generating info QLabels
+QLabel *generateInfoLabel(std::string text) {
+ auto label = new QLabel;
+ label->setTextFormat(Qt::RichText);
+ label->setText(QString::fromUtf8(obs_module_text(text.c_str())));
+ label->setOpenExternalLinks(true);
+ label->setWordWrap(true);
+ label->setAlignment(Qt::AlignTop);
+
+ return label;
+}
+
+// Helper for generating form QLabels
+QLabel *generateFormLabel(std::string text) {
+ auto label = new QLabel(QString::fromUtf8(obs_module_text(text.c_str())));
+ label->setStyleSheet("font-weight: bold;");
+
+ return label;
+}
+
+// Helper for generating QPushButtons w/ style
+QPushButton *generateButton(QString text) {
+ auto button = new QPushButton;
+ button->setText(text);
+ button->setStyleSheet("padding: 4px 12px;");
+ button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+
+ return button;
+}
+
QToolButton *OutputDialog::selectionButton(std::string title, QIcon icon, int selectionStep) {
auto button = new QToolButton;
@@ -199,12 +249,15 @@ QWidget *OutputDialog::WizardInfoUnknown() {
QWidget *OutputDialog::WizardInfoTwitch() {
auto page = new QWidget(this);
-
page->setStyleSheet("padding: 0px; margin: 0px;");
- auto pageLayout = new QVBoxLayout;
- pageLayout->setSpacing(16);
+ // Set defaults for this service
+ outputName = QString("Twitch Output");
+
+ // Layout
+ auto pageLayout = new QVBoxLayout;
+ pageLayout->setSpacing(12);
// Heading
auto title = new QLabel(QString::fromUtf8(obs_module_text("TwitchServiceInfo")));
@@ -212,8 +265,9 @@ QWidget *OutputDialog::WizardInfoTwitch() {
// Content
auto contentLayout = new QVBoxLayout;
-// auto filler = new QLabel(QString("filler text"));
-// contentLayout->addWidget(filler);
+
+ // Confirm button - initialised here so we can set state in form input connects
+ auto confirmButton = generateButton(QString("Create Output"));
// Form
auto formLayout = new QFormLayout;
@@ -222,20 +276,27 @@ QWidget *OutputDialog::WizardInfoTwitch() {
formLayout->setSpacing(12);
// Output name
- auto outputNameTitle = new QLabel(QString::fromUtf8(obs_module_text("OutputName")));
- outputNameTitle->setStyleSheet("font-weight: bold;");
+ auto outputNameField = new QLineEdit;
+ outputNameField->setText(outputName);
+ outputNameField->setStyleSheet("padding: 4px 8px;");
- auto outputName = new QLineEdit;
- outputName->setStyleSheet("padding: 4px 8px;");
- formLayout->addRow(outputNameTitle, outputName);
+ connect(outputNameField, &QLineEdit::textEdited, [this, outputNameField, confirmButton] {
+ outputName = outputNameField->text();
+ validateOutputs(confirmButton);
+ });
+
+ formLayout->addRow(generateFormLabel("OutputName"), outputNameField);
// Server selection
-
- auto serverSelectionTitle = new QLabel(QString::fromUtf8(obs_module_text("TwitchServer")));
- serverSelectionTitle->setStyleSheet("font-weight: bold;");
auto serverSelection = new QComboBox;
serverSelection->setMinimumHeight(30);
serverSelection->setStyleSheet("padding: 4px 8px;");
+
+ connect(serverSelection, &QComboBox::currentIndexChanged, [this, serverSelection, confirmButton] {
+ outputServer = serverSelection->currentData().toString();
+ validateOutputs(confirmButton);
+ });
+
auto rawOptions = getService("Twitch");
// turn raw options into actual selectable options
@@ -250,33 +311,23 @@ QWidget *OutputDialog::WizardInfoTwitch() {
}
- formLayout->addRow(serverSelectionTitle, serverSelection);
+ formLayout->addRow(generateFormLabel("TwitchServer"), serverSelection);
// Server info
- auto serverInfo = new QLabel;
- serverInfo->setTextFormat(Qt::RichText);
- serverInfo->setText(QString::fromUtf8(obs_module_text("TwitchServerInfo")));
- serverInfo->setOpenExternalLinks(true);
- serverInfo->setWordWrap(true);
- formLayout->addWidget(serverInfo);
+ formLayout->addWidget(generateInfoLabel("TwitchServerInfo"));
// Server key
- auto outputKeyTitle = new QLabel(QString::fromUtf8(obs_module_text("TwitchStreamKey")));
- outputNameTitle->setStyleSheet("font-weight: bold;");
+ auto outputKeyField = new QLineEdit;
+ outputKeyField->setStyleSheet("padding: 4px 8px;");
+ connect(outputKeyField, &QLineEdit::textEdited, [this, outputKeyField, confirmButton] {
+ outputKey = outputKeyField->text();
+ validateOutputs(confirmButton);
+ });
- auto outputKey = new QLineEdit;
- outputName->setStyleSheet("padding: 4px 8px;");
- formLayout->addRow(outputKeyTitle, outputKey);
+ formLayout->addRow(generateFormLabel("TwitchStreamKey"), outputKeyField);
// Server key info
- auto keyInfo = new QLabel;
- keyInfo->setTextFormat(Qt::RichText);
- keyInfo->setText(QString::fromUtf8(obs_module_text("TwitchStreamKeyInfo")));
- keyInfo->setOpenExternalLinks(true);
- keyInfo->setWordWrap(true);
- keyInfo->setAlignment(Qt::AlignTop);
- formLayout->addWidget(keyInfo);
-
+ formLayout->addWidget(generateInfoLabel("TwitchStreamKeyInfo"));
contentLayout->addLayout(formLayout);
@@ -290,12 +341,8 @@ QWidget *OutputDialog::WizardInfoTwitch() {
auto controlsLayout = new QHBoxLayout;
controlsLayout->setSpacing(12);
-
// back button
- auto serviceButton = new QPushButton;
- serviceButton->setText(QString("< Back"));
- serviceButton->setStyleSheet("padding: 4px 12px;");
- serviceButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ auto serviceButton = generateButton(QString("< Back"));
connect(serviceButton, &QPushButton::clicked, [this] {
stackedWidget->setCurrentIndex(0);
@@ -303,18 +350,17 @@ QWidget *OutputDialog::WizardInfoTwitch() {
});
controlsLayout->addWidget(serviceButton, 0);
-
controlsLayout->addStretch(1);
- // confirm button
- auto confirmButton = new QPushButton;
- confirmButton->setEnabled(false);
- confirmButton->setText(QString("Create Output"));
- confirmButton->setStyleSheet("padding: 4px 12px;");
- confirmButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+
+ // confirm button (initialised above so we can set state)
+ validateOutputs(confirmButton);
+
+ connect(confirmButton, &QPushButton::clicked, [this] {
+ acceptOutputs();
+ });
controlsLayout->addWidget(confirmButton, 0);
-
// Hook it all together
pageLayout->addLayout(controlsLayout);
page->setLayout(pageLayout);
diff --git a/output-dialog.hpp b/output-dialog.hpp
index 999ccae..3a0469b 100644
--- a/output-dialog.hpp
+++ b/output-dialog.hpp
@@ -4,6 +4,7 @@
#include
#include
#include
+#include
#include
#include "obs-data.h"
@@ -35,15 +36,16 @@ private:
QIcon platformIconUnknown = QIcon(":/aitum/media/unknown.png");
obs_data_array_t *servicesData;
-
- QString outputName;
- QString outputServer;
- QString outputKey;
-
+
void resetOutputs();
+ void acceptOutputs();
+ void validateOutputs(QPushButton *confirmButton);
obs_data_t *getService(std::string serviceName);
QStackedWidget *stackedWidget;
public:
OutputDialog(QDialog *parent);
+ QString outputName;
+ QString outputServer;
+ QString outputKey;
};