Skip to content

spike(qt): PySide6 vertical slice and go/no-go measurements (8c) - #29

Draft
DesvoSoft wants to merge 2 commits into
devfrom
spike/qt
Draft

DesvoSoft wants to merge 2 commits into
devfrom
spike/qt

Conversation

@DesvoSoft

Copy link
Copy Markdown
Owner

Roadmap 8c, a timeboxed spike. Result: GO with conditions. The full write-up is in docs/QT-SPIKE.md.

This is exploratory, so it is a draft and not meant to be merged as is. 8d will rebuild these pieces screen by screen.

Criteria (Windows 11, this machine)

Criterion Target Qt Verdict
Dialog open time, flash < 100 ms, no flash 63–74 ms first open, 26–37 ms warm; close dialog 14–32 ms. No white frame in any capture. PASS
Exe size ≤ 60 MB 30.9 MiB one-file PyInstaller PASS
Startup ≤ current + 1 s 1,538 ms median of 5, vs 2,410 ms PASS
150 % + Spanish correct es/en at 100/150 % (QT_SCALE_FACTOR) PASS*

Baselines and controls:

  • Dialog time: CustomTkinter takes ~370 ms for Server Properties and ~120 ms for confirm dialogs.
  • Flash: the same probe on a CTkToplevel catches a 100 % white frame every time.
  • Exe size: CustomTkinter built the same way is 23.0 MiB.

* 150 % was emulated with QT_SCALE_FACTOR, not by changing the Windows display setting. A real check is one of the conditions.

What's in it

  • app/ui_qt/ (~920 lines), launched with py app/launcher.py --ui=qt. CustomTkinter stays the default.
    • Server list and a live status header.
    • Batched console with command input.
    • Close-to-tray choice and the tray icon.
    • The Engine & Version dialog.
    • Dark/light theme built from the AppConfig tokens.
    • QtDispatcher: a queued signal that runs API callbacks on the GUI thread.
  • Uses only app/api. tests/test_ui_qt.py enforces that and also tests the dispatcher; those tests are skipped when PySide6 is missing, as in CI.
  • Spanish uses the same gettext catalog. 28 new strings, .po and .mo updated.
  • Packaging:
    • packaging/qt_spike.spec builds the Qt exe.
    • PySide6 is only in requirements-qt.txt.
    • The release specs now exclude app.ui_qt/PySide6, so the current build is unchanged.
  • Measurements: tools/qt_spike_bench.py reproduces every number. Screenshots and raw results are in docs/assets/qt-spike/.
  • Docs: ROADMAP 8c status and the ARCHITECTURE dispatcher table are updated.

Conditions for 8d

  1. Check real 150 % and mixed-DPI scaling by hand.
  2. Port the first-run, setup, uninstall and EULA dialogs (still Tk) before tkinter leaves the exe.
  3. Add a Linux Qt one-file build and a Python 3.11 Windows build in CI early.
  4. Add the LGPL notices for Qt/PySide6.

Proposed 8d order, about 24 working days: listed in docs/QT-SPIKE.md.

Not done

  • Nuitka: it needs MSVC for Python 3.13+, which is not installed.
  • Real server start: not run. Console streaming was tested with 2k and 20k line bursts on the real EventBus.

Roadmap 8c. app/ui_qt sits only on app/api: server list and live status
header, batched console with command input, close-to-tray choice and
QSystemTrayIcon, the Engine & Version dialog, a dark/light theme built
from the AppConfig tokens, and Spanish from the same gettext catalog
(28 new strings). QtDispatcher posts API callbacks to the GUI thread
through a queued signal.

packaging/qt_spike.spec builds a 30.9 MiB one-file exe; PySide6 lives
only in requirements-qt.txt and the release specs exclude it.
tools/qt_spike_bench.py reproduces the numbers in docs/QT-SPIKE.md
(GO with conditions); ROADMAP 8c updated.
# Conflicts:
#	assets/locales/es/LC_MESSAGES/zbb.mo
#	assets/locales/es/LC_MESSAGES/zbb.po
#	assets/locales/zbb.pot

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant