From 4b4703f37b657d9734d6e314c28b33113bfa1930 Mon Sep 17 00:00:00 2001 From: David Marsh Date: Tue, 16 Jul 2024 14:16:40 +0100 Subject: [PATCH] Add in platform icons, fix vertical warning bug, WIP new output dialog --- CMakeLists.txt | 2 ++ config-dialog.cpp | 46 +++++++++++++++++++++++++++++++++--- data/locale/en-US.ini | 2 ++ media/facebook.png | Bin 0 -> 1865 bytes media/tiktok.png | Bin 0 -> 4996 bytes media/trovo.png | Bin 0 -> 7340 bytes media/twitch.png | Bin 0 -> 2658 bytes media/twitter.png | Bin 0 -> 5293 bytes media/unknown.png | Bin 0 -> 2408 bytes media/youtube.png | Bin 0 -> 1992 bytes multistream.cpp | 53 ++++++++++++++++++++++++++++++++++++++---- multistream.hpp | 15 +++++++++++- output-dialog.cpp | 41 ++++++++++++++++++++++++++++++++ output-dialog.hpp | 16 +++++++++++++ resources.qrc | 7 ++++++ 15 files changed, 174 insertions(+), 8 deletions(-) create mode 100644 media/facebook.png create mode 100644 media/tiktok.png create mode 100644 media/trovo.png create mode 100644 media/twitch.png create mode 100644 media/twitter.png create mode 100644 media/unknown.png create mode 100644 media/youtube.png create mode 100644 output-dialog.cpp create mode 100644 output-dialog.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d48fc6..43d0944 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/config-dialog.cpp b/config-dialog.cpp index be207e1..a0b270a 100644 --- a/config-dialog.cpp +++ b/config-dialog.cpp @@ -26,6 +26,7 @@ #include #include +#include "output-dialog.hpp" template std::string to_string_with_precision(const T a_value, const int n = 6) { @@ -161,10 +162,45 @@ OBSBasicSettings::OBSBasicSettings(QMainWindow *parent) : QDialog(parent) AddServer(mainOutputsLayout, s); 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); auto serverGroup = new QGroupBox; @@ -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); diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 2ba154a..3d721ff 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -26,3 +26,5 @@ Stream="Stream" MainOutputNotActive="Main output not active!" NewVersion="New version (%1) available here" 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." diff --git a/media/facebook.png b/media/facebook.png new file mode 100644 index 0000000000000000000000000000000000000000..b042da5ea706fbfef3f9054375e220064cd87a07 GIT binary patch literal 1865 zcmV-P2e$Z$P)cWWAXLnDIRj+fEXx?OXg9>Irq zTU2~rM@vs?0nMsge;2WK?DB^Cx z$M2w?Aa~&V9W^IH@bR6~Uz{$;8a$GUIT3=d-xhsM7vy2_2A(EM1fNebRghc6&^8Nt z1mEL=APIh)i8&GYiCWY(A;?YQ3_MFV2>HQDLGH@VmPn1S5CmC-Et#4UA!x9uB-Aq& zWNb_%Xt22?6qh3T;D!p;XKh7lRHr-$aZR%oq0X|tg0)#&(Gf;5h#`y#B9t+&_P1I) zW~BDKgo;pj?y4P=zF2E3Sdn_SouDLCxlaiKbo1VothKRFtvl&ECY=2fsgY#bUsx(+d&g#{??%YKAhkNix>+a^-1k?u{vOMPjdzJl?{7*` z42mGgIOeme%_70J|FHFOtP1VDt#X(n@_$nwM;BMNxq0s1oq`YxvC1M zrYnEl^M&t*TiOAGE<*YPv&_Iy>b*A2OK-{~UXD@L3>@m0`pS2rAT!e2F9aSb69uWm z@pJ6&6Do`;69uWmzCK0<#1WDg4)qHY$qc*`1*yZ~evM}mW|=5R9bP*nvt(oxqz;Gr zW#*YENF5HHmdOpBECi`i$?<7W#p@YGSY$Lp$~i9K9X-Rz3`a=%$;GR9^ksG&Y^=sH zK1@>KnLAnCVxsT6J9u#~rDYdCF2Tvc+LMfS_@*z&0*>}^^mUDem4oQw+-U1vKK~kf z{voV*zZ4Z0GQ1f?TImZiCMoE@2>RD38N}`q&f@8ejfwCK&Q44WAIs2? zNZ>Ip%+z<_)yzzZyo&8y5TuHqW@b+0XKHI*rslH#h`(fF&fI1vwoUvqJ-K*~oTgF= z@>M0xG9dVTlIemR#Me_Zr$Le=-|Ko;pa-{#Gx}!ur{J?5)1s-FXm*jqHhdg6<0&yq zT#rG)H#g%GrcC-8p_L6gRUz-P9gDFUpTc_Kx7k%}3UPqbwqZuPOgJal-f8lR< zq4s)9{2y{>U&XFKlXL(801jnXNoGw=04e|g00;m8000000Mb*F00000NkvXXu0mjf Dnecdn literal 0 HcmV?d00001 diff --git a/media/tiktok.png b/media/tiktok.png new file mode 100644 index 0000000000000000000000000000000000000000..166f8ca9eae2504645ebf506ade2d0c0609cf427 GIT binary patch literal 4996 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.hfqUzA|n3+2EiYfX&U-LlhAa;Gpit8+0H&Ver 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 S(o>TF0000#wn literal 0 HcmV?d00001 diff --git a/media/twitch.png b/media/twitch.png new file mode 100644 index 0000000000000000000000000000000000000000..0671138b98a58ee14b1335d041a31aba4b32bb9f GIT binary patch literal 2658 zcmV-o3Z3m|@Ep1n!w$n6PM$5KND?%!(v`tfo0JYV+m8x{5R8ycZZ9uA#4ps`JtdLFR zSAhU=NC^IwySG2i3BkXx9iQ)F-{&94@9y3E>idcB-M#nDmew!3!2oar^MD1wJ-{TO z92g1|4dlRsfDmvUxCER8J_Ysz2Y~KO4=QCKL;@B8j{x@rLo#hVPw@lq1Fr(R0g+B+ zInBnF0Ura6z_+nv#A66rZW_^YwKSc|sS240d;q)yOi!nQ0%tn#E?Vv;rcxmlA>RT1 z4J^z&u7YPFS`Ht+-HyqGNWiavZ9qwO;worLfH%={Dka(}kq`;^9q?TC<0^Qb170D4 zlte<-1FQ6k$b!ewavVcEArAvv>Y#wE{qm35!jTIa4bN}^(|Ll(L!Fq>cDf! zFtnWa(O<|itV>%XScsN;;HD4>_?aQ$SOEN-$W>RbkZ)k!fg8y*wDG|{A&(dri$#Q$ zpb2pU4;mVZ1!xZ3GTMBG)8Jq%Gzar!w8LQ3Ycu$0GMhA?#}*k z(?gOVtOQZiFhVE@p`wZ&6w!mChEUZW?Y$b--U|g)gi+KUR1rp1dr(9eMGd101tFA} zSAjqXfk2J4AwZH4LZxp~PiU{A-y~n}-xAU-R_*(nNTPwL_fbiW2#6dgD!BqJ z<nNGXt(b9k&98o;MJzJ{QW;00Al_F2LtZn zQdBi-hZ|-m$E!nx5ER>s@VH>h{?+U|xiOc`o1G$iE?W~qV3QqGmD+jZ;BOMjaJgI* z7Z>L;w3JX3h0e}SUE9c+kX{*gjC8Q$<3FcrA0+Wh3;*nyDlqjdS#6FIC$^KmfOkz z= zh9$&gSVBxj-Ux{|z3TV-lh%nhRovFrmaUL7BB#rM^rX7F8n4%jENlN`LI}#s%ahir ztgO7Hj;gB6ojX_eSd)=ALY6OI&hq6kPZ=krrlyAG=4PED%8a}@W#tQ&kTfVOE7QFV zOGp|VJ9bR>HY_12a`50mmM&cyQ=aV=`+3u;>q%2n6Z7ZKkGrkQ--a!V|JK$gMoktUrrfUNVGT$G7nIp+~cQ=olIr z8rZyfbKGrPw{B(Cs#OGo!K9}aNs>?#JlpJX-^EWC|C3QAWt{iBksCn$WI!HV_Bx%hUt|<5BNJ@0i)ZRT zqN=p2pA7vO^q-JuvLVA^8^-GTgG?E74`sE~@`vsk@o2Z{<8u61LR&C`|YD8!s!*H>OLjn(!02=%~~>o-g# z19TE%mmv_29W^zY@t!a9lSLomE-vEYHS?UN`lE}G_8UFiU0%oi(|?UkcBEWSl59Bb zcJ`ilnaf?DrChJJ`o{?2L{Worw+jRgo0Hn==W!L8R|e=Lq$?1l(ld>zi713Xo`kE)U5 zIny36WCkzC?3aN9K<2YMS;i(qTj!@hqywK&!xtR^Bq@6fnoUXoI3NSvzWg>6Fv0#1cPiSWsuW_mh(QMh5Q$IEN9_ZJPx$>FNileunpLdlW+=~ z4M5EAcqE#wSquDL*Ki7(O=vleA(0RPJPEw0S40KOi)j5u+}X5b^O*v89#{eB`{R9u zK_~D%w45fK+Dv7F`Om;Cw97M#%-D;T!#~|_$5dzhTY-hZLzv)>eh~2qTFw>{bv2cU zbeCYf1AGZs47`nrMu|;C04+C*ff@9>=}U!7R-Fj6ahF}dP+%TV158ExZT9j=dFm_V z1}9Xi=R2G6}u_000hUSV?A0O#mtY000O800000007cc QlK=n!07*qoM6N<$f{5kX)c^nh literal 0 HcmV?d00001 diff --git a/media/twitter.png b/media/twitter.png new file mode 100644 index 0000000000000000000000000000000000000000..c5a12ccd9b4ce1b5f2bb09add356da3b72dec884 GIT binary patch literal 5293 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 literal 0 HcmV?d00001 diff --git a/media/unknown.png b/media/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..e5844661411f1aed0365e1d56bf33119cd1dbdc0 GIT binary patch literal 2408 zcmV-u377VXP)G_QMaV2H zv^?U^Y+ChoYeVh@4&luiiQ*zKf)=Z<)g(NB5)FA+p9hf?cuiL- z@xTKTNIiN;n>IRKjFl4*SVxr^MU!@r{g3&T&jCAan+p0Rs zcHJ-}SJG9N#l(gkJEVdFyR4iX>Fu|rrY5&lMaor4xv4!|h2rd4Y0jKrv^@BrbmWNJ zsv@P_j~yk+6O}G&Q-cu00+>(k{3EEaJxb^U{I^lFw(+ zGJLpn=#bm0!m$fUKe(+TD)#S}9)DaqdD6Meo;}jQfo4jVF4AkSNevB&(-=8FAnB~z zDx#vaG`Ks$#K(>ezvQi{ zk?yE=24MB1kQd1M#Jk-veQemNWbl0xZ z+O<-n!^qswAieskP4-}u|K7c^)6zkb!;t)ZsiGpbOVZzezjeu5R1|&^|L!}fq{Pbl zeD>M%=VPZQLXyLftSsw@{{5wQ-?gD9R_xm+-E&WH60fR~E?*8^_S!XR-8zdZuqgZT z%h+j&faEYFJ3Bb;gH%=~?TX=k_0lD2$o-ib* zAz&%>6)U8pMHav8{Dy$k zt(#5y-+t>{$B7ft`0>HdOqwK}I^|rxwpJQ7Dp-E@Z0XFI&}FY*m)?Kh4!{D@yLD@H z*X%%Q7!r8(>nFYOhV;uXq3daGmNssb^70}(Z*OXnHf#tEOMUv-2Gfb-$8R;gq9Xhd z*$Gn1ke2C@UAt_u4n5QG;ynlam*WQZMH6-vVE|%VV z&$79pICV-YFAtUCtXZ&Pg&CA0q^}_X3JYQNYIy1?xa+R?v=Kwn-;e;4C&Tm4LwPy)9KTWKI+8F!!($7po0J?XF2@~M;*J0GC#I_xV%rzuH z|Nc-}3C}*86qCMZNPuzU;H8)B-)`Mpli?ZCTF0VAHt7!?>WT!L!lOpXNAoC2#%CbF0bu~QtsM~7VkXeQl62q_h;)tg-X+B$%|@BYh3&+t*Sa3l`V}o+6~5 zA-TD>)2^R7avPGJ4P(bzR7{-cwwi>HyoL-JVs{Nb^Gwnv0^>pQ8IqG@dx|AX z?54B~BROuA3mlo2mRicAqQZ_|3)Lj89S{Za>+%t`6?J6MCe^ ze)0oH+*aXnlOulMfZHlOZgRjU zDHk{kWah#@d1wH7`+>{APM5`az%Jl&;0}P#T@>PBd=9~R_VTi(HTQp(j6EBj0K8; zK|sNc_v8Q5IquQ~TmsGjKLY;&YJh*;c)wHpAG9v@=kFgHt^fc44rN$LW=%~1DgXcg a2mk;800000(o>TF00003{-t^-UB zI|@sVsWAmTjQ)azsE~}QY%{#Y3c+-j2Tc{3pF(`bt+7lpl$MGh{yGBDl1{^SQs}B zDk`)96&3l<{RuLrpIu0$^irw32&t6*oKEXyPY)y#`gYaDQb0;sz;>Aj3GGV7HIJRyT&7bTkD<0S9+v;jDmyuxQO8DUi5m&Oe zy}Ngpo)`efj)}RFJ3`9K^_@vom595@v3xl+H+yy?cZAHJU%Fxdy!obx8#zH{&J=SM zNtP`WaU&FXn1c&Yy=5K7htXXl)HGDJaGc*>Y%AfH=&!rbXmMnp9zYQ-AfgFquL0o?M1>SfA-hSJk&ZD6aIBm-aQdTDNlq$x_ldxa` z?AoQfYJ+0zSkEqG1gWevOAyfAtvh$>>&wxj!ECd#vj0B*B9IZpEkH1ln>S&@254x| zec^uM7Grpzbn3D$T!7W9btB-ZQ~qqDtV~zJctA!FxArLtT)U=Ae*D03ba|2&7b1aV zGUhy-4aBTjaQLvUyJ~FoXB+9XE>-Y=Orcyd8SLFmF;rB*wr#L=tLF>ukhs;69*~JJ zmGbX2;DwDFVaJZ(dNY&BeAVO#k^9SZc8a<3%#tOre?P1U_K%#N0)WJ9i8_LI8gJQPf?exO`c}jjSM_ek$rNQXDxV;zm}G zOPApIaZ#6%;NnI2`fCwa@&gAr4z#qu!iA!4jpgoLcb7O8xYcQkypUlCxk&l&h_U7hiEtuoz|C2jXkV`71*T-V{ zA(=oglgYdwsZ{=ZGU>TeL=rOvDPc;daxo%UK@7tRVi*p3)?3}T9|!Q>t74JjssmgJI|@sVD-Lij>?kZb&e=)9%po@^SQjAEyJGReH$a#BV0bjd zKrEW0@a)v9E$A61Ey2@g>Qx2o3N0MVCuCdQ3+Gcmjh!(%XujvEocA}u{jcbGzAgUK z0W1doa#s|#_O<~Z1sPF^vx%p~fc~4`zXbLM5>9Ee7x<#jTGhYB6ddriBBiwLa5l$% zazBtDt|(0g1V7rWX&^C%62!H46|@_$BT=_@1?z{(_izM3!5jr=4A`lt+L>$)hs^bG z1#zuW!EXlaU{tIno3ml(xL85lYs)GH#}yUYKD6#xJL4rN$LW=%~1DgXcg a2mk;800000(o>TF0000LoadVerticalOutputs(); + 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)) { - showVerticalWarning(verticalCanvasLayout); // show warning + if (firstLoad) { // only display warning on first load + showVerticalWarning(verticalCanvasLayout); // show warning + } calldata_free(&cd); return; } diff --git a/multistream.hpp b/multistream.hpp index a20da7e..8d42702 100644 --- a/multistream.hpp +++ b/multistream.hpp @@ -7,6 +7,7 @@ #include #include #include +#include class OBSBasicSettings; @@ -40,8 +41,20 @@ 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); @@ -54,5 +67,5 @@ private slots: public: MultistreamDock(QWidget *parent = nullptr); ~MultistreamDock(); - void LoadVerticalOutputs(); + void LoadVerticalOutputs(bool firstLoad = true); }; diff --git a/output-dialog.cpp b/output-dialog.cpp new file mode 100644 index 0000000..c5ec4f1 --- /dev/null +++ b/output-dialog.cpp @@ -0,0 +1,41 @@ +#include "output-dialog.hpp" + +#include +#include +#include + +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; +} + diff --git a/output-dialog.hpp b/output-dialog.hpp new file mode 100644 index 0000000..4470655 --- /dev/null +++ b/output-dialog.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include +#include +#include + +class OutputDialog : public QWizard { + Q_OBJECT +private: + QWizardPage *WizardPage1(); + QWizardPage *WizardPage2(); + QWizardPage *WizardPage3(); + +public: + OutputDialog(QDialog *parent); +}; diff --git a/resources.qrc b/resources.qrc index 00b29c5..7c8d372 100644 --- a/resources.qrc +++ b/resources.qrc @@ -3,5 +3,12 @@ media/aitum.png media/stream.svg media/streaming.svg + media/facebook.png + media/tiktok.png + media/trovo.png + media/twitch.png + media/twitter.png + media/unknown.png + media/youtube.png