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