diff --git a/mainwindow.cpp b/mainwindow.cpp index 042c52f7a..582a8049d 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -736,6 +736,8 @@ void MainWindow::setup_menus() { full_screen->setProperty("id", "fullscreen"); full_screen->setCheckable(true); + view_menu->addAction(tr("Full Screen Viewer"), this, SLOT(full_screen_viewer()))->setProperty("id", "fullscreenviewer"); + // INITIALIZE PLAYBACK MENU QMenu* playback_menu = menuBar->addMenu(tr("&Playback")); @@ -799,7 +801,11 @@ void MainWindow::setup_menus() { window_sequenceviewer_action->setCheckable(true); window_sequenceviewer_action->setData(reinterpret_cast(panel_sequence_viewer)); - window_menu->addSeparator(); + window_menu->addSeparator(); + + window_menu->addAction(tr("Maximize Panel"), this, SLOT(maximize_panel()), QKeySequence("`"))->setProperty("id", "maximizepanel"); + + window_menu->addSeparator(); window_menu->addAction(tr("Reset to Default Layout"), this, SLOT(reset_layout()))->setProperty("id", "resetdefaultlayout"); @@ -1185,7 +1191,34 @@ void MainWindow::next_cut() { QDockWidget* focused_panel = get_focused_panel(); if (sequence != nullptr && (panel_timeline == focused_panel || panel_sequence_viewer == focused_panel)) { panel_timeline->next_cut(); - } + } +} + +void MainWindow::maximize_panel() { + // toggles between normal state and a state of one panel being maximized + if (temp_panel_state.isEmpty()) { + // get currently hovered panel + QDockWidget* focused_panel = get_focused_panel(true); + + // if the mouse is in fact hovering over a panel + if (focused_panel != nullptr) { + // store the current state of panels + temp_panel_state = saveState(); + + // remove all dock widgets (kind of painful having to do each individually) + if (focused_panel != panel_project) removeDockWidget(panel_project); + if (focused_panel != panel_effect_controls) removeDockWidget(panel_effect_controls); + if (focused_panel != panel_timeline) removeDockWidget(panel_timeline); + if (focused_panel != panel_sequence_viewer) removeDockWidget(panel_sequence_viewer); + if (focused_panel != panel_footage_viewer) removeDockWidget(panel_footage_viewer); + } + } else { + // we must be maximized, restore previous state + restoreState(temp_panel_state); + + // clear temp panel state for next maximize call + temp_panel_state.clear(); + } } void MainWindow::preferences() @@ -1200,7 +1233,15 @@ void MainWindow::zoom_in_tracks() { } void MainWindow::zoom_out_tracks() { - panel_timeline->decrease_track_height(); + panel_timeline->decrease_track_height(); +} + +void MainWindow::full_screen_viewer() { + if (get_focused_panel() == panel_footage_viewer) { + panel_footage_viewer->viewer_widget->set_fullscreen(); + } else { + panel_sequence_viewer->viewer_widget->set_fullscreen(); + } } void MainWindow::windowMenu_About_To_Be_Shown() { @@ -1585,6 +1626,10 @@ void MainWindow::toggle_panel_visibility() { QAction* action = static_cast(sender()); QDockWidget* w = reinterpret_cast(action->data().value()); w->setVisible(!w->isVisible()); + + // layout has changed, we're no longer in maximized panel mode, + // so we clear this byte array + temp_panel_state.clear(); } void MainWindow::set_timecode_view() { diff --git a/mainwindow.h b/mainwindow.h index 4652b2c24..b00bf28c9 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -78,14 +78,16 @@ private slots: void prev_cut(); void next_cut(); + void maximize_panel(); void reset_layout(); void preferences(); void zoom_in_tracks(); - void zoom_out_tracks(); + void full_screen_viewer(); + void fileMenu_About_To_Be_Shown(); void fileMenu_About_To_Hide(); void editMenu_About_To_Be_Shown(); @@ -204,6 +206,9 @@ private: bool enable_launch_with_project; QString appName; + + // used to store the panel state when one panel is maximized + QByteArray temp_panel_state; }; extern MainWindow* mainWindow; diff --git a/panels/panels.cpp b/panels/panels.cpp index 98a61dcd2..b460647c9 100644 --- a/panels/panels.cpp +++ b/panels/panels.cpp @@ -115,9 +115,9 @@ void update_ui(bool modified) { panel_graph_editor->update_panel(); } -QDockWidget *get_focused_panel() { +QDockWidget *get_focused_panel(bool force_hover) { QDockWidget* w = nullptr; - if (config.hover_focus) { + if (config.hover_focus || force_hover) { if (panel_project->underMouse()) { w = panel_project; } else if (panel_effect_controls->underMouse()) { diff --git a/panels/panels.h b/panels/panels.h index 2434d1daa..0e934513e 100644 --- a/panels/panels.h +++ b/panels/panels.h @@ -19,7 +19,7 @@ extern Timeline* panel_timeline; extern GraphEditor* panel_graph_editor; void update_ui(bool modified); -QDockWidget* get_focused_panel(); +QDockWidget* get_focused_panel(bool force_hover = false); void alloc_panels(QWidget *parent); void free_panels(); void scroll_to_frame_internal(QScrollBar* bar, long frame, double zoom, int area_width); diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index ea2322836..f6031f4ea 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -93,7 +93,20 @@ void ViewerWidget::set_waveform_scroll(int s) { if (waveform) { waveform_scroll = s; update(); - } + } +} + +void ViewerWidget::set_fullscreen(int screen) { + if (screen >= 0 && screen < QGuiApplication::screens().size()) { + QScreen* selected_screen = QGuiApplication::screens().at(screen); + window->showFullScreen(); + window->setGeometry(selected_screen->geometry()); + + // HACK: window seems to show with distorted texture on first showing, so we queue an update after it's shown + QTimer::singleShot(100, window, SLOT(update())); + } else { + qCritical() << "Failed to find requested screen" << screen << "to set fullscreen to"; + } } void ViewerWidget::show_context_menu() { @@ -170,12 +183,7 @@ void ViewerWidget::fullscreen_menu_action(QAction *action) { if (action->data().isNull()) { window->hide(); } else { - QScreen* selected_screen = QGuiApplication::screens().at(action->data().toInt()); - window->showFullScreen(); - window->setGeometry(selected_screen->geometry()); - - // HACK: window seems to show with distorted texture on first showing, so we queue an update after it's shown - QTimer::singleShot(100, window, SLOT(update())); + set_fullscreen(action->data().toInt()); } } } diff --git a/ui/viewerwidget.h b/ui/viewerwidget.h index e6f0526c8..ce09c790a 100644 --- a/ui/viewerwidget.h +++ b/ui/viewerwidget.h @@ -47,6 +47,7 @@ public: void set_scroll(double x, double y); public slots: void set_waveform_scroll(int s); + void set_fullscreen(int screen = 0); protected: void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event);