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:
@@ -7,7 +7,7 @@ reTerminal E1002 渲染层 —— 复用 renderer.DashboardRenderer 的组件(
|
||||
|
||||
版式(k=1,点阵字体且**只用整数倍字号 12/24/36/48/84**,不放大;四段,三道横规):
|
||||
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 定稿,
|
||||
此前「状态栏横排在时钟上方+时钟缩 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,底沿 79(F84 数字墨迹高 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,数字墨迹 25~79)右贴页边 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(紧凑单行,与三色版同款)----
|
||||
|
||||
Reference in New Issue
Block a user