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:
1 parent
5b7013f240
commit
add61a6b5e
16 files changed
+768
-63
No files matched your search
@@ -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 = {
|
||||
|
||||
Reference in new issue
Block a user