From d85bd416c6267e9c86948b9b5f2e5dba5e67f755 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 12 Oct 2022 23:21:09 +0200 Subject: [PATCH] Save and restore sash positions in the main DoM. --- src/lib/config.cc | 11 +++++++++++ src/lib/config.h | 18 ++++++++++++++++++ src/tools/dcpomatic.cc | 10 +++++++--- src/wx/content_panel.cc | 16 ++++++++++------ 4 files changed, 46 insertions(+), 9 deletions(-) diff --git a/src/lib/config.cc b/src/lib/config.cc index eeb009594..81daff5b6 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -207,6 +207,9 @@ Config::set_defaults () set_notification_email_to_default (); set_cover_sheet_to_default (); + _main_divider_sash_position = {}; + _main_content_divider_sash_position = {}; + _export.set_defaults(); } @@ -604,6 +607,8 @@ try } _auto_crop_threshold = f.optional_number_child("AutoCropThreshold").get_value_or(0.1); _last_release_notes_version = f.optional_string_child("LastReleaseNotesVersion"); + _main_divider_sash_position = f.optional_number_child("MainDividerSashPosition"); + _main_content_divider_sash_position = f.optional_number_child("MainContentDividerSashPosition"); _export.read(f.optional_node_child("Export")); } @@ -1071,6 +1076,12 @@ Config::write_config () const if (_last_release_notes_version) { root->add_child("LastReleaseNotesVersion")->add_child_text(*_last_release_notes_version); } + if (_main_divider_sash_position) { + root->add_child("MainDividerSashPosition")->add_child_text(raw_convert(*_main_divider_sash_position)); + } + if (_main_content_divider_sash_position) { + root->add_child("MainContentDividerSashPosition")->add_child_text(raw_convert(*_main_content_divider_sash_position)); + } _export.write(root->add_child("Export")); diff --git a/src/lib/config.h b/src/lib/config.h index 8fbdeaf95..1a11b4a41 100644 --- a/src/lib/config.h +++ b/src/lib/config.h @@ -590,6 +590,14 @@ public: return _last_release_notes_version; } + boost::optional main_divider_sash_position() const { + return _main_divider_sash_position; + } + + boost::optional main_content_divider_sash_position() const { + return _main_content_divider_sash_position; + } + /* SET (mostly) */ void set_master_encoding_threads (int n) { @@ -1138,6 +1146,14 @@ public: return _export; } + void set_main_divider_sash_position(int position) { + maybe_set(_main_divider_sash_position, position); + } + + void set_main_content_divider_sash_position(int position) { + maybe_set(_main_content_divider_sash_position, position); + } + void changed (Property p = OTHER); boost::signals2::signal Changed; /** Emitted if read() failed on an existing Config file. There is nothing @@ -1370,6 +1386,8 @@ private: RoughDuration _default_kdm_duration; double _auto_crop_threshold; boost::optional _last_release_notes_version; + boost::optional _main_divider_sash_position; + boost::optional _main_content_divider_sash_position; ExportConfig _export; diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index a10cb9b35..eec81d3c8 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -287,7 +287,11 @@ public: bool OnSashPositionChange(int new_position) override { /* Try to stop the left bit of the splitter getting too small */ - return new_position > _left_panel_minimum_size; + auto const ok = new_position > _left_panel_minimum_size; + if (ok) { + Config::instance()->set_main_divider_sash_position(new_position); + } + return ok; } private: @@ -297,7 +301,7 @@ private: /* The window is now fairly big but the left panel is small; this happens when the DCP-o-matic window * is shrunk and then made larger again. Try to set a sensible left panel size in this case. */ - SetSashPosition(_left_panel_minimum_size); + SetSashPosition(Config::instance()->main_divider_sash_position().get_value_or(_left_panel_minimum_size)); } ev.Skip(); @@ -410,7 +414,7 @@ public: _right_panel->SetSizer(right_sizer); - _splitter->SplitVertically(left_panel, _right_panel, left_panel->GetSize().GetWidth() + 8); + _splitter->SplitVertically(left_panel, _right_panel, Config::instance()->main_divider_sash_position().get_value_or(left_panel->GetSize().GetWidth() + 8)); set_menu_sensitivity (); diff --git a/src/wx/content_panel.cc b/src/wx/content_panel.cc index df6308bea..cadf3682a 100644 --- a/src/wx/content_panel.cc +++ b/src/wx/content_panel.cc @@ -90,22 +90,26 @@ public: bool OnSashPositionChange(int new_position) override { /* Try to stop the top bit of the splitter getting so small that buttons disappear */ - return new_position > 220; + auto const ok = new_position > 220; + if (ok) { + Config::instance()->set_main_content_divider_sash_position(new_position); + } + return ok; } void first_shown(wxWindow* top, wxWindow* bottom) { int const sn = wxDisplay::GetFromWindow(this); + /* Fallback for when GetFromWindow fails for reasons that aren't clear */ + int pos = -600; if (sn >= 0) { wxRect const screen = wxDisplay(sn).GetClientArea(); /* This is a hack to try and make the content notebook a sensible size; large on big displays but small enough on small displays to leave space for the content area. */ - SplitHorizontally(top, bottom, screen.height > 800 ? -600 : -_top_panel_minimum_size); - } else { - /* Fallback for when GetFromWindow fails for reasons that aren't clear */ - SplitHorizontally(top, bottom, -600); + pos = screen.height > 800 ? -600 : -_top_panel_minimum_size; } + SplitHorizontally(top, bottom, Config::instance()->main_content_divider_sash_position().get_value_or(pos)); _first_shown = true; } @@ -117,7 +121,7 @@ private: /* The window is now fairly big but the top panel is small; this happens when the DCP-o-matic window * is shrunk and then made larger again. Try to set a sensible top panel size in this case (#1839). */ - SetSashPosition(_top_panel_minimum_size); + SetSashPosition(Config::instance()->main_content_divider_sash_position().get_value_or(_top_panel_minimum_size)); } ev.Skip (); -- 2.30.2