Skip to content

Commit b53de5a

Browse files
committed
UI: Refactor integration and browser docks
Use the QAction provided by QDockWidget with new Qt connection rather than creating a new one for each dock. Separate extra browser docks from extra docks, the latter is meant for plugin/integration docks.
1 parent 5a7d41b commit b53de5a

9 files changed

Lines changed: 212 additions & 108 deletions

UI/auth-restream.cpp

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,28 @@ using namespace json11;
2424
#define RESTREAM_STREAMKEY_URL "https://api.restream.io/v2/user/streamKey"
2525
#define RESTREAM_SCOPE_VERSION 1
2626

27+
#define RESTREAM_CHAT_DOCK_NAME "restreamChat"
28+
#define RESTREAM_INFO_DOCK_NAME "restreamInfo"
29+
#define RESTREAM_CHANNELS_DOCK_NAME "restreamChannel"
30+
2731
static Auth::Def restreamDef = {"Restream", Auth::Type::OAuth_StreamKey};
2832

2933
/* ------------------------------------------------------------------------- */
3034

3135
RestreamAuth::RestreamAuth(const Def &d) : OAuthStreamKey(d) {}
3236

37+
RestreamAuth::~RestreamAuth()
38+
{
39+
if (!uiLoaded)
40+
return;
41+
42+
OBSBasic *main = OBSBasic::Get();
43+
44+
main->RemoveDockWidget(RESTREAM_CHAT_DOCK_NAME);
45+
main->RemoveDockWidget(RESTREAM_INFO_DOCK_NAME);
46+
main->RemoveDockWidget(RESTREAM_CHANNELS_DOCK_NAME);
47+
}
48+
3349
bool RestreamAuth::GetChannelInfo()
3450
try {
3551
std::string client_id = RESTREAM_CLIENTID;
@@ -134,52 +150,49 @@ void RestreamAuth::LoadUI()
134150
QSize size = main->frameSize();
135151
QPoint pos = main->pos();
136152

137-
chat.reset(new BrowserDock());
138-
chat->setObjectName("restreamChat");
153+
BrowserDock *chat = new BrowserDock();
154+
chat->setObjectName(RESTREAM_CHAT_DOCK_NAME);
139155
chat->resize(420, 600);
140156
chat->setMinimumSize(200, 300);
141157
chat->setWindowTitle(QTStr("Auth.Chat"));
142158
chat->setAllowedAreas(Qt::AllDockWidgetAreas);
143159

144-
browser = cef->create_widget(chat.data(), url, panel_cookies);
160+
browser = cef->create_widget(chat, url, panel_cookies);
145161
chat->SetWidget(browser);
146162

147-
main->addDockWidget(Qt::RightDockWidgetArea, chat.data());
148-
chatMenu.reset(main->AddDockWidget(chat.data()));
163+
main->AddDockWidget(chat, Qt::RightDockWidgetArea);
149164

150165
/* ----------------------------------- */
151166

152167
url = "https://restream.io/titles/embed";
153168

154-
info.reset(new BrowserDock());
155-
info->setObjectName("restreamInfo");
169+
BrowserDock *info = new BrowserDock();
170+
info->setObjectName(RESTREAM_INFO_DOCK_NAME);
156171
info->resize(410, 600);
157172
info->setMinimumSize(200, 150);
158173
info->setWindowTitle(QTStr("Auth.StreamInfo"));
159174
info->setAllowedAreas(Qt::AllDockWidgetAreas);
160175

161-
browser = cef->create_widget(info.data(), url, panel_cookies);
176+
browser = cef->create_widget(info, url, panel_cookies);
162177
info->SetWidget(browser);
163178

164-
main->addDockWidget(Qt::LeftDockWidgetArea, info.data());
165-
infoMenu.reset(main->AddDockWidget(info.data()));
179+
main->AddDockWidget(info, Qt::LeftDockWidgetArea);
166180

167181
/* ----------------------------------- */
168182

169183
url = "https://restream.io/channel/embed";
170184

171-
channels.reset(new BrowserDock());
172-
channels->setObjectName("restreamChannel");
185+
BrowserDock *channels = new BrowserDock();
186+
channels->setObjectName(RESTREAM_CHANNELS_DOCK_NAME);
173187
channels->resize(410, 600);
174188
channels->setMinimumSize(410, 300);
175189
channels->setWindowTitle(QTStr("RestreamAuth.Channels"));
176190
channels->setAllowedAreas(Qt::AllDockWidgetAreas);
177191

178-
browser = cef->create_widget(channels.data(), url, panel_cookies);
192+
browser = cef->create_widget(channels, url, panel_cookies);
179193
channels->SetWidget(browser);
180194

181-
main->addDockWidget(Qt::LeftDockWidgetArea, channels.data());
182-
channelMenu.reset(main->AddDockWidget(channels.data()));
195+
main->AddDockWidget(channels, Qt::LeftDockWidgetArea);
183196

184197
/* ----------------------------------- */
185198

UI/auth-restream.hpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,6 @@ class BrowserDock;
77
class RestreamAuth : public OAuthStreamKey {
88
Q_OBJECT
99

10-
QSharedPointer<BrowserDock> chat;
11-
QSharedPointer<BrowserDock> info;
12-
QSharedPointer<BrowserDock> channels;
13-
14-
QSharedPointer<QAction> chatMenu;
15-
QSharedPointer<QAction> infoMenu;
16-
QSharedPointer<QAction> channelMenu;
17-
1810
bool uiLoaded = false;
1911

2012
virtual bool RetryLogin() override;
@@ -28,6 +20,7 @@ class RestreamAuth : public OAuthStreamKey {
2820

2921
public:
3022
RestreamAuth(const Def &d);
23+
~RestreamAuth();
3124

3225
static std::shared_ptr<Auth> Login(QWidget *parent,
3326
const std::string &service_name);

UI/auth-twitch.cpp

Lines changed: 45 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ using namespace json11;
2727

2828
#define TWITCH_SCOPE_VERSION 1
2929

30+
#define TWITCH_CHAT_DOCK_NAME "twitchChat"
31+
#define TWITCH_INFO_DOCK_NAME "twitchInfo"
32+
#define TWITCH_STATS_DOCK_NAME "twitchStats"
33+
#define TWITCH_FEED_DOCK_NAME "twitchFeed"
34+
3035
static Auth::Def twitchDef = {"Twitch", Auth::Type::OAuth_StreamKey};
3136

3237
/* ------------------------------------------------------------------------- */
@@ -49,6 +54,19 @@ TwitchAuth::TwitchAuth(const Def &d) : OAuthStreamKey(d)
4954
&TwitchAuth::TryLoadSecondaryUIPanes);
5055
}
5156

57+
TwitchAuth::~TwitchAuth()
58+
{
59+
if (!uiLoaded)
60+
return;
61+
62+
OBSBasic *main = OBSBasic::Get();
63+
64+
main->RemoveDockWidget(TWITCH_CHAT_DOCK_NAME);
65+
main->RemoveDockWidget(TWITCH_INFO_DOCK_NAME);
66+
main->RemoveDockWidget(TWITCH_STATS_DOCK_NAME);
67+
main->RemoveDockWidget(TWITCH_FEED_DOCK_NAME);
68+
}
69+
5270
bool TwitchAuth::MakeApiRequest(const char *path, Json &json_out)
5371
{
5472
std::string client_id = TWITCH_CLIENTID;
@@ -233,16 +251,16 @@ void TwitchAuth::LoadUI()
233251
QSize size = main->frameSize();
234252
QPoint pos = main->pos();
235253

236-
chat.reset(new BrowserDock());
237-
chat->setObjectName("twitchChat");
254+
BrowserDock *chat = new BrowserDock();
255+
chat->setObjectName(TWITCH_CHAT_DOCK_NAME);
238256
chat->resize(300, 600);
239257
chat->setMinimumSize(200, 300);
240258
chat->setWindowTitle(QTStr("Auth.Chat"));
241259
chat->setAllowedAreas(Qt::AllDockWidgetAreas);
242260

243-
browser = cef->create_widget(chat.data(), url, panel_cookies);
261+
browser = cef->create_widget(chat, url, panel_cookies);
244262
chat->SetWidget(browser);
245-
cef->add_force_popup_url(moderation_tools_url, chat.data());
263+
cef->add_force_popup_url(moderation_tools_url, chat);
246264

247265
if (App()->IsThemeDark()) {
248266
script = "localStorage.setItem('twilight.theme', 1);";
@@ -261,8 +279,7 @@ void TwitchAuth::LoadUI()
261279

262280
browser->setStartupScript(script);
263281

264-
main->addDockWidget(Qt::RightDockWidgetArea, chat.data());
265-
chatMenu.reset(main->AddDockWidget(chat.data()));
282+
main->AddDockWidget(chat, Qt::RightDockWidgetArea);
266283

267284
/* ----------------------------------- */
268285

@@ -321,39 +338,37 @@ void TwitchAuth::LoadSecondaryUIPanes()
321338
url += name;
322339
url += "/stream-manager/edit-stream-info";
323340

324-
info.reset(new BrowserDock());
325-
info->setObjectName("twitchInfo");
341+
BrowserDock *info = new BrowserDock();
342+
info->setObjectName(TWITCH_INFO_DOCK_NAME);
326343
info->resize(300, 650);
327344
info->setMinimumSize(200, 300);
328345
info->setWindowTitle(QTStr("Auth.StreamInfo"));
329346
info->setAllowedAreas(Qt::AllDockWidgetAreas);
330347

331-
browser = cef->create_widget(info.data(), url, panel_cookies);
348+
browser = cef->create_widget(info, url, panel_cookies);
332349
info->SetWidget(browser);
333350
browser->setStartupScript(script);
334351

335-
main->addDockWidget(Qt::RightDockWidgetArea, info.data());
336-
infoMenu.reset(main->AddDockWidget(info.data()));
352+
main->AddDockWidget(info, Qt::RightDockWidgetArea);
337353

338354
/* ----------------------------------- */
339355

340356
url = "https://www.twitch.tv/popout/";
341357
url += name;
342358
url += "/dashboard/live/stats";
343359

344-
stat.reset(new BrowserDock());
345-
stat->setObjectName("twitchStats");
346-
stat->resize(200, 250);
347-
stat->setMinimumSize(200, 150);
348-
stat->setWindowTitle(QTStr("TwitchAuth.Stats"));
349-
stat->setAllowedAreas(Qt::AllDockWidgetAreas);
360+
BrowserDock *stats = new BrowserDock();
361+
stats->setObjectName(TWITCH_STATS_DOCK_NAME);
362+
stats->resize(200, 250);
363+
stats->setMinimumSize(200, 150);
364+
stats->setWindowTitle(QTStr("TwitchAuth.Stats"));
365+
stats->setAllowedAreas(Qt::AllDockWidgetAreas);
350366

351-
browser = cef->create_widget(stat.data(), url, panel_cookies);
352-
stat->SetWidget(browser);
367+
browser = cef->create_widget(stats, url, panel_cookies);
368+
stats->SetWidget(browser);
353369
browser->setStartupScript(script);
354370

355-
main->addDockWidget(Qt::RightDockWidgetArea, stat.data());
356-
statMenu.reset(main->AddDockWidget(stat.data()));
371+
main->AddDockWidget(stats, Qt::RightDockWidgetArea);
357372

358373
/* ----------------------------------- */
359374

@@ -362,36 +377,35 @@ void TwitchAuth::LoadSecondaryUIPanes()
362377
url += "/stream-manager/activity-feed";
363378
url += "?uuid=" + uuid;
364379

365-
feed.reset(new BrowserDock());
366-
feed->setObjectName("twitchFeed");
380+
BrowserDock *feed = new BrowserDock();
381+
feed->setObjectName(TWITCH_FEED_DOCK_NAME);
367382
feed->resize(300, 650);
368383
feed->setMinimumSize(200, 300);
369384
feed->setWindowTitle(QTStr("TwitchAuth.Feed"));
370385
feed->setAllowedAreas(Qt::AllDockWidgetAreas);
371386

372-
browser = cef->create_widget(feed.data(), url, panel_cookies);
387+
browser = cef->create_widget(feed, url, panel_cookies);
373388
feed->SetWidget(browser);
374389
browser->setStartupScript(script);
375390

376-
main->addDockWidget(Qt::RightDockWidgetArea, feed.data());
377-
feedMenu.reset(main->AddDockWidget(feed.data()));
391+
main->AddDockWidget(feed, Qt::RightDockWidgetArea);
378392

379393
/* ----------------------------------- */
380394

381395
info->setFloating(true);
382-
stat->setFloating(true);
396+
stats->setFloating(true);
383397
feed->setFloating(true);
384398

385-
QSize statSize = stat->frameSize();
399+
QSize statSize = stats->frameSize();
386400

387401
info->move(pos.x() + 50, pos.y() + 50);
388-
stat->move(pos.x() + size.width() / 2 - statSize.width() / 2,
389-
pos.y() + size.height() / 2 - statSize.height() / 2);
402+
stats->move(pos.x() + size.width() / 2 - statSize.width() / 2,
403+
pos.y() + size.height() / 2 - statSize.height() / 2);
390404
feed->move(pos.x() + 100, pos.y() + 100);
391405

392406
if (firstLoad) {
393407
info->setVisible(true);
394-
stat->setVisible(false);
408+
stats->setVisible(false);
395409
feed->setVisible(false);
396410
} else {
397411
uint32_t lastVersion = config_get_int(App()->GlobalConfig(),

UI/auth-twitch.hpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,6 @@ class TwitchAuth : public OAuthStreamKey {
1515

1616
friend class TwitchLogin;
1717

18-
QSharedPointer<BrowserDock> chat;
19-
QSharedPointer<BrowserDock> info;
20-
QSharedPointer<BrowserDock> stat;
21-
QSharedPointer<BrowserDock> feed;
22-
QSharedPointer<QAction> chatMenu;
23-
QSharedPointer<QAction> infoMenu;
24-
QSharedPointer<QAction> statMenu;
25-
QSharedPointer<QAction> feedMenu;
2618
bool uiLoaded = false;
2719

2820
std::string name;
@@ -40,6 +32,7 @@ class TwitchAuth : public OAuthStreamKey {
4032

4133
public:
4234
TwitchAuth(const Def &d);
35+
~TwitchAuth();
4336

4437
static std::shared_ptr<Auth> Login(QWidget *parent,
4538
const std::string &service_name);

UI/auth-youtube.cpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ using namespace json11;
4242
#define YOUTUBE_CHAT_POPOUT_URL \
4343
"https://www.youtube.com/live_chat?is_popout=1&dark_theme=1&v=%1"
4444

45+
#define YOUTUBE_CHAT_DOCK_NAME "ytChat"
46+
4547
static const char allowedChars[] =
4648
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
4749
static const int allowedCount = static_cast<int>(sizeof(allowedChars) - 1);
@@ -71,6 +73,19 @@ YoutubeAuth::YoutubeAuth(const Def &d)
7173
{
7274
}
7375

76+
YoutubeAuth::~YoutubeAuth()
77+
{
78+
if (!uiLoaded)
79+
return;
80+
81+
#ifdef BROWSER_AVAILABLE
82+
OBSBasic *main = OBSBasic::Get();
83+
84+
main->RemoveDockWidget(YOUTUBE_CHAT_DOCK_NAME);
85+
chat = nullptr;
86+
#endif
87+
}
88+
7489
bool YoutubeAuth::RetryLogin()
7590
{
7691
return true;
@@ -139,20 +154,19 @@ void YoutubeAuth::LoadUI()
139154
QSize size = main->frameSize();
140155
QPoint pos = main->pos();
141156

142-
chat.reset(new YoutubeChatDock());
143-
chat->setObjectName("ytChat");
157+
chat = new YoutubeChatDock();
158+
chat->setObjectName(YOUTUBE_CHAT_DOCK_NAME);
144159
chat->resize(300, 600);
145160
chat->setMinimumSize(200, 300);
146161
chat->setWindowTitle(QTStr("Auth.Chat"));
147162
chat->setAllowedAreas(Qt::AllDockWidgetAreas);
148163

149-
browser = cef->create_widget(chat.data(), YOUTUBE_CHAT_PLACEHOLDER_URL,
164+
browser = cef->create_widget(chat, YOUTUBE_CHAT_PLACEHOLDER_URL,
150165
panel_cookies);
151166
browser->setStartupScript(ytchat_script);
152167

153168
chat->SetWidget(browser);
154-
main->addDockWidget(Qt::RightDockWidgetArea, chat.data());
155-
chatMenu.reset(main->AddDockWidget(chat.data()));
169+
main->AddDockWidget(chat, Qt::RightDockWidgetArea);
156170

157171
chat->setFloating(true);
158172
chat->move(pos.x() + size.width() - chat->width() - 50, pos.y() + 50);

UI/auth-youtube.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ class YoutubeAuth : public OAuthStreamKey {
4343
std::string section;
4444

4545
#ifdef BROWSER_AVAILABLE
46-
QSharedPointer<YoutubeChatDock> chat;
47-
QSharedPointer<QAction> chatMenu;
46+
YoutubeChatDock *chat;
4847
#endif
4948

5049
virtual bool RetryLogin() override;
@@ -56,6 +55,7 @@ class YoutubeAuth : public OAuthStreamKey {
5655

5756
public:
5857
YoutubeAuth(const Def &d);
58+
~YoutubeAuth();
5959

6060
void SetChatId(const QString &chat_id, const std::string &api_chat_id);
6161
void ResetChat();

0 commit comments

Comments
 (0)