From 04cac794ea7a681ee001df4b1e9efaefe27d4d59 Mon Sep 17 00:00:00 2001 From: Selectel ML Tokens Date: Thu, 10 Sep 2026 16:04:19 +0300 Subject: [PATCH] Dog loader: 48x32 detail and lighter overlay (50%) --- CHANGELOG.md | 4 +- src/selectel_ml_tui/ui/app.py | 2 +- src/selectel_ml_tui/ui/dog_art.py | 172 ++++++++++++++++++------------ tests/test_tui.py | 4 +- 4 files changed, 111 insertions(+), 71 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27f5b10..7b07ca4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,9 +8,9 @@ ### Добавлено - Экран **Dashboard**: полноэкранный индикатор загрузки — анимированная - **собачка из GIF** (12 кадров, 40 мс), отрисованная truecolor + **собачка из GIF** (12 кадров, 40 мс, 48×32), отрисованная truecolor half-block'ами (▀) с прозрачным фоном поверх затемнённого дашборда - (`$background 80%`). + (`$background 50%`). - На время загрузки ввод блокируется (горячие клавиши и фокус), после завершения — возвращается. - Показывается при автообновлении по таймеру и при ручном обновлении (`r`); diff --git a/src/selectel_ml_tui/ui/app.py b/src/selectel_ml_tui/ui/app.py index 8e1863f..3e1726e 100644 --- a/src/selectel_ml_tui/ui/app.py +++ b/src/selectel_ml_tui/ui/app.py @@ -669,7 +669,7 @@ class SelectelMLTUI(App[Any]): layer: _loading; width: 100%; height: 100%; - background: $background 80%; + background: $background 50%; content-align: center middle; text-align: center; } diff --git a/src/selectel_ml_tui/ui/dog_art.py b/src/selectel_ml_tui/ui/dog_art.py index 6113a05..727a9a2 100644 --- a/src/selectel_ml_tui/ui/dog_art.py +++ b/src/selectel_ml_tui/ui/dog_art.py @@ -1,7 +1,7 @@ """Кадры анимации индикатора-собачки (авто-сгенерировано, не редактировать). Источник: 236205.gif; квантование в палитру, фон прозрачный (индекс 0). -Кадр хранится как 32x22 индексов палитры (по строке). +Кадр хранится как 48x32 индексов палитры (по строке). """ from __future__ import annotations @@ -9,83 +9,123 @@ from __future__ import annotations import base64 import zlib -WIDTH = 32 -PX_HEIGHT = 22 +WIDTH = 48 +PX_HEIGHT = 32 FRAME_COUNT = 12 FRAME_MS = 40 # Индекс 0 — прозрачный фон; остальные — RGB кадров GIF. PALETTE: tuple[tuple[int, int, int], ...] = ( - (0,0,0), (255,255,255), (255,253,255), (255,255,249), (255,255,237), (255,250,241), - (255,255,227), (255,255,205), (251,254,245), (250,252,222), (245,253,237), - (161,253,251), (248,243,233), (247,241,202), (238,240,213), (224,235,231), - (254,218,208), (253,213,181), (227,225,205), (215,222,212), (216,215,204), - (253,204,185), (248,196,180), (225,199,179), (207,202,184), (236,183,173), - (213,181,176), (216,169,159), (213,153,148), (195,218,240), (196,198,188), - (191,193,179), (186,184,180), (192,170,157), (175,187,192), (171,169,157), - (158,172,207), (102,188,250), (190,155,145), (156,155,159), (183,137,135), - (161,135,133), (142,146,165), (137,132,135), (121,138,193), (121,126,151), - (227,104,135), (187,107,111), (223,77,125), (134,118,124), (165,84,91), - (111,116,159), (119,118,123), (117,114,115), (105,105,126), (106,102,104), - (106,91,101), (91,107,177), (88,94,138), (93,92,107), (84,83,114), (87,82,88), - (83,75,91), (75,76,104), (76,70,84), (68,68,94), (69,65,77), (176,44,87), - (135,20,39), (109,27,51), (109,0,13), (69,59,76), (64,59,78), (62,58,79), - (73,43,62), (86,14,32), (59,57,81), (58,54,74), (56,53,74), (59,54,69), (57,53,68), - (57,52,69), (58,51,66), (57,51,67), (56,51,68), (56,50,66), (57,45,61), - (48,59,108), (51,52,69), (53,51,68), (53,50,71), (53,50,65), (55,49,65), - (55,49,64), (50,49,65), (54,48,64), (54,48,63), (53,48,64), (53,48,63), (51,48,65), - (54,47,63), (53,47,65), (53,47,63), (53,47,62), (52,47,65), (52,47,63), (52,47,62), - (48,47,64), (53,46,62), (52,46,62), (51,46,62), (51,45,61), (50,45,61), (51,43,60), - (48,44,63), (47,43,60), (47,43,59), (46,42,58), (44,40,63), (44,39,57), (44,38,56), - (28,24,119), (41,36,54), (41,34,53), (42,32,51), (38,31,51), (36,31,50), - (33,26,47), + (0,0,0), (30,24,46), (38,32,52), (40,33,52), + (40,34,53), (40,36,54), (120,0,12), (42,36,55), + (44,36,55), (44,39,56), (127,0,14), (43,41,60), + (47,41,58), (47,43,60), (50,43,59), (50,44,60), + (53,43,59), (85,26,45), (47,46,63), (51,45,60), + (50,45,61), (51,46,62), (52,46,61), (50,47,63), + (51,46,63), (52,46,62), (53,46,62), (52,47,62), + (53,47,62), (49,48,65), (52,47,63), (53,47,63), + (48,49,66), (52,47,64), (53,48,63), (54,47,63), + (53,47,64), (52,48,64), (55,47,63), (53,48,64), + (54,48,64), (53,48,65), (45,51,70), (54,49,64), + (54,48,65), (55,49,64), (54,49,65), (55,49,65), + (56,49,65), (55,50,66), (56,50,66), (56,51,67), + (54,51,69), (66,46,64), (50,52,75), (56,52,70), + (128,17,35), (113,25,47), (58,55,74), (59,55,74), + (56,56,77), (64,56,73), (56,61,91), (70,64,77), + (60,62,89), (62,63,87), (137,31,49), (73,69,82), + (61,69,101), (70,74,98), (92,76,90), (76,80,102), + (93,86,95), (98,94,103), (149,67,88), (178,50,78), + (105,103,108), (143,95,102), (113,111,118), (119,120,126), + (143,117,118), (137,128,127), (138,138,134), (226,69,121), + (174,132,129), (150,142,143), (226,88,128), (152,150,150), + (199,135,136), (159,159,153), (176,158,158), (181,171,160), + (202,162,150), (183,182,169), (211,174,164), (196,194,177), + (228,181,167), (231,191,171), (201,205,188), (222,201,176), + (246,192,173), (215,214,194), (250,197,176), (204,214,211), + (254,200,178), (254,204,182), (220,224,201), (249,212,186), + (232,229,188), (238,222,189), (230,230,208), (214,226,232), + (233,234,206), (238,237,203), (228,234,220), (230,237,219), + (242,243,206), (240,241,220), (253,252,200), (229,242,238), + (243,246,227), (243,251,223), (251,252,216), (253,253,223), + (255,255,229), (245,251,245), (251,253,242), (255,255,239), ) _DATA_B64 = ( - "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" - "Sw0=" + "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" + "sab/AIrxKUs=" ) def decode_frames() -> list[bytes]: - """Вернуть список кадров: каждый — 32*22 байт индексов палитры.""" + """Вернуть список кадров: каждый — 48*32 байт индексов палитры.""" raw = zlib.decompress(base64.b64decode(_DATA_B64)) size = WIDTH * PX_HEIGHT return [raw[i * size:(i + 1) * size] for i in range(FRAME_COUNT)] diff --git a/tests/test_tui.py b/tests/test_tui.py index b78bed3..2146c81 100644 --- a/tests/test_tui.py +++ b/tests/test_tui.py @@ -405,8 +405,8 @@ def test_dog_art_frames() -> None: assert len(frames) == dog_art.FRAME_COUNT size = dog_art.WIDTH * dog_art.PX_HEIGHT assert all(len(f) == size for f in frames) - # уменьшенный размер и чётная высота для half-block - assert (dog_art.WIDTH, dog_art.PX_HEIGHT) == (32, 22) + # увеличенный размер и чётная высота для half-block + assert (dog_art.WIDTH, dog_art.PX_HEIGHT) == (48, 32) assert dog_art.PX_HEIGHT % 2 == 0 # индексы палитры в допустимом диапазоне, фон = 0 assert all(b < len(dog_art.PALETTE) for f in frames for b in f)