A panel dragged wider was back at its first size after every reload. The sizes are now kept in the browser, next to the folded groups. - editor/panelSizes.ts holds one entry in localStorage, game-maker.panel-sizes: a name per divider and its width, height or share. - A panel reads its size once when it is built, held to the bounds its divider keeps today. Every drag writes the new size. - Kept are the columns left and right of the centre, the console, the split of the left column, the tilemap panel, the preview of the Shader, Particles and Pixel art tabs, each under its own name, and the split of the user management. - The sizes belong to the browser, not to the project. They hold for every project opened there. - A browser that refuses the storage, or holds rubbish under the entry, starts with the sizes the editor comes with. Tests: - Gate on melektaus-atx: 219 files, 3400 tests, CHECK EXIT 0. - Seven new unit tests in tests/editor/panel-sizes.test.ts. All five counter-probes bite. - Smokes on melektaus-atx: 24, 19 and 21, all pass. - One new e2e check in module 48: the left column dragged 40 px wider is as wide after a reload, and dragged back after. - Full suite on melektaus-atx: 1692 checks, all pass. It ran before the fix to the animation players of the commit before last. - Browser counter-probe: without the write to the browser exactly that check fails. - Only the left column is measured across a reload. The other dividers go the same way and have no check of their own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
35 lines
1.4 KiB
TypeScript
35 lines
1.4 KiB
TypeScript
import { clamp, HStack, Splitter, type Widget } from '../ui';
|
|
import { keepPanelSize, panelSize } from './panelSizes';
|
|
|
|
/** The panel can be dragged in to the width of its own controls, and open to most of a wide window. */
|
|
const MIN_PREVIEW = 200;
|
|
const MAX_PREVIEW = 640;
|
|
|
|
/**
|
|
* A graph with its preview panel right of it, the two dragged apart like the console: how much of
|
|
* the tab is graph and how much is picture depends on what is being worked on, and on a narrow
|
|
* window a fixed panel eats the canvas. The Particles and Shader tabs (#86, #168).
|
|
*/
|
|
export class PreviewSplit extends HStack {
|
|
readonly splitter = new Splitter('x');
|
|
private panelWidth: number;
|
|
|
|
/** `name` is the tab this stands in: each keeps the width of its own panel in the browser. */
|
|
constructor(canvas: Widget, side: Widget, name: string) {
|
|
super();
|
|
const kept = `preview:${name}`;
|
|
this.panelWidth = panelSize(kept, 280, MIN_PREVIEW, MAX_PREVIEW);
|
|
side.minWidth = this.panelWidth;
|
|
this.splitter.onDrag = (delta) => {
|
|
this.panelWidth = clamp(this.panelWidth - delta, MIN_PREVIEW, MAX_PREVIEW);
|
|
side.minWidth = this.panelWidth;
|
|
// The row keeps its own size, so resizing it would not lay out again: ask it directly.
|
|
this.relayout();
|
|
keepPanelSize(kept, this.panelWidth);
|
|
};
|
|
this.add(canvas, 1);
|
|
this.add(this.splitter);
|
|
this.add(side);
|
|
}
|
|
}
|