Hardware wallet window: invoices paid from PLEDGER, checksummed addresses, DEX signing, block confirmation animation

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ZHU MINCHAOandClaude Opus 5.5 committed 2026-11-03 22:29:42 +08:00
1 parent 5b7013f240
commit add61a6b5e
16 files changed
+768 -63

No files matched your search

+53
View File
@@ -41,6 +41,9 @@ C = {
'n': (0x1E, 0x1B, 0x25), # 近黑
'x': (0x4A, 0x4E, 0x58), # 石墨亮边
'z': (0x2D, 0x2F, 0x38), # 石墨暗
'P': (0xD8, 0xDA, 0xD0), # 墨水屏
'K': (0x3C, 0x3F, 0x48), # 石墨机身
'E': (0x5A, 0x5E, 0x6A), # 机身受光边
}
@@ -617,7 +620,57 @@ for _tier in range(4):
SPRITES['gpu_probidia_f_t%d' % _tier] = (lambda t=_tier: gpu_front('G', 'g2', tier=t))
SPRITES['gpu_pmd_f_t%d' % _tier] = (lambda t=_tier: gpu_front('R', 'r2', tier=t))
def hw_button(symbol):
"""硬件钱包的物理按键(24×24):石墨外圈、左上受光的金属环,中间凹下去的按键面,刻着 ✓ 或 ✕。"""
c = Canvas(24, 24)
for y in range(24):
for x in range(24):
d = ((x - 11.5) ** 2 + (y - 11.5) ** 2) ** 0.5
if d <= 11.5:
c.put(x, y, 'x' if x + y < 23 else 'z') # 外圈:左上亮、右下暗
if d <= 9.5:
c.put(x, y, 'k' if x + y < 23 else 'n') # 凹槽:反过来,左上暗、右下亮一点
if d <= 8.5:
c.put(x, y, 'z') # 按键面
mark = 'G' if symbol == 'ok' else 'R'
if symbol == 'ok':
pts = [(7, 12), (8, 13), (9, 14), (10, 15), (11, 14), (12, 13), (13, 12), (14, 11), (15, 10), (16, 9)]
else:
pts = [(8 + k, 8 + k) for k in range(8)] + [(15 - k, 8 + k) for k in range(8)]
for (x, y) in pts:
c.put(x, y, mark); c.put(x, y + 1, mark)
outline(c)
return c
def rounded(size, r, fill, light=None, dark=None):
"""圆角矩形(九宫格用):圆角半径 r,外轮廓 O;可选左上一圈受光、右下一圈背光。"""
c = Canvas(size, size)
def inside(x, y, rr):
cx = min(max(x, rr), size - 1 - rr); cy = min(max(y, rr), size - 1 - rr)
return (x - cx) ** 2 + (y - cy) ** 2 <= rr * rr + rr * 0.6
for y in range(size):
for x in range(size):
if inside(x, y, r):
c.put(x, y, fill)
if light or dark:
for y in range(size):
for x in range(size):
if c.px[y][x] is None:
continue
edge = any(not (0 <= x + dx < size and 0 <= y + dy < size) or c.px[y + dy][x + dx] is None for dx, dy in ((2, 0), (-2, 0), (0, 2), (0, -2)))
if edge:
c.put(x, y, light if x + y < size - 1 else dark)
outline(c)
return c
UI_ICONS = {'ui_bank': ui_bank, 'ui_poinbase': ui_poinbase, 'ui_web3': ui_web3}
UI_ICONS['ui_hw_shell'] = lambda: rounded(32, 7, 'K', 'E', 'z')
UI_ICONS['ui_hw_bezel'] = lambda: rounded(16, 4, 'n')
UI_ICONS['ui_hw_paper'] = lambda: rounded(12, 2, 'P')
UI_ICONS['ui_hw_ok'] = lambda: hw_button('ok')
UI_ICONS['ui_hw_no'] = lambda: hw_button('no')
# 叠加图:和底图同尺寸,位置 (0,0) 对齐,只画变化的像素,不参与判格
OVERLAYS = {