Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Changelog

## Unreleased

### Breaking (Rust source)

- The unified top toolbar is now the only layout. Panel-era typed config fields and order groups are removed from the serde model (`side_*` placement/pin/pane keys, `show_settings_section` / mode overrides, and `ui.toolbar.items.order.{side_sections,actions,pages,boards,presets,tool_options,sessions}`). Authored values at those exact paths remain in `config.toml` as retired settings and no longer affect the overlay. Matching keys under `runtime-ui.toml`'s recognized `item_order` map are pruned on rewrite.
- Public Rust types that described the side palette / panel-only toolbar order groups are gone. Downstream crates that constructed those fields must drop them; the in-repo configurator already matches this shape.
15 changes: 10 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -963,11 +963,16 @@ quitting Wayscriber never changes the file on its own. An incidental preference
the current run and offers a route to the configurator screen that owns its default.

Toolbar pins (updated by the pin buttons and by the toolbar show/hide keybinding, so the next
start matches what was on screen), dragged positions, the top strip's display form,
minimized/pane/collapsed state, individual toolbar item visibility/order, and board pins changed
in the overlay are direct interaction state and are saved separately in the generated
start matches what was on screen), dragged top-strip positions, the top strip's display form and
minimized state, individual toolbar item visibility/order, and board pins changed in the overlay
are direct interaction state and are saved separately in the generated
`$XDG_DATA_HOME/wayscriber/runtime-ui.toml` file. Inspect, recover, or reset those runtime
preferences from the overlay Settings panel; see [Configuration Guide](docs/CONFIG.md#configured-defaults-and-runtime-ui-preferences).
preferences from the overlay Settings popover; see [Configuration Guide](docs/CONFIG.md#configured-defaults-and-runtime-ui-preferences).

The unified top toolbar is the only layout. Older panel keys such as `side_layout` remain
readable and are preserved on save, but they no longer affect the running overlay; the
configurator reports them as retired settings you can remove. Historically named `side.*`
item IDs still customize top-toolbar controls and must not be renamed.

### Configurator (GUI)

Expand Down Expand Up @@ -1081,7 +1086,7 @@ See [Session manager examples](examples/session-manager.md) for complete CLI, ov

- Config values seed startup defaults. When `restore_tool_state` is enabled (default), the last-used tool settings saved in the session (including arrow head placement) override those config defaults on startup. Run `wayscriber --clear-tool-state` to remove only that saved tool layer so config defaults apply next startup while saved boards/history remain. In a running overlay, use Command Palette → Reset Tool Defaults to clear the saved layer and immediately apply config defaults to the active tools.
- `--session-file` uses exactly the selected file, implies persistence for that overlay run, rejects directories/symlinks/special files, and does not create missing parent directories. A running daemon can launch a hidden overlay with a named target; if the overlay is already visible, hide it before switching to a different named session.
- The overlay Session panel lives in the side toolbar's Settings drawer. It can open an existing named session, save the current overlay as another named session, show session info, clear the active session, reopen recent named sessions, and jump to the configurator. The Open/Save As dialogs use `zenity` or `kdialog`; Save As appends `.wayscriber-session` when no extension is supplied and asks before replacing existing session artifacts.
- The overlay Session controls live in the top toolbar's Session popover (overflow menu → Session...). They can open an existing named session, save the current overlay as another named session, show session info, clear the active session, reopen recent named sessions, and jump to the configurator. The Open/Save As dialogs use `zenity` or `kdialog`; Save As appends `.wayscriber-session` when no extension is supplied and asks before replacing existing session artifacts.
- The configurator Session tab manages recent named sessions recorded when named-session targets are opened or saved from the CLI, daemon, or overlay. It can rename catalog labels, reveal files, and forget metadata without touching files. Clear Tool State removes only the saved tool layer; Clear Saved Data removes session files. Duplicate, Move, Clear Tool State, and Clear are disabled while an overlay, manually started daemon, or background service is active.

</details>
Expand Down
76 changes: 20 additions & 56 deletions config.example.toml
Original file line number Diff line number Diff line change
Expand Up @@ -518,14 +518,10 @@ layout_mode = "regular"
# choice
top_pinned = true

# Show side toolbar on startup (pinned)
side_pinned = true

# Start toolbars minimized to their edge restore tabs
# The minimize button updates these; a minimized bar always leaves a
# Start the top toolbar minimized to its edge restore tab
# The minimize button updates this; a minimized bar always leaves a
# clickable tab on screen to bring it back
top_minimized = false
side_minimized = false

# Display form of the top strip restored at startup: "full" or "micro"
# (one 44px round chip: active tool glyph + a ring in the current color).
Expand All @@ -535,24 +531,15 @@ side_minimized = false
# runtime-only and comes back per top_pinned
top_display_mode = "full"

# Where the side-palette functions live: "pill" (default) or "panel".
# "pill" retires the standalone side palette: drawing properties live in
# the top strip's contextual style pill, canvas management in the status
# HUD and board picker, and the Session/Settings panes in popovers opened
# from the top strip's overflow menu ("Session..." / "Settings...").
# "panel" is the legacy escape hatch restoring the classic four-pane side
# palette (side_active_pane, collapsed_sections, side_pinned, and
# side_minimized apply only under "panel"); it is deprecated and planned
# for removal one release after the pill default
side_layout = "pill"

# Side-palette pane restored at startup: "draw", "canvas", "session", or "settings"
# The overlay updates this as you switch panes (legacy side_layout = "panel" only)
side_active_pane = "draw"

# Side-palette sections collapsed to their header row
# The overlay updates this as you collapse/expand sections
collapsed_sections = []
# The unified top toolbar is the only layout. Drawing properties live in
# the top strip's contextual style pill; canvas management in the status
# HUD, board picker, and Canvas overflow popover; Session/Settings in
# popovers from the top strip's overflow menu. Older keys such as
# side_layout, side_pinned, side_minimized, side_active_pane,
# collapsed_sections, side_offset(_x), show_settings_section, and the
# retired items.order lists (side_sections, actions, pages, boards,
# presets, tool_options, sessions) remain readable and are preserved on
# save, but they no longer affect the running overlay.

# Use icons instead of text labels in toolbars
# Icons are more compact; text labels are more explicit
Expand All @@ -565,7 +552,7 @@ scale = 1.0
# When enabled, displays additional color options beyond the basic 8
show_more_colors = false

# Show basic actions (undo/redo/clear) in side toolbar
# Show basic actions (undo/redo/clear) in the Canvas overflow popover
show_actions_section = true

# Show advanced actions (undo all, delay, freeze, etc.)
Expand All @@ -591,7 +578,7 @@ show_pages_section = true
# Show board controls section (prev/next/new/del)
show_boards_section = true

# Show presets section in side toolbar
# Show presets island in the top strip
show_presets = true

# Show step undo/redo section
Expand All @@ -600,15 +587,11 @@ show_step_section = false
# Keep text controls visible even when text is inactive
show_text_controls = true

# Deprecated compatibility mirror. Settings navigation is always reachable;
# this value is preserved for older Wayscriber versions but is otherwise ignored.
show_settings_section = true

# Show timing delay sliders in side toolbar
# Show timing delay sliders in the Canvas popover's Step section
# Allows configuring delayed undo/redo all timing
show_delay_sliders = false

# Show marker opacity slider in side toolbar even when the marker tool isn't active
# Keep the marker opacity control available in the style pill even when the marker tool isn't active
# Enable to keep marker transparency control visible at all times
show_marker_opacity_section = false

Expand All @@ -623,17 +606,13 @@ show_preset_toasts = true
# Show cursor tool preview bubble near the pointer
show_tool_preview = false

# Authored default toolbar offsets (layer-shell/inline). Dragging a toolbar
# persists its position to runtime-ui.toml instead of rewriting these;
# Authored default top-toolbar offsets (layer-shell/inline). Dragging the
# strip persists its position to runtime-ui.toml instead of rewriting these;
# editing these values again takes over from the saved drag.
# Horizontal offset for the top toolbar
top_offset = 0.0
# Vertical offset for the top toolbar (move top bar down/up)
top_offset_y = 0.0
# Vertical offset for the side toolbar
side_offset = 0.0
# Horizontal offset for the side toolbar (move side bar left/right)
side_offset_x = 0.0

# Force inline toolbars even when layer-shell is available
force_inline = false
Expand Down Expand Up @@ -663,8 +642,8 @@ shown = []
[ui.toolbar.items.order]
# Optional order overrides. Empty lists use the built-in order.
# Known IDs omitted from a non-empty list are appended in the default order.
# Side section ordering uses runtime block representatives; detailed sections
# such as eraser-mode, polygon-sides, and font remain visibility-only IDs.
# Historically named side.* item IDs still customize top-toolbar controls
# (Canvas/Session/Settings popovers, section visibility); do not rename them.
top_tools = [
"top.tool.select",
"top.tool.pen",
Expand All @@ -684,21 +663,6 @@ top_controls = [
"top.utility.clear-canvas",
"top.utility.highlight",
]
side_sections = [
"side.group.colors",
"side.group.presets",
"side.group.thickness",
"side.group.arrow-labels",
"side.group.step-markers",
"side.group.marker-opacity",
"side.group.text-size",
"side.group.actions",
"side.group.boards",
"side.group.pages",
"side.group.step-undo",
"side.group.session",
"side.group.settings",
]

# ───────────────────────────────────────────────────────────────────────────────
# Status Bar Styling
Expand Down Expand Up @@ -815,7 +779,7 @@ hide_toolbars = true
hide_tool_preview = true

# What hide_toolbars does to the top strip: "hidden" removes it entirely,
# "micro" collapses it to the 44px micro chip (side toolbars always hide)
# "micro" collapses it to the 44px micro chip
toolbar_mode = "hidden"

# Close the help overlay when entering presenter mode
Expand Down
11 changes: 5 additions & 6 deletions configurator/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,11 @@ Destinations are `ui/toolbar`, `ui/toolbar-visibility`, `ui/status-bar`, `ui/cli
search box filled. `--help` prints the same list. An unknown destination falls back to the normal
initial screen and says so in the status banner.

Toolbar pins, placement offsets, the top strip's display form, item visibility/order, pane state,
and board pin controls are labeled as configured defaults because the running overlay can store
later customizations in the separate generated
`$XDG_DATA_HOME/wayscriber/runtime-ui.toml` file. The configurator edits only `config.toml`; it does
not overwrite or reset runtime preferences. Use the overlay Settings panel to inspect or reset that
state.
Toolbar pin, top placement offsets, the top strip's display form, item visibility/order, and board
pin controls are labeled as configured defaults because the running overlay can store later
customizations in the separate generated `$XDG_DATA_HOME/wayscriber/runtime-ui.toml` file. The
configurator edits only `config.toml`; it does not overwrite or reset runtime preferences. Use the
overlay Settings popover to inspect or reset that state.

Config, daemon-setup, and saved-session filesystem/process operations run through a bounded Tokio
blocking-job adapter. Two jobs may run concurrently; existing request ordering and busy-state gates
Expand Down
30 changes: 2 additions & 28 deletions configurator/src/app/pages/ui/toolbar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use relm4::ComponentSender;
use crate::messages::Message;
use crate::models::{
OverrideOption, TabId, TextField, ToggleField, ToolbarLayoutModeOption, ToolbarOverrideField,
ToolbarRebindModifierOption, ToolbarSideLayoutOption, ZoomChipDisplayOption,
ToolbarRebindModifierOption, ZoomChipDisplayOption,
};

use super::super::super::state::ConfiguratorApp;
Expand All @@ -13,8 +13,6 @@ use super::{note, options};
pub(super) fn build(sender: &ComponentSender<ConfiguratorApp>) -> BuiltPage {
let (layout_modes, layout_labels) =
options(ToolbarLayoutModeOption::list(), |value| value.label());
let (side_layouts, side_layout_labels) =
options(ToolbarSideLayoutOption::list(), |value| value.label());
let (zoom_chips, zoom_chip_labels) =
options(ZoomChipDisplayOption::list(), |value| value.label());
let (rebinds, rebind_labels) = options(ToolbarRebindModifierOption::ALL.to_vec(), |value| {
Expand All @@ -26,7 +24,7 @@ pub(super) fn build(sender: &ComponentSender<ConfiguratorApp>) -> BuiltPage {
let mut page = PageBuilder::new(sender, TabId::Ui);

page.group("Toolbar").custom(&note(
"These settings are configured defaults. Toolbar pins, position, display form, item visibility/order, pane state, and board pins changed in the overlay are saved separately as runtime preferences.",
"These settings are configured defaults. Toolbar pin, position, display form, item visibility/order, and board pins changed in the overlay are saved separately as runtime preferences.",
));

page.group("Layout")
Expand All @@ -38,14 +36,6 @@ pub(super) fn build(sender: &ComponentSender<ConfiguratorApp>) -> BuiltPage {
|app| app.draft.ui_toolbar_layout_mode,
Message::ToolbarLayoutModeChanged,
)
.combo_row(
"Side layout",
"Pill (the default) retires the side palette: drawing properties live in the top strip's style pill, canvas management in the status HUD and board picker, and Session/Settings in popovers on the top strip's overflow menu. Panel is the legacy escape hatch restoring the classic side palette; it is deprecated and planned for removal one release after the pill default.",
side_layouts,
side_layout_labels,
|app| app.draft.ui_toolbar_side_layout,
Message::ToolbarSideLayoutChanged,
)
.combo_row(
"Zoom chip",
"",
Expand Down Expand Up @@ -74,12 +64,6 @@ pub(super) fn build(sender: &ComponentSender<ConfiguratorApp>) -> BuiltPage {
|app| app.draft.ui_toolbar_top_pinned,
|value| Message::ToggleChanged(ToggleField::UiToolbarTopPinned, value),
)
.switch_row(
"Configured default: pin side toolbar",
"",
|app| app.draft.ui_toolbar_side_pinned,
|value| Message::ToggleChanged(ToggleField::UiToolbarSidePinned, value),
)
.switch_row(
"Use icon-only buttons",
"",
Expand Down Expand Up @@ -213,16 +197,6 @@ pub(super) fn build(sender: &ComponentSender<ConfiguratorApp>) -> BuiltPage {
|app| app.draft.ui_toolbar_top_offset_y.clone(),
|value| Message::TextChanged(TextField::ToolbarTopOffsetY, value),
)
.entry_row(
"Side offset Y (px)",
|app| app.draft.ui_toolbar_side_offset.clone(),
|value| Message::TextChanged(TextField::ToolbarSideOffset, value),
)
.entry_row(
"Side offset X (px)",
|app| app.draft.ui_toolbar_side_offset_x.clone(),
|value| Message::TextChanged(TextField::ToolbarSideOffsetX, value),
)
.custom(&note(
"Configured defaults. Dragging a toolbar in the overlay saves that position as a runtime preference; editing a value here takes over from the saved drag.",
));
Expand Down
11 changes: 2 additions & 9 deletions configurator/src/app/pages/ui/toolbar_visibility.rs
Original file line number Diff line number Diff line change
Expand Up @@ -219,9 +219,7 @@ pub(super) fn build(sender: &ComponentSender<ConfiguratorApp>) -> BuiltPage {
fn item_sections(built_in: &ResolvedToolbarItems) -> Vec<ItemSection> {
let mut sections: Vec<ItemSection> = Vec::new();
for definition in toolbar_item_definitions() {
if definition.id == toolbar_item_ids::SIDE_GROUP_SETTINGS
|| definition.id == toolbar_item_ids::TOP_CHROME_OVERFLOW
{
if definition.id == toolbar_item_ids::TOP_CHROME_OVERFLOW {
continue;
}

Expand Down Expand Up @@ -277,10 +275,6 @@ fn configurator_order_group(
ToolbarItemOrderGroup::TopControls => {
Some((ToolbarItemOrderGroup::TopControls, "Controls"))
}
ToolbarItemOrderGroup::SideSections => {
Some((ToolbarItemOrderGroup::SideSections, "Sections"))
}
_ => None,
}
}

Expand Down Expand Up @@ -333,7 +327,7 @@ fn visibility_label(visible: bool) -> &'static str {
fn surface_label(surface: ToolbarItemSurface) -> &'static str {
match surface {
ToolbarItemSurface::Top => "Top toolbar",
ToolbarItemSurface::Side => "Side toolbar",
ToolbarItemSurface::Popover => "Popover sections",
}
}

Expand All @@ -348,6 +342,5 @@ fn category_label(category: ToolbarItemCategory) -> &'static str {
ToolbarItemCategory::Board => "Boards",
ToolbarItemCategory::Setting => "Settings",
ToolbarItemCategory::Session => "Sessions",
ToolbarItemCategory::ToolOption => "Tool options",
}
}
10 changes: 1 addition & 9 deletions configurator/src/app/search/terms.rs
Original file line number Diff line number Diff line change
Expand Up @@ -176,10 +176,7 @@ pub(super) const UI_GENERAL_TERMS: &[&str] = &[
pub(super) const UI_TOOLBAR_TERMS: &[&str] = &[
"toolbar",
"layout mode",
"side layout",
"side palette",
"style pill",
"panel",
"zoom chip",
"zoom chip display",
"show zoom chip",
Expand All @@ -188,9 +185,7 @@ pub(super) const UI_TOOLBAR_TERMS: &[&str] = &[
"shortcut edit click",
"toolbar rebind modifier",
"pin top toolbar",
"pin side toolbar",
"configured default pin top toolbar",
"configured default pin side toolbar",
"runtime preferences",
"use icon-only buttons",
"show extended colors",
Expand All @@ -212,8 +207,6 @@ pub(super) const UI_TOOLBAR_TERMS: &[&str] = &[
"placement offsets",
"top offset x",
"top offset y",
"side offset x",
"side offset y",
];
pub(super) const UI_TOOLBAR_VISIBILITY_TERMS: &[&str] = &[
"toolbar visibility",
Expand All @@ -227,7 +220,7 @@ pub(super) const UI_TOOLBAR_VISIBILITY_TERMS: &[&str] = &[
"show toolbar buttons",
"visible toolbar buttons",
"top toolbar",
"side toolbar",
"popover sections",
"toolbar controls",
"tools",
"utilities",
Expand All @@ -238,7 +231,6 @@ pub(super) const UI_TOOLBAR_VISIBILITY_TERMS: &[&str] = &[
"presets",
"settings",
"sessions",
"tool options",
];
pub(super) const UI_STATUS_BAR_TERMS: &[&str] = &[
"status bar",
Expand Down
Loading
Loading