feat: E1002 右上角天气改「图标|F48 温度」在上、一行城市·天气·温区右对齐在下

温度 F48 粗 3 顶沿与时钟齐平、「°」F24 上标、右贴页边;底行「定位水滴+城市  天气  温区」
与日期同基线右对齐。图标 1.25 倍并按各类别真实墨迹范围(_ICON_EXTENT,多云太阳光芒探出顶部、
雷阵雨闪电垂到云下)竖直居中于温度中心,避免顶到页边或越过横规。移除不再使用的 F72。
同步 CLAUDE.md 版式说明并记录同日被否的「三行信息|图标 ×1.75|F84 温度」中间版。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 16:53:05 +08:00
parent c836b0d6bc
commit 7c60d3680c
2 changed files with 30 additions and 28 deletions

File diff suppressed because one or more lines are too long

View File

@@ -7,7 +7,7 @@ reTerminal E1002 渲染层 —— 复用 renderer.DashboardRenderer 的组件(
版式k=1点阵字体且**只用整数倍字号 12/24/36/48/84**,不放大;四段,三道横规):
A 顶部090 **大时钟 F84**(墨迹 1679 其右一列三行、左缘对齐:① 电池图标+电量 ② 温度计+温度 水滴+湿度 ③ 星期/日期
右侧:两行(定位+城市 / 天气·温区,底行与时钟同基线)| 天气图标 **实时温度 F72**(比时钟小一号、同基线、「°」F36 上标、右贴页边
右侧上下两层:上 天气图标 ×1.25 **实时温度 F48 粗 3**(墨迹顶沿 16 与时钟齐平、「°」F24 上标、右贴页边 790下 一行「定位水滴+城市 天气 温区」F12 右对齐贴 790、与日期同基线
F12行距 22日期与时钟数字**基线对齐**;设备数据来自 SenseCraft 遥测 `data.device`2026-09-14 定稿,
此前「状态栏横排在时钟上方+时钟缩 F60」版被否
|天气(右,贴 790——天气组件与三色版同尺寸。
@@ -64,8 +64,7 @@ class E1002Renderer(DashboardRenderer):
self.F13 = ImageFont.truetype(font_path, 12)
self.F16 = self.F13
self.FPACE = self.F13
self.F84 = ImageFont.truetype(font_path, 84)
self.F72 = ImageFont.truetype(font_path, 72) # 6 倍整数缩放右上角实时温度比时钟小一号2026-09-14 用户要求)
self.F84 = ImageFont.truetype(font_path, 84) # 顶部大时钟
# ---------- 配色钩子(三档,顺序固定 绿 → 黑 → 红;用量与 pace 各自独立计算)----------
_ok, _pace_tol = _cfg.USAGE_OK, _cfg.PACE_TOL # 由 _usage_block 按数据覆盖
@@ -96,6 +95,10 @@ class E1002Renderer(DashboardRenderer):
return GREEN
return BLACK
# 天气图标各类别的真实墨迹上下沿(基类 _weather_icon 名义框 36×38 的坐标系、未乘 s用于按墨迹而非名义框竖直居中。
_ICON_EXTENT = {"sunny": (1, 37), "clear_night": (6, 32), "overcast": (10, 34), "fog": (9, 34),
"cloudy": (-4, 38), "rain": (5, 39), "snow": (5, 40), "thunder": (5, 46)}
# ---------- 组件 ----------
def _status_battery(self, x, cy, dev):
"""状态项·电池F12数字伪粗体墨迹中心 cy外框 16×9 + 正极 2×4内部按电量实心填充——充电中 GREEN、≤20% RED、其余 BLACK
@@ -295,7 +298,7 @@ class E1002Renderer(DashboardRenderer):
usage, gpt = data["usage"], data.get("usage_gpt") or {}
# ---- A. 顶部:大时钟 F84 占满整段(左);其右一列三行、左缘与日期对齐:① 电池 ② 温度+湿度 ③ 星期/日期(与时钟基线对齐)
# 天气(右):两行(定位+城市 / 天气·温区,底行同基线)| 图标 温度 F72 右贴页边 ----
# 天气(右):上层 图标 ×1.25 温度 F48顶沿与时钟齐平、右贴页边下层 一行「定位+城市 天气 温区」右对齐、与日期同基线 ----
DIV_Y = 90
TIME_BOLD, INK_TOP = 3, 16 # 伪粗体 3px墨迹顶沿 16底沿 79F84 数字墨迹高 63
_, tt, _, tb = self.F84.getbbox(dt["time"])
@@ -313,34 +316,33 @@ class E1002Renderer(DashboardRenderer):
dev = data.get("device")
self._status_battery(col_x, cy_date - 2 * PITCH, dev)
self._status_env(col_x, cy_date - PITCH, dev)
# 天气2026-09-14 用户要求)从左到右:两行信息(左缘对齐:① 定位水滴+城市 ② 天气·温区,底行与时钟同基线)| 天气图标(竖直居中)
# 实时温度 F72比时钟小一号与时钟同粗、同基线 79数字墨迹 2579右贴页边 R。曾试过 F84 与时钟同高,被嫌大
loc, temp, cr = wt["loc"], wt["temp"], f'{wt["cond"]} {wt["range"]}'
# 度数符号不用大字号F84 下 35px 宽且比数字高 7px「°」F36 粗 2 作上标,墨迹顶沿对齐数字顶沿
FT = self.F72
# 天气2026-09-15 用户要求)上下两层:上层 天气图标 实时温度 F48右贴页边 R墨迹顶沿 16 与时钟齐平);
# 下层 一行「定位水滴+城市 天气 温区」F12 右对齐贴 R与日期行同基线底沿 79与时钟基线对齐
# 此前(同日上午)为「三行信息|图标 ×1.75|温度 F84 与时钟同高」,用户随即改为本版;更早为 F72「小一号」版2026-09-14
loc, temp, cond, rng = wt["loc"], wt["temp"], wt["cond"], wt["range"]
FT, DEG_F = self.F48, self.F24 # 「°」小一号作上标(大字号度号又宽又高),墨迹顶沿对齐数字顶沿
has_deg = temp.endswith("°")
digits = temp[:-1] if has_deg else temp
DEG_BOLD, DEG_GAP = 2, 2
deg_w = self._tw_b("°", self.F36, DEG_BOLD) + DEG_GAP if has_deg else 0
DEG_BOLD, DEG_GAP = 1, 2
deg_w = self._tw_b("°", DEG_F, DEG_BOLD) + DEG_GAP if has_deg else 0
_, tdt, _, tdb = FT.getbbox(digits)
temp_x = R - deg_w - self._tw_b(digits, FT, TIME_BOLD)
temp_y = base_y - tdb # 数字沿与时钟基线对齐
temp_y = INK_TOP - tdt # 数字墨迹顶沿与时钟顶沿齐平16底沿 52
self.text(temp_x, temp_y, digits, FT, bold=TIME_BOLD)
if has_deg:
rb = self.F36.getlength("°") - self.F36.getmask("°").getbbox()[2] # 字形右侧空白 3px,补回使墨迹右缘贴 R
self.rtext(R + rb, temp_y + tdt - self.F36.getbbox("°")[1], "°", self.F36, bold=DEG_BOLD)
s = 1.5
iw, ih = 36 * s, 38 * s
icon_x = temp_x - 14 - iw
self._weather_icon(icon_x, (DIV_Y - ih) / 2,
self._weather_category(wt.get("icon")), s=s, accent=RED, wet=BLUE)
PIN_W, PIN_GAP = 8, 6
col_w = max(PIN_W + PIN_GAP + self._tw(loc, self.F12), self._tw(cr, self.F12))
col_x = icon_x - 12 - col_w
self.text(col_x, date_y, cr, self.F12) # 底行:天气·温区,与日期同基线
loc_y = date_y - PITCH
self._loc_pin(col_x, loc_y + 2, PIN_W, fg=RED)
self.text(col_x + PIN_W + PIN_GAP, loc_y, loc, self.F12)
rb = DEG_F.getlength("°") - DEG_F.getmask("°").getbbox()[2] # 字形右侧空白,补回使墨迹右缘贴 R
self.rtext(R + rb, temp_y + tdt - DEG_F.getbbox("°")[1], "°", DEG_F, bold=DEG_BOLD)
temp_cy = INK_TOP + (tdb - tdt) / 2 # 温度墨迹竖直中心,图标以此居中
s = 1.25
cat = self._weather_category(wt.get("icon"))
et, eb = self._ICON_EXTENT.get(cat, (0, 38)) # 该类图标真实墨迹的上下沿(名义框 36×38 之外:多云太阳光芒探出顶部、雷阵雨闪电垂到云下)
icon_x = temp_x - 14 - 36 * s
self._weather_icon(icon_x, temp_cy - (et + eb) * s / 2, cat, s=s, accent=RED, wet=BLUE)
PIN_W, PIN_GAP, SEP = 8, 6, " "
info = f"{loc}{SEP}{cond}{SEP}{rng}"
info_x = R - self._tw(info, self.F12)
self.text(info_x, date_y, info, self.F12) # 底行与日期同基线
self._loc_pin(info_x - PIN_GAP - PIN_W, date_y + 2, PIN_W, fg=RED)
self.hdash(8, self.W - 8, DIV_Y)
# ---- B. 用量:左 Claude 右 Codex紧凑单行与三色版同款----