From f58ce9f421223934a41bc77312c30c2489c21ad7 Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Sun, 5 Apr 2020 18:52:06 +0200 Subject: [PATCH] project: Implement a brand new UI with fancy windows Implements support for various new UI features that weren't possible up until now, such as an 'About StreamFX' window with a thank you to everyone that supported the project up until now. --- CMakeLists.txt | 13 ++ source/plugin.cpp | 15 +++ source/ui/ui-about-entry.cpp | 130 +++++++++++++++++++ source/ui/ui-about-entry.hpp | 51 ++++++++ source/ui/ui-about.cpp | 204 +++++++++++++++++++++++++++++ source/ui/ui-about.hpp | 83 ++++++++++++ source/ui/ui-common.hpp | 43 +++++++ source/ui/ui.cpp | 200 ++++++++++++++++++++++++++++ source/ui/ui.hpp | 82 ++++++++++++ ui/about-entry.ui | 243 +++++++++++++++++++++++++++++++++++ ui/about.ui | 173 +++++++++++++++++++++++++ ui/linktype_discord.png | Bin 0 -> 613 bytes ui/linktype_facebook.png | Bin 0 -> 1465 bytes ui/linktype_generic.png | Bin 0 -> 937 bytes ui/linktype_twitch.png | Bin 0 -> 656 bytes ui/linktype_twitter.png | Bin 0 -> 727 bytes ui/linktype_youtube.png | Bin 0 -> 1373 bytes ui/logo.png | Bin 0 -> 59845 bytes ui/streamfx.qrc | 13 ++ 19 files changed, 1250 insertions(+) create mode 100644 source/ui/ui-about-entry.cpp create mode 100644 source/ui/ui-about-entry.hpp create mode 100644 source/ui/ui-about.cpp create mode 100644 source/ui/ui-about.hpp create mode 100644 source/ui/ui-common.hpp create mode 100644 source/ui/ui.cpp create mode 100644 source/ui/ui.hpp create mode 100644 ui/about-entry.ui create mode 100644 ui/about.ui create mode 100644 ui/linktype_discord.png create mode 100644 ui/linktype_facebook.png create mode 100644 ui/linktype_generic.png create mode 100644 ui/linktype_twitch.png create mode 100644 ui/linktype_twitter.png create mode 100644 ui/linktype_youtube.png create mode 100644 ui/logo.png create mode 100644 ui/streamfx.qrc diff --git a/CMakeLists.txt b/CMakeLists.txt index 4bbd185..86d2b62 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -501,8 +501,21 @@ endif() ## OBS Studio - Frontend/Qt if(HAVE_OBS_FRONTEND) list(APPEND PROJECT_UI + "ui/streamfx.qrc" + "ui/about.ui" + "ui/about-entry.ui" ) list(APPEND PROJECT_PRIVATE_SOURCE + "source/ui/ui-common.hpp" + "source/ui/ui.hpp" + "source/ui/ui.cpp" + "source/ui/ui-about.hpp" + "source/ui/ui-about.cpp" + "source/ui/ui-about-entry.hpp" + "source/ui/ui-about-entry.cpp" + ) + list(APPEND PROJECT_DATA + ) list(APPEND PROJECT_INCLUDE_DIRS "source/ui" diff --git a/source/plugin.cpp b/source/plugin.cpp index abf50cf..1224d81 100644 --- a/source/plugin.cpp +++ b/source/plugin.cpp @@ -18,6 +18,7 @@ */ #include "plugin.hpp" +#include #include #include "configuration.hpp" #include "obs/obs-source-tracker.hpp" @@ -62,6 +63,10 @@ #include "transitions/transition-shader.hpp" #endif +#ifdef ENABLE_FRONTEND +#include "ui/ui.hpp" +#endif + static std::shared_ptr _threadpool; MODULE_EXPORT bool obs_module_load(void) @@ -133,6 +138,11 @@ try { #endif } + // Frontend +#ifdef ENABLE_FRONTEND + streamfx::ui::handler::initialize(); +#endif + LOG_INFO("Loaded Version %s", STREAMFX_VERSION_STRING); return true; } catch (...) { @@ -144,6 +154,11 @@ MODULE_EXPORT void obs_module_unload(void) try { LOG_INFO("Unloading Version %s", STREAMFX_VERSION_STRING); + // Frontend +#ifdef ENABLE_FRONTEND + streamfx::ui::handler::finalize(); +#endif + // Transitions { using namespace streamfx::transition; diff --git a/source/ui/ui-about-entry.cpp b/source/ui/ui-about-entry.cpp new file mode 100644 index 0000000..aba1a69 --- /dev/null +++ b/source/ui/ui-about-entry.cpp @@ -0,0 +1,130 @@ +/* + * Modern effects for a modern Streamer + * Copyright (C) 2020 Michael Fabian Dirks + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "ui-about-entry.hpp" + +constexpr std::string_view i18n_role_contributor = "UI.About.Role.Contributor"; +constexpr std::string_view i18n_role_translator = "UI.About.Role.Translator"; +constexpr std::string_view i18n_role_family = "UI.About.Role.Family"; +constexpr std::string_view i18n_role_friend = "UI.About.Role.Friend"; +constexpr std::string_view i18n_role_supporter_patreon = "UI.About.Role.Supporter.Patreon"; +constexpr std::string_view i18n_role_supporter_github = "UI.About.Role.Supporter.Github"; +constexpr std::string_view i18n_role_supporter_twitch = "UI.About.Role.Supporter.Twitch"; +constexpr std::string_view i18n_role_creator = "UI.About.Role.Creator"; + +streamfx::ui::about_entry::about_entry(QWidget* parent, streamfx::ui::about::entry& entry) + : QWidget(parent), _last_click(std::chrono::high_resolution_clock::now()), _link1_url(), _link2_url() +{ + setupUi(this); + + name->setText(QString::fromStdString(entry.name)); + switch (entry.role) { + case streamfx::ui::about::role_type::NONE: + title->setText(QString::fromStdString(entry.role_custom)); + break; + case streamfx::ui::about::role_type::CONTRIBUTOR: + title->setText(D_TRANSLATE(i18n_role_contributor.data())); + break; + case streamfx::ui::about::role_type::TRANSLATOR: + title->setText(D_TRANSLATE(i18n_role_translator.data())); + break; + case streamfx::ui::about::role_type::FAMILY: { + const char* txt = D_TRANSLATE(i18n_role_family.data()); + std::vector buf(2048); + snprintf(buf.data(), buf.size(), txt, entry.role_custom.c_str()); + title->setText(QString::fromUtf8(buf.data())); + break; + } + case streamfx::ui::about::role_type::FRIEND: { + const char* txt = D_TRANSLATE(i18n_role_friend.data()); + std::vector buf(2048); + snprintf(buf.data(), buf.size(), txt, entry.role_custom.c_str()); + title->setText(QString::fromUtf8(buf.data())); + break; + } + case streamfx::ui::about::role_type::PATREON_SUPPORTER: + title->setText(D_TRANSLATE(i18n_role_supporter_patreon.data())); + break; + case streamfx::ui::about::role_type::GITHUB_SUPPORTER: + title->setText(D_TRANSLATE(i18n_role_supporter_github.data())); + break; + case streamfx::ui::about::role_type::TWITCH_SUPPORTER: + title->setText(D_TRANSLATE(i18n_role_supporter_twitch.data())); + break; + case streamfx::ui::about::role_type::CREATOR: + title->setText(D_TRANSLATE(i18n_role_creator.data())); + break; + } + + std::tuple els[]{ + {entry.link1_type, entry.link1_address, entry.link1_text, link1, _link1_url}, + {entry.link2_type, entry.link2_address, entry.link2_text, link2, _link2_url}, + }; + for (auto el : els) { + switch (std::get<0>(el)) { + case streamfx::ui::about::link_type::NONE: + std::get<3>(el)->setHidden(true); + break; + case streamfx::ui::about::link_type::GENERIC: + std::get<3>(el)->setIcon(QIcon(":/linktype/generic")); + break; + case streamfx::ui::about::link_type::SOCIAL_TWITCH: + std::get<3>(el)->setIcon(QIcon(":/linktype/twitch")); + break; + case streamfx::ui::about::link_type::SOCIAL_YOUTUBE: + std::get<3>(el)->setIcon(QIcon(":/linktype/youtube")); + break; + case streamfx::ui::about::link_type::SOCIAL_DISCORD: + std::get<3>(el)->setIcon(QIcon(":/linktype/discord")); + break; + case streamfx::ui::about::link_type::SOCIAL_TWITTER: + std::get<3>(el)->setIcon(QIcon(":/linktype/twitter")); + break; + case streamfx::ui::about::link_type::SOCIAL_FACEBOOK: + std::get<3>(el)->setIcon(QIcon(":/linktype/facebook")); + break; + } + std::get<3>(el)->setText(QString::fromUtf8(std::get<2>(el).c_str())); + std::get<4>(el).setUrl(QString::fromStdString(std::get<1>(el))); + } + connect(link1, &QPushButton::pressed, this, &streamfx::ui::about_entry::on_link1_clicked); + connect(link2, &QPushButton::pressed, this, &streamfx::ui::about_entry::on_link2_clicked); + + // Don't free up space when hidden. + /*if (!(link1->isVisible() || link2->isVisible())) { + QSizePolicy qsp = link1->sizePolicy(); + qsp.setRetainSizeWhenHidden(true); + link1->setSizePolicy(qsp); + }*/ +} + +streamfx::ui::about_entry::~about_entry() {} + +void streamfx::ui::about_entry::on_link1_clicked() +{ + // FIXME! Button clicks twice? + for (size_t attempt = 0; (attempt < 10) && (!QDesktopServices::openUrl(_link1_url)); attempt++) { + } +} + +void streamfx::ui::about_entry::on_link2_clicked() +{ + for (size_t attempt = 0; (attempt < 10) && (!QDesktopServices::openUrl(_link2_url)); attempt++) { + } +} diff --git a/source/ui/ui-about-entry.hpp b/source/ui/ui-about-entry.hpp new file mode 100644 index 0000000..6d161ef --- /dev/null +++ b/source/ui/ui-about-entry.hpp @@ -0,0 +1,51 @@ +/* + * Modern effects for a modern Streamer + * Copyright (C) 2020 Michael Fabian Dirks + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#pragma once +#include +#include "ui-about.hpp" +#include "ui-common.hpp" + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4251 4365 4371 4619 4946) +#endif +#include "ui_about-entry.h" +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +namespace streamfx::ui { + class about_entry : public QWidget, public Ui::AboutEntry { + Q_OBJECT + + private: + std::chrono::high_resolution_clock::time_point _last_click; + QUrl _link1_url; + QUrl _link2_url; + + public: + about_entry(QWidget* parent, ui::about::entry& entry); + ~about_entry(); + + public slots: + void on_link1_clicked(); + void on_link2_clicked(); + }; +} // namespace streamfx::ui diff --git a/source/ui/ui-about.cpp b/source/ui/ui-about.cpp new file mode 100644 index 0000000..662c3f1 --- /dev/null +++ b/source/ui/ui-about.cpp @@ -0,0 +1,204 @@ +/* + * Modern effects for a modern Streamer + * Copyright (C) 2020 Michael Fabian Dirks + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "ui-about.hpp" +#include +#include +#include "ui-about-entry.hpp" + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4251 4365 4371 4619 4946) +#endif +#include +#include +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +constexpr std::string_view text_social_facebook = "Facebook"; +constexpr std::string_view text_social_twitch = "Twitch"; +constexpr std::string_view text_social_twitter = "Twitter"; +constexpr std::string_view text_social_youtube = "YouTube"; + +static const std::list _entries = { + // Contributers + streamfx::ui::about::entry{"Michael \"Xaymar\" Dirks", streamfx::ui::about::role_type::CONTRIBUTOR, "", + streamfx::ui::about::link_type::GENERIC, "https://xaymar.com", "Blog & Stuff", + streamfx::ui::about::link_type::SOCIAL_TWITCH, "https://twitch.tv/xaymar", + text_social_twitch.data()}, + + // Translators + streamfx::ui::about::entry{"FrozenNortherner", streamfx::ui::about::role_type::TRANSLATOR, "", + streamfx::ui::about::link_type::SOCIAL_TWITCH, "https://twitch.tv/frozennortherner", + text_social_twitch.data(), streamfx::ui::about::link_type::NONE, "", ""}, + streamfx::ui::about::entry{"HANAWINS", streamfx::ui::about::role_type::TRANSLATOR, "", + streamfx::ui::about::link_type::SOCIAL_TWITCH, "https://www.twitch.tv/hanawins", + text_social_twitch.data(), streamfx::ui::about::link_type::NONE, "", ""}, + streamfx::ui::about::entry{"hydargos", streamfx::ui::about::role_type::TRANSLATOR, "", + streamfx::ui::about::link_type::SOCIAL_TWITCH, "https://www.youtube.com/hydargos", + text_social_youtube.data(), streamfx::ui::about::link_type::NONE, "", ""}, + streamfx::ui::about::entry{"Monsteer", streamfx::ui::about::role_type::TRANSLATOR, "", + streamfx::ui::about::link_type::SOCIAL_TWITTER, "https://twitter.com/cooliguay", + text_social_twitter.data(), streamfx::ui::about::link_type::NONE, "", ""}, + streamfx::ui::about::entry{"Nanito", streamfx::ui::about::role_type::TRANSLATOR, "", + streamfx::ui::about::link_type::SOCIAL_TWITCH, "https://twitch.tv/nanito", + text_social_twitch.data(), streamfx::ui::about::link_type::SOCIAL_FACEBOOK, + "https://facebook.com/nanitotv", text_social_facebook.data()}, + + // Separator + streamfx::ui::about::entry{"", streamfx::ui::about::role_type::NONE, "", streamfx::ui::about::link_type::NONE, "", + "", streamfx::ui::about::link_type::NONE, "", ""}, + + // Supporters + streamfx::ui::about::entry{"GranDroidTonight", streamfx::ui::about::role_type::PATREON_SUPPORTER, "", + streamfx::ui::about::link_type::SOCIAL_TWITCH, "https://www.twitch.tv/GranDroidTonight", + text_social_twitch.data(), streamfx::ui::about::link_type::SOCIAL_YOUTUBE, + "https://youtube.com/channel/UCGoT2XFPpeKaL1QuY_NPDuA", text_social_youtube.data()}, + streamfx::ui::about::entry{"chi11estpanda", streamfx::ui::about::role_type::PATREON_SUPPORTER, "", + streamfx::ui::about::link_type::SOCIAL_TWITCH, "https://www.twitch.tv/chi11estpanda", + "Gaming, Life and Laughs", streamfx::ui::about::link_type::NONE, "", ""}, + streamfx::ui::about::entry{"DandiDoesIt", streamfx::ui::about::role_type::PATREON_SUPPORTER, "", + streamfx::ui::about::link_type::SOCIAL_TWITCH, "https://www.twitch.tv/DandiDoesIt", + "Twitch Channel", streamfx::ui::about::link_type::NONE, "", ""}, + streamfx::ui::about::entry{"iamresist", streamfx::ui::about::role_type::PATREON_SUPPORTER, "", + streamfx::ui::about::link_type::SOCIAL_TWITCH, "https://twitch.tv/iamresist", + text_social_twitch.data(), streamfx::ui::about::link_type::NONE, "", ""}, + streamfx::ui::about::entry{"Nordern", streamfx::ui::about::role_type::PATREON_SUPPORTER, "", + streamfx::ui::about::link_type::SOCIAL_YOUTUBE, "https://youtube.com/nordern", + text_social_youtube.data(), streamfx::ui::about::link_type::SOCIAL_TWITCH, + "https://www.twitch.tv/thenordern", text_social_twitch.data()}, + + // Separator + streamfx::ui::about::entry{"", streamfx::ui::about::role_type::NONE, "", streamfx::ui::about::link_type::NONE, "", + "", streamfx::ui::about::link_type::NONE, "", ""}, + + // Family + streamfx::ui::about::entry{"Andrea Stenschke", streamfx::ui::about::role_type::FAMILY, "Xaymar", + streamfx::ui::about::link_type::NONE, "", "", streamfx::ui::about::link_type::NONE, "", + ""}, + streamfx::ui::about::entry{"Carsten Dirks", streamfx::ui::about::role_type::FAMILY, "Xaymar", + streamfx::ui::about::link_type::NONE, "", "", streamfx::ui::about::link_type::NONE, "", + ""}, + streamfx::ui::about::entry{"Christian \"Azekil\" Dirks", streamfx::ui::about::role_type::FAMILY, "Xaymar", + streamfx::ui::about::link_type::NONE, "", "", streamfx::ui::about::link_type::NONE, "", + ""}, + streamfx::ui::about::entry{"Gabriele Rantfl", streamfx::ui::about::role_type::FAMILY, "Xaymar", + streamfx::ui::about::link_type::NONE, "", "", streamfx::ui::about::link_type::NONE, "", + ""}, + streamfx::ui::about::entry{"Reiner Rantfl", streamfx::ui::about::role_type::FAMILY, "Xaymar", + streamfx::ui::about::link_type::NONE, "", "", streamfx::ui::about::link_type::NONE, "", + ""}, + streamfx::ui::about::entry{"René \"Dex\" Dirks", streamfx::ui::about::role_type::FAMILY, "Xaymar", + streamfx::ui::about::link_type::SOCIAL_TWITCH, "https://twitch.tv/vektordex", + text_social_twitch.data(), streamfx::ui::about::link_type::GENERIC, + "https://worldofdex.de", "Website"}, + + // Friends + streamfx::ui::about::entry{"Axelle", streamfx::ui::about::role_type::FRIEND, "Xaymar", + streamfx::ui::about::link_type::SOCIAL_TWITCH, "https://www.twitch.tv/axelle123", + text_social_twitch.data(), streamfx::ui::about::link_type::SOCIAL_TWITTER, + "https://twitter.com/AxellesNobody", text_social_twitter.data()}, + + // Separator + streamfx::ui::about::entry{"", streamfx::ui::about::role_type::NONE, "", streamfx::ui::about::link_type::NONE, "", + "", streamfx::ui::about::link_type::NONE, "", ""}, + + // Creators + streamfx::ui::about::entry{"EposVox", streamfx::ui::about::role_type::CREATOR, "", + streamfx::ui::about::link_type::SOCIAL_TWITCH, "https://www.twitch.tv/EposVox", + text_social_twitch.data(), streamfx::ui::about::link_type::SOCIAL_YOUTUBE, + "https://youtube.com/c/EposVox", text_social_youtube.data()}, + +}; + +streamfx::ui::about::about() : QDialog(reinterpret_cast(obs_frontend_get_main_window())) +{ + setupUi(this); + + // Remove some extra styling. + setWindowFlag(Qt::WindowContextHelpButtonHint, false); // Remove the unimplemented help button. + + // Thank every single helper. + bool column_selector = false; + size_t row_selector = 0; + QGridLayout* content_layout = dynamic_cast(content->layout()); + for (auto entry : _entries) { + if (entry.name.size() == 0) { + row_selector += 2; + column_selector = 0; + + // Add a separator line. + auto separator = new QFrame(content); + { + auto sp = separator->sizePolicy(); + sp.setVerticalPolicy(QSizePolicy::Fixed); + separator->setSizePolicy(sp); + } + separator->setFrameShape(QFrame::HLine); + separator->setFrameShadow(QFrame::Sunken); + separator->setMaximumHeight(1); + separator->setMinimumHeight(1); + separator->setFixedHeight(1); + separator->setLineWidth(1); + content_layout->addWidget(separator, static_cast(row_selector - 1), 0, 1, 2); + content_layout->setRowStretch(static_cast(row_selector - 1), 0); + } else { + streamfx::ui::about_entry* v = new streamfx::ui::about_entry(content, entry); + + content_layout->addWidget(v, static_cast(row_selector), column_selector ? 1 : 0); + content_layout->setRowStretch(static_cast(row_selector), 0); + + if (column_selector) { + row_selector++; + } + column_selector = !column_selector; + } + } + { + row_selector++; + auto padder = new QFrame(content); + { + auto sp = padder->sizePolicy(); + sp.setVerticalPolicy(QSizePolicy::Minimum); + sp.setVerticalStretch(1); + padder->setSizePolicy(sp); + } + padder->setObjectName("PaddleMeDaddy"); + padder->setMaximumHeight(QWIDGETSIZE_MAX); + padder->setMinimumHeight(1); + padder->setFrameShape(QFrame::NoFrame); + content_layout->addWidget(padder, static_cast(row_selector), 0, 1, 2); + content_layout->setRowStretch(static_cast(row_selector), 9999); + } + + content_layout->setColumnStretch(0, 1); + content_layout->setColumnStretch(1, 1); + content->setSizePolicy(QSizePolicy::Policy::Minimum, QSizePolicy::Policy::Maximum); + + // Make the OK button do things. + connect(buttonBox, &QDialogButtonBox::accepted, this, &streamfx::ui::about::on_ok); +} + +streamfx::ui::about::~about() {} + +void streamfx::ui::about::on_ok() +{ + hide(); +} diff --git a/source/ui/ui-about.hpp b/source/ui/ui-about.hpp new file mode 100644 index 0000000..d3d7c9d --- /dev/null +++ b/source/ui/ui-about.hpp @@ -0,0 +1,83 @@ +/* + * Modern effects for a modern Streamer + * Copyright (C) 2020 Michael Fabian Dirks + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#pragma once +#include "common.hpp" +#include "ui-common.hpp" + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4251 4365 4371 4619 4946) +#endif +#include "ui_about.h" +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +namespace streamfx::ui { + class about : public QDialog, public Ui::About { + Q_OBJECT + + public: + enum class role_type : std::int32_t { + NONE, + CONTRIBUTOR, + TRANSLATOR, + FAMILY, + FRIEND, + PATREON_SUPPORTER, + GITHUB_SUPPORTER, + TWITCH_SUPPORTER, + CREATOR, + }; + enum class link_type : std::int32_t { + NONE, + GENERIC, + + // Social Links + SOCIAL_TWITCH = 2000, + SOCIAL_YOUTUBE, + SOCIAL_DISCORD, + SOCIAL_TWITTER, + SOCIAL_FACEBOOK, + }; + + struct entry { + std::string name; + ui::about::role_type role; + std::string role_custom; + + ui::about::link_type link1_type; + std::string link1_address; + std::string link1_text; + + ui::about::link_type link2_type; + std::string link2_address; + std::string link2_text; + }; + + public: + about(); + ~about(); + + public slots: + ; // Not having this breaks some linters. + void on_ok(); + }; +} // namespace streamfx::ui diff --git a/source/ui/ui-common.hpp b/source/ui/ui-common.hpp new file mode 100644 index 0000000..ee8373c --- /dev/null +++ b/source/ui/ui-common.hpp @@ -0,0 +1,43 @@ +/* + * Modern effects for a modern Streamer + * Copyright (C) 2017 Michael Fabian Dirks + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#pragma once + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4251 4365 4371 4619 4946) +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern "C" { +#include +} + +#ifdef _MSC_VER +#pragma warning(pop) +#endif diff --git a/source/ui/ui.cpp b/source/ui/ui.cpp new file mode 100644 index 0000000..18d7f2d --- /dev/null +++ b/source/ui/ui.cpp @@ -0,0 +1,200 @@ +/* + * Modern effects for a modern Streamer + * Copyright (C) 2020 Michael Fabian Dirks + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "ui.hpp" +#include "common.hpp" +#include "strings.hpp" +#include +#include "configuration.hpp" +#include "obs/obs-tools.hpp" +#include "plugin.hpp" + +#include + +// Translation Keys +constexpr std::string_view _i18n_prefix = "StreamFX::"; +constexpr std::string_view _i18n_menu = "UI.Menu"; +constexpr std::string_view _i18n_menu_report_issue = "UI.Menu.ReportIssue"; +constexpr std::string_view _i18n_menu_request_help = "UI.Menu.RequestHelp"; +constexpr std::string_view _i18n_menu_website = "UI.Menu.Website"; +constexpr std::string_view _i18n_menu_discord = "UI.Menu.Discord"; +constexpr std::string_view _i18n_menu_github = "UI.Menu.Github"; +constexpr std::string_view _i18n_menu_about = "UI.Menu.About"; + +// Configuration +constexpr std::string_view _cfg_have_shown_about = "UI.HaveShownAboutStreamFX"; + +// URLs +constexpr std::string_view _url_report_issue = "https://github.com/Xaymar/obs-StreamFX/issues/new?template=issue.md"; +constexpr std::string_view _url_request_help = "https://github.com/Xaymar/obs-StreamFX/issues/new?template=help.md"; +constexpr std::string_view _url_website = "https://streamfx.xaymar.com"; +constexpr std::string_view _url_discord = "https://discordapp.com/invite/DaeJg7M"; +constexpr std::string_view _url_github = "https://github.com/Xaymar/obs-StreamFX"; + +bool streamfx::ui::handler::have_shown_about_streamfx(bool shown) +{ + if (shown) { + obs_data_set_bool(streamfx::configuration::instance()->get().get(), _cfg_have_shown_about.data(), true); + } + if (streamfx::configuration::instance()->is_different_version()) { + return false; + } else { + return obs_data_get_bool(streamfx::configuration::instance()->get().get(), _cfg_have_shown_about.data()); + } +} + +streamfx::ui::handler::handler() + : QObject(), _menu_action(), _menu(), + + _report_issue(), _request_help(), + + _link_website(), _link_discord(), _link_github(), + + _about_action(), _about_dialog() +{ + // Qt Resources and Translators + Q_INIT_RESOURCE(streamfx); + QCoreApplication::installTranslator(new streamfx::ui::translator(this)); + + // Handle all frontend events. + obs_frontend_add_event_callback(frontend_event_handler, this); + + { // Build StreamFX menu. + _menu = new QMenu(reinterpret_cast(obs_frontend_get_main_window())); + + { // Github Issues + //_menu->addSeparator(); + _report_issue = _menu->addAction(QString::fromUtf8(D_TRANSLATE(_i18n_menu_report_issue.data()))); + _request_help = _menu->addAction(QString::fromUtf8(D_TRANSLATE(_i18n_menu_request_help.data()))); + connect(_report_issue, &QAction::triggered, this, &streamfx::ui::handler::on_action_report_issue); + connect(_request_help, &QAction::triggered, this, &streamfx::ui::handler::on_action_request_help); + } + + { // Official Links + _menu->addSeparator(); + _link_website = _menu->addAction(QString::fromUtf8(D_TRANSLATE(_i18n_menu_website.data()))); + _link_discord = _menu->addAction(QString::fromUtf8(D_TRANSLATE(_i18n_menu_discord.data()))); + _link_github = _menu->addAction(QString::fromUtf8(D_TRANSLATE(_i18n_menu_github.data()))); + connect(_link_website, &QAction::triggered, this, &streamfx::ui::handler::on_action_website); + connect(_link_discord, &QAction::triggered, this, &streamfx::ui::handler::on_action_discord); + connect(_link_github, &QAction::triggered, this, &streamfx::ui::handler::on_action_github); + } + + { // About StreamFX + _about_dialog = new streamfx::ui::about(); + _menu->addSeparator(); + _about_action = _menu->addAction(QString::fromUtf8(D_TRANSLATE(_i18n_menu_about.data()))); + connect(_about_action, &QAction::triggered, this, &streamfx::ui::handler::on_action_about); + if (!have_shown_about_streamfx()) { + // Automatically show it if it has not yet been shown. + _about_dialog->show(); + have_shown_about_streamfx(true); + } + } + } +} + +streamfx::ui::handler::~handler() +{ + // Handle all frontend events. + obs_frontend_remove_event_callback(frontend_event_handler, this); + + // Qt Resources and Translators + Q_CLEANUP_RESOURCE(streamfx); +} + +void streamfx::ui::handler::frontend_event_handler(obs_frontend_event event, void* private_data) +{ + streamfx::ui::handler* ptr = reinterpret_cast(private_data); + switch (event) { + case OBS_FRONTEND_EVENT_FINISHED_LOADING: + ptr->on_obs_loaded(); + break; + default: + break; + } +} + +void streamfx::ui::handler::on_obs_loaded() +{ + // Add StreamFX menu. + _menu_action = reinterpret_cast(obs_frontend_add_tools_menu_qaction(D_TRANSLATE(_i18n_menu.data()))); + _menu_action->setMenu(_menu); +} + +void streamfx::ui::handler::on_action_report_issue(bool) +{ + QDesktopServices::openUrl(QUrl(QString::fromUtf8(_url_report_issue.data()))); +} + +void streamfx::ui::handler::on_action_request_help(bool) +{ + QDesktopServices::openUrl(QUrl(QString::fromUtf8(_url_request_help.data()))); +} + +void streamfx::ui::handler::on_action_website(bool) +{ + QDesktopServices::openUrl(QUrl(QString::fromUtf8(_url_website.data()))); +} + +void streamfx::ui::handler::on_action_discord(bool) +{ + QDesktopServices::openUrl(QUrl(QString::fromUtf8(_url_discord.data()))); +} + +void streamfx::ui::handler::on_action_github(bool) +{ + QDesktopServices::openUrl(QUrl(QString::fromUtf8(_url_github.data()))); +} + +void streamfx::ui::handler::on_action_about(bool checked) +{ + _about_dialog->show(); +} + +static std::shared_ptr _handler_singleton; + +void streamfx::ui::handler::initialize() +{ + _handler_singleton = std::make_shared(); +} + +void streamfx::ui::handler::finalize() +{ + _handler_singleton.reset(); +} + +std::shared_ptr streamfx::ui::handler::get() +{ + return _handler_singleton; +} + +streamfx::ui::translator::translator(QObject* parent) {} + +streamfx::ui::translator::~translator() {} + +QString streamfx::ui::translator::translate(const char* context, const char* sourceText, const char* disambiguation, + int n) const +{ + std::string_view sourceView{sourceText}; + if (sourceView.substr(0, _i18n_prefix.length()) == _i18n_prefix) { + return QString::fromUtf8(D_TRANSLATE(sourceView.substr(_i18n_prefix.length()).data())); + } + return QString(); +} diff --git a/source/ui/ui.hpp b/source/ui/ui.hpp new file mode 100644 index 0000000..ce58dfc --- /dev/null +++ b/source/ui/ui.hpp @@ -0,0 +1,82 @@ +/* + * Modern effects for a modern Streamer + * Copyright (C) 2020 Michael Fabian Dirks + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#pragma once +#include "ui-about.hpp" +#include "ui-common.hpp" + +namespace streamfx::ui { + class handler : public QObject { + Q_OBJECT + + private: + QAction* _menu_action; + QMenu* _menu; + + // Bug Report, Help Request + QAction* _report_issue; + QAction* _request_help; + + // Website, Discord, Source + QAction* _link_website; + QAction* _link_discord; + QAction* _link_github; + + // About Dialog + QAction* _about_action; + ui::about* _about_dialog; + + public: + handler(); + ~handler(); + + bool have_shown_about_streamfx(bool shown = false); + + private: + static void frontend_event_handler(obs_frontend_event event, void* private_data); + + void on_obs_loaded(); + + public slots: + ; // Not having this breaks some linters. + void on_action_report_issue(bool); + void on_action_request_help(bool); + void on_action_website(bool); + void on_action_discord(bool); + void on_action_github(bool); + void on_action_about(bool); + + public /* Singleton */: + static void initialize(); + + static void finalize(); + + static std::shared_ptr get(); + }; + + class translator : public QTranslator { + public: + translator(QObject* parent = nullptr); + ~translator(); + + virtual QString translate(const char* context, const char* sourceText, const char* disambiguation = nullptr, + int n = -1) const override; + }; + +} // namespace streamfx::ui diff --git a/ui/about-entry.ui b/ui/about-entry.ui new file mode 100644 index 0000000..432d8e8 --- /dev/null +++ b/ui/about-entry.ui @@ -0,0 +1,243 @@ + + + AboutEntry + + + + 0 + 0 + 195 + 99 + + + + + 0 + 0 + + + + Form + + + QWidget { + background: hsl(0, 0%, 20%); + color: hsl(0, 0%, 100%); +} + +QPushButton, +QPushButton:default, +QPushButton:flat, +QPushButton:checked { + background: hsl(0, 0%, 25%); + border: 0; + padding: 5px; + box-shadow: 0; + cursor: pointer; + padding: 4px; +} + +QWidget[objectName="title"] { + color: hsl(200, 100%, 80%); +} + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 5 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + 0 + 0 + + + + + 14 + 75 + true + PreferAntialias + + + + Supporter Name + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 10 + + + + Supporter Title + + + Qt::AlignCenter + + + + + + + 5 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 36 + + + + + 16777215 + 36 + + + + + 0 + 36 + + + + + 10 + + + + YouTube + + + + :/social/youtube:/social/youtube + + + + 32 + 32 + + + + + + + + + 0 + 36 + + + + + 16777215 + 36 + + + + + 0 + 36 + + + + + 10 + + + + Twitch + + + + :/social/twitch:/social/twitch + + + + 32 + 32 + + + + + + + + + + + + + + + + diff --git a/ui/about.ui b/ui/about.ui new file mode 100644 index 0000000..35d616e --- /dev/null +++ b/ui/about.ui @@ -0,0 +1,173 @@ + + + About + + + + 0 + 0 + 512 + 512 + + + + + 512 + 512 + + + + + 1024 + 16777215 + + + + StreamFX::UI.About.Title + + + QWidget { + background: transparent; + color: hsl(0, 0%, 100%); +} + +QWidget[objectName="About"], +QWidget[objectName="contentContainer"], +QWidget[objectName="content"] { + background: hsl(0, 0%, 10%); + border: 0; +} + +QWidget[objectName="PaddleMeDaddy"] { + background: hsl(0, 0%, 10%); +} + + + + 5 + + + 10 + + + 10 + + + 10 + + + 10 + + + + + + 0 + 0 + + + + + + + :/logos/streamfx_logo + + + false + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 12 + true + + + + <html><head/><body><p>StreamFX is made possible by all the supporters on <a href="https://patreon.com/Xaymar"><span style=" text-decoration: underline; color:#00aaff;">Patreon</span></a>, on <a href="https://github.com/sponsors/xaymar"><span style=" text-decoration: underline; color:#00aaff;">Github Sponsors</span></a>, and anyone donating through <a href="https://paypal.me/Xaymar"><span style=" text-decoration: underline; color:#00aaff;">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; color:#00aaff;">Crowdin</span></a>. You all are amazing!</p></body></html> + + + Qt::AlignHCenter|Qt::AlignTop + + + true + + + true + + + Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse + + + + + + + Qt::ScrollBarAlwaysOff + + + true + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + 0 + 0 + 492 + 282 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 5 + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Ok + + + false + + + + + + + + + + diff --git a/ui/linktype_discord.png b/ui/linktype_discord.png new file mode 100644 index 0000000000000000000000000000000000000000..f953ffe4cd98aac8aee9f7802b842c7aaede728d GIT binary patch literal 613 zcmV-r0-F7aP)cilCAv5(_N?AqrYVOu98nz$C)%vDg_HW+$09vy+XGQ@wZR z-gkcUn9F+uyItDqq3t8Uo(?^ll71Jeuzkh$va8dw?aQI&{kH#BXdY|B_VKh|*7lwT z_7&Q)F!e-h=K>ts2J={lLjby}9S7K3F#i?s5jX%G1L}Z*Uf?V69T)^g2zDTWbE0 zR@*&I#O?q$fcrVMr2u}#1KTHoIY~pw1W6OXM3i$1n3vQ5R;mEFWc!h%pTH7u%XS|y z3oHT+T01frji)3vZ0`rIRRJ&n%-g;PJdcd0frF{MCU5~*vpovj1=^0^T-hGqhPyzl z@wDHLA4dNrz-k5S);j@s2mI*};5B8>0!fR&d0>uKTb0pS;3n{(WPNqAecN_(vo7cs z#6{a{SpY?^WThl&(sms<+6})=WqZqC!QH8UhqEX>4Tx04R}tkv&MmKpe$i(@I4uigplj$WWauh>AE$6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|}?mh0_0Yam~R5LIEsG4P@ z;xRFsTNQ(^2w)Hc=!YONQ%|H9Gw>W=_we!cF3PjK&;2=imAuISpGZ8%bi*RvAfDN@ zbk6(4VOEk9;&bA0gDyz?$aUG}H_ki6e@tQNECM zS>e3JS*_Gq>z@3Dp}e+|<~q$0#Ib|~k`N)IhB7L!5T#Wk#YBqsV;=rt$DbsZOs+B* zITlcb3d!+<|H1EW&BD~An-q!xT`#u%F$x5Cfo9#dzmILZc>?&Kfh(=;uQq_$Ptxmc zEpi0(Z37qAZB5<-E_Z;TCtWfmNAlAY3I*W(jJ_!c4Bi4gYi@6?eVjf38R}~J1~@nb z#)_1^?(y#K&ffk#)9UXB9r<#F?NYh)00006VoOIv00000008+zyMF)x010qNS#tmY z7ZCse7ZCx(c?#b}`=F=9vqq5(;; ziP2SgP!ki>#Au>T{1X!?ZMF%Ck$^5pBGJV7V6;!XT4Tfq4M7PHzSv+1im6~BbP2Gq z>}+?t?aW*sI@bQ5U1;lho6I@)`|des&U{C-)`Xeem8VuoJ+K4V4r~URfn|Y988{F0 z0Y3rXj%tRo2kg+ZWj+G&t~_@rX#u){mw+ghnGf^=`-@utdhE;1n0lW5Wx1G11tdKw=<*Ww24pO}kHUK=EN!zEVzfhAO%H!bcfRhUd4$uM|Po$hj zM9$2efket_0Db}1R&%?uCZh<498p<*YefWgHmZZ7ZZtQ$Hd|58BzVi3q= zeIpV+r29?aM3~o){cg?WNws{m)gn;OZrLHSaR2T?E zX1LhXaO{m3>zk&w#C69n-L-c(wyN?`R1|1XJDY8QPydG*@I}V;OX{f1I}L2jr0u?W7n4aO zt}1ve*a?fb0XzmA7I>)lO?%d?s<|RBrET|$r_;bX;A5ar1#lVY0Uju8-W^KYrHAjC zTb<4=zdwot3`xh$T?tF=(U8>8W*W2x>sCW>iL8j6Me}=5x}ybO-*66wN)7%2o69xkN^8POkZEGVLV}Wz z;$L7jabY9>0Vom|{t3z&sB8HLY*FNEC5dPuA#tGu7q--xeuQ*f+;j8pyv#5&(1b)! za&z80-}jvJ&b^QSJ2Zxrox~Jc*oo2LE#X&O!ne4H_GSgy#5Asl(Y#jhN34|^?|SGo zAJqATYBz1n;bV;J%-%@I&S1WfzbIwuzTg0s!_ax`9YVK-A4B&J_7Cg)9js#m$D|#? z3xP-QHMYe1s*u?hxQXLoV{MoqCZwHj;DexzVit$v{ZnaoIe<1k58f0`1sy<Xzgl zj;5;S#|rwGRNDq#QZ-!}z$#t|nfaQt;15ztM{zKCImMr;nyd_E!D1# z#ZcNR^+-1Zjo@vK=f%+72wQM2XsxU?QW(e$HXHaz;pnGOd>7ZG$#)e`$GRG{Ya!DP zogCPac>X5vd))%aX`c)FRKdF$cp~t#*o8-9?Fw2cb5jLV5y)K4S4RM2Qq6AQWz}Z{ zw*x<~KV+HP1#JtqOZ8t@d?95mSERbVh)3{Djkk)Yq^8TT6nM0tt>Yg&jwcHG-?)og zcn(j}nSqB6`BZC21EoCOz6_a@HF|vxv_nSdl=SV=hS%_Wc3NiOhLpB3{3ewnL!R${ z4zQ6dv#p^06*hNDC0ythz?H!Jq;L0Z!P^n|m%z*TS*q#XcwVl_>`=j3DGU4J{c^X+ z^C0>z-Zyg)y%92b5KVRqpd7_}f_6r#*(dIQ6rT=SOP^6pbr^kb^ADr*`W!}d9>+%u z`m53uyVr5NCe^*$ah!v`V1Rq#xavake$eU{l6=0G0h|clVX1U^l71Mrmhf6X=NZZ? z*-`zkWG9QA^}3S1J*e{x4{|A;)Ojf#+Ifa?o!9bt=~_OabB2uIb*b~u74jDhk@jBD z>&IkOI#_PSbIDsU;E&0$zh*6|$@WS+%Z;`ePA^GQZ&QEG{@d^`cxe77+*+%d00000 LNkvXXu0mjfx;(u! literal 0 HcmV?d00001 diff --git a/ui/linktype_twitch.png b/ui/linktype_twitch.png new file mode 100644 index 0000000000000000000000000000000000000000..32b95a1f1449c91eae824f2f7c8cd218e7f250de GIT binary patch literal 656 zcmV;B0&o3^P)!bXkjDBi57xgIPs&nJ3%~9 z3sEdgA$}Z)7K(z=oN>n@pqt&zy2&nU;{yxJ!_54idEcE`fr-Y0G7Nk-8qswDB-q!nf*T%k)(jG&% z^d8_nfUQ&TxeMw$An!w}UtR~j(=G%k^d=wOq6JV=uJ@&a?y7OE1xK6gp6%24CIOB% z*^LZQjieZe<-n+G0km)rw1-y3FINJ*1_z5D;o>l7`Nf>7z19$ZUw|5bM4Z^qFkA84 zmkmh?7f~94A|Qs~TWCf6)~;7j+ zxBHwB%%}}Ta2i?`2N?v`{~U}o9+Xiapt9!uUb;IM#A7BfBW2S9$Kcrna1@?tfcdNc q^f(E(9zZhd_tG8yBN9%+0iFOa{j)6;7MG3y0000kq;J literal 0 HcmV?d00001 diff --git a/ui/linktype_twitter.png b/ui/linktype_twitter.png new file mode 100644 index 0000000000000000000000000000000000000000..ce4173fd933eea421bb191e68507f70d343d0cab GIT binary patch literal 727 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%0D+`dQJbSb07J#&ynIjK=v`xRFdBJy|le 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 literal 0 HcmV?d00001 diff --git a/ui/streamfx.qrc b/ui/streamfx.qrc new file mode 100644 index 0000000..152443d --- /dev/null +++ b/ui/streamfx.qrc @@ -0,0 +1,13 @@ + + + logo.png + + + linktype_discord.png + linktype_facebook.png + linktype_generic.png + linktype_twitch.png + linktype_twitter.png + linktype_youtube.png + +