Try to improve splitter behaviour when shrinking and then enlarging
authorCarl Hetherington <cth@carlh.net>
Tue, 20 Oct 2020 19:10:49 +0000 (21:10 +0200)
committerCarl Hetherington <cth@carlh.net>
Tue, 20 Oct 2020 19:10:49 +0000 (21:10 +0200)
the main window (#1839).

src/wx/content_panel.cc
src/wx/content_panel.h

index 8b6b02316bee43c10adfcb29b2fc6dca50d57b51..9ec44a9f22d1bf9bd85e577460191473aabeff0e 100644 (file)
@@ -803,11 +803,14 @@ ContentPanel::panels () const
 
 LimitedSplitter::LimitedSplitter (wxWindow* parent)
        : wxSplitterWindow (parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_NOBORDER | wxSP_3DSASH | wxSP_LIVE_UPDATE)
+       , _top_panel_minimum_size (350)
 {
        /* This value doesn't really mean much but we just want to stop double-click on the
           divider from shrinking the bottom panel (#1601).
        */
        SetMinimumPaneSize (64);
+
+       Bind (wxEVT_SIZE, boost::bind(&LimitedSplitter::sized, this, _1));
 }
 
 
@@ -820,10 +823,24 @@ LimitedSplitter::first_shown (wxWindow* top, wxWindow* bottom)
                /* 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 : -150);
+               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);
        }
 
 }
+
+
+void
+LimitedSplitter::sized (wxSizeEvent& ev)
+{
+       if (_first_shown && GetSize().GetHeight() > _top_panel_minimum_size && GetSashPosition() < _top_panel_minimum_size) {
+               /* 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);
+       }
+
+       ev.Skip ();
+}
index 52a7e9f3c2bab045243171d54635169de478545d..df5c58ebd0450ebaaa7240cb0bab3839ffcfce1b 100644 (file)
@@ -54,6 +54,12 @@ public:
        }
 
        void first_shown (wxWindow* top, wxWindow* bottom);
+
+private:
+       void sized (wxSizeEvent& ev);
+
+       bool _first_shown;
+       int const _top_panel_minimum_size;
 };