From 77bce62a09351846fbeb9879ff33a62a8a91cbf9 Mon Sep 17 00:00:00 2001 From: David Capello Date: Wed, 24 Aug 2022 17:10:12 -0300 Subject: [PATCH] Save/restore timeline splitter position correctly --- src/app/ui/dock.cpp | 1 + src/app/ui/dock.h | 2 ++ src/app/ui/main_window.cpp | 71 +++++++++++++++++++++++++++++++++----- src/app/ui/main_window.h | 3 ++ 4 files changed, 69 insertions(+), 8 deletions(-) diff --git a/src/app/ui/dock.cpp b/src/app/ui/dock.cpp index 1cffa9f10..6614bb8dd 100644 --- a/src/app/ui/dock.cpp +++ b/src/app/ui/dock.cpp @@ -311,6 +311,7 @@ bool Dock::onProcessMessage(ui::Message* msg) } layout(); + Resize(); } } break; diff --git a/src/app/ui/dock.h b/src/app/ui/dock.h index 821e780b8..0d97d7064 100644 --- a/src/app/ui/dock.h +++ b/src/app/ui/dock.h @@ -53,6 +53,8 @@ public: Dock* right() { return subdock(ui::RIGHT); } Dock* center() { return subdock(ui::CENTER); } + obs::signal Resize; + protected: void onSizeHint(ui::SizeHintEvent& ev) override; void onResize(ui::ResizeEvent& ev) override; diff --git a/src/app/ui/main_window.cpp b/src/app/ui/main_window.cpp index d9197273b..3f0b97523 100644 --- a/src/app/ui/main_window.cpp +++ b/src/app/ui/main_window.cpp @@ -59,6 +59,9 @@ namespace app { using namespace ui; +static const char* kLegacyLayoutMainWindowSection = "layout:main_window"; +static const char* kLegacyLayoutTimelineSplitter = "timeline_splitter"; + class ScreenScalePanic : public INotificationDelegate { public: std::string notificationText() override { return "Reset Scale!"; } @@ -191,6 +194,8 @@ void MainWindow::initialize() MainWindow::~MainWindow() { + m_timelineResizeConn.disconnect(); + m_dock->resetDocks(); m_customizableDock->resetDocks(); @@ -375,6 +380,8 @@ void MainWindow::popTimeline() void MainWindow::setDefaultLayout() { + m_timelineResizeConn.disconnect(); + m_customizableDock->resetDocks(); m_customizableDock->dock(ui::LEFT, m_colorBar.get()); m_customizableDock->center()->dock(ui::TOP, m_contextBar.get()); @@ -383,12 +390,13 @@ void MainWindow::setDefaultLayout() m_timeline.get(), gfx::Size(64 * guiscale(), 64 * guiscale())); m_customizableDock->center()->center()->dock(ui::CENTER, m_workspace.get()); - - layout(); + configureWorkspaceLayout(); } void MainWindow::setDefaultMirrorLayout() { + m_timelineResizeConn.disconnect(); + m_customizableDock->resetDocks(); m_customizableDock->dock(ui::RIGHT, m_colorBar.get()); m_customizableDock->center()->dock(ui::TOP, m_contextBar.get()); @@ -397,8 +405,7 @@ void MainWindow::setDefaultMirrorLayout() m_timeline.get(), gfx::Size(64 * guiscale(), 64 * guiscale())); m_customizableDock->center()->center()->dock(ui::CENTER, m_workspace.get()); - - layout(); + configureWorkspaceLayout(); } void MainWindow::dataRecoverySessionsAreReady() @@ -621,6 +628,9 @@ DropTabResult MainWindow::onDropTab(Tabs* tabs, void MainWindow::configureWorkspaceLayout() { + // First layout to get the bounds of some widgets + layout(); + const auto& pref = Preferences::instance(); bool normal = (m_mode == NormalMode); bool isDoc = (getDocView() != nullptr); @@ -647,20 +657,42 @@ void MainWindow::configureWorkspaceLayout() // Configure timeline { + const gfx::Rect workspaceBounds = m_customizableDock->center()->center()->bounds(); + // Get legacy timeline position and splitter position auto timelinePosition = pref.general.timelinePosition(); + auto timelineSplitterPos = + get_config_double(kLegacyLayoutMainWindowSection, kLegacyLayoutTimelineSplitter, 75.0) / + 100.0; int side = ui::BOTTOM; m_customizableDock->undock(m_timeline.get()); + int w, h; + w = h = 64; + switch (timelinePosition) { - case gen::TimelinePosition::LEFT: side = ui::LEFT; break; - case gen::TimelinePosition::RIGHT: side = ui::RIGHT; break; - case gen::TimelinePosition::BOTTOM: side = ui::BOTTOM; break; + case gen::TimelinePosition::LEFT: + side = ui::LEFT; + w = (workspaceBounds.w * (1.0 - timelineSplitterPos)) / guiscale(); + break; + case gen::TimelinePosition::RIGHT: + side = ui::RIGHT; + w = (workspaceBounds.w * (1.0 - timelineSplitterPos)) / guiscale(); + break; + case gen::TimelinePosition::BOTTOM: + side = ui::BOTTOM; + h = (workspaceBounds.h * (1.0 - timelineSplitterPos)) / guiscale(); + break; } + // Listen to resizing changes in the dock that contains the + // timeline (so we save the new splitter position) + m_timelineResizeConn = m_customizableDock->center()->center()->Resize.connect( + [this] { saveTimelineConfiguration(); }); + m_customizableDock->center()->center()->dock(side, m_timeline.get(), - gfx::Size(64 * guiscale(), 64 * guiscale())); + gfx::Size(w * guiscale(), h * guiscale())); m_timeline->setVisible(isDoc && (m_mode == NormalMode || m_mode == ContextBarAndTimelineMode) && pref.general.visibleTimeline()); @@ -673,4 +705,27 @@ void MainWindow::configureWorkspaceLayout() layout(); } +void MainWindow::saveTimelineConfiguration() +{ + const auto& pref = Preferences::instance(); + const gfx::Rect timelineBounds = m_timeline->bounds(); + const gfx::Rect workspaceBounds = m_customizableDock->center()->center()->bounds(); + auto timelinePosition = pref.general.timelinePosition(); + double timelineSplitterPos = 0.75; + + switch (timelinePosition) { + case gen::TimelinePosition::LEFT: + case gen::TimelinePosition::RIGHT: + timelineSplitterPos = 1.0 - double(timelineBounds.w) / workspaceBounds.w; + break; + case gen::TimelinePosition::BOTTOM: + timelineSplitterPos = 1.0 - double(timelineBounds.h) / workspaceBounds.h; + break; + } + + set_config_double(kLegacyLayoutMainWindowSection, + kLegacyLayoutTimelineSplitter, + std::clamp(timelineSplitterPos * 100.0, 1.0, 99.0)); +} + } // namespace app diff --git a/src/app/ui/main_window.h b/src/app/ui/main_window.h index 5b492397d..d5eff28a1 100644 --- a/src/app/ui/main_window.h +++ b/src/app/ui/main_window.h @@ -10,6 +10,7 @@ #pragma once #include "app/ui/tabs.h" +#include "obs/connection.h" #include "ui/window.h" #include @@ -126,6 +127,7 @@ private: DocView* getDocView(); HomeView* getHomeView(); void configureWorkspaceLayout(); + void saveTimelineConfiguration(); ui::TooltipManager* m_tooltipManager; Dock* m_dock; @@ -149,6 +151,7 @@ private: #ifdef ENABLE_SCRIPTING std::unique_ptr m_devConsoleView; #endif + obs::scoped_connection m_timelineResizeConn; }; } // namespace app