fix: the sidebar keeps its own width, so a small window can no longer hide it
The sidebar's width was a GtkPaned divider position: `window - 940` in pixels. On any window narrower than 940 px the divider landed past the right edge and the sidebar came up 0 px wide, reachable only by dragging the divider back. Every attempt that kept the paned failed for that reason -- deriving the position from the paned's own width, re-parenting the column, property-form children, code-set size requests. The mechanism was the fault, so it is gone: the row is an AdwOverlaySplitView, which is what a utility sidebar is in GNOME, with min-sidebar-width = max-sidebar-width = 320 in pixels. Its width is therefore its own at any window size, and when there is no room beside the plot it *overlays* the plot (collapsed, set from the window's width in tick()) instead of being squeezed to nothing. Two things found on the way, both recorded in the invariants: - sidebar-width-fraction is a 0..1 fraction of the window whatever sidebar-width-unit says. Setting a pixel count there is a GObject critical and it falls back to 0.25, which is why the sidebar first read 560. The width is pinned with min/max instead. - the window opened at its content minimum (756 px, the plot column plus the sidebar) because the explicit gtk_window_set_default_size() was dropped when the window moved into the .ui. Restored. [sidebar-probe] reads both states and is the guard: window=756 sidebar=320 under a 2x scale, which is the case that used to read 0.
This commit is contained in:
1 parent
a8c25f0cb3
commit
bb01278d88
7 files changed
+165
-54
No files matched your search
@@ -405,6 +405,10 @@ struct App {
|
||||
|
||||
/// The main window's builder. Held because the window belongs to its object list: it is replaced on
|
||||
/// the next build rather than reused, and everything found by id comes out of it.
|
||||
/// The split view the sidebar lives in. Its width, its collapse and its overlay are that widget's
|
||||
/// business -- `AdwOverlaySplitView` -- and not a paned position's.
|
||||
GtkWidget* side_view = nullptr;
|
||||
|
||||
GtkBuilder* window_ui = nullptr;
|
||||
bool comparing = false;
|
||||
/// The last x/y range seen on each side of a comparison, one entry per row: a frame compares them
|
||||
@@ -1000,6 +1004,9 @@ struct RowMenuProbeState {
|
||||
};
|
||||
|
||||
constexpr int kTickMs = 16;
|
||||
/// Below this window width the sidebar has no room beside the plot, and the split view overlays it
|
||||
/// instead of squeezing it. See `tick()`.
|
||||
constexpr int kSidebarRoom = 900;
|
||||
constexpr int kWindowUnitCount = 3;
|
||||
constexpr double kWindowMinS = 1.0e-6;
|
||||
constexpr int kWindowLabelChars = 9;
|
||||
@@ -1129,6 +1136,7 @@ void sync_events_divider(App& app);
|
||||
/// because the theme is the one preference that takes effect without a restart.
|
||||
void open_preferences(App& app);
|
||||
gboolean prefs_probe(gpointer user);
|
||||
gboolean sidebar_probe(gpointer user);
|
||||
gboolean boxzoom_probe(gpointer user);
|
||||
/// A labelled row whose control keeps its natural width -- what a `GtkSwitch` needs and what
|
||||
/// `labeled_box()`'s expanding child denies it.
|
||||
|
||||
Reference in new issue
Block a user