2024-07-16 15:16:40 +02:00
|
|
|
#include "output-dialog.hpp"
|
|
|
|
|
|
|
|
#include <QDialog>
|
2024-07-16 18:41:19 +02:00
|
|
|
#include <QVBoxLayout>
|
2024-07-18 01:32:30 +02:00
|
|
|
#include <QHBoxLayout>
|
2024-07-16 18:41:19 +02:00
|
|
|
#include <QLabel>
|
|
|
|
#include <QStackedWidget>
|
2024-07-16 23:00:33 +02:00
|
|
|
#include <QPushButton>
|
|
|
|
#include <QAbstractButton>
|
|
|
|
#include <QToolButton>
|
2024-07-18 01:32:30 +02:00
|
|
|
#include <QFormLayout>
|
|
|
|
#include <QComboBox>
|
|
|
|
#include <QLineEdit>
|
|
|
|
#include <QSizePolicy>
|
2024-07-16 20:52:59 +02:00
|
|
|
#include "obs-module.h"
|
2024-07-18 01:32:30 +02:00
|
|
|
#include "util/platform.h"
|
2024-07-16 20:52:59 +02:00
|
|
|
|
2024-07-18 01:32:30 +02:00
|
|
|
// Reset output values, e.g. when user hits the back button
|
|
|
|
void OutputDialog::resetOutputs() {
|
|
|
|
outputName = QString("");
|
|
|
|
outputServer = QString("");
|
|
|
|
outputKey = QString("");
|
|
|
|
}
|
2024-07-16 15:16:40 +02:00
|
|
|
|
2024-07-18 16:18:56 +02:00
|
|
|
// 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->setOpenExternalLinks(true);
|
2024-07-18 17:06:23 +02:00
|
|
|
label->setText(QString::fromUtf8(obs_module_text(text.c_str())));
|
2024-07-18 16:18:56 +02:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2024-07-19 21:19:54 +02:00
|
|
|
// Helper for generating output name field
|
|
|
|
QLineEdit *OutputDialog::generateOutputNameField(std::string text, QPushButton *confirmButton) {
|
|
|
|
auto field = new QLineEdit;
|
|
|
|
field->setText(QString::fromUtf8(obs_module_text(text.c_str())));
|
|
|
|
field->setStyleSheet("padding: 4px 8px;");
|
|
|
|
|
|
|
|
connect(field, &QLineEdit::textEdited, [this, field, confirmButton] {
|
|
|
|
outputName = field->text();
|
|
|
|
validateOutputs(confirmButton);
|
|
|
|
});
|
|
|
|
|
|
|
|
return field;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Helper for generating output server field
|
|
|
|
QLineEdit *OutputDialog::generateOutputServerField(QPushButton *confirmButton, bool locked) {
|
|
|
|
auto field = new QLineEdit;
|
|
|
|
field->setStyleSheet("padding: 4px 8px;");
|
|
|
|
field->setDisabled(locked);
|
|
|
|
|
|
|
|
if (!locked) {
|
|
|
|
connect(field, &QLineEdit::textEdited, [this, field, confirmButton] {
|
|
|
|
outputServer = field->text();
|
|
|
|
validateOutputs(confirmButton);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return field;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Helper for generating QComboBoxes for server selection
|
|
|
|
QComboBox *OutputDialog::generateOutputServerCombo(std::string service, QPushButton *confirmButton) {
|
|
|
|
auto combo = new QComboBox;
|
|
|
|
combo->setMinimumHeight(30);
|
|
|
|
combo->setStyleSheet("padding: 4px 8px;");
|
|
|
|
|
|
|
|
connect(combo, &QComboBox::currentIndexChanged, [this, combo, confirmButton] {
|
|
|
|
outputServer = combo->currentData().toString();
|
|
|
|
validateOutputs(confirmButton);
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
auto rawOptions = getService(service);
|
|
|
|
|
|
|
|
// turn raw options into actual selectable options
|
|
|
|
if (rawOptions != nullptr) {
|
|
|
|
auto servers = obs_data_get_array(rawOptions, "servers");
|
|
|
|
auto totalServers = obs_data_array_count(servers);
|
|
|
|
|
|
|
|
for (size_t idx = 0; idx < totalServers; idx++) {
|
|
|
|
auto item = obs_data_array_item(servers, idx);
|
|
|
|
combo->addItem(obs_data_get_string(item, "name"), obs_data_get_string(item, "url"));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set default value for server
|
|
|
|
outputServer = combo->currentData().toString();
|
|
|
|
|
|
|
|
return combo;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Helper for generating output key field
|
|
|
|
QLineEdit *OutputDialog::generateOutputKeyField(QPushButton *confirmButton) {
|
|
|
|
auto field = new QLineEdit;
|
|
|
|
field->setStyleSheet("padding: 4px 8px;");
|
|
|
|
|
|
|
|
connect(field, &QLineEdit::textEdited, [this, field, confirmButton] {
|
|
|
|
outputKey = field->text();
|
|
|
|
validateOutputs(confirmButton);
|
|
|
|
});
|
|
|
|
|
|
|
|
return field;
|
|
|
|
}
|
|
|
|
|
2024-07-18 16:18:56 +02:00
|
|
|
// 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;
|
|
|
|
}
|
|
|
|
|
2024-07-18 01:32:30 +02:00
|
|
|
QToolButton *OutputDialog::selectionButton(std::string title, QIcon icon, int selectionStep) {
|
2024-07-16 23:00:33 +02:00
|
|
|
auto button = new QToolButton;
|
|
|
|
|
|
|
|
button->setText(QString::fromUtf8(title));
|
|
|
|
button->setIcon(icon);
|
|
|
|
button->setIconSize(QSize(32, 32));
|
|
|
|
button->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
|
|
|
|
button->setStyleSheet("min-width: 110px; max-width: 110px; min-height: 90px; max-height: 90px; padding-top: 16px; font-weight: bold;");
|
|
|
|
|
2024-07-18 01:32:30 +02:00
|
|
|
connect(button, &QPushButton::clicked, [this, selectionStep] {
|
|
|
|
stackedWidget->setCurrentIndex(selectionStep);
|
|
|
|
});
|
|
|
|
|
2024-07-16 23:00:33 +02:00
|
|
|
return button;
|
|
|
|
}
|
|
|
|
|
2024-07-18 01:32:30 +02:00
|
|
|
// Gets a service from the service array matched by name
|
|
|
|
obs_data_t *OutputDialog::getService(std::string serviceName) {
|
|
|
|
auto total = obs_data_array_count(servicesData);
|
|
|
|
|
|
|
|
for (size_t idx = 0; idx < total; idx++) {
|
|
|
|
auto item = obs_data_array_item(servicesData, idx);
|
|
|
|
// blog(LOG_WARNING, "[Aitum Multistream] %s", obs_data_get_string(item, "name"));
|
|
|
|
|
|
|
|
if (serviceName == obs_data_get_string(item, "name")) {
|
|
|
|
return item;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
2024-07-16 18:41:19 +02:00
|
|
|
OutputDialog::OutputDialog(QDialog *parent) : QDialog(parent) {
|
2024-07-18 01:32:30 +02:00
|
|
|
// Load the services from rtmp-services plugin
|
|
|
|
auto servicesPath = obs_module_get_config_path(obs_get_module("rtmp-services"), "services.json");
|
|
|
|
auto absolutePath = os_get_abs_path_ptr(servicesPath);
|
|
|
|
auto allData = obs_data_create_from_json_file(absolutePath);
|
|
|
|
|
|
|
|
servicesData = obs_data_get_array(allData, "services");
|
|
|
|
|
|
|
|
bfree(allData);
|
|
|
|
bfree(servicesPath);
|
|
|
|
bfree(absolutePath);
|
|
|
|
|
2024-07-18 17:06:23 +02:00
|
|
|
// Blank info
|
|
|
|
resetOutputs();
|
|
|
|
|
2024-07-18 01:32:30 +02:00
|
|
|
//
|
2024-07-16 20:52:59 +02:00
|
|
|
setModal(true);
|
2024-07-18 01:32:30 +02:00
|
|
|
setContentsMargins(0, 0, 0, 0);
|
|
|
|
setFixedSize(650, 400);
|
|
|
|
|
2024-07-16 18:41:19 +02:00
|
|
|
stackedWidget = new QStackedWidget;
|
2024-07-16 15:16:40 +02:00
|
|
|
|
2024-07-18 01:32:30 +02:00
|
|
|
stackedWidget->setStyleSheet("padding: 0px; margin: 0px;");
|
|
|
|
|
2024-07-16 18:41:19 +02:00
|
|
|
// Service selection page
|
|
|
|
stackedWidget->addWidget(WizardServicePage());
|
2024-07-16 15:16:40 +02:00
|
|
|
|
2024-07-16 18:41:19 +02:00
|
|
|
// Pages for each service
|
|
|
|
stackedWidget->addWidget(WizardInfoKick());
|
|
|
|
stackedWidget->addWidget(WizardInfoYouTube());
|
|
|
|
stackedWidget->addWidget(WizardInfoTwitter());
|
|
|
|
stackedWidget->addWidget(WizardInfoUnknown());
|
|
|
|
stackedWidget->addWidget(WizardInfoTwitch());
|
|
|
|
stackedWidget->addWidget(WizardInfoTrovo());
|
|
|
|
stackedWidget->addWidget(WizardInfoTikTok());
|
|
|
|
stackedWidget->addWidget(WizardInfoFacebook());
|
|
|
|
|
|
|
|
stackedWidget->setCurrentIndex(0);
|
|
|
|
|
2024-07-18 01:32:30 +02:00
|
|
|
stackedWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
2024-07-16 20:52:59 +02:00
|
|
|
setWindowTitle(obs_module_text("NewOutputWindowTitle"));
|
2024-07-16 18:41:19 +02:00
|
|
|
|
|
|
|
auto stackedLayout = new QVBoxLayout;
|
2024-07-18 01:32:30 +02:00
|
|
|
stackedLayout->setContentsMargins(0, 0, 0, 0);
|
|
|
|
stackedLayout->addWidget(stackedWidget, 1);
|
|
|
|
|
2024-07-16 18:41:19 +02:00
|
|
|
setLayout(stackedLayout);
|
2024-07-16 15:16:40 +02:00
|
|
|
show();
|
|
|
|
}
|
|
|
|
|
2024-07-19 21:19:54 +02:00
|
|
|
// Edit mode
|
|
|
|
OutputDialog::OutputDialog(QDialog *parent, QString name, QString server, QString key) : QDialog(parent) {
|
|
|
|
|
|
|
|
// Load the services from rtmp-services plugin
|
|
|
|
auto servicesPath = obs_module_get_config_path(obs_get_module("rtmp-services"), "services.json");
|
|
|
|
auto absolutePath = os_get_abs_path_ptr(servicesPath);
|
|
|
|
auto allData = obs_data_create_from_json_file(absolutePath);
|
|
|
|
|
|
|
|
servicesData = obs_data_get_array(allData, "services");
|
|
|
|
|
|
|
|
bfree(allData);
|
|
|
|
bfree(servicesPath);
|
|
|
|
bfree(absolutePath);
|
|
|
|
|
|
|
|
// Blank info
|
|
|
|
resetOutputs();
|
|
|
|
|
|
|
|
// Set info from constructor
|
|
|
|
outputName = name;
|
|
|
|
outputServer = server;
|
|
|
|
outputKey = key;
|
|
|
|
|
|
|
|
//
|
|
|
|
setModal(true);
|
|
|
|
setContentsMargins(0, 0, 0, 0);
|
|
|
|
setFixedSize(650, 400);
|
|
|
|
|
|
|
|
auto layout = new QVBoxLayout();
|
|
|
|
|
|
|
|
// Add the appropriate page to the layout based upon the server url
|
|
|
|
if (outputServer.contains(QString::fromUtf8(".contribute.live-video.net")) ||
|
|
|
|
outputServer.contains(QString::fromUtf8(".twitch.tv"))) { // twitch
|
|
|
|
layout->addWidget(WizardInfoTwitch(true));
|
|
|
|
} else if (outputServer.contains(QString::fromUtf8(".youtube.com"))) { // youtube
|
|
|
|
layout->addWidget(WizardInfoYouTube(true));
|
|
|
|
} else if (outputServer.contains(QString::fromUtf8("fa723fc1b171.global-contribute.live-video.net"))) { // kick
|
|
|
|
layout->addWidget(WizardInfoKick(true));
|
|
|
|
} else if (outputServer.contains(QString::fromUtf8(".tiktokcdn-"))) { // tiktok
|
|
|
|
layout->addWidget(WizardInfoTikTok(true));
|
|
|
|
} else if (outputServer.contains(QString::fromUtf8(".pscp.tv"))) { // twitter
|
|
|
|
layout->addWidget(WizardInfoTwitter(true));
|
|
|
|
} else if (outputServer.contains(QString::fromUtf8("livepush.trovo.live"))) { // trovo
|
|
|
|
layout->addWidget(WizardInfoTrovo(true));
|
|
|
|
} else if (outputServer.contains(QString::fromUtf8(".facebook.com"))) { // facebook
|
|
|
|
layout->addWidget(WizardInfoFacebook(true));
|
|
|
|
} else { // unknown
|
|
|
|
layout->addWidget(WizardInfoUnknown(true));
|
|
|
|
}
|
|
|
|
|
|
|
|
setLayout(layout);
|
|
|
|
|
|
|
|
setWindowTitle(obs_module_text("EditOutputWindowTitle"));
|
|
|
|
|
|
|
|
show();
|
|
|
|
}
|
|
|
|
|
2024-07-16 18:41:19 +02:00
|
|
|
QWidget *OutputDialog::WizardServicePage() {
|
|
|
|
auto page = new QWidget(this);
|
|
|
|
auto pageLayout = new QVBoxLayout;
|
2024-07-18 01:32:30 +02:00
|
|
|
pageLayout->setAlignment(Qt::AlignTop);
|
2024-07-16 18:41:19 +02:00
|
|
|
|
2024-07-16 20:52:59 +02:00
|
|
|
auto description = new QLabel(QString::fromUtf8(obs_module_text("NewOutputSelectService")));
|
2024-07-16 23:00:33 +02:00
|
|
|
description->setStyleSheet("margin-bottom: 20px;");
|
2024-07-16 20:52:59 +02:00
|
|
|
pageLayout->addWidget(description);
|
|
|
|
|
|
|
|
// layout for service selection
|
|
|
|
auto selectionLayout = new QVBoxLayout;
|
2024-07-18 01:32:30 +02:00
|
|
|
selectionLayout->setAlignment(Qt::AlignCenter);
|
2024-07-16 23:00:33 +02:00
|
|
|
|
2024-07-18 01:32:30 +02:00
|
|
|
auto spacerTest = new QSpacerItem(20, 45, QSizePolicy::Fixed, QSizePolicy::Fixed);
|
2024-07-16 23:00:33 +02:00
|
|
|
|
|
|
|
pageLayout->addSpacerItem(spacerTest);
|
2024-07-16 20:52:59 +02:00
|
|
|
|
|
|
|
// row 1
|
|
|
|
auto rowOne = new QHBoxLayout;
|
|
|
|
|
2024-07-18 01:32:30 +02:00
|
|
|
rowOne->addWidget(selectionButton("Twitch", platformIconTwitch, 5));
|
|
|
|
rowOne->addWidget(selectionButton("YouTube", platformIconYouTube, 2));
|
|
|
|
rowOne->addWidget(selectionButton("TikTok", platformIconTikTok, 7));
|
|
|
|
rowOne->addWidget(selectionButton("Facebook", platformIconFacebook, 8));
|
2024-07-16 23:00:33 +02:00
|
|
|
|
|
|
|
selectionLayout->addLayout(rowOne);
|
2024-07-16 20:52:59 +02:00
|
|
|
|
|
|
|
// row 2
|
2024-07-16 23:00:33 +02:00
|
|
|
auto rowTwo = new QHBoxLayout;
|
2024-07-16 20:52:59 +02:00
|
|
|
|
2024-07-18 01:32:30 +02:00
|
|
|
rowTwo->addWidget(selectionButton("Trovo", platformIconTrovo, 6));
|
|
|
|
rowTwo->addWidget(selectionButton("X (Twitter)", platformIconTwitter, 3));
|
|
|
|
rowTwo->addWidget(selectionButton("Kick", platformIconKick, 1));
|
|
|
|
rowTwo->addWidget(selectionButton(obs_module_text("OtherService"), platformIconUnknown, 4));
|
2024-07-16 20:52:59 +02:00
|
|
|
|
2024-07-16 23:00:33 +02:00
|
|
|
selectionLayout->addLayout(rowTwo);
|
2024-07-18 01:32:30 +02:00
|
|
|
|
2024-07-16 23:00:33 +02:00
|
|
|
//
|
|
|
|
pageLayout->addLayout(selectionLayout);
|
2024-07-16 18:41:19 +02:00
|
|
|
page->setLayout(pageLayout);
|
|
|
|
|
|
|
|
return page;
|
|
|
|
}
|
|
|
|
|
2024-07-19 21:19:54 +02:00
|
|
|
QWidget *OutputDialog::WizardInfoKick(bool edit) {
|
2024-07-16 18:41:19 +02:00
|
|
|
auto page = new QWidget(this);
|
2024-07-18 18:08:16 +02:00
|
|
|
page->setStyleSheet("padding: 0px; margin: 0px;");
|
|
|
|
|
|
|
|
// Layout
|
2024-07-16 18:41:19 +02:00
|
|
|
auto pageLayout = new QVBoxLayout;
|
2024-07-18 18:08:16 +02:00
|
|
|
pageLayout->setSpacing(12);
|
2024-07-16 18:41:19 +02:00
|
|
|
|
2024-07-18 18:08:16 +02:00
|
|
|
// Heading
|
2024-07-19 21:19:54 +02:00
|
|
|
auto title = new QLabel(QString::fromUtf8(obs_module_text(edit ? "KickServiceInfoEdit" : "KickServiceInfo")));
|
2024-07-18 18:08:16 +02:00
|
|
|
title->setWordWrap(true);
|
|
|
|
title->setTextFormat(Qt::RichText);
|
2024-07-16 18:41:19 +02:00
|
|
|
pageLayout->addWidget(title);
|
|
|
|
|
2024-07-18 18:08:16 +02:00
|
|
|
// Content
|
|
|
|
auto contentLayout = new QVBoxLayout;
|
|
|
|
|
|
|
|
// Confirm button - initialised here so we can set state in form input connects
|
2024-07-19 21:19:54 +02:00
|
|
|
auto confirmButton = generateButton(QString(edit ? "Save Output" : "Create Output"));
|
2024-07-18 18:08:16 +02:00
|
|
|
|
|
|
|
// Form
|
|
|
|
auto formLayout = new QFormLayout;
|
|
|
|
formLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
|
|
|
|
formLayout->setLabelAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
|
|
|
|
formLayout->setSpacing(12);
|
|
|
|
|
|
|
|
// Output name
|
2024-07-19 21:19:54 +02:00
|
|
|
auto outputNameField = generateOutputNameField("KickOutput", confirmButton);
|
2024-07-18 18:08:16 +02:00
|
|
|
formLayout->addRow(generateFormLabel("OutputName"), outputNameField);
|
|
|
|
|
|
|
|
// Server field
|
2024-07-19 21:19:54 +02:00
|
|
|
auto serverSelection = generateOutputServerField(confirmButton, true);
|
2024-07-18 18:08:16 +02:00
|
|
|
serverSelection->setText("rtmps://fa723fc1b171.global-contribute.live-video.net");
|
|
|
|
formLayout->addRow(generateFormLabel("KickServer"), serverSelection);
|
|
|
|
|
|
|
|
// Server info
|
|
|
|
formLayout->addWidget(generateInfoLabel("KickServerInfo"));
|
|
|
|
|
|
|
|
// Server key
|
2024-07-19 21:19:54 +02:00
|
|
|
auto outputKeyField = generateOutputKeyField(confirmButton);
|
2024-07-18 18:08:16 +02:00
|
|
|
formLayout->addRow(generateFormLabel("KickStreamKey"), outputKeyField);
|
|
|
|
|
|
|
|
// Server key info
|
|
|
|
formLayout->addWidget(generateInfoLabel("KickStreamKeyInfo"));
|
|
|
|
|
|
|
|
contentLayout->addLayout(formLayout);
|
|
|
|
|
|
|
|
// spacing
|
|
|
|
auto spacer = new QSpacerItem(1, 20, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
|
|
|
|
contentLayout->addSpacerItem(spacer);
|
|
|
|
|
|
|
|
pageLayout->addLayout(contentLayout);
|
|
|
|
|
|
|
|
// Controls
|
|
|
|
auto controlsLayout = new QHBoxLayout;
|
|
|
|
controlsLayout->setSpacing(12);
|
|
|
|
|
|
|
|
// back button
|
2024-07-19 21:19:54 +02:00
|
|
|
if (!edit) {
|
|
|
|
auto serviceButton = generateButton(QString("< Back"));
|
|
|
|
|
|
|
|
connect(serviceButton, &QPushButton::clicked, [this] {
|
|
|
|
stackedWidget->setCurrentIndex(0);
|
|
|
|
resetOutputs();
|
|
|
|
});
|
|
|
|
|
|
|
|
controlsLayout->addWidget(serviceButton, 0);
|
|
|
|
controlsLayout->addStretch(1);
|
|
|
|
}
|
2024-07-18 18:08:16 +02:00
|
|
|
|
|
|
|
// confirm button (initialised above so we can set state)
|
|
|
|
connect(confirmButton, &QPushButton::clicked, [this] {
|
|
|
|
acceptOutputs();
|
|
|
|
});
|
|
|
|
|
|
|
|
controlsLayout->addWidget(confirmButton, 0);
|
|
|
|
|
|
|
|
// Hook it all together
|
|
|
|
pageLayout->addLayout(controlsLayout);
|
2024-07-16 18:41:19 +02:00
|
|
|
page->setLayout(pageLayout);
|
|
|
|
|
2024-07-18 18:08:16 +02:00
|
|
|
// Defaults for when we're changed to
|
2024-07-19 21:19:54 +02:00
|
|
|
if (!edit) {
|
|
|
|
connect(stackedWidget, &QStackedWidget::currentChanged, [this, outputNameField, serverSelection, outputKeyField, confirmButton] {
|
|
|
|
if (stackedWidget->currentIndex() == 1) {
|
|
|
|
outputName = outputNameField->text();
|
|
|
|
outputServer = serverSelection->text();
|
|
|
|
outputKey = outputKeyField->text();
|
|
|
|
validateOutputs(confirmButton);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2024-07-18 18:08:16 +02:00
|
|
|
|
|
|
|
|
2024-07-19 21:19:54 +02:00
|
|
|
// Edit changes
|
|
|
|
if (edit) {
|
|
|
|
outputNameField->setText(outputName);
|
|
|
|
serverSelection->setText(outputServer);
|
|
|
|
outputKeyField->setText(outputKey);
|
|
|
|
}
|
|
|
|
|
2024-07-16 18:41:19 +02:00
|
|
|
return page;
|
|
|
|
}
|
|
|
|
|
2024-07-19 21:19:54 +02:00
|
|
|
QWidget *OutputDialog::WizardInfoYouTube(bool edit) {
|
2024-07-16 18:41:19 +02:00
|
|
|
auto page = new QWidget(this);
|
2024-07-18 17:06:23 +02:00
|
|
|
page->setStyleSheet("padding: 0px; margin: 0px;");
|
|
|
|
|
|
|
|
// Layout
|
2024-07-16 18:41:19 +02:00
|
|
|
auto pageLayout = new QVBoxLayout;
|
2024-07-18 17:06:23 +02:00
|
|
|
pageLayout->setSpacing(12);
|
2024-07-16 18:41:19 +02:00
|
|
|
|
2024-07-18 17:06:23 +02:00
|
|
|
// Heading
|
|
|
|
auto title = new QLabel(QString::fromUtf8(obs_module_text("YouTubeServiceInfo")));
|
2024-07-16 18:41:19 +02:00
|
|
|
pageLayout->addWidget(title);
|
|
|
|
|
2024-07-18 17:06:23 +02:00
|
|
|
// Content
|
|
|
|
auto contentLayout = new QVBoxLayout;
|
|
|
|
|
|
|
|
// Confirm button - initialised here so we can set state in form input connects
|
|
|
|
auto confirmButton = generateButton(QString("Create Output"));
|
|
|
|
|
|
|
|
// Form
|
|
|
|
auto formLayout = new QFormLayout;
|
|
|
|
formLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
|
|
|
|
formLayout->setLabelAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
|
|
|
|
formLayout->setSpacing(12);
|
|
|
|
|
|
|
|
// Output name
|
2024-07-19 21:19:54 +02:00
|
|
|
auto outputNameField = generateOutputNameField("YouTubeOutput", confirmButton);
|
2024-07-18 17:06:23 +02:00
|
|
|
formLayout->addRow(generateFormLabel("OutputName"), outputNameField);
|
|
|
|
|
|
|
|
// Server selection
|
2024-07-19 21:19:54 +02:00
|
|
|
auto serverSelection = generateOutputServerCombo("YouTube - RTMPS", confirmButton);
|
2024-07-18 17:06:23 +02:00
|
|
|
formLayout->addRow(generateFormLabel("YouTubeServer"), serverSelection);
|
|
|
|
|
|
|
|
// Server info
|
|
|
|
formLayout->addWidget(generateInfoLabel("YouTubeServerInfo"));
|
|
|
|
|
|
|
|
// Server key
|
2024-07-19 21:19:54 +02:00
|
|
|
auto outputKeyField = generateOutputKeyField(confirmButton);
|
2024-07-18 17:06:23 +02:00
|
|
|
formLayout->addRow(generateFormLabel("YouTubeStreamKey"), outputKeyField);
|
|
|
|
|
|
|
|
// Server key info
|
|
|
|
formLayout->addWidget(generateInfoLabel("YouTubeStreamKeyInfo"));
|
|
|
|
|
|
|
|
contentLayout->addLayout(formLayout);
|
|
|
|
|
|
|
|
// spacing
|
|
|
|
auto spacer = new QSpacerItem(1, 20, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
|
|
|
|
contentLayout->addSpacerItem(spacer);
|
|
|
|
|
|
|
|
pageLayout->addLayout(contentLayout);
|
|
|
|
|
|
|
|
// Controls
|
|
|
|
auto controlsLayout = new QHBoxLayout;
|
|
|
|
controlsLayout->setSpacing(12);
|
|
|
|
|
|
|
|
// back button
|
2024-07-19 21:19:54 +02:00
|
|
|
if (!edit) {
|
|
|
|
auto serviceButton = generateButton(QString("< Back"));
|
|
|
|
|
|
|
|
connect(serviceButton, &QPushButton::clicked, [this] {
|
|
|
|
stackedWidget->setCurrentIndex(0);
|
|
|
|
resetOutputs();
|
|
|
|
});
|
|
|
|
|
|
|
|
controlsLayout->addWidget(serviceButton, 0);
|
|
|
|
controlsLayout->addStretch(1);
|
|
|
|
}
|
2024-07-18 17:06:23 +02:00
|
|
|
|
|
|
|
// confirm button (initialised above so we can set state)
|
|
|
|
connect(confirmButton, &QPushButton::clicked, [this] {
|
|
|
|
acceptOutputs();
|
|
|
|
});
|
|
|
|
|
|
|
|
controlsLayout->addWidget(confirmButton, 0);
|
|
|
|
|
|
|
|
// Hook it all together
|
|
|
|
pageLayout->addLayout(controlsLayout);
|
2024-07-16 18:41:19 +02:00
|
|
|
page->setLayout(pageLayout);
|
|
|
|
|
2024-07-18 17:06:23 +02:00
|
|
|
// Defaults for when we're changed to
|
2024-07-19 21:19:54 +02:00
|
|
|
if (!edit) {
|
|
|
|
connect(stackedWidget, &QStackedWidget::currentChanged, [this, outputNameField, serverSelection, outputKeyField, confirmButton] {
|
|
|
|
if (stackedWidget->currentIndex() == 2) {
|
|
|
|
outputName = outputNameField->text();
|
|
|
|
outputServer = serverSelection->currentData().toString();
|
|
|
|
outputKey = outputKeyField->text();
|
|
|
|
validateOutputs(confirmButton);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2024-07-18 17:06:23 +02:00
|
|
|
|
2024-07-19 21:19:54 +02:00
|
|
|
// Edit changes
|
|
|
|
if (edit) {
|
|
|
|
outputNameField->setText(outputName);
|
|
|
|
|
|
|
|
auto selectionIndex = serverSelection->findData(outputServer);
|
|
|
|
if (selectionIndex != -1) {
|
|
|
|
serverSelection->setCurrentIndex(selectionIndex);
|
|
|
|
}
|
|
|
|
|
|
|
|
outputKeyField->setText(outputKey);
|
|
|
|
}
|
2024-07-18 17:06:23 +02:00
|
|
|
|
2024-07-16 18:41:19 +02:00
|
|
|
return page;
|
|
|
|
}
|
|
|
|
|
2024-07-19 21:19:54 +02:00
|
|
|
QWidget *OutputDialog::WizardInfoTwitter(bool edit) {
|
2024-07-16 18:41:19 +02:00
|
|
|
auto page = new QWidget(this);
|
2024-07-18 18:02:40 +02:00
|
|
|
page->setStyleSheet("padding: 0px; margin: 0px;");
|
|
|
|
|
|
|
|
// Layout
|
2024-07-16 18:41:19 +02:00
|
|
|
auto pageLayout = new QVBoxLayout;
|
2024-07-18 18:02:40 +02:00
|
|
|
pageLayout->setSpacing(12);
|
2024-07-16 18:41:19 +02:00
|
|
|
|
2024-07-18 18:02:40 +02:00
|
|
|
// Heading
|
|
|
|
auto title = new QLabel(QString::fromUtf8(obs_module_text("TwitterServiceInfo")));
|
2024-07-16 18:41:19 +02:00
|
|
|
pageLayout->addWidget(title);
|
2024-07-16 15:16:40 +02:00
|
|
|
|
2024-07-18 18:02:40 +02:00
|
|
|
// Content
|
|
|
|
auto contentLayout = new QVBoxLayout;
|
|
|
|
|
|
|
|
// Confirm button - initialised here so we can set state in form input connects
|
|
|
|
auto confirmButton = generateButton(QString("Create Output"));
|
|
|
|
|
|
|
|
// Form
|
|
|
|
auto formLayout = new QFormLayout;
|
|
|
|
formLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
|
|
|
|
formLayout->setLabelAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
|
|
|
|
formLayout->setSpacing(12);
|
|
|
|
|
|
|
|
// Output name
|
2024-07-19 21:19:54 +02:00
|
|
|
auto outputNameField = generateOutputNameField("TwitterOutput", confirmButton);
|
2024-07-18 18:02:40 +02:00
|
|
|
formLayout->addRow(generateFormLabel("OutputName"), outputNameField);
|
|
|
|
|
|
|
|
// Server selection
|
2024-07-19 21:19:54 +02:00
|
|
|
auto serverSelection = generateOutputServerCombo("Twitter", confirmButton);
|
2024-07-18 18:02:40 +02:00
|
|
|
formLayout->addRow(generateFormLabel("TwitterServer"), serverSelection);
|
|
|
|
|
|
|
|
// Server info
|
|
|
|
formLayout->addWidget(generateInfoLabel("TwitterServerInfo"));
|
|
|
|
|
|
|
|
// Server key
|
2024-07-19 21:19:54 +02:00
|
|
|
auto outputKeyField = generateOutputKeyField(confirmButton);
|
2024-07-18 18:02:40 +02:00
|
|
|
formLayout->addRow(generateFormLabel("TwitterStreamKey"), outputKeyField);
|
|
|
|
|
|
|
|
// Server key info
|
|
|
|
formLayout->addWidget(generateInfoLabel("TwitterStreamKeyInfo"));
|
|
|
|
|
|
|
|
contentLayout->addLayout(formLayout);
|
|
|
|
|
|
|
|
// spacing
|
|
|
|
auto spacer = new QSpacerItem(1, 20, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
|
|
|
|
contentLayout->addSpacerItem(spacer);
|
|
|
|
|
|
|
|
pageLayout->addLayout(contentLayout);
|
|
|
|
|
|
|
|
// Controls
|
|
|
|
auto controlsLayout = new QHBoxLayout;
|
|
|
|
controlsLayout->setSpacing(12);
|
|
|
|
|
|
|
|
// back button
|
2024-07-19 21:19:54 +02:00
|
|
|
if (!edit) {
|
|
|
|
auto serviceButton = generateButton(QString("< Back"));
|
|
|
|
|
|
|
|
connect(serviceButton, &QPushButton::clicked, [this] {
|
|
|
|
stackedWidget->setCurrentIndex(0);
|
|
|
|
resetOutputs();
|
|
|
|
});
|
|
|
|
|
|
|
|
controlsLayout->addWidget(serviceButton, 0);
|
|
|
|
controlsLayout->addStretch(1);
|
|
|
|
}
|
2024-07-18 18:02:40 +02:00
|
|
|
|
|
|
|
// confirm button (initialised above so we can set state)
|
|
|
|
connect(confirmButton, &QPushButton::clicked, [this] {
|
|
|
|
acceptOutputs();
|
|
|
|
});
|
|
|
|
|
|
|
|
controlsLayout->addWidget(confirmButton, 0);
|
|
|
|
|
|
|
|
// Hook it all together
|
|
|
|
pageLayout->addLayout(controlsLayout);
|
2024-07-16 18:41:19 +02:00
|
|
|
page->setLayout(pageLayout);
|
2024-07-16 15:16:40 +02:00
|
|
|
|
2024-07-18 18:02:40 +02:00
|
|
|
// Defaults for when we're changed to
|
2024-07-19 21:19:54 +02:00
|
|
|
if (!edit) {
|
|
|
|
connect(stackedWidget, &QStackedWidget::currentChanged, [this, outputNameField, serverSelection, outputKeyField, confirmButton] {
|
|
|
|
if (stackedWidget->currentIndex() == 3) {
|
|
|
|
outputName = outputNameField->text();
|
|
|
|
outputServer = serverSelection->currentData().toString();
|
|
|
|
outputKey = outputKeyField->text();
|
|
|
|
validateOutputs(confirmButton);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// Edit changes
|
|
|
|
if (edit) {
|
|
|
|
outputNameField->setText(outputName);
|
|
|
|
|
|
|
|
auto selectionIndex = serverSelection->findData(outputServer);
|
|
|
|
if (selectionIndex != -1) {
|
|
|
|
serverSelection->setCurrentIndex(selectionIndex);
|
2024-07-18 18:02:40 +02:00
|
|
|
}
|
2024-07-19 21:19:54 +02:00
|
|
|
|
|
|
|
outputKeyField->setText(outputKey);
|
|
|
|
}
|
2024-07-18 18:02:40 +02:00
|
|
|
|
2024-07-16 15:16:40 +02:00
|
|
|
return page;
|
|
|
|
}
|
|
|
|
|
2024-07-19 21:19:54 +02:00
|
|
|
QWidget *OutputDialog::WizardInfoUnknown(bool edit) {
|
2024-07-16 18:41:19 +02:00
|
|
|
auto page = new QWidget(this);
|
2024-07-18 18:18:50 +02:00
|
|
|
page->setStyleSheet("padding: 0px; margin: 0px;");
|
|
|
|
|
|
|
|
// Layout
|
2024-07-16 18:41:19 +02:00
|
|
|
auto pageLayout = new QVBoxLayout;
|
2024-07-18 18:18:50 +02:00
|
|
|
pageLayout->setSpacing(12);
|
2024-07-16 18:41:19 +02:00
|
|
|
|
2024-07-18 18:18:50 +02:00
|
|
|
// Heading
|
|
|
|
auto title = new QLabel(QString::fromUtf8(obs_module_text("CustomServiceInfo")));
|
|
|
|
title->setWordWrap(true);
|
|
|
|
title->setTextFormat(Qt::RichText);
|
2024-07-16 18:41:19 +02:00
|
|
|
pageLayout->addWidget(title);
|
2024-07-16 15:16:40 +02:00
|
|
|
|
2024-07-18 18:18:50 +02:00
|
|
|
// Content
|
|
|
|
auto contentLayout = new QVBoxLayout;
|
|
|
|
|
|
|
|
// Confirm button - initialised here so we can set state in form input connects
|
|
|
|
auto confirmButton = generateButton(QString("Create Output"));
|
|
|
|
|
|
|
|
// Form
|
|
|
|
auto formLayout = new QFormLayout;
|
|
|
|
formLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
|
|
|
|
formLayout->setLabelAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
|
|
|
|
formLayout->setSpacing(12);
|
|
|
|
|
|
|
|
// Output name
|
2024-07-19 21:19:54 +02:00
|
|
|
auto outputNameField = generateOutputNameField("CustomOutput", confirmButton);
|
2024-07-18 18:18:50 +02:00
|
|
|
formLayout->addRow(generateFormLabel("OutputName"), outputNameField);
|
|
|
|
|
|
|
|
// Server field
|
2024-07-19 21:19:54 +02:00
|
|
|
auto serverSelection = generateOutputServerField(confirmButton, false);
|
2024-07-18 18:18:50 +02:00
|
|
|
formLayout->addRow(generateFormLabel("CustomServer"), serverSelection);
|
|
|
|
|
|
|
|
// Server info
|
|
|
|
formLayout->addWidget(generateInfoLabel("CustomServerInfo"));
|
|
|
|
|
|
|
|
// Server key
|
2024-07-19 21:19:54 +02:00
|
|
|
auto outputKeyField = generateOutputKeyField(confirmButton);
|
2024-07-18 18:18:50 +02:00
|
|
|
formLayout->addRow(generateFormLabel("CustomStreamKey"), outputKeyField);
|
|
|
|
|
|
|
|
// Server key info
|
|
|
|
formLayout->addWidget(generateInfoLabel("CustomStreamKeyInfo"));
|
|
|
|
|
|
|
|
contentLayout->addLayout(formLayout);
|
|
|
|
|
|
|
|
// spacing
|
|
|
|
auto spacer = new QSpacerItem(1, 20, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
|
|
|
|
contentLayout->addSpacerItem(spacer);
|
|
|
|
|
|
|
|
pageLayout->addLayout(contentLayout);
|
|
|
|
|
|
|
|
// Controls
|
|
|
|
auto controlsLayout = new QHBoxLayout;
|
|
|
|
controlsLayout->setSpacing(12);
|
|
|
|
|
|
|
|
// back button
|
2024-07-19 21:19:54 +02:00
|
|
|
if (!edit) {
|
|
|
|
auto serviceButton = generateButton(QString("< Back"));
|
|
|
|
|
|
|
|
connect(serviceButton, &QPushButton::clicked, [this] {
|
|
|
|
stackedWidget->setCurrentIndex(0);
|
|
|
|
resetOutputs();
|
|
|
|
});
|
|
|
|
|
|
|
|
controlsLayout->addWidget(serviceButton, 0);
|
|
|
|
controlsLayout->addStretch(1);
|
|
|
|
}
|
2024-07-18 18:18:50 +02:00
|
|
|
|
|
|
|
// confirm button (initialised above so we can set state)
|
|
|
|
connect(confirmButton, &QPushButton::clicked, [this] {
|
|
|
|
acceptOutputs();
|
|
|
|
});
|
|
|
|
|
|
|
|
controlsLayout->addWidget(confirmButton, 0);
|
|
|
|
|
|
|
|
// Hook it all together
|
|
|
|
pageLayout->addLayout(controlsLayout);
|
2024-07-16 18:41:19 +02:00
|
|
|
page->setLayout(pageLayout);
|
2024-07-16 15:16:40 +02:00
|
|
|
|
2024-07-18 18:18:50 +02:00
|
|
|
// Defaults for when we're changed to
|
2024-07-19 21:19:54 +02:00
|
|
|
if (!edit) {
|
|
|
|
connect(stackedWidget, &QStackedWidget::currentChanged, [this, outputNameField, serverSelection, outputKeyField, confirmButton] {
|
|
|
|
if (stackedWidget->currentIndex() == 4) {
|
|
|
|
outputName = outputNameField->text();
|
|
|
|
outputServer = serverSelection->text();
|
|
|
|
outputKey = outputKeyField->text();
|
|
|
|
validateOutputs(confirmButton);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2024-07-18 18:18:50 +02:00
|
|
|
|
2024-07-19 21:19:54 +02:00
|
|
|
// Edit changes
|
|
|
|
if (edit) {
|
|
|
|
outputNameField->setText(outputName);
|
|
|
|
serverSelection->setText(outputServer);
|
|
|
|
outputKeyField->setText(outputKey);
|
|
|
|
}
|
2024-07-18 18:18:50 +02:00
|
|
|
|
2024-07-16 15:16:40 +02:00
|
|
|
return page;
|
|
|
|
}
|
|
|
|
|
2024-07-19 21:19:54 +02:00
|
|
|
QWidget *OutputDialog::WizardInfoTwitch(bool edit) {
|
2024-07-16 18:41:19 +02:00
|
|
|
auto page = new QWidget(this);
|
2024-07-18 01:32:30 +02:00
|
|
|
page->setStyleSheet("padding: 0px; margin: 0px;");
|
|
|
|
|
2024-07-18 16:18:56 +02:00
|
|
|
// Layout
|
|
|
|
auto pageLayout = new QVBoxLayout;
|
|
|
|
pageLayout->setSpacing(12);
|
2024-07-16 15:16:40 +02:00
|
|
|
|
2024-07-18 01:32:30 +02:00
|
|
|
// Heading
|
|
|
|
auto title = new QLabel(QString::fromUtf8(obs_module_text("TwitchServiceInfo")));
|
2024-07-16 18:41:19 +02:00
|
|
|
pageLayout->addWidget(title);
|
|
|
|
|
2024-07-18 01:32:30 +02:00
|
|
|
// Content
|
|
|
|
auto contentLayout = new QVBoxLayout;
|
2024-07-18 16:18:56 +02:00
|
|
|
|
|
|
|
// Confirm button - initialised here so we can set state in form input connects
|
|
|
|
auto confirmButton = generateButton(QString("Create Output"));
|
2024-07-18 01:32:30 +02:00
|
|
|
|
|
|
|
// Form
|
|
|
|
auto formLayout = new QFormLayout;
|
|
|
|
formLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
|
|
|
|
formLayout->setLabelAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
|
|
|
|
formLayout->setSpacing(12);
|
|
|
|
|
|
|
|
// Output name
|
2024-07-19 21:19:54 +02:00
|
|
|
auto outputNameField = generateOutputNameField("TwitchOutput", confirmButton);
|
2024-07-18 16:18:56 +02:00
|
|
|
formLayout->addRow(generateFormLabel("OutputName"), outputNameField);
|
2024-07-18 01:32:30 +02:00
|
|
|
|
2024-07-18 16:18:56 +02:00
|
|
|
// Server selection
|
2024-07-19 21:19:54 +02:00
|
|
|
auto serverSelection = generateOutputServerCombo("Twitch", confirmButton);
|
2024-07-18 16:18:56 +02:00
|
|
|
formLayout->addRow(generateFormLabel("TwitchServer"), serverSelection);
|
2024-07-18 01:32:30 +02:00
|
|
|
|
|
|
|
// Server info
|
2024-07-18 16:18:56 +02:00
|
|
|
formLayout->addWidget(generateInfoLabel("TwitchServerInfo"));
|
2024-07-18 01:32:30 +02:00
|
|
|
|
|
|
|
// Server key
|
2024-07-19 21:19:54 +02:00
|
|
|
auto outputKeyField = generateOutputKeyField(confirmButton);
|
2024-07-18 16:18:56 +02:00
|
|
|
formLayout->addRow(generateFormLabel("TwitchStreamKey"), outputKeyField);
|
2024-07-18 01:32:30 +02:00
|
|
|
|
|
|
|
// Server key info
|
2024-07-18 16:18:56 +02:00
|
|
|
formLayout->addWidget(generateInfoLabel("TwitchStreamKeyInfo"));
|
2024-07-18 01:32:30 +02:00
|
|
|
|
|
|
|
contentLayout->addLayout(formLayout);
|
|
|
|
|
|
|
|
// spacing
|
|
|
|
auto spacer = new QSpacerItem(1, 20, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
|
|
|
|
contentLayout->addSpacerItem(spacer);
|
|
|
|
|
|
|
|
pageLayout->addLayout(contentLayout);
|
|
|
|
|
|
|
|
// Controls
|
|
|
|
auto controlsLayout = new QHBoxLayout;
|
|
|
|
controlsLayout->setSpacing(12);
|
|
|
|
|
|
|
|
// back button
|
2024-07-19 21:19:54 +02:00
|
|
|
if (!edit) {
|
|
|
|
auto serviceButton = generateButton(QString("< Back"));
|
|
|
|
|
|
|
|
connect(serviceButton, &QPushButton::clicked, [this] {
|
|
|
|
stackedWidget->setCurrentIndex(0);
|
|
|
|
resetOutputs();
|
|
|
|
});
|
|
|
|
|
|
|
|
controlsLayout->addWidget(serviceButton, 0);
|
|
|
|
controlsLayout->addStretch(1);
|
|
|
|
}
|
2024-07-18 16:18:56 +02:00
|
|
|
|
|
|
|
// confirm button (initialised above so we can set state)
|
|
|
|
connect(confirmButton, &QPushButton::clicked, [this] {
|
|
|
|
acceptOutputs();
|
|
|
|
});
|
2024-07-18 01:32:30 +02:00
|
|
|
|
|
|
|
controlsLayout->addWidget(confirmButton, 0);
|
|
|
|
|
|
|
|
// Hook it all together
|
|
|
|
pageLayout->addLayout(controlsLayout);
|
2024-07-16 18:41:19 +02:00
|
|
|
page->setLayout(pageLayout);
|
2024-07-16 15:16:40 +02:00
|
|
|
|
2024-07-18 17:06:23 +02:00
|
|
|
// Defaults for when we're changed to
|
2024-07-19 21:19:54 +02:00
|
|
|
if (!edit) {
|
|
|
|
connect(stackedWidget, &QStackedWidget::currentChanged, [this, outputNameField, serverSelection, outputKeyField, confirmButton] {
|
|
|
|
if (stackedWidget->currentIndex() == 5) {
|
|
|
|
blog(LOG_WARNING, "[Aitum Multistream] default outputname %s ", outputNameField->text().toUtf8().constData());
|
|
|
|
outputName = outputNameField->text();
|
|
|
|
outputServer = serverSelection->currentData().toString();
|
|
|
|
outputKey = outputKeyField->text();
|
|
|
|
validateOutputs(confirmButton);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// Edit changes
|
|
|
|
if (edit) {
|
|
|
|
outputNameField->setText(outputName);
|
|
|
|
|
|
|
|
auto selectionIndex = serverSelection->findData(outputServer);
|
|
|
|
if (selectionIndex != -1) {
|
|
|
|
serverSelection->setCurrentIndex(selectionIndex);
|
2024-07-18 17:06:23 +02:00
|
|
|
}
|
2024-07-19 21:19:54 +02:00
|
|
|
|
|
|
|
outputKeyField->setText(outputKey);
|
|
|
|
}
|
2024-07-18 17:06:23 +02:00
|
|
|
|
2024-07-16 15:16:40 +02:00
|
|
|
return page;
|
|
|
|
}
|
|
|
|
|
2024-07-19 21:19:54 +02:00
|
|
|
QWidget *OutputDialog::WizardInfoTrovo(bool edit) {
|
2024-07-16 18:41:19 +02:00
|
|
|
auto page = new QWidget(this);
|
2024-07-18 17:52:43 +02:00
|
|
|
page->setStyleSheet("padding: 0px; margin: 0px;");
|
|
|
|
|
|
|
|
// Layout
|
2024-07-16 18:41:19 +02:00
|
|
|
auto pageLayout = new QVBoxLayout;
|
2024-07-18 17:52:43 +02:00
|
|
|
pageLayout->setSpacing(12);
|
2024-07-16 18:41:19 +02:00
|
|
|
|
2024-07-18 17:52:43 +02:00
|
|
|
// Heading
|
|
|
|
auto title = new QLabel(QString::fromUtf8(obs_module_text("TrovoServiceInfo")));
|
|
|
|
title->setWordWrap(true);
|
|
|
|
title->setTextFormat(Qt::RichText);
|
2024-07-16 18:41:19 +02:00
|
|
|
pageLayout->addWidget(title);
|
|
|
|
|
2024-07-18 17:52:43 +02:00
|
|
|
// Content
|
|
|
|
auto contentLayout = new QVBoxLayout;
|
|
|
|
|
|
|
|
// Confirm button - initialised here so we can set state in form input connects
|
|
|
|
auto confirmButton = generateButton(QString("Create Output"));
|
|
|
|
|
|
|
|
// Form
|
|
|
|
auto formLayout = new QFormLayout;
|
|
|
|
formLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
|
|
|
|
formLayout->setLabelAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
|
|
|
|
formLayout->setSpacing(12);
|
|
|
|
|
|
|
|
// Output name
|
2024-07-19 21:19:54 +02:00
|
|
|
auto outputNameField = generateOutputNameField("TrovoOutput", confirmButton);
|
2024-07-18 17:52:43 +02:00
|
|
|
formLayout->addRow(generateFormLabel("OutputName"), outputNameField);
|
|
|
|
|
|
|
|
// Server field
|
2024-07-19 21:19:54 +02:00
|
|
|
auto serverSelection = generateOutputServerField(confirmButton, true);
|
2024-07-18 17:52:43 +02:00
|
|
|
serverSelection->setText("rtmp://livepush.trovo.live/live/");
|
2024-07-19 21:19:54 +02:00
|
|
|
|
2024-07-18 17:52:43 +02:00
|
|
|
|
|
|
|
formLayout->addRow(generateFormLabel("TrovoServer"), serverSelection);
|
|
|
|
|
|
|
|
// Server info
|
|
|
|
formLayout->addWidget(generateInfoLabel("TrovoServerInfo"));
|
|
|
|
|
|
|
|
// Server key
|
2024-07-19 21:19:54 +02:00
|
|
|
auto outputKeyField = generateOutputKeyField(confirmButton);
|
2024-07-18 17:52:43 +02:00
|
|
|
formLayout->addRow(generateFormLabel("TrovoStreamKey"), outputKeyField);
|
|
|
|
|
|
|
|
// Server key info
|
|
|
|
formLayout->addWidget(generateInfoLabel("TrovoStreamKeyInfo"));
|
|
|
|
|
|
|
|
contentLayout->addLayout(formLayout);
|
|
|
|
|
|
|
|
// spacing
|
|
|
|
auto spacer = new QSpacerItem(1, 20, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
|
|
|
|
contentLayout->addSpacerItem(spacer);
|
|
|
|
|
|
|
|
pageLayout->addLayout(contentLayout);
|
|
|
|
|
|
|
|
// Controls
|
|
|
|
auto controlsLayout = new QHBoxLayout;
|
|
|
|
controlsLayout->setSpacing(12);
|
|
|
|
|
|
|
|
// back button
|
2024-07-19 21:19:54 +02:00
|
|
|
if (!edit) {
|
|
|
|
auto serviceButton = generateButton(QString("< Back"));
|
|
|
|
|
|
|
|
connect(serviceButton, &QPushButton::clicked, [this] {
|
|
|
|
stackedWidget->setCurrentIndex(0);
|
|
|
|
resetOutputs();
|
|
|
|
});
|
|
|
|
|
|
|
|
controlsLayout->addWidget(serviceButton, 0);
|
|
|
|
controlsLayout->addStretch(1);
|
|
|
|
}
|
2024-07-18 17:52:43 +02:00
|
|
|
|
|
|
|
// confirm button (initialised above so we can set state)
|
|
|
|
connect(confirmButton, &QPushButton::clicked, [this] {
|
|
|
|
acceptOutputs();
|
|
|
|
});
|
|
|
|
|
|
|
|
controlsLayout->addWidget(confirmButton, 0);
|
|
|
|
|
|
|
|
// Hook it all together
|
|
|
|
pageLayout->addLayout(controlsLayout);
|
2024-07-16 18:41:19 +02:00
|
|
|
page->setLayout(pageLayout);
|
|
|
|
|
2024-07-18 17:52:43 +02:00
|
|
|
// Defaults for when we're changed to
|
2024-07-19 21:19:54 +02:00
|
|
|
if (!edit) {
|
|
|
|
connect(stackedWidget, &QStackedWidget::currentChanged, [this, outputNameField, serverSelection, outputKeyField, confirmButton] {
|
|
|
|
if (stackedWidget->currentIndex() == 6) {
|
|
|
|
outputName = outputNameField->text();
|
|
|
|
outputServer = serverSelection->text();
|
|
|
|
outputKey = outputKeyField->text();
|
|
|
|
validateOutputs(confirmButton);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2024-07-18 17:52:43 +02:00
|
|
|
|
2024-07-19 21:19:54 +02:00
|
|
|
// Edit changes
|
|
|
|
if (edit) {
|
|
|
|
outputNameField->setText(outputName);
|
|
|
|
serverSelection->setText(outputServer);
|
|
|
|
outputKeyField->setText(outputKey);
|
|
|
|
}
|
2024-07-18 17:52:43 +02:00
|
|
|
|
2024-07-16 18:41:19 +02:00
|
|
|
return page;
|
|
|
|
}
|
|
|
|
|
2024-07-19 21:19:54 +02:00
|
|
|
QWidget *OutputDialog::WizardInfoTikTok(bool edit) {
|
2024-07-16 18:41:19 +02:00
|
|
|
auto page = new QWidget(this);
|
2024-07-18 17:32:38 +02:00
|
|
|
page->setStyleSheet("padding: 0px; margin: 0px;");
|
|
|
|
|
|
|
|
// Layout
|
2024-07-16 18:41:19 +02:00
|
|
|
auto pageLayout = new QVBoxLayout;
|
2024-07-18 17:32:38 +02:00
|
|
|
pageLayout->setSpacing(12);
|
2024-07-16 18:41:19 +02:00
|
|
|
|
2024-07-18 17:32:38 +02:00
|
|
|
// Heading
|
|
|
|
auto title = new QLabel(QString::fromUtf8(obs_module_text("TikTokServiceInfo")));
|
|
|
|
title->setWordWrap(true);
|
|
|
|
title->setTextFormat(Qt::RichText);
|
2024-07-16 18:41:19 +02:00
|
|
|
pageLayout->addWidget(title);
|
|
|
|
|
2024-07-18 17:32:38 +02:00
|
|
|
// Content
|
|
|
|
auto contentLayout = new QVBoxLayout;
|
|
|
|
|
|
|
|
// Confirm button - initialised here so we can set state in form input connects
|
|
|
|
auto confirmButton = generateButton(QString("Create Output"));
|
|
|
|
|
|
|
|
// Form
|
|
|
|
auto formLayout = new QFormLayout;
|
|
|
|
formLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
|
|
|
|
formLayout->setLabelAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
|
|
|
|
formLayout->setSpacing(12);
|
|
|
|
|
|
|
|
// Output name
|
2024-07-19 21:19:54 +02:00
|
|
|
auto outputNameField = generateOutputNameField("TikTokOutput", confirmButton);
|
2024-07-18 17:32:38 +02:00
|
|
|
formLayout->addRow(generateFormLabel("OutputName"), outputNameField);
|
|
|
|
|
|
|
|
// Server field
|
2024-07-19 21:19:54 +02:00
|
|
|
auto serverSelection = generateOutputServerField(confirmButton, false);
|
2024-07-18 17:32:38 +02:00
|
|
|
formLayout->addRow(generateFormLabel("TikTokServer"), serverSelection);
|
|
|
|
|
|
|
|
// Server info
|
|
|
|
formLayout->addWidget(generateInfoLabel("TikTokServerInfo"));
|
|
|
|
|
|
|
|
// Server key
|
2024-07-19 21:19:54 +02:00
|
|
|
auto outputKeyField = generateOutputKeyField(confirmButton);
|
2024-07-18 17:32:38 +02:00
|
|
|
formLayout->addRow(generateFormLabel("TikTokStreamKey"), outputKeyField);
|
|
|
|
|
|
|
|
// Server key info
|
|
|
|
formLayout->addWidget(generateInfoLabel("TikTokStreamKeyInfo"));
|
|
|
|
|
|
|
|
contentLayout->addLayout(formLayout);
|
|
|
|
|
|
|
|
// spacing
|
|
|
|
auto spacer = new QSpacerItem(1, 20, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
|
|
|
|
contentLayout->addSpacerItem(spacer);
|
|
|
|
|
|
|
|
pageLayout->addLayout(contentLayout);
|
|
|
|
|
|
|
|
// Controls
|
|
|
|
auto controlsLayout = new QHBoxLayout;
|
|
|
|
controlsLayout->setSpacing(12);
|
|
|
|
|
|
|
|
// back button
|
2024-07-19 21:19:54 +02:00
|
|
|
if (!edit) {
|
|
|
|
auto serviceButton = generateButton(QString("< Back"));
|
|
|
|
|
|
|
|
connect(serviceButton, &QPushButton::clicked, [this] {
|
|
|
|
stackedWidget->setCurrentIndex(0);
|
|
|
|
resetOutputs();
|
|
|
|
});
|
|
|
|
|
|
|
|
controlsLayout->addWidget(serviceButton, 0);
|
|
|
|
controlsLayout->addStretch(1);
|
|
|
|
}
|
2024-07-18 17:32:38 +02:00
|
|
|
|
|
|
|
// confirm button (initialised above so we can set state)
|
|
|
|
connect(confirmButton, &QPushButton::clicked, [this] {
|
|
|
|
acceptOutputs();
|
|
|
|
});
|
|
|
|
|
|
|
|
controlsLayout->addWidget(confirmButton, 0);
|
|
|
|
|
|
|
|
// Hook it all together
|
|
|
|
pageLayout->addLayout(controlsLayout);
|
2024-07-16 18:41:19 +02:00
|
|
|
page->setLayout(pageLayout);
|
|
|
|
|
2024-07-18 17:32:38 +02:00
|
|
|
// Defaults for when we're changed to
|
2024-07-19 21:19:54 +02:00
|
|
|
if (!edit) {
|
|
|
|
connect(stackedWidget, &QStackedWidget::currentChanged, [this, outputNameField, serverSelection, outputKeyField, confirmButton] {
|
|
|
|
if (stackedWidget->currentIndex() == 7) {
|
|
|
|
outputName = outputNameField->text();
|
|
|
|
outputServer = serverSelection->text();
|
|
|
|
outputKey = outputKeyField->text();
|
|
|
|
validateOutputs(confirmButton);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2024-07-18 17:32:38 +02:00
|
|
|
|
2024-07-19 21:19:54 +02:00
|
|
|
// Edit changes
|
|
|
|
if (edit) {
|
|
|
|
outputNameField->setText(outputName);
|
|
|
|
serverSelection->setText(outputServer);
|
|
|
|
outputKeyField->setText(outputKey);
|
|
|
|
}
|
|
|
|
|
2024-07-18 17:32:38 +02:00
|
|
|
|
2024-07-16 18:41:19 +02:00
|
|
|
return page;
|
|
|
|
}
|
|
|
|
|
2024-07-19 21:19:54 +02:00
|
|
|
QWidget *OutputDialog::WizardInfoFacebook(bool edit) {
|
2024-07-16 18:41:19 +02:00
|
|
|
auto page = new QWidget(this);
|
2024-07-18 17:47:42 +02:00
|
|
|
page->setStyleSheet("padding: 0px; margin: 0px;");
|
|
|
|
|
|
|
|
// Layout
|
2024-07-16 18:41:19 +02:00
|
|
|
auto pageLayout = new QVBoxLayout;
|
2024-07-18 17:47:42 +02:00
|
|
|
pageLayout->setSpacing(12);
|
2024-07-16 18:41:19 +02:00
|
|
|
|
2024-07-18 17:47:42 +02:00
|
|
|
// Heading
|
|
|
|
auto title = new QLabel(QString::fromUtf8(obs_module_text("FacebookServiceInfo")));
|
|
|
|
title->setWordWrap(true);
|
|
|
|
title->setTextFormat(Qt::RichText);
|
2024-07-16 18:41:19 +02:00
|
|
|
pageLayout->addWidget(title);
|
|
|
|
|
2024-07-18 17:47:42 +02:00
|
|
|
// Content
|
|
|
|
auto contentLayout = new QVBoxLayout;
|
|
|
|
|
|
|
|
// Confirm button - initialised here so we can set state in form input connects
|
|
|
|
auto confirmButton = generateButton(QString("Create Output"));
|
|
|
|
|
|
|
|
// Form
|
|
|
|
auto formLayout = new QFormLayout;
|
|
|
|
formLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
|
|
|
|
formLayout->setLabelAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
|
|
|
|
formLayout->setSpacing(12);
|
|
|
|
|
|
|
|
// Output name
|
2024-07-19 21:19:54 +02:00
|
|
|
auto outputNameField = generateOutputNameField("FacebookOutput", confirmButton);
|
2024-07-18 17:47:42 +02:00
|
|
|
formLayout->addRow(generateFormLabel("OutputName"), outputNameField);
|
|
|
|
|
|
|
|
// Server field
|
2024-07-19 21:19:54 +02:00
|
|
|
auto serverSelection = generateOutputServerField(confirmButton, true);
|
2024-07-18 17:47:42 +02:00
|
|
|
serverSelection->setText("rtmps://rtmp-api.facebook.com:443/rtmp/");
|
|
|
|
|
|
|
|
formLayout->addRow(generateFormLabel("FacebookServer"), serverSelection);
|
|
|
|
|
|
|
|
// Server info
|
|
|
|
formLayout->addWidget(generateInfoLabel("FacebookServerInfo"));
|
|
|
|
|
|
|
|
// Server key
|
2024-07-19 21:19:54 +02:00
|
|
|
auto outputKeyField = generateOutputKeyField(confirmButton);
|
2024-07-18 17:47:42 +02:00
|
|
|
formLayout->addRow(generateFormLabel("FacebookStreamKey"), outputKeyField);
|
|
|
|
|
|
|
|
// Server key info
|
|
|
|
formLayout->addWidget(generateInfoLabel("FacebookStreamKeyInfo"));
|
|
|
|
|
|
|
|
contentLayout->addLayout(formLayout);
|
|
|
|
|
|
|
|
// spacing
|
|
|
|
auto spacer = new QSpacerItem(1, 20, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
|
|
|
|
contentLayout->addSpacerItem(spacer);
|
|
|
|
|
|
|
|
pageLayout->addLayout(contentLayout);
|
|
|
|
|
|
|
|
// Controls
|
|
|
|
auto controlsLayout = new QHBoxLayout;
|
|
|
|
controlsLayout->setSpacing(12);
|
|
|
|
|
|
|
|
// back button
|
2024-07-19 21:19:54 +02:00
|
|
|
if (!edit) {
|
|
|
|
auto serviceButton = generateButton(QString("< Back"));
|
|
|
|
|
|
|
|
connect(serviceButton, &QPushButton::clicked, [this] {
|
|
|
|
stackedWidget->setCurrentIndex(0);
|
|
|
|
resetOutputs();
|
|
|
|
});
|
|
|
|
|
|
|
|
controlsLayout->addWidget(serviceButton, 0);
|
|
|
|
controlsLayout->addStretch(1);
|
|
|
|
}
|
2024-07-18 17:47:42 +02:00
|
|
|
|
|
|
|
// confirm button (initialised above so we can set state)
|
|
|
|
connect(confirmButton, &QPushButton::clicked, [this] {
|
|
|
|
acceptOutputs();
|
|
|
|
});
|
|
|
|
|
|
|
|
controlsLayout->addWidget(confirmButton, 0);
|
|
|
|
|
|
|
|
// Hook it all together
|
|
|
|
pageLayout->addLayout(controlsLayout);
|
2024-07-16 18:41:19 +02:00
|
|
|
page->setLayout(pageLayout);
|
|
|
|
|
2024-07-18 17:47:42 +02:00
|
|
|
// Defaults for when we're changed to
|
2024-07-19 21:19:54 +02:00
|
|
|
if (!edit) {
|
|
|
|
connect(stackedWidget, &QStackedWidget::currentChanged, [this, outputNameField, serverSelection, outputKeyField, confirmButton] {
|
|
|
|
if (stackedWidget->currentIndex() == 8) {
|
|
|
|
outputName = outputNameField->text();
|
|
|
|
outputServer = serverSelection->text();
|
|
|
|
outputKey = outputKeyField->text();
|
|
|
|
validateOutputs(confirmButton);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2024-07-18 17:47:42 +02:00
|
|
|
|
2024-07-19 21:19:54 +02:00
|
|
|
// Edit changes
|
|
|
|
if (edit) {
|
|
|
|
outputNameField->setText(outputName);
|
|
|
|
serverSelection->setText(outputServer);
|
|
|
|
outputKeyField->setText(outputKey);
|
|
|
|
}
|
2024-07-18 17:47:42 +02:00
|
|
|
|
2024-07-16 18:41:19 +02:00
|
|
|
return page;
|
|
|
|
}
|