Backend:
- save_workspace / load_workspace Tauri commands writing to
%APPDATA%\com.megaproxy.tiletopia\workspace.json with atomic
tmp+rename. Path from app.path().app_config_dir() (no dirs crate).
Layout helpers:
- tree.ts: changeDistro (with id swap to force XtermPane remount via
{#key}), changeLabel, presetSingle / TwoColumns / ThreeColumns /
TwoRows / TwoByTwo.
- New ops.ts with PaneOps interface bundling split / close /
setDistro / setLabel / distros, drilled through Pane chain
instead of individual callbacks.
UI:
- LeafPane: in-toolbar editable label (click to rename, Enter
saves, Esc cancels) and distro chip popover. Picking a different
distro respawns the pane.
- App.svelte: migrated from localStorage to APPDATA via the new
Tauri commands, debounced 500ms. One-time localStorage migration
on boot. Split inherits parent's distro+cwd. Titlebar preset
buttons with confirm when replacing >1 pane.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
import { invoke } from "@tauri-apps/api/core";
|
|
import { listen, type UnlistenFn } from "@tauri-apps/api/event";
|
|
|
|
export type PaneId = number;
|
|
|
|
export const listDistros = (): Promise<string[]> => invoke("list_distros");
|
|
|
|
export const spawnPane = (args: {
|
|
distro?: string;
|
|
cwd?: string;
|
|
cols: number;
|
|
rows: number;
|
|
}): Promise<PaneId> => invoke("spawn_pane", args);
|
|
|
|
export const writeToPane = (id: PaneId, dataB64: string): Promise<void> =>
|
|
invoke("write_to_pane", { id, dataB64 });
|
|
|
|
export const resizePane = (id: PaneId, cols: number, rows: number): Promise<void> =>
|
|
invoke("resize_pane", { id, cols, rows });
|
|
|
|
export const killPane = (id: PaneId): Promise<void> => invoke("kill_pane", { id });
|
|
|
|
export const onPaneData = (
|
|
id: PaneId,
|
|
cb: (b64: string) => void,
|
|
): Promise<UnlistenFn> =>
|
|
listen<{ b64: string }>(`pane://${id}/data`, (e) => cb(e.payload.b64));
|
|
|
|
export const onPaneExit = (
|
|
id: PaneId,
|
|
cb: () => void,
|
|
): Promise<UnlistenFn> => listen(`pane://${id}/exit`, () => cb());
|
|
|
|
// ---- workspace persistence -------------------------------------------------
|
|
|
|
export const saveWorkspace = (json: string): Promise<void> =>
|
|
invoke("save_workspace", { json });
|
|
|
|
export const loadWorkspace = (): Promise<string | null> =>
|
|
invoke("load_workspace");
|