diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 60706e68b..cf0af57e2 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -2230,7 +2230,7 @@ void OBSBasic::OBSInit() ui->viewMenu->addSeparator(); AddProjectorMenuMonitors(ui->multiviewProjectorMenu, this, - SLOT(OpenMultiviewProjector())); + &OBSBasic::OpenMultiviewProjector); connect(ui->viewMenu->menuAction(), &QAction::hovered, this, &OBSBasic::UpdateMultiviewProjectorMenu); @@ -2490,7 +2490,7 @@ void OBSBasic::UpdateMultiviewProjectorMenu() { ui->multiviewProjectorMenu->clear(); AddProjectorMenuMonitors(ui->multiviewProjectorMenu, this, - SLOT(OpenMultiviewProjector())); + &OBSBasic::OpenMultiviewProjector); } void OBSBasic::InitHotkeys() @@ -5347,10 +5347,9 @@ void OBSBasic::EditSceneName() item->setFlags(flags); } -void OBSBasic::AddProjectorMenuMonitors(QMenu *parent, QObject *target, - const char *slot) +QList OBSBasic::GetProjectorMenuMonitorsFormatted() { - QAction *action; + QList projectorsFormatted; QList screens = QGuiApplication::screens(); for (int i = 0; i < screens.size(); i++) { QScreen *screen = screens[i]; @@ -5387,10 +5386,9 @@ void OBSBasic::AddProjectorMenuMonitors(QMenu *parent, QObject *target, ratio), QString::number(screenGeometry.x()), QString::number(screenGeometry.y())); - - action = parent->addAction(str, target, slot); - action->setProperty("monitor", i); + projectorsFormatted.push_back(str); } + return projectorsFormatted; } void OBSBasic::on_scenes_customContextMenuRequested(const QPoint &pos) @@ -5441,7 +5439,7 @@ void OBSBasic::on_scenes_customContextMenuRequested(const QPoint &pos) delete sceneProjectorMenu; sceneProjectorMenu = new QMenu(QTStr("SceneProjector")); AddProjectorMenuMonitors(sceneProjectorMenu, this, - SLOT(OpenSceneProjector())); + &OBSBasic::OpenSceneProjector); popup.addMenu(sceneProjectorMenu); QAction *sceneWindow = popup.addAction( @@ -5888,7 +5886,7 @@ void OBSBasic::CreateSourcePopupMenu(int idx, bool preview) previewProjectorSource = new QMenu(QTStr("PreviewProjector")); AddProjectorMenuMonitors(previewProjectorSource, this, - SLOT(OpenPreviewProjector())); + &OBSBasic::OpenPreviewProjector); popup.addMenu(previewProjectorSource); @@ -6003,8 +6001,9 @@ void OBSBasic::CreateSourcePopupMenu(int idx, bool preview) popup.addSeparator(); sourceProjector = new QMenu(QTStr("SourceProjector")); - AddProjectorMenuMonitors(sourceProjector, this, - SLOT(OpenSourceProjector())); + AddProjectorMenuMonitors( + sourceProjector, this, + &OBSBasic::OpenSourceProjector); popup.addMenu(sourceProjector); popup.addAction(QTStr("SourceWindow"), this, &OBSBasic::OpenSourceWindow); @@ -8236,7 +8235,7 @@ void OBSBasic::ProgramViewContextMenuRequested() studioProgramProjector = new QMenu(QTStr("StudioProgramProjector")); AddProjectorMenuMonitors(studioProgramProjector, this, - SLOT(OpenStudioProgramProjector())); + &OBSBasic::OpenStudioProgramProjector); popup.addMenu(studioProgramProjector); @@ -8265,7 +8264,7 @@ void OBSBasic::on_previewDisabledWidget_customContextMenuRequested() previewProjectorMain = new QMenu(QTStr("PreviewProjector")); AddProjectorMenuMonitors(previewProjectorMain, this, - SLOT(OpenPreviewProjector())); + &OBSBasic::OpenPreviewProjector); QAction *previewWindow = popup.addAction(QTStr("PreviewWindow"), this, &OBSBasic::OpenPreviewWindow); @@ -9669,9 +9668,9 @@ void OBSBasic::SystemTrayInit() previewProjector = new QMenu(QTStr("PreviewProjector")); studioProgramProjector = new QMenu(QTStr("StudioProgramProjector")); AddProjectorMenuMonitors(previewProjector, this, - SLOT(OpenPreviewProjector())); + &OBSBasic::OpenPreviewProjector); AddProjectorMenuMonitors(studioProgramProjector, this, - SLOT(OpenStudioProgramProjector())); + &OBSBasic::OpenStudioProgramProjector); trayMenu->addAction(showHide); trayMenu->addSeparator(); trayMenu->addMenu(previewProjector); @@ -9714,9 +9713,9 @@ void OBSBasic::IconActivated(QSystemTrayIcon::ActivationReason reason) previewProjector->clear(); studioProgramProjector->clear(); AddProjectorMenuMonitors(previewProjector, this, - SLOT(OpenPreviewProjector())); + &OBSBasic::OpenPreviewProjector); AddProjectorMenuMonitors(studioProgramProjector, this, - SLOT(OpenStudioProgramProjector())); + &OBSBasic::OpenStudioProgramProjector); #ifdef __APPLE__ UNUSED_PARAMETER(reason); diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index 8158b0288..3a9c3ab52 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -982,8 +982,19 @@ public: const char *GetCurrentOutputPath(); void DeleteProjector(OBSProjector *projector); - void AddProjectorMenuMonitors(QMenu *parent, QObject *target, - const char *slot); + + static QList GetProjectorMenuMonitorsFormatted(); + template + static void AddProjectorMenuMonitors(QMenu *parent, Receiver *target, + void (Receiver::*slot)(Args...)) + { + auto projectors = GetProjectorMenuMonitorsFormatted(); + for (int i = 0; i < projectors.size(); i++) { + QString str = projectors[i]; + QAction *action = parent->addAction(str, target, slot); + action->setProperty("monitor", i); + } + } QIcon GetSourceIcon(const char *id) const; QIcon GetGroupIcon() const; diff --git a/UI/window-projector.cpp b/UI/window-projector.cpp index 698a6391a..24793d553 100644 --- a/UI/window-projector.cpp +++ b/UI/window-projector.cpp @@ -256,13 +256,12 @@ void OBSProjector::mousePressEvent(QMouseEvent *event) OBSQTDisplay::mousePressEvent(event); if (event->button() == Qt::RightButton) { - OBSBasic *main = - reinterpret_cast(App()->GetMainWindow()); - QMenu popup(this); - QMenu *projectorMenu = new QMenu(QTStr("Fullscreen")); - main->AddProjectorMenuMonitors(projectorMenu, this, - SLOT(OpenFullScreenProjector())); + OBSBasic::AddProjectorMenuMonitors( + projectorMenu, this, + &OBSProjector::OpenFullScreenProjector); + + QMenu popup(this); popup.addMenu(projectorMenu); if (GetMonitor() > -1) {