Draw the whole interface in Compose

Etappen 3 to 6a of the migration (129 commits). Every window the operator sees
is Compose; the JavaFX ones still exist beside them so the two could be
compared against a live session, which is the only way the differences came to
light.

The toolchain first, then the settings window with its eleven tabs and 72 real
preferences; then the multi-column table as a component, and with it the rules
it needs -- stable row identity, a selection that survives a refresh, column
order the operator can drag, and a repaint when the rows change rather than
when the list instance does. Then the update and monitor windows, and the main
window: 22 station columns, the filter bar, the selected-station panel, the
message tabs, the priority bar, the sked controls, the status indicators and
the timeline, assembled behind a splitter because Compose has none.

The map stops being a WebView. A Compose canvas projects WebMercator tiles
itself, with the clustering in core and an asynchronous fetcher in place of the
local tile proxy; derive() becomes a pure Kotlin reimplementation instead of a
reflection call into com.sun.javafx.

Most of the volume here is parity the operator would notice rather than new
behaviour: desktop density instead of Material's phone minimums, colours taken
from the JavaFX stylesheets instead of Material's palette, row dividers, band
columns, grid-square labels and their colours, the home marker and antenna
beam, pinch-to-zoom under Wayland, and layouts that survive a window narrower
than the chart they stack.

Two lessons are worth more than the diff. A control bound to a value Compose
cannot observe writes through and never redraws -- that one shipped repeatedly
with a green build, because no test drew anything. And a layout that clips
instead of wrapping is worse than one that is merely too narrow: half a word
is the worst available outcome.
This commit is contained in:
Rsclub2_2 committed 2026-10-05 22:33:28 +02:00
1 parent a6fba12f01
commit cc8c90204e
173 files changed
+26500 -4305

No files matched your search

+5 -11
View File
@@ -26,19 +26,13 @@ build() {
export JAVA_HOME=$(find /usr/lib/jvm -maxdepth 1 -name 'java-21-*' -type d | head -n 1)
export PATH="${JAVA_HOME}/bin:${PATH}"
./gradlew --offline -S :app-desktop:collectRuntime
./gradlew --offline -S :app-desktop:createDistributable
# package() reads dist/KST4Contest. Application name, icon and the JDK
# module list come from app-desktop/build.gradle.kts.
rm -rf dist
mkdir -p dist
ADD_MODULES="$(grep -m1 '^jpackageAddModules=' gradle.properties | cut -d= -f2)"
jpackage \
--type app-image \
--name KST4Contest \
--icon packaging/icons/kst4contest.png \
--input app-desktop/build/dist-libs \
--main-jar app.jar \
--main-class kst4contest.view.Main \
--add-modules "$ADD_MODULES" \
--dest dist
cp -a app-desktop/build/compose/binaries/main/app/KST4Contest dist/
}
package() {
+6 -26
View File
@@ -19,34 +19,14 @@ build() {
export JAVA_HOME=$(find /usr/lib/jvm -maxdepth 1 -name 'java-21-*' -type d | head -n 1)
export PATH="${JAVA_HOME}/bin:${PATH}"
./gradlew --offline -S :app-desktop:collectRuntime
./gradlew --offline -S :app-desktop:createDistributable
# package() reads dist/KST4Contest. Application name, icon and the JDK
# module list come from app-desktop/build.gradle.kts, so this PKGBUILD no
# longer has to keep its own copy of them.
rm -rf dist
mkdir -p dist
# From the Gradle build onwards the list lives in gradle.properties. Older
# tarballs still carry it in pom.xml or derive it via packaging/AddModules.java.
if [ -f gradle.properties ]; then
ADD_MODULES="$(grep -m1 '^jpackageAddModules=' gradle.properties | cut -d= -f2)"
elif [ -f packaging/AddModules.java ]; then
ADD_MODULES="$(java packaging/AddModules.java)"
else
ADD_MODULES="$(sed -n 's:.*<addmodule>\(.*\)</addmodule>.*:\1:p' pom.xml | paste -sd,)"
fi
# Same story for the packaging icon: without --icon jpackage silently ships
# its own Duke placeholder, but tarballs older than v1.42.0 have no icon to
# point at, so only pass the flag when the file is actually there.
ICON_ARGS=()
if [ -f packaging/icons/kst4contest.png ]; then
ICON_ARGS=(--icon packaging/icons/kst4contest.png)
fi
jpackage \
--type app-image \
--name KST4Contest \
"${ICON_ARGS[@]}" \
--input app-desktop/build/dist-libs \
--main-jar app.jar \
--main-class kst4contest.view.Main \
--add-modules "$ADD_MODULES" \
--dest dist
cp -a app-desktop/build/compose/binaries/main/app/KST4Contest dist/
}
package() {