diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c83a6d12b5..0cda2dbdf34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - Minor: Added chatter count for each category in viewer list. (#3683) - Minor: Sorted usernames in /vips message to be case-insensitive. (#3696) - Minor: Added option to open a user's chat in a new tab from the usercard profile picture context menu. (#3625) +- Minor: Added option to open a user's chat in a new tab/split/window by CTRL/ALT/SHIFT+Left Clicking (#3766) - Minor: Fixed tag parsing for consecutive escaped characters. (#3711) - Minor: Prevent user from entering incorrect characters in Live Notifications channels list. (#3715, #3730) - Minor: Fixed automod caught message notice appearing twice for mods. (#3717) diff --git a/src/controllers/commands/CommandController.cpp b/src/controllers/commands/CommandController.cpp index e4fe0f20e01..423c8be50fe 100644 --- a/src/controllers/commands/CommandController.cpp +++ b/src/controllers/commands/CommandController.cpp @@ -742,15 +742,7 @@ void CommandController::initialize(Settings &, Paths &paths) return ""; } - auto *app = getApp(); - Window &window = app->windows->createWindow(WindowType::Popup, true); - - auto *split = new Split(static_cast( - window.getNotebook().getOrAddSelectedPage())); - - split->setChannel(app->twitch->getOrAddChannel(target)); - - window.getNotebook().getOrAddSelectedPage()->appendSplit(split); + getApp()->windows->createChannelWindow(target); return ""; }); diff --git a/src/singletons/WindowManager.cpp b/src/singletons/WindowManager.cpp index 81d2af113a5..2c9c74ab070 100644 --- a/src/singletons/WindowManager.cpp +++ b/src/singletons/WindowManager.cpp @@ -275,6 +275,32 @@ Window &WindowManager::createWindow(WindowType type, bool show) return *window; } +Window &WindowManager::createChannelWindow(ChannelPtr channel) +{ + Window &window = this->createWindow(WindowType::Popup, true); + auto split = + window.getNotebook().getOrAddSelectedPage()->appendNewSplit(false); + split->setChannel(channel); + window.getNotebook().getOrAddSelectedPage()->refreshTab(); + return window; +} + +Window &WindowManager::createChannelWindow(QString channelName) +{ + return this->createChannelWindow( + getApp()->twitch->getOrAddChannel(channelName)); +} + +Window &WindowManager::createChannelWindow(Split *split) +{ + Window &window = + this->createChannelWindow(split->getIndirectChannel().get()); + Split *_split = window.getNotebook().getOrAddSelectedPage()->getSplits()[0]; + _split->setModerationMode(split->getModerationMode()); + _split->setFilters(split->getFilters()); + return window; +} + void WindowManager::select(Split *split) { this->selectSplit.invoke(split); diff --git a/src/singletons/WindowManager.hpp b/src/singletons/WindowManager.hpp index c3d7c75f552..e91054a4077 100644 --- a/src/singletons/WindowManager.hpp +++ b/src/singletons/WindowManager.hpp @@ -59,6 +59,11 @@ class WindowManager final : public Singleton Window &getSelectedWindow(); Window &createWindow(WindowType type, bool show = true); + // Opens a channel in new popup window + Window &createChannelWindow(ChannelPtr channel); + Window &createChannelWindow(QString channelName); + Window &createChannelWindow(Split *split); + void select(Split *split); void select(SplitContainer *container); diff --git a/src/widgets/dialogs/UserInfoPopup.cpp b/src/widgets/dialogs/UserInfoPopup.cpp index b2c8bd4f579..743bc19e7de 100644 --- a/src/widgets/dialogs/UserInfoPopup.cpp +++ b/src/widgets/dialogs/UserInfoPopup.cpp @@ -295,14 +295,8 @@ UserInfoPopup::UserInfoPopup(bool closeAutomatically, QWidget *parent) menu->addAction( "Open channel in a new popup window", this, [loginName] { - auto app = getApp(); - auto &window = app->windows->createWindow( - WindowType::Popup, true); - auto split = window.getNotebook() - .getOrAddSelectedPage() - ->appendNewSplit(false); - split->setChannel(app->twitch->getOrAddChannel( - loginName.toLower())); + getApp()->windows->createChannelWindow( + loginName); }); menu->addAction( diff --git a/src/widgets/helper/ChannelView.cpp b/src/widgets/helper/ChannelView.cpp index c938ceee231..072c487cff5 100644 --- a/src/widgets/helper/ChannelView.cpp +++ b/src/widgets/helper/ChannelView.cpp @@ -2188,7 +2188,24 @@ void ChannelView::handleLinkClick(QMouseEvent *event, const Link &link, case Link::UserWhisper: case Link::UserInfo: { auto user = link.value; - this->showUserInfoPopup(user, layout->getMessage()->channelName); + switch (event->modifiers()) + { + case Qt::ShiftModifier: + getApp()->windows->createChannelWindow(user); + break; + case Qt::ControlModifier: + this->openChannelIn.invoke( + user, FromTwitchLinkOpenChannelIn::Tab); + break; + case Qt::AltModifier: + this->openChannelIn.invoke( + user, FromTwitchLinkOpenChannelIn::Split); + break; + default: + this->showUserInfoPopup(user, + layout->getMessage()->channelName); + break; + } } break; diff --git a/src/widgets/splits/Split.cpp b/src/widgets/splits/Split.cpp index 8ee377f41ee..e1e8a27cf6e 100644 --- a/src/widgets/splits/Split.cpp +++ b/src/widgets/splits/Split.cpp @@ -874,18 +874,7 @@ void Split::explainSplitting() void Split::popup() { - auto app = getApp(); - Window &window = app->windows->createWindow(WindowType::Popup); - - Split *split = new Split(static_cast( - window.getNotebook().getOrAddSelectedPage())); - - split->setChannel(this->getIndirectChannel()); - split->setModerationMode(this->getModerationMode()); - split->setFilters(this->getFilters()); - - window.getNotebook().getOrAddSelectedPage()->appendSplit(split); - window.show(); + getApp()->windows->createChannelWindow(this); } void Split::clear()