`ruff check --fix` over the whole tree, ahead of putting the linter in CI: 1977 mechanical fixes, overwhelmingly `Optional[X]` → `X | None` (1186 in the package alone) and the quoted annotations that `from __future__ import annotations` already made unnecessary, plus import sorting and unused imports. Nothing here changes behaviour — the suite is 1885 green before and after. Four findings were real rather than stylistic and are fixed by hand: a dead `cells` range in `MapCanvas`, a dead slot dict in the heat-ladder test, a `ProgressScreen` task handle nobody read, and a tab loop binding a `label` it never used. The two `F821`s were quoted forward references to names imported inside their function bodies — now declared under `TYPE_CHECKING`, which keeps `test_performance`'s local import (it guards the startup import graph) while letting the linter resolve the name. 412 findings remain and are deliberately untouched: they need a decision about the rule, not an edit to the code. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
61 lines
2.9 KiB
Python
61 lines
2.9 KiB
Python
"""The shared mark constants: node-type glyphs, their colours, and path sentinels.
|
||
|
||
The app's spatial surfaces — the map, the path graph, the braille rasters, the node
|
||
rows — all pin nodes with the same marks in the same hues, and several of them need the
|
||
constants *without* the machinery around them. Before this module, ``ui.widgets`` pulled
|
||
``map_render``, ``mapcanvas`` and ``pathgraph`` onto the boot path for a handful of
|
||
tuples and type aliases (~60 ms of import on the PicoCalc); now the constants live here,
|
||
dependency-free, and the heavy modules import *from* the constants instead of hosting
|
||
them. ``map_render``/``mapcanvas``/``pathgraph`` re-export their old names, so existing
|
||
importers of those modules are untouched.
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
from collections.abc import Callable
|
||
|
||
#: An ``(r, g, b)`` colour triple, 0–255 per channel (the raster/canvas colour type).
|
||
RGB = tuple[int, int, int]
|
||
|
||
|
||
def parse_hex(color: str) -> RGB:
|
||
"""Convert ``"#rrggbb"`` (or ``"rrggbb"``) to an ``(r, g, b)`` tuple."""
|
||
c = color.lstrip("#")
|
||
return (int(c[0:2], 16), int(c[2:4], 16), int(c[4:6], 16))
|
||
|
||
|
||
# Marker palette, shared across the whole app. The basemap is blue (water), green (parks)
|
||
# and warm amber (roads), so markers use the hues a map never contains — pink/violet — to
|
||
# stand out against it. Ordinary nodes are the loudest (bright pink); repeaters recede a
|
||
# step (a calmer violet); our own node stays the fixed yellow star; a node heard of but
|
||
# never identified is a light grey ring. Every glyph is in the PicoCalc console font.
|
||
#
|
||
# A mark's colour is whatever :func:`~meshterm.ui.theme.mark_rgb` takes — a literal hex, or
|
||
# a theme style name where the platform must pick the shade itself. The unknown ring is
|
||
# named (``node.unknown``) so the ring and the grey label beside it can never disagree.
|
||
SELF_MARK = ("★", "#facc15")
|
||
REPEATER_MARK = ("▲", "#a78bfa")
|
||
NODE_MARK = ("●", "#f472b6")
|
||
UNKNOWN_MARK = ("○", "node.unknown")
|
||
|
||
#: THE concealed character: one bullet stands in for one character of something the screen
|
||
#: is holding back — a password being typed (``ui/tui/prompt.py``), the BLE pairing PIN on
|
||
#: the Device info page. One glyph for the concept, so a row of them reads the same way
|
||
#: wherever it appears, and it is deliberately *not* the ``●`` of an unread message or a
|
||
#: node: those are marks that mean something, this one means "not shown".
|
||
MASK_MARK = "•"
|
||
|
||
#: Sentinels naming a path's endpoints on the route graph. ``\x00`` never appears in a
|
||
#: node hash, so they can share the node-id namespace without colliding with one.
|
||
SRC_NODE = "\x00src"
|
||
DST_NODE = "\x00dst"
|
||
|
||
#: Maps a node id to its graph marker: a ``(glyph, colour)`` pair.
|
||
GlyphOf = Callable[[str], tuple[str, str]]
|
||
|
||
#: A node's graph label, or ``None``/``""`` to leave the marker bare.
|
||
LabelOf = Callable[[str], str | None]
|
||
|
||
#: The colour a node's label is drawn in (usually the node's name hue).
|
||
LabelRgbOf = Callable[[str], RGB]
|