wip setup ui

This commit is contained in:
Michael Fabian 'Xaymar' Dirks 2023-03-10 17:49:25 +01:00
parent 5dfb8bcab1
commit c6aec2b5fd
6 changed files with 577 additions and 0 deletions

View File

@ -1499,6 +1499,8 @@ if(T_CHECK)
"source/ui/ui-about-entry.cpp"
"source/ui/ui-obs-browser-widget.hpp"
"source/ui/ui-obs-browser-widget.cpp"
"source/ui/ui-setup.hpp"
"source/ui/ui-setup.cpp"
)
list(APPEND PROJECT_INCLUDE_DIRS
"source/ui"

View File

@ -39,6 +39,17 @@ UI.Menu.Twitter="Follow StreamFX on Twitter"
UI.Menu.YouTube="Subscribe to StreamFX on YouTube"
UI.Menu.About="About StreamFX"
# Front-end - Setup
UI.Setup.Title="Welcome to StreamFX"
UI.Setup.Header.Website="Website"
UI.Setup.Header.Patreon="Patreon"
UI.Setup.Header.Discord="Discord"
UI.Setup.Banner="StreamFX is made possible through support by"
UI.Setup.Control.Cancel="Cancel"
UI.Setup.Control.Previous="Previous"
UI.Setup.Control.Next="Next"
UI.Setup.Control.Finish="Finish"
# Front-end - About StreamFX
UI.About.Title="About StreamFX"
UI.About.Text="<html><head/><body><p>StreamFX is made possible by all the supporters on <a href='https://patreon.com/Xaymar'><span style='text-decoration: underline;'>Patreon</span></a>, on <a href='https://github.com/sponsors/xaymar'><span style='text-decoration: underline;'>Github Sponsors</span></a>, and anyone donating through <a href='https://paypal.me/Xaymar'><span style='text-decoration: underline;'>PayPal</span></a>. Additional thanks go out to all the translators helping out with the localization on <a href='https://crowdin.com/project/obs-stream-effects'><span style='text-decoration: underline;'>Crowdin</span></a>. You all are amazing!</p></body></html>"

309
source/ui/ui-setup.cpp Normal file
View File

@ -0,0 +1,309 @@
#include "ui-setup.hpp"
#include "version.hpp"
#include "warning-disable.hpp"
#include <QCoreApplication>
#include <QHBoxLayout>
#include <QPixmap>
#include <QSizePolicy>
#include <QVBoxLayout>
#include "warning-enable.hpp"
streamfx::ui::setup::setup(QWidget* parent) : QDialog(parent)
{
// Don't delete this window when it is closed.
// Set up basics, like not deleting self on close.
setObjectName(QString::fromUtf8("setup"));
setAttribute(Qt::WA_DeleteOnClose, false);
setWindowFlag(Qt::WindowContextHelpButtonHint, false);
setModal(false);
// Set up overall layout.
auto layout = new QVBoxLayout(this);
layout->setContentsMargins(5, 5, 5, 5);
layout->setSpacing(10);
//setLayout(layout);
// Create a font for multi-language support.
QStringList families;
families.append(QString::fromUtf8("Roboto"));
families.append(QString::fromUtf8("MS Shell Dlg 2"));
families.append(QString::fromUtf8("MS Gothic"));
families.append(QString::fromUtf8("Malgun Gothic"));
{ // Set up header.
auto header_layout = new QVBoxLayout();
header_layout->setContentsMargins(0, 0, 0, 0);
header_layout->setSpacing(10);
{
_header_logo = new QLabel(this);
_header_logo->setObjectName(QString::fromUtf8("logo"));
QSizePolicy size_policy(QSizePolicy::Preferred, QSizePolicy::Preferred);
size_policy.setHorizontalStretch(0);
size_policy.setVerticalStretch(0);
size_policy.setHeightForWidth(_header_logo->sizePolicy().hasHeightForWidth());
_header_logo->setSizePolicy(size_policy);
{
QPixmap logo{QString::fromUtf8(":/logos/streamfx_logo")};
_header_logo->setPixmap(logo);
_header_logo->setMinimumSize(logo.size());
_header_logo->setMaximumSize(logo.size());
}
_header_logo->setScaledContents(false);
header_layout->addWidget(_header_logo, 0, Qt::AlignCenter);
}
{
auto links_layout = new QHBoxLayout();
links_layout->setContentsMargins(0, 0, 0, 0);
links_layout->setSpacing(10);
header_layout->addLayout(links_layout);
QFont font;
font.setFamilies(families);
font.setPointSize(12);
QSizePolicy size_policy(QSizePolicy::Expanding, QSizePolicy::Maximum);
size_policy.setHorizontalStretch(0);
size_policy.setVerticalStretch(0);
{
_header_website = new QLabel(this);
_header_website->setObjectName(QString::fromUtf8("website"));
size_policy.setHeightForWidth(_header_website->sizePolicy().hasHeightForWidth());
_header_website->setSizePolicy(size_policy);
_header_website->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
_header_website->setWordWrap(false);
_header_website->setOpenExternalLinks(true);
_header_website->setTextInteractionFlags(Qt::LinksAccessibleByKeyboard | Qt::LinksAccessibleByMouse);
_header_website->setFont(font);
links_layout->addWidget(_header_website);
}
{
_header_patreon = new QLabel(this);
_header_patreon->setObjectName(QString::fromUtf8("patreon"));
size_policy.setHeightForWidth(_header_patreon->sizePolicy().hasHeightForWidth());
_header_patreon->setSizePolicy(size_policy);
_header_patreon->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
_header_patreon->setWordWrap(false);
_header_patreon->setOpenExternalLinks(true);
_header_patreon->setTextInteractionFlags(Qt::LinksAccessibleByKeyboard | Qt::LinksAccessibleByMouse);
_header_patreon->setFont(font);
links_layout->addWidget(_header_patreon);
}
{
_header_discord = new QLabel(this);
_header_discord->setObjectName(QString::fromUtf8("discord"));
size_policy.setHeightForWidth(_header_discord->sizePolicy().hasHeightForWidth());
_header_discord->setSizePolicy(size_policy);
_header_discord->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
_header_discord->setWordWrap(false);
_header_discord->setOpenExternalLinks(true);
_header_discord->setTextInteractionFlags(Qt::LinksAccessibleByKeyboard | Qt::LinksAccessibleByMouse);
_header_discord->setFont(font);
links_layout->addWidget(_header_discord);
}
}
layout->addLayout(header_layout);
}
layout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding));
{ // Set up footer.
auto footer_layout = new QVBoxLayout();
footer_layout->setContentsMargins(0, 0, 0, 0);
footer_layout->setSpacing(10);
{ // Banner
auto container_layout = new QHBoxLayout();
container_layout->setContentsMargins(0, 0, 0, 0);
container_layout->setSpacing(0);
auto banner_layout = new QVBoxLayout();
banner_layout->setContentsMargins(0, 0, 0, 0);
banner_layout->setSpacing(10);
{ // Title
QFont font;
font.setFamilies(families);
font.setPointSize(9);
_banner_title = new QLabel(this);
_banner_title->setObjectName(QString::fromUtf8("banner_title"));
_banner_title->setFont(font);
banner_layout->addWidget(_banner_title, 0, Qt::AlignLeft | Qt::AlignVCenter);
}
{ // Content
if (streamfx::ui::obs_browser_widget::is_available()) {
_banner_content =
new streamfx::ui::obs_browser_widget(QUrl(QString::fromUtf8("https://www.xaymar.com/")), this);
} else {
_banner_content = new QLabel(this);
}
_banner_content->setObjectName(QString::fromUtf8("banner_content"));
_banner_content->setFixedSize(728, 90);
_banner_content->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
banner_layout->addWidget(_banner_content, 0, Qt::AlignCenter);
}
container_layout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum));
container_layout->addLayout(banner_layout);
container_layout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum));
footer_layout->addLayout(container_layout);
}
{ // Controls
auto control_layout = new QHBoxLayout();
QFont font;
font.setFamilies(families);
font.setPointSize(12);
{ // Cancel
_control_cancel = new QPushButton(this);
QSizePolicy size_policy(QSizePolicy::MinimumExpanding, QSizePolicy::Maximum);
size_policy.setHorizontalStretch(1);
size_policy.setVerticalStretch(0);
size_policy.setHeightForWidth(_control_cancel->sizePolicy().hasHeightForWidth());
_control_cancel->setSizePolicy(size_policy);
_control_cancel->setFont(font);
control_layout->addWidget(_control_cancel, 2, Qt::AlignLeft);
}
{ // Previous
_control_prev = new QPushButton(this);
QSizePolicy size_policy(QSizePolicy::MinimumExpanding, QSizePolicy::Maximum);
size_policy.setHorizontalStretch(1);
size_policy.setVerticalStretch(0);
size_policy.setHeightForWidth(_control_prev->sizePolicy().hasHeightForWidth());
_control_prev->setSizePolicy(size_policy);
_control_prev->setFont(font);
control_layout->addWidget(_control_prev, 2, Qt::AlignLeft);
}
control_layout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum));
{ // Next
_control_next = new QPushButton(this);
QSizePolicy size_policy(QSizePolicy::MinimumExpanding, QSizePolicy::Maximum);
size_policy.setHorizontalStretch(1);
size_policy.setVerticalStretch(0);
size_policy.setHeightForWidth(_control_next->sizePolicy().hasHeightForWidth());
_control_next->setSizePolicy(size_policy);
_control_next->setFont(font);
control_layout->addWidget(_control_next, 3, Qt::AlignRight);
}
{ // Finish
_control_finish = new QPushButton(this);
QSizePolicy size_policy(QSizePolicy::MinimumExpanding, QSizePolicy::Maximum);
size_policy.setHorizontalStretch(1);
size_policy.setVerticalStretch(0);
size_policy.setHeightForWidth(_control_finish->sizePolicy().hasHeightForWidth());
_control_finish->setSizePolicy(size_policy);
_control_finish->setFont(font);
control_layout->addWidget(_control_finish, 3, Qt::AlignRight);
}
footer_layout->addLayout(control_layout);
}
{ // Info Line
auto info_layout = new QHBoxLayout();
QFont font;
font.setFamilies(families);
font.setPointSize(9);
{ // Version
_info_version = new QLabel(this);
_info_version->setObjectName(QString::fromUtf8("version"));
QSizePolicy size_policy(QSizePolicy::MinimumExpanding, QSizePolicy::Maximum);
size_policy.setHorizontalStretch(0);
size_policy.setVerticalStretch(0);
size_policy.setHeightForWidth(_info_version->sizePolicy().hasHeightForWidth());
_info_version->setSizePolicy(size_policy);
_info_version->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
_info_version->setWordWrap(false);
_info_version->setOpenExternalLinks(true);
_info_version->setTextInteractionFlags(Qt::LinksAccessibleByKeyboard | Qt::LinksAccessibleByMouse);
_info_version->setFont(font);
info_layout->addWidget(_info_version);
}
footer_layout->addLayout(info_layout);
}
layout->addLayout(footer_layout);
}
// Translate initial text.
retranslate();
// Connect any named objects directly.
QMetaObject::connectSlotsByName(this);
// Ensure we fit the content.
resize(400, 300);
adjustSize();
}
streamfx::ui::setup::~setup() {}
void streamfx::ui::setup::retranslate()
{
setWindowTitle(QCoreApplication::translate("Setup", "StreamFX::UI.Setup.Title", ""));
{ // Header
{ // Website
char buffer[2048];
auto text = QCoreApplication::translate("Setup", "StreamFX::UI.Setup.Header.Website", "");
snprintf(buffer, sizeof(buffer), "<a href='%s'>%s</a>", "https://streamfx.xaymar.com/",
text.toStdString().c_str());
_header_website->setText(QString::fromUtf8(buffer));
};
{ // Patreon
char buffer[2048];
auto text = QCoreApplication::translate("Setup", "StreamFX::UI.Setup.Header.Patreon", "");
snprintf(buffer, sizeof(buffer), "<a href='%s'>%s</a>", "https://s.xaymar.com/streamfx/patreon",
text.toStdString().c_str());
_header_patreon->setText(QString::fromUtf8(buffer));
};
{ // Discord
char buffer[2048];
auto text = QCoreApplication::translate("Setup", "StreamFX::UI.Setup.Header.Discord", "");
snprintf(buffer, sizeof(buffer), "<a href='%s'>%s</a>", "https://s.xaymar.com/streamfx/discord",
text.toStdString().c_str());
_header_discord->setText(QString::fromUtf8(buffer));
}
}
{ // Footer
{ // Banner
_banner_title->setText(QCoreApplication::translate("Setup", "StreamFX::UI.Setup.Banner"));
}
{ // Controls
_control_cancel->setText(QCoreApplication::translate("Setup", "StreamFX::UI.Setup.Control.Cancel"));
_control_prev->setText(QCoreApplication::translate("Setup", "StreamFX::UI.Setup.Control.Previous"));
_control_next->setText(QCoreApplication::translate("Setup", "StreamFX::UI.Setup.Control.Next"));
_control_finish->setText(QCoreApplication::translate("Setup", "StreamFX::UI.Setup.Control.Finish"));
}
_info_version->setText(STREAMFX_VERSION_STRING);
}
layout()->invalidate();
}

42
source/ui/ui-setup.hpp Normal file
View File

@ -0,0 +1,42 @@
#pragma once
#include "ui-obs-browser-widget.hpp"
#include "warning-disable.hpp"
#include <QDialog>
#include <QLabel>
#include <QPushButton>
#include <QWidget>
#include "warning-enable.hpp"
namespace streamfx::ui {
class setup : public QDialog {
Q_OBJECT;
QLabel* _header_logo;
QLabel* _header_website;
QLabel* _header_patreon;
QLabel* _header_discord;
QLabel* _banner_title;
QWidget* _banner_content;
QPushButton* _control_cancel;
QPushButton* _control_prev;
QPushButton* _control_next;
QPushButton* _control_finish;
QLabel* _info_version;
public:
setup(QWidget* parent = nullptr);
virtual ~setup();
void retranslate();
Q_SIGNALS:
protected Q_SLOTS:
};
} // namespace streamfx::ui

View File

@ -10,6 +10,7 @@
#include "obs/obs-tools.hpp"
#include "plugin.hpp"
#include "ui/ui-obs-browser-widget.hpp"
#include "ui/ui-setup.hpp"
#include "warning-disable.hpp"
#include <string_view>
@ -121,6 +122,9 @@ void streamfx::ui::handler::on_obs_loaded()
// Create the 'About StreamFX' dialog.
_about_dialog = new streamfx::ui::about();
auto ptr = new streamfx::ui::setup(reinterpret_cast<QWidget*>(obs_frontend_get_main_window()));
ptr->show();
{ // Create and build the StreamFX menu
_menu = new QMenu(reinterpret_cast<QWidget*>(obs_frontend_get_main_window()));

209
ui/setup.ui Normal file
View File

@ -0,0 +1,209 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>699</width>
<height>848</height>
</rect>
</property>
<property name="windowTitle">
<string>StreamFX::UI.Setup.Title</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>10</number>
</property>
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>10</number>
</property>
<item>
<widget class="QLabel" name="logo">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="streamfx.qrc">:/logos/streamfx_logo</pixmap>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="spacing">
<number>10</number>
</property>
<item>
<widget class="QLabel" name="websiteLabel">
<property name="text">
<string>StreamFX::UI.Setup.Website</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="patreonLabel">
<property name="text">
<string>StreamFX::UI.Setup.Patreon</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="versionLabel">
<property name="text">
<string>StreamFX::UI.Setup.Version</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="QStackedWidget" name="setupPager">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<widget class="QWidget" name="aboutPage">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>0</number>
</property>
</layout>
</widget>
<widget class="QWidget" name="updaterPage">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>0</number>
</property>
</layout>
</widget>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>0</number>
</property>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="OBSBrowserWidget" name="widget" native="true">
<property name="minimumSize">
<size>
<width>600</width>
<height>160</height>
</size>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="prevButton">
<property name="text">
<string>StreamFX::UI.Setup.Previous</string>
</property>
<property name="autoDefault">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="abortButton">
<property name="text">
<string>StreamFX::UI.Setup.Cancel</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="nextButton">
<property name="text">
<string>StreamFX::UI.Setup.Next</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>OBSBrowserWidget</class>
<extends>QWidget</extends>
<header>obsbrowserwidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>nextButton</tabstop>
<tabstop>prevButton</tabstop>
<tabstop>abortButton</tabstop>
</tabstops>
<resources>
<include location="streamfx.qrc"/>
</resources>
<connections/>
</ui>