93fc5e0517
Panel now selects from four width tiers based on $COLUMNS (with a 6-col buffer per side before stepping up): 52-wide (default), 70, 74, or 78. Each tier carries richer category descriptions sized to fit the layout. The box is horizontally centered on every draw via a left-padding prefix. Key reader switches from stty min 1 to min 0 / time 3, giving a 0.3 s poll interval so COLUMNS changes are detected without a keypress. The erase formula is now wrap-aware: prev_max_line_width / COLUMNS gives the wrap factor, ensuring old wider panels are fully cleared after narrowing. Idle timeout ticks that detect no resize are skipped entirely.
195 lines
8.4 KiB
Fish
195 lines
8.4 KiB
Fish
# Copyright (C) 2026 Rootiest
|
||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||
|
||
# SYNOPSIS
|
||
# __config_toggle_draw <cur_row> <cur_scope> <var1> ... <var7>
|
||
#
|
||
# DESCRIPTION
|
||
# Renders the 14-line config-toggle TUI panel to stdout. Panel width and
|
||
# horizontal position are chosen automatically from $COLUMNS each call,
|
||
# so a terminal resize takes effect on the next keypress without any
|
||
# extra bookkeeping. Four width tiers with a 6-col buffer per side:
|
||
#
|
||
# COLUMNS ≥ 90 → 78-wide (IW=76, desc=43 chars)
|
||
# COLUMNS ≥ 86 → 74-wide (IW=72, desc=39 chars)
|
||
# COLUMNS ≥ 82 → 70-wide (IW=68, desc=35 chars)
|
||
# COLUMNS < 82 → 52-wide (IW=50, desc=17 chars) ← default
|
||
#
|
||
# The box is horizontally centered via a left-padding prefix on every
|
||
# output line. \e[14A\e[J erases by line count so the horizontal offset
|
||
# does not interfere with the redraw loop.
|
||
#
|
||
# ARGUMENTS
|
||
# cur_row 0–6, the currently highlighted row
|
||
# cur_scope "universal" or "session"
|
||
# var1–var7 Variable names for rows 0–6 (in order per Variable Reference)
|
||
#
|
||
# RETURNS
|
||
# 0 Always
|
||
#
|
||
# EXAMPLE
|
||
# __config_toggle_draw 0 universal \
|
||
# __fish_config_op_aliases __fish_config_op_autoexec \
|
||
# __fish_config_op_overrides __fish_config_op_integrations \
|
||
# __fish_config_op_logging __fish_config_op_greeting \
|
||
# __fish_config_opinionated
|
||
function __config_toggle_draw
|
||
set -l cur_row $argv[1]
|
||
set -l cur_scope $argv[2]
|
||
set -l vars $argv[3..]
|
||
|
||
set -l c_ok (set_color green)
|
||
set -l c_err (set_color red)
|
||
set -l c_dim (set_color brblack)
|
||
set -l c_sel (set_color --bold magenta)
|
||
set -l c_hi (set_color --bold white)
|
||
set -l c_head (set_color --bold cyan)
|
||
set -l c_reset (set_color normal)
|
||
|
||
set -l labels Aliases Auto-exec Overrides Integrations Logging Greeting Master
|
||
|
||
# ── Width tier: 6-col buffer per side before stepping up ──────────────
|
||
# IW = inner width (chars between │ │); desc field = IW - 33.
|
||
# All four layouts are exactly 14 lines tall — panel_h in caller stays 14.
|
||
set -l iw 50
|
||
set -l descs \
|
||
"cmd shadows" \
|
||
startup \
|
||
"keys/env/prompt" \
|
||
"terminal coupling" \
|
||
scrollback \
|
||
fish_greeting \
|
||
"disable all"
|
||
|
||
if test "$COLUMNS" -ge 90
|
||
set iw 76
|
||
set descs \
|
||
"shadows: ls→eza, cat→bat, cd→z, rm→trash" \
|
||
"Fisher bootstrap, themes, py-venv activate" \
|
||
"vi-mode, bang-bang, PAGER, CDPATH, starship" \
|
||
"Kitty/WezTerm tab/split fns, notifications" \
|
||
"scrollback capture & paru/yay AUR wrappers" \
|
||
"fish_greeting & first-run welcome banner" \
|
||
"master off-switch: overrides all categories"
|
||
else if test "$COLUMNS" -ge 86
|
||
set iw 72
|
||
set descs \
|
||
"ls→eza, cat→bat, cd→zoxide, rm→trash" \
|
||
"Fisher bootstrap, themes, py-venv auto" \
|
||
"vi-mode, bang-bang, PAGER, starship" \
|
||
"Kitty/WezTerm fns, done notifications" \
|
||
"scrollback capture & paru/yay wrappers" \
|
||
"fish_greeting: first-run welcome banner" \
|
||
"master off-switch for all categories"
|
||
else if test "$COLUMNS" -ge 82
|
||
set iw 68
|
||
set descs \
|
||
"ls→eza, cat→bat, cd→z, rm→trash" \
|
||
"Fisher, themes, py-venv activate" \
|
||
"vi-mode, bang-bang, PAGER, starship" \
|
||
"Kitty/WezTerm, done notifications" \
|
||
"scrollback & paru/yay log wrappers" \
|
||
"fish_greeting & first-run banner" \
|
||
"master disable for all categories"
|
||
end
|
||
|
||
set -l HBR (string repeat -n $iw '─')
|
||
|
||
# ── Center padding ────────────────────────────────────────────────────
|
||
# ponytail: floor division — left margin may be 1 col less than right if gap is odd
|
||
set -l p (string repeat -n (math --scale=0 "max(0, ($COLUMNS - ($iw + 2)) / 2)") ' ')
|
||
|
||
# ── Scope tabs ────────────────────────────────────────────────────────
|
||
set -l u_label
|
||
set -l s_label
|
||
if test $cur_scope = universal
|
||
set u_label "$c_hi● Universal$c_reset"
|
||
set s_label "○ Session "
|
||
else
|
||
set u_label "○ Universal"
|
||
set s_label "$c_hi● Session $c_reset"
|
||
end
|
||
|
||
# ── Top border ────────────────────────────────────────────────────────
|
||
# ┌─ Opinionated Settings (iw-23)×─ ┐ total = iw+2
|
||
printf '%s┌─%s Opinionated Settings %s┐\n' \
|
||
$p $c_head $c_reset(string repeat -n (math $iw - 23) '─')
|
||
|
||
# ── Scope tab line ────────────────────────────────────────────────────
|
||
# Inner: " ●/○ Universal ●/○ Session " (25) + (iw-40)×space + "Tab to switch " (15) = iw
|
||
printf '%s│ %s %s%s│\n' \
|
||
$p $u_label $s_label \
|
||
(string repeat -n (math $iw - 40) ' ')"Tab to switch "
|
||
|
||
# ── Top divider ───────────────────────────────────────────────────────
|
||
printf '%s│%s│\n' $p $HBR
|
||
|
||
# ── Category rows 0–5 ─────────────────────────────────────────────────
|
||
for i in (seq 0 5)
|
||
set -l idx (math $i + 1)
|
||
set -l var $vars[$idx]
|
||
set -l label $labels[$idx]
|
||
set -l desc $descs[$idx]
|
||
|
||
set -l val (__config_toggle_get_val $var $cur_scope)
|
||
|
||
# Badge: 7 visible chars, coloured
|
||
set -l badge
|
||
switch $val
|
||
case on
|
||
set badge "$c_ok"" ON$c_reset"
|
||
case off
|
||
set badge "$c_err""OFF $c_reset"
|
||
case '*'
|
||
set badge "$c_dim""DEFAULT$c_reset"
|
||
end
|
||
|
||
# Cursor: 2 visible chars
|
||
set -l curs " "
|
||
if test $i -eq $cur_row
|
||
set curs "$c_sel▶$c_reset "
|
||
end
|
||
|
||
# Label padded to 12, desc padded to (iw-33), right margin 3
|
||
set -l lpad (string pad -r -w 12 -- $label)
|
||
set -l dpad (string pad -r -w (math $iw - 33) -- $desc)
|
||
|
||
printf '%s│ %s%s [ %s ] %s │\n' $p $curs $lpad $badge $dpad
|
||
end
|
||
|
||
# ── Separator before Master ───────────────────────────────────────────
|
||
printf '%s│ %s │\n' $p (string repeat -n (math $iw - 6) '─')
|
||
|
||
# ── Master row (index 6) ──────────────────────────────────────────────
|
||
set -l val (__config_toggle_get_val $vars[7] $cur_scope)
|
||
set -l badge
|
||
switch $val
|
||
case on
|
||
set badge "$c_ok"" ON$c_reset"
|
||
case off
|
||
set badge "$c_err""OFF $c_reset"
|
||
case '*'
|
||
set badge "$c_dim""DEFAULT$c_reset"
|
||
end
|
||
set -l curs " "
|
||
if test $cur_row -eq 6
|
||
set curs "$c_sel▶$c_reset "
|
||
end
|
||
printf '%s│ %s%s [ %s ] %s │\n' \
|
||
$p $curs \
|
||
(string pad -r -w 12 -- Master) \
|
||
$badge \
|
||
(string pad -r -w (math $iw - 33) -- $descs[7])
|
||
|
||
# ── Bottom divider ────────────────────────────────────────────────────
|
||
printf '%s│%s│\n' $p $HBR
|
||
|
||
# ── Keybind hint ──────────────────────────────────────────────────────
|
||
# string pad is width-aware (arrows count as 1 column)
|
||
set -l hint " ↑↓/kj move ←→/hl set Tab scope q quit"
|
||
printf '%s│%s%s%s│\n' $p $c_dim (string pad -r -w $iw -- $hint) $c_reset
|
||
|
||
# ── Bottom border ─────────────────────────────────────────────────────
|
||
printf '%s└%s┘\n' $p $HBR
|
||
end
|