diff --git a/app/panel/viewer/viewerbase.cpp b/app/panel/viewer/viewerbase.cpp index 5918894f4..50733e94f 100644 --- a/app/panel/viewer/viewerbase.cpp +++ b/app/panel/viewer/viewerbase.cpp @@ -53,3 +53,8 @@ void ViewerPanelBase::ConnectPixelSamplerPanel(PixelSamplerPanel *psp) connect(psp, &PixelSamplerPanel::visibilityChanged, vw, &ViewerWidget::SetSignalCursorColorEnabled); connect(vw, &ViewerWidget::CursorColor, psp, &PixelSamplerPanel::SetValues); } + +void ViewerPanelBase::SetFullScreen(QScreen *screen) +{ + static_cast(GetTimeBasedWidget())->SetFullScreen(screen); +} diff --git a/app/panel/viewer/viewerbase.h b/app/panel/viewer/viewerbase.h index d3c3f1c98..ac2d9d7b8 100644 --- a/app/panel/viewer/viewerbase.h +++ b/app/panel/viewer/viewerbase.h @@ -27,6 +27,11 @@ public: void ConnectPixelSamplerPanel(PixelSamplerPanel *psp); + /** + * @brief Wrapper for ViewerWidget::SetFullScreen() + */ + void SetFullScreen(QScreen* screen = nullptr); + }; #endif // VIEWERPANELBASE_H diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index a1e8e017e..25248f95e 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -275,6 +275,40 @@ void ViewerWidget::SetMatrix(const QMatrix4x4 &mat) } } +void ViewerWidget::SetFullScreen(QScreen *screen) +{ + if (!screen) { + // Try to find the screen that contains the mouse cursor currently + foreach (QScreen* test, QGuiApplication::screens()) { + if (test->geometry().contains(QCursor::pos())) { + screen = test; + break; + } + } + + // Fallback, just use the first screen + if (!screen) { + screen = QGuiApplication::screens().first(); + } + } + + ViewerWindow* vw = new ViewerWindow(this); + + vw->showFullScreen(); + vw->setGeometry(screen->geometry()); + vw->gl_widget()->ConnectColorManager(main_gl_widget()->color_manager()); + main_gl_widget()->ConnectSibling(vw->gl_widget()); + connect(vw, &ViewerWindow::destroyed, this, &ViewerWidget::WindowAboutToClose); + connect(vw->gl_widget(), &ViewerGLWidget::customContextMenuRequested, this, &ViewerWidget::ShowContextMenu); + + if (GetConnectedNode()) { + vw->SetResolution(GetConnectedNode()->video_params().width(), GetConnectedNode()->video_params().height()); + } + + windows_.append(vw); + gl_widgets_.append(vw->gl_widget()); +} + VideoRenderBackend *ViewerWidget::video_renderer() const { return video_renderer_; @@ -379,25 +413,9 @@ void ViewerWidget::UpdateStack() } } -void ViewerWidget::SetFullScreenDisplay(QAction *action) +void ViewerWidget::ContextMenuSetFullScreen(QAction *action) { - QScreen* target = QGuiApplication::screens().at(action->data().toInt()); - - ViewerWindow* vw = new ViewerWindow(this); - - vw->showFullScreen(); - vw->setGeometry(target->geometry()); - vw->gl_widget()->ConnectColorManager(main_gl_widget()->color_manager()); - main_gl_widget()->ConnectSibling(vw->gl_widget()); - connect(vw, &ViewerWindow::destroyed, this, &ViewerWidget::WindowAboutToClose); - connect(vw->gl_widget(), &ViewerGLWidget::customContextMenuRequested, this, &ViewerWidget::ShowContextMenu); - - if (GetConnectedNode()) { - vw->SetResolution(GetConnectedNode()->video_params().width(), GetConnectedNode()->video_params().height()); - } - - windows_.append(vw); - gl_widgets_.append(vw->gl_widget()); + SetFullScreen(QGuiApplication::screens().at(action->data().toInt())); } void ViewerWidget::WindowAboutToClose() @@ -515,7 +533,7 @@ void ViewerWidget::ShowContextMenu(const QPoint &pos) a->setData(i); } - connect(full_screen_menu, &QMenu::triggered, this, &ViewerWidget::SetFullScreenDisplay); + connect(full_screen_menu, &QMenu::triggered, this, &ViewerWidget::ContextMenuSetFullScreen); menu.exec(static_cast(sender())->mapToGlobal(pos)); } diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index 690a9c6ef..3bf9650f9 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -71,6 +71,13 @@ public: void SetMatrix(const QMatrix4x4& mat); + /** + * @brief Creates a ViewerWindow widget and places it full screen on another screen + * + * If `screen` is nullptr, the screen will be automatically selected as whichever one contains the mouse cursor. + */ + void SetFullScreen(QScreen* screen = nullptr); + VideoRenderBackend* video_renderer() const; public slots: @@ -221,7 +228,7 @@ private slots: void UpdateStack(); - void SetFullScreenDisplay(QAction* action); + void ContextMenuSetFullScreen(QAction* action); void WindowAboutToClose(); diff --git a/app/window/mainwindow/mainmenu.cpp b/app/window/mainwindow/mainmenu.cpp index 1034fe378..8e66bffe4 100644 --- a/app/window/mainwindow/mainmenu.cpp +++ b/app/window/mainwindow/mainmenu.cpp @@ -164,7 +164,7 @@ MainMenu::MainMenu(QMainWindow *parent) : view_full_screen_item_ = view_menu_->AddItem("fullscreen", parent, SLOT(SetFullscreen(bool)), "F11"); view_full_screen_item_->setCheckable(true); - view_full_screen_viewer_item_ = view_menu_->AddItem("fullscreenviewer", nullptr, nullptr); + view_full_screen_viewer_item_ = view_menu_->AddItem("fullscreenviewer", this, SLOT(FullScreenViewerTriggered())); // // PLAYBACK MENU @@ -509,6 +509,11 @@ void MainMenu::SetMarkerTriggered() PanelManager::instance()->CurrentlyFocused()->SetMarker(); } +void MainMenu::FullScreenViewerTriggered() +{ + PanelManager::instance()->MostRecentlyFocused()->SetFullScreen(); +} + void MainMenu::Retranslate() { // MenuShared is not a QWidget and therefore does not receive a LanguageEvent, we use MainMenu's to update it diff --git a/app/window/mainwindow/mainmenu.h b/app/window/mainwindow/mainmenu.h index d45b0818a..bc70bed3c 100644 --- a/app/window/mainwindow/mainmenu.h +++ b/app/window/mainwindow/mainmenu.h @@ -142,6 +142,8 @@ private slots: void SetMarkerTriggered(); + void FullScreenViewerTriggered(); + private: /** * @brief Set strings based on the current application language.