Add in platform icons, fix vertical warning bug, WIP new output dialog
@ -51,10 +51,12 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/version.h.in ${CMAKE_CURRENT_SOURCE_D
|
||||
|
||||
target_sources(${PROJECT_NAME} PRIVATE
|
||||
config-dialog.cpp
|
||||
output-dialog.cpp
|
||||
multistream.cpp
|
||||
file-updater.c
|
||||
resources.qrc
|
||||
config-dialog.hpp
|
||||
output-dialog.hpp
|
||||
multistream.hpp
|
||||
file-updater.h)
|
||||
|
||||
|
@ -26,6 +26,7 @@
|
||||
|
||||
#include <sstream>
|
||||
#include <util/platform.h>
|
||||
#include "output-dialog.hpp"
|
||||
|
||||
template<typename T> std::string to_string_with_precision(const T a_value, const int n = 6)
|
||||
{
|
||||
@ -162,8 +163,43 @@ OBSBasicSettings::OBSBasicSettings(QMainWindow *parent) : QDialog(parent)
|
||||
obs_data_release(s);
|
||||
});
|
||||
|
||||
auto addButtonTest = new QPushButton(QIcon(":/res/images/plus.svg"), QString::fromUtf8(obs_module_text("AddOutput")) + " Test");
|
||||
addButtonTest->setProperty("themeID", QVariant(QString::fromUtf8("addIconSmall")));
|
||||
connect(addButtonTest, &QPushButton::clicked, [this] {
|
||||
auto outputDialog = new OutputDialog(this);
|
||||
|
||||
if (outputDialog->exec() == QDialog::Accepted) {
|
||||
// got a result
|
||||
blog(LOG_WARNING, "[Aitum Multistream] output accepted");
|
||||
} else {
|
||||
blog(LOG_WARNING, "[Aitum Multistream] output rejected");
|
||||
}
|
||||
|
||||
delete outputDialog;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 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();
|
||||
// obs_data_set_string(s, "name", obs_module_text("Unnamed"));
|
||||
// obs_data_array_push_back(outputs, s);
|
||||
// obs_data_array_release(outputs);
|
||||
// AddServer(mainOutputsLayout, s);
|
||||
// obs_data_release(s);
|
||||
});
|
||||
|
||||
//streaming_title_layout->addWidget(guide_link, 0, Qt::AlignRight);
|
||||
streaming_title_layout->addWidget(addButton, 0, Qt::AlignRight);
|
||||
streaming_title_layout->addWidget(addButtonTest, 0, Qt::AlignRight);
|
||||
|
||||
|
||||
mainOutputsLayout->addRow(streaming_title_layout);
|
||||
|
||||
@ -177,9 +213,13 @@ OBSBasicSettings::OBSBasicSettings(QMainWindow *parent) : QDialog(parent)
|
||||
serverLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
|
||||
serverLayout->setLabelAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
|
||||
|
||||
auto main_title = new QLabel(QString::fromUtf8(obs_module_text("MainOutput")));
|
||||
main_title->setStyleSheet(QString::fromUtf8("font-weight: bold;"));
|
||||
serverLayout->addRow(main_title);
|
||||
auto mainTitle = new QLabel(QString::fromUtf8(obs_module_text("SettingsMainCanvasTitle")));
|
||||
mainTitle->setStyleSheet(QString::fromUtf8("font-weight: bold;"));
|
||||
serverLayout->addRow(mainTitle);
|
||||
|
||||
auto mainDescription = new QLabel(QString::fromUtf8(obs_module_text("SettingsMainCanvasDescription")));
|
||||
// mainTitle->setStyleSheet(QString::fromUtf8("font-weight: bold;"));
|
||||
serverLayout->addRow(mainDescription);
|
||||
|
||||
serverGroup->setLayout(serverLayout);
|
||||
|
||||
|
@ -26,3 +26,5 @@ Stream="Stream"
|
||||
MainOutputNotActive="Main output not active!"
|
||||
NewVersion="New version (%1) available <a href='https://aitum.tv/download/multi/'>here</a>"
|
||||
NoVerticalWarning="The Vertical plugin is not installed, or you are using an older version."
|
||||
SettingsMainCanvasTitle="Main Canvas"
|
||||
SettingsMainCanvasDescription="You can manage your Main Canvas (the default canvas) settings here. \nPlease note that to change your Built-in Output settings, you need to do this from within the normal OBS settings."
|
||||
|
BIN
media/facebook.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
media/tiktok.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
BIN
media/trovo.png
Normal file
After Width: | Height: | Size: 7.2 KiB |
BIN
media/twitch.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
media/twitter.png
Normal file
After Width: | Height: | Size: 5.2 KiB |
BIN
media/unknown.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
media/youtube.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
@ -67,7 +67,7 @@ bool obs_module_load(void)
|
||||
|
||||
void obs_module_post_load()
|
||||
{
|
||||
multistream_dock->LoadVerticalOutputs();
|
||||
multistream_dock->LoadVerticalOutputs(true);
|
||||
}
|
||||
|
||||
void obs_module_unload()
|
||||
@ -105,6 +105,29 @@ void RemoveWidget(QWidget *widget)
|
||||
delete widget;
|
||||
}
|
||||
|
||||
// Platform icons deciphered from endpoints
|
||||
QIcon MultistreamDock::getPlatformFromEndpoint(QString endpoint) {
|
||||
|
||||
if (endpoint.contains(QString::fromUtf8(".contribute.live-video.net"))) { // twitch
|
||||
return platformIconTwitch;
|
||||
} else if (endpoint.contains(QString::fromUtf8(".youtube.com"))) { // youtube
|
||||
return platformIconYouTube;
|
||||
} else if (endpoint.contains(QString::fromUtf8("fa723fc1b171.global-contribute.live-video.net"))) { // kick
|
||||
return platformIconUnknown;
|
||||
} else if (endpoint.contains(QString::fromUtf8(".tiktokcdn-"))) { // tiktok
|
||||
return platformIconTikTok;
|
||||
} else if (endpoint.contains(QString::fromUtf8(".pscp.tv"))) { // twitter
|
||||
return platformIconTwitter;
|
||||
} else if (endpoint.contains(QString::fromUtf8("livepush.trovo.live/live"))) { // trovo
|
||||
return platformIconTrovo;
|
||||
} else if (endpoint.contains(QString::fromUtf8(".facebook.com"))) { // facebook
|
||||
return platformIconFacebook;
|
||||
} else { // unknown
|
||||
return platformIconUnknown;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Output button styling
|
||||
void MultistreamDock::outputButtonStyle(QPushButton *button)
|
||||
{
|
||||
@ -123,6 +146,7 @@ auto outputTitleStyle = QString("QLabel{}"); // "Built -in str
|
||||
auto outputGroupStyle = QString("background-color: %1; padding: 0px;")
|
||||
.arg(QPalette().color(QPalette::ColorRole::Mid).name(QColor::HexRgb)); // wrapper around above
|
||||
|
||||
|
||||
// For showing warning for no vertical integration
|
||||
void showVerticalWarning(QVBoxLayout *verticalLayout)
|
||||
{
|
||||
@ -174,6 +198,15 @@ MultistreamDock::MultistreamDock(QWidget *parent) : QFrame(parent)
|
||||
auto bisHeaderLabel = new QLabel(QString::fromUtf8(obs_module_text("BuiltinStream")));
|
||||
bisHeaderLabel->setStyleSheet(outputTitleStyle);
|
||||
|
||||
// blank because we're not pulling settings through from bis, fix this
|
||||
auto platformIconLabel = new QLabel;
|
||||
auto platformIcon = getPlatformFromEndpoint(QString::fromUtf8(""));
|
||||
// platformIcon.
|
||||
|
||||
platformIconLabel->setPixmap(platformIcon.pixmap(30, 30));
|
||||
|
||||
l2->addWidget(platformIconLabel);
|
||||
|
||||
l2->addWidget(bisHeaderLabel, 1);
|
||||
|
||||
mainStreamButton = new QPushButton;
|
||||
@ -258,7 +291,7 @@ MultistreamDock::MultistreamDock(QWidget *parent) : QFrame(parent)
|
||||
SaveSettings();
|
||||
LoadSettings();
|
||||
configDialog->SaveVerticalSettings();
|
||||
LoadVerticalOutputs();
|
||||
LoadVerticalOutputs(false);
|
||||
} else {
|
||||
current_config = settings;
|
||||
}
|
||||
@ -459,6 +492,7 @@ void MultistreamDock::LoadSettings()
|
||||
void MultistreamDock::LoadOutput(obs_data_t *data, bool vertical)
|
||||
{
|
||||
auto name = QString::fromUtf8(obs_data_get_string(data, "name"));
|
||||
auto endpoint = QString::fromUtf8(obs_data_get_string(data, "stream_server"));
|
||||
if (vertical) {
|
||||
for (int i = 1; i < verticalCanvasLayout->count(); i++) {
|
||||
auto item = verticalCanvasLayout->itemAt(i);
|
||||
@ -482,6 +516,15 @@ void MultistreamDock::LoadOutput(obs_data_t *data, bool vertical)
|
||||
auto streamLayout = new QVBoxLayout;
|
||||
|
||||
auto l2 = new QHBoxLayout;
|
||||
|
||||
|
||||
auto platformIconLabel = new QLabel;
|
||||
auto platformIcon = getPlatformFromEndpoint(endpoint);
|
||||
|
||||
platformIconLabel->setPixmap(platformIcon.pixmap(30, 30));
|
||||
|
||||
l2->addWidget(platformIconLabel);
|
||||
|
||||
l2->addWidget(new QLabel(name), 1);
|
||||
auto streamButton = new QPushButton;
|
||||
streamButton->setMinimumHeight(30);
|
||||
@ -807,13 +850,15 @@ void MultistreamDock::NewerVersionAvailable(QString version)
|
||||
configButton->setStyleSheet(QString::fromUtf8("background: rgb(192,128,0);"));
|
||||
}
|
||||
|
||||
void MultistreamDock::LoadVerticalOutputs()
|
||||
void MultistreamDock::LoadVerticalOutputs(bool firstLoad)
|
||||
{
|
||||
auto ph = obs_get_proc_handler();
|
||||
struct calldata cd;
|
||||
calldata_init(&cd);
|
||||
if (!proc_handler_call(ph, "aitum_vertical_get_stream_settings", &cd)) {
|
||||
if (firstLoad) { // only display warning on first load
|
||||
showVerticalWarning(verticalCanvasLayout); // show warning
|
||||
}
|
||||
calldata_free(&cd);
|
||||
return;
|
||||
}
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include <QPushButton>
|
||||
#include <QVBoxLayout>
|
||||
#include <QTimer>
|
||||
#include <QString>
|
||||
|
||||
class OBSBasicSettings;
|
||||
|
||||
@ -40,9 +41,21 @@ private:
|
||||
|
||||
void outputButtonStyle(QPushButton *button);
|
||||
|
||||
QIcon getPlatformFromEndpoint(QString endpoint);
|
||||
|
||||
QIcon streamActiveIcon = QIcon(":/aitum/media/streaming.svg");
|
||||
QIcon streamInactiveIcon = QIcon(":/aitum/media/stream.svg");
|
||||
|
||||
// Platform icons
|
||||
QIcon platformIconTwitch = QIcon(":/aitum/media/twitch.png");
|
||||
QIcon platformIconYouTube = QIcon(":/aitum/media/youtube.png");
|
||||
// QIcon platformIconKick = QIcon(":/aitum/media/stream.svg");
|
||||
QIcon platformIconTikTok = QIcon(":/aitum/media/tiktok.png");
|
||||
QIcon platformIconTwitter = QIcon(":/aitum/media/twitter.png");
|
||||
QIcon platformIconTrovo = QIcon(":/aitum/media/trovo.png");
|
||||
QIcon platformIconFacebook = QIcon(":/aitum/media/facebook.png");
|
||||
QIcon platformIconUnknown = QIcon(":/aitum/media/unknown.png");
|
||||
|
||||
static void frontend_event(enum obs_frontend_event event, void *private_data);
|
||||
|
||||
static void stream_output_stop(void *data, calldata_t *calldata);
|
||||
@ -54,5 +67,5 @@ private slots:
|
||||
public:
|
||||
MultistreamDock(QWidget *parent = nullptr);
|
||||
~MultistreamDock();
|
||||
void LoadVerticalOutputs();
|
||||
void LoadVerticalOutputs(bool firstLoad = true);
|
||||
};
|
||||
|
41
output-dialog.cpp
Normal file
@ -0,0 +1,41 @@
|
||||
#include "output-dialog.hpp"
|
||||
|
||||
#include <QDialog>
|
||||
#include <QWizard>
|
||||
#include <QWizardPage>
|
||||
|
||||
OutputDialog::OutputDialog(QDialog *parent) : QWizard(parent) {
|
||||
setWindowTitle("this is my wizard title!!");
|
||||
|
||||
addPage(WizardPage1());
|
||||
addPage(WizardPage2());
|
||||
addPage(WizardPage3());
|
||||
|
||||
show();
|
||||
}
|
||||
|
||||
QWizardPage *OutputDialog::WizardPage1() {
|
||||
auto page = new QWizardPage(this);
|
||||
|
||||
page->setTitle(QString("page 1"));
|
||||
|
||||
return page;
|
||||
}
|
||||
|
||||
QWizardPage *OutputDialog::WizardPage2() {
|
||||
auto page = new QWizardPage(this);
|
||||
|
||||
page->setTitle(QString("page 2"));
|
||||
|
||||
return page;
|
||||
}
|
||||
|
||||
QWizardPage *OutputDialog::WizardPage3() {
|
||||
auto page = new QWizardPage(this);
|
||||
|
||||
page->setTitle(QString("page 3"));
|
||||
page->setFinalPage(true);
|
||||
|
||||
return page;
|
||||
}
|
||||
|
16
output-dialog.hpp
Normal file
@ -0,0 +1,16 @@
|
||||
#pragma once
|
||||
|
||||
#include <QWizard>
|
||||
#include <QWizardPage>
|
||||
#include <QDialog>
|
||||
|
||||
class OutputDialog : public QWizard {
|
||||
Q_OBJECT
|
||||
private:
|
||||
QWizardPage *WizardPage1();
|
||||
QWizardPage *WizardPage2();
|
||||
QWizardPage *WizardPage3();
|
||||
|
||||
public:
|
||||
OutputDialog(QDialog *parent);
|
||||
};
|
@ -3,5 +3,12 @@
|
||||
<file>media/aitum.png</file>
|
||||
<file>media/stream.svg</file>
|
||||
<file>media/streaming.svg</file>
|
||||
<file>media/facebook.png</file>
|
||||
<file>media/tiktok.png</file>
|
||||
<file>media/trovo.png</file>
|
||||
<file>media/twitch.png</file>
|
||||
<file>media/twitter.png</file>
|
||||
<file>media/unknown.png</file>
|
||||
<file>media/youtube.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|