Files
MeshTerm/meshterm/ui/marks.py
T
Jean-Pierre MartineauandClaude Opus 5 71b16ec7b7 The annotations, imports, and dead locals answer to ruff
`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>
2026-09-06 17:26:12 -04:00

61 lines
2.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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]