implemented #424

This commit is contained in:
itsmattkc
2019-02-28 02:59:08 -08:00
parent 1685fa3a5d
commit eb4c2fdad3
5 changed files with 87 additions and 36 deletions
+64 -26
View File
@@ -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;i<olive::panels.size();i++) {
removeDockWidget(olive::panels.at(i));
}
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);
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<ClipPtr>();
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()) {
+11 -1
View File
@@ -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:
/**
-2
View File
@@ -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();
+11 -6
View File
@@ -26,7 +26,8 @@
QVector<Panel*> 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?";
}
+1 -1
View File
@@ -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;
};