0.4.2 — Menus#
Released
The 0.4.2 release introduced the three-layer menubar model, menu module scaffolding, and a large batch of installer and release pipeline fixes.
Three-Layer Menubar Model#
The HostMenu menubar is now structured as three permanent layers:
Built-in layer — the
Appcascade (Close Window / Quit), always first, built automatically byattach()Project layer — app-wide cascades defined once in
Host.pyat startup; never cleared during normal useScreen layer — cascades contributed by the active tab via
configure_menu(menubar); all cleared automatically on tab deactivation
HostMenu API Changes#
set_project_items(items, label)— new method; appends one cascade to the project layer; calling multiple times adds multiple cascades; these persist across tab changesclear_project_items()— removes all project-layer cascadesset_screen_items(items, label)— accumulates rather than replaces; calling multiple times adds multiple screen-layer cascades side by sideclear_screen_items()— removes all accumulated screen cascades_project_labels: list[str]and_screen_labels: list[str]replace the single_screen_cascade/_screen_labelpair
VIS add screen <name> menu <menuname>#
Screen.addMenu(menu)implemented (was a stub)Creates
modules/<screen>/m_<menuname>.pywith aconfigure_menu(menubar)function pre-filled with a commented cascade templateIf
modules/<screen>/m_<screenname>.py(hooks module) already exists and does not defineconfigure_menu, a delegation function is appended automaticallyIf
configure_menualready exists, import instructions are added as comments for manual wiring
Installer & Release Fixes#
Replaced
from tkinter import *withimport tkinter as tkinInstaller.py(wildcard import shadowedall())Fixed
shortcut(): stale loop variable and nonexistentuser_desktop_dir()Removed stale
i_file.close()inmakechecksFixed
extal(): onlychmod +xactual binaries on LinuxReplaced
os.mkdirwithos.makedirs(exist_ok=True)inadjacents()Deduplicated
installableslistReplaced
source.index(i)withenumerateinmakechecksAdded
archive.close()calls in quiet mode exit and GUI close buttonFixed prefix matching in extraction to prevent false matches
Fixed
_internalfilter to use trailing slashFixed
previous()crash viaglobal next_btnReplaced four redundant extraction loops with single-pass install + progress bar
Added version display in installer header and next to checkboxes
Fixed
binstall()to take separateselected_screensparameterReplaced manual argument parsing with
ArgHandler; added--Help,--Path,--Desktopflags--Quietwith no screen names now defaults to installing all screensAdded
binaries.zipexistence check with user-friendly errorRemoved unused
shutilimport
Release Pipeline Fixes#
Fixed
newVersion(): compared Version object vs stringAdded user confirmation prompt in
newVersion()before applying a version changeRe-enabled
newVersion()call inrelease()(was commented out)Collapsed duplicated path logic in
clean()Removed
os.chdir()fromrelease()
Cached Installer Builds#
_Release.pyno longer runs PyInstaller for the installer on every release; the base installer exe is compiled once and cached in.VIS/cache/SHA-256 hash of
Installer.py+ icon file stored alongside the cache; recompiled only when source or icon changesInstaller.pytries self-contained mode first (sys.frozen+ZipFile(sys.executable)), falls back to externalbinaries.zip
Planned#
Auto-launch after install — optional checkbox on the completion page