diff --git a/mainwindow.cpp b/mainwindow.cpp index 967bdc3b9..03ce31903 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -70,31 +70,55 @@ MainWindow* olive::MainWindow; #define DEFAULT_CSS "QPushButton::checked { background: rgb(25, 25, 25); }" -void MainWindow::setup_layout(bool reset) { - panel_project->show(); - panel_effect_controls->show(); - panel_footage_viewer->show(); - panel_sequence_viewer->show(); - panel_timeline->show(); - panel_graph_editor->hide(); - - addDockWidget(Qt::TopDockWidgetArea, panel_project); - addDockWidget(Qt::TopDockWidgetArea, panel_graph_editor); - addDockWidget(Qt::TopDockWidgetArea, panel_footage_viewer); - tabifyDockWidget(panel_footage_viewer, panel_effect_controls); - panel_footage_viewer->raise(); - addDockWidget(Qt::TopDockWidgetArea, panel_sequence_viewer); - addDockWidget(Qt::BottomDockWidgetArea, panel_timeline); - +void MainWindow::setup_layout(bool reset) { // load panels from file if (!reset) { QFile panel_config(get_config_path() + "/layout"); if (panel_config.exists() && panel_config.open(QFile::ReadOnly)) { restoreState(panel_config.readAll(), 0); panel_config.close(); + } else { + reset = true; } } + if (reset) { + // remove all panels from the main window + for (int i=0;iraise(); + addDockWidget(Qt::TopDockWidgetArea, panel_sequence_viewer); + addDockWidget(Qt::BottomDockWidgetArea, panel_timeline); + + panel_project->show(); + panel_effect_controls->show(); + panel_footage_viewer->show(); + panel_sequence_viewer->show(); + panel_timeline->show(); + panel_graph_editor->hide(); + + panel_project->setFloating(false); + panel_effect_controls->setFloating(false); + panel_footage_viewer->setFloating(false); + panel_sequence_viewer->setFloating(false); + panel_timeline->setFloating(false); + panel_graph_editor->setFloating(true); + + resizeDocks({panel_project, panel_footage_viewer, panel_sequence_viewer}, + {width()/3, width()/3, width()/3}, + Qt::Horizontal); + + resizeDocks({panel_project, panel_timeline}, + {height()/2, height()/2}, + Qt::Vertical); + } + layout()->update(); } @@ -102,8 +126,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), first_show(true) { - qRegisterMetaType(); - init_custom_cursors(); open_debug_file(); @@ -223,9 +245,6 @@ MainWindow::MainWindow(QWidget *parent) : olive::Global->check_for_autorecovery_file(); - // set up panel layout - setup_layout(false); - // set up output audio device init_audio(); @@ -892,26 +911,45 @@ void MainWindow::paintEvent(QPaintEvent *event) { QMainWindow::paintEvent(event); if (first_show) { + // set this to false immediately to prevent anything here being called again first_show = false; + + /** + * @brief Set up the dock widget layout on the main window + * + * For some reason, Qt didn't like this in the constructor. It would lead to several geometry issues with HiDPI + * on Windows, and also seemed to break QMainWindow::restoreState() which is why it took so long to implement + * saving/restoring panel layouts. Putting it in showEvent() didn't help either, nor did putting it in + * changeEvent() (QEvent::type() == QEvent::Polish). This is the only place it's functioned as expected. + */ + setup_layout(false); + + /** + Signal that window has finished loading. + */ emit finished_first_paint(); } } -bool MainWindow::event(QEvent *e) +void MainWindow::changeEvent(QEvent *e) { if (e->type() == QEvent::LanguageChange) { + + // if this was a LanguageEvent, run the retranslation function Retranslate(); - return true; + + } else { + + // otherwise pass it to the base class + QMainWindow::changeEvent(e); + } - return QMainWindow::event(e); } void MainWindow::reset_layout() { setup_layout(true); } - - void MainWindow::maximize_panel() { // toggles between normal state and a state of one panel being maximized if (temp_panel_state.isEmpty()) { diff --git a/mainwindow.h b/mainwindow.h index 352d1865f..15b85d9d3 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -109,7 +109,17 @@ protected: */ virtual void paintEvent(QPaintEvent *) override; - virtual bool event(QEvent* e) override; + /** + * @brief Change event + * + * Overridden to handle language changes (e->type() == QEvent::LanguageChange) by calling Retranslate(). + * + * See documentation for QWidget::changeEvent() for more information. + * + * @param e + * @return + */ + virtual void changeEvent(QEvent* e) override; private slots: /** diff --git a/panels/timeline.cpp b/panels/timeline.cpp index bef7ffd3b..45cb97b12 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -2060,8 +2060,6 @@ void Timeline::set_tool() { void olive::timeline::MultiplyTrackSizesByDPI() { - qDebug() << QApplication::desktop()->devicePixelRatio(); - kTrackDefaultHeight *= QApplication::desktop()->devicePixelRatio(); kTrackMinHeight *= QApplication::desktop()->devicePixelRatio(); kTrackHeightIncrement *= QApplication::desktop()->devicePixelRatio(); diff --git a/ui/panel.cpp b/ui/panel.cpp index c7d60f882..2892be2e8 100644 --- a/ui/panel.cpp +++ b/ui/panel.cpp @@ -26,7 +26,8 @@ QVector olive::panels; Panel::Panel(QWidget *parent) : QDockWidget (parent) { - setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); +// setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); +// setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); olive::panels.append(this); } @@ -39,13 +40,17 @@ Panel::~Panel() void Panel::changeEvent(QEvent *e) { if (e->type() == QEvent::LanguageChange) { + /** + + NOTE: While overriding changeEvent() is the official documented way of handling runtime language change events, + I found it buggy to do it this way (some panels would change and others wouldn't, and the panels that did/didn't + change would be different each time). The current workaround is calling Retranslate() on each panel manually + from MainWindow::Retranslate which is triggered by its own changeEvent() that seems fairly reliable. Currently + this function is mostly a no-op. + + */ // Retranslate(); } else { QDockWidget::changeEvent(e); } } - -void Panel::Retranslate() -{ - qDebug() << "like what?"; -} diff --git a/ui/panel.h b/ui/panel.h index cb43e7afe..db7054b13 100644 --- a/ui/panel.h +++ b/ui/panel.h @@ -28,7 +28,7 @@ class Panel : public QDockWidget { public: Panel(QWidget* parent = nullptr); virtual ~Panel() override; - virtual void Retranslate(); + virtual void Retranslate() = 0; protected: virtual void changeEvent(QEvent* e) override; };