Skip to content

Commit 7e7e889

Browse files
Zayn995claude
andcommitted
Header image: struck-through tweak counts wrap to a second line
The row of struck-through numbers had grown to the point where it pushed the tagline off the right edge of the Nexus header. The numbers now flow like words: what does not fit moves to the next line, the current count and the sentence after it stay together, and the sliders move down a little when a second line exists. If two lines are not enough the numbers are set smaller before the script gives up. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
1 parent 3d41aaf commit 7e7e889

1 file changed

Lines changed: 64 additions & 20 deletions

File tree

tools/make_header.py

Lines changed: 64 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -108,27 +108,71 @@ def scribbled_number(text: str, size: int, color, strike=True,
108108
return tile.rotate(angle, expand=True, resample=Image.BICUBIC)
109109

110110

111-
# Tagline: "Sliders in. .pak out." + immer wieder durchgestrichene Zahlen
111+
# Tagline: "Sliders in. .pak out." + immer wieder durchgestrichene Zahlen.
112+
# Die Zahlen fliessen wie Woerter: was rechts nicht mehr passt, wandert in
113+
# die naechste Zeile (Wunsch des Besitzers, 05.09.2026 - vorher schob die
114+
# Reihe den Satz aus dem Bild). Die aktuelle Zahl und der Satz dahinter
115+
# bleiben immer zusammen. Bei zwei Zeilen ruecken die Slider etwas nach
116+
# unten; reichen zwei Zeilen nicht, werden die Zahlen kleiner gesetzt.
112117
tag_font = font(28, variation="SemiBold")
113-
y_base = 172
114-
x = 197
115-
prefix = "Sliders in. .pak out. "
116-
d.text((x, y_base), prefix, font=tag_font, fill=GREY)
117-
x += int(d.textlength(prefix, font=tag_font))
118-
for i, number in enumerate(STRUCK_NUMBERS):
119-
tile = scribbled_number(number, 28, (128, 130, 134),
120-
angle=(-2.5, 2.0, -1.5)[i % 3])
121-
img.paste(tile, (x, y_base + (-12, -17, -9)[i % 3]), tile)
122-
x += tile.width - 8
123-
tile = scribbled_number(CURRENT_NUMBER, 31, AMBER, strike=False, angle=-2.0)
124-
img.paste(tile, (x, y_base - 16), tile)
125-
x += tile.width - 14
126-
d.text((x, y_base), " tweaks \u2013 zero modding knowledge needed.",
127-
font=tag_font, fill=GREY)
128-
129-
slider(d, 200, 740, 266, 0.67)
130-
slider(d, 200, 740, 312, 0.29)
131-
slider(d, 200, 740, 356, 0.51)
118+
X0, X_MAX, Y_BASE, LINE_H = 197, 1268, 172, 40
119+
PREFIX = "Sliders in. .pak out. "
120+
SUFFIX = " tweaks \u2013 zero modding knowledge needed."
121+
122+
123+
def layout(struck_size: int, current_size: int):
124+
"""Zeilen aus Praefix, Zahlen-Schnipseln und Schlusssatz zusammensetzen.
125+
Liefert eine Liste von Zeilen; jede Zeile ist eine Liste von
126+
(x, art, nutzlast, dy)."""
127+
lines = [[]]
128+
x = X0
129+
lines[-1].append((x, "text", PREFIX, 0))
130+
x += int(d.textlength(PREFIX, font=tag_font))
131+
for i, number in enumerate(STRUCK_NUMBERS):
132+
tile = scribbled_number(number, struck_size, (128, 130, 134),
133+
angle=(-2.5, 2.0, -1.5)[i % 3])
134+
if x + tile.width > X_MAX:
135+
lines.append([])
136+
x = X0
137+
lines[-1].append((x, "tile", tile, (-12, -17, -9)[i % 3]))
138+
x += tile.width - 8
139+
current = scribbled_number(CURRENT_NUMBER, current_size, AMBER,
140+
strike=False, angle=-2.0)
141+
tail = (current.width - 14) + int(d.textlength(SUFFIX, font=tag_font))
142+
if x + tail > X_MAX:
143+
lines.append([])
144+
x = X0
145+
lines[-1].append((x, "tile", current, -16))
146+
x += current.width - 14
147+
lines[-1].append((x, "text", SUFFIX, 0))
148+
return lines
149+
150+
151+
lines = layout(28, 31)
152+
if len(lines) > 2:
153+
lines = layout(23, 31)
154+
if len(lines) > 2:
155+
raise SystemExit("Zu viele durchgestrichene Zahlen fuer zwei Zeilen - "
156+
"STRUCK_NUMBERS kuerzen oder LINE_H/Slider anpassen.")
157+
158+
for row, line in enumerate(lines):
159+
y = Y_BASE + row * LINE_H
160+
for pos, (x, kind, payload, dy) in enumerate(line):
161+
if kind == "text":
162+
d.text((x, y), payload, font=tag_font, fill=GREY)
163+
else:
164+
# Schnipsel haben 14 px Rand: am Zeilenanfang so weit nach links
165+
# ruecken, dass die Ziffer buendig mit "Sliders" steht.
166+
img.paste(payload, (x - (12 if pos == 0 else 0), y + dy), payload)
167+
168+
# Slider: bei einer Tagline-Zeile wie bisher, bei zwei etwas tiefer, damit
169+
# die zweite Zeile nicht in den ersten Regler laeuft.
170+
slider_ys = (266, 312, 356) if len(lines) == 1 else (282, 322, 358)
171+
slider(d, 200, 740, slider_ys[0], 0.67)
172+
slider(d, 200, 740, slider_ys[1], 0.29)
173+
slider(d, 200, 740, slider_ys[2], 0.51)
174+
print(f"Tagline: {len(lines)} Zeile(n), {len(STRUCK_NUMBERS)} durchgestrichene "
175+
f"Zahlen, aktuell {CURRENT_NUMBER}")
132176

133177
OUT.parent.mkdir(parents=True, exist_ok=True)
134178
img.save(OUT)

0 commit comments

Comments
 (0)