[PR #1234] [CLOSED] Улучшения интерфейса настроек #115

Closed
opened 2026-09-08 16:02:14 +03:00 by mirror-bot · 0 comments

📋 Pull Request Information

Original PR: https://github.com/Flowseal/tg-ws-proxy/pull/1234
Author: @holdingq0
Created: 8/18/2026
Status: ❌ Closed

Base: main ← Head: ui/settings-polish


📝 Commits (4)

  • 459e860 ui: replace language/theme comboboxes with animated select
  • 9c7be99 ui: animated checkboxes
  • 5ccd3a9 ui: rounded tooltips
  • 4a1bc7e ui: instant language switch, flicker-free theme switch, regen icon

📊 Changes

9 files changed (+1267 additions, -136 deletions)

View changed files

➕ ui/ctk_anim.py (+218 -0)
➕ ui/ctk_checkbox.py (+214 -0)
➕ ui/ctk_select.py (+538 -0)
📝 ui/ctk_theme.py (+1 -0)
📝 ui/ctk_tooltip.py (+43 -15)
📝 ui/ctk_tray_ui.py (+231 -120)
📝 ui/i18n/en.json (+1 -0)
📝 ui/i18n/ru.json (+1 -0)
📝 utils/win32_theme.py (+20 -1)

📄 Description

Улучшения интерфейса настроек

Несколько правок по интерфейсу окна настроек: выпадающие списки, чекбоксы, подсказки
и поведение при смене языка и темы.

Что исправлено

Выпадающие списки языка и темы. CTkComboBox открывает список нативным меню
tkinter: клик по стрелке при открытом меню сначала закрывал его как «клик мимо», а
затем тот же клик открывал заново — визуально список мигал и не закрывался. Список
заменён на собственный виджет CtkSelect: повторный клик закрывает, список также
закрывается по клику мимо, прокрутке, Escape и перемещению окна. Выбранное значение
отмечено галочкой, стрелка плавно переворачивается, строки подсвечиваются при наведении.

Язык применялся только после сохранения и перезапуска, хотя тема применялась сразу.
Теперь каждый переводимый элемент формы знает свой ключ перевода, поэтому выбор языка
мгновенно перерисовывает диалог, подсказки и меню в трее, не теряя введённые в поля
значения. Отмена по-прежнему возвращает прежний язык.

Мигание окна при смене темы. CustomTkinter перекрашивает заголовок окна на Windows
через withdraw() + deiconify(), из-за чего окно пропадало и появлялось снова. Диалог
отключает эту процедуру и выставляет атрибут тёмного заголовка сам, перерисовывая рамку
через SetWindowPos, — окно остаётся на месте.

Чекбоксы заменены на CtkCheckBox с той же внешностью, но с анимацией: заливка
квадрата и прорисовка галочки вместо мгновенной подстановки глифа. Состояние
по-прежнему хранится в BooleanVar, поэтому остальной код не менялся.

Подсказки были прямоугольными рядом со скруглёнными полями — теперь скруглены,
с прозрачными углами и коротким появлением.

Кнопка перегенерации секрета использовала текстовый символ ↺, который в разных
шрифтах выглядит по-разному и смещён от центра. Теперь это нарисованная круговая стрелка.

Детали реализации

  • Иконки (стрелка списка, галочки, круговая стрелка) рисуются через Pillow с
    четырёхкратным суперсэмплингом и учитывают масштаб виджетов CustomTkinter, поэтому
    не «лесенят» на HiDPI. Pillow уже есть в зависимостях; если его нет, есть запасной
    путь на примитивах Canvas.
  • Скруглённые углы всплывающих окон сделаны через прозрачный ключевой цвет окна
    (Windows), с запасным вариантом заливки там, где оконный менеджер этого не умеет.
  • Обработчики закрытия списка вешаются на окно один раз и не снимаются через
    unbind(sequence, funcid): на Python < 3.13 такой вызов удаляет все обработчики
    события у окна, включая собственные обработчики CustomTkinter.

Проверка

  • ruff check . — без замечаний
  • python -m unittest discover -s tests -t . — 56 тестов проходят
  • Диалог проверялся вручную в светлой и тёмной теме: открытие/закрытие списков, выбор
    значения, переключение языка и темы, наведение на подсказки.

Скриншоты

1-настройки-светлая 2-настройки-тёмная 3-список-светлая 4-список-тёмная 5-чекбокс 6-подсказка

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/Flowseal/tg-ws-proxy/pull/1234 **Author:** [@holdingq0](https://github.com/holdingq0) **Created:** 8/18/2026 **Status:** ❌ Closed **Base:** `main` ← **Head:** `ui/settings-polish` --- ### 📝 Commits (4) - [`459e860`](https://github.com/Flowseal/tg-ws-proxy/commit/459e8609ba6441efdcd6fdac3c3661213020d6a2) ui: replace language/theme comboboxes with animated select - [`9c7be99`](https://github.com/Flowseal/tg-ws-proxy/commit/9c7be999ecbaea7b3a09f068b44e9aabc0888119) ui: animated checkboxes - [`5ccd3a9`](https://github.com/Flowseal/tg-ws-proxy/commit/5ccd3a95ee0a3878bc6bcb1f11774c6ab4bffa8e) ui: rounded tooltips - [`4a1bc7e`](https://github.com/Flowseal/tg-ws-proxy/commit/4a1bc7e7917126525c881812d406e8b7dcde5694) ui: instant language switch, flicker-free theme switch, regen icon ### 📊 Changes **9 files changed** (+1267 additions, -136 deletions) <details> <summary>View changed files</summary> ➕ `ui/ctk_anim.py` (+218 -0) ➕ `ui/ctk_checkbox.py` (+214 -0) ➕ `ui/ctk_select.py` (+538 -0) 📝 `ui/ctk_theme.py` (+1 -0) 📝 `ui/ctk_tooltip.py` (+43 -15) 📝 `ui/ctk_tray_ui.py` (+231 -120) 📝 `ui/i18n/en.json` (+1 -0) 📝 `ui/i18n/ru.json` (+1 -0) 📝 `utils/win32_theme.py` (+20 -1) </details> ### 📄 Description # Улучшения интерфейса настроек Несколько правок по интерфейсу окна настроек: выпадающие списки, чекбоксы, подсказки и поведение при смене языка и темы. ## Что исправлено **Выпадающие списки языка и темы.** `CTkComboBox` открывает список нативным меню tkinter: клик по стрелке при открытом меню сначала закрывал его как «клик мимо», а затем тот же клик открывал заново — визуально список мигал и не закрывался. Список заменён на собственный виджет `CtkSelect`: повторный клик закрывает, список также закрывается по клику мимо, прокрутке, Escape и перемещению окна. Выбранное значение отмечено галочкой, стрелка плавно переворачивается, строки подсвечиваются при наведении. **Язык применялся только после сохранения и перезапуска**, хотя тема применялась сразу. Теперь каждый переводимый элемент формы знает свой ключ перевода, поэтому выбор языка мгновенно перерисовывает диалог, подсказки и меню в трее, не теряя введённые в поля значения. Отмена по-прежнему возвращает прежний язык. **Мигание окна при смене темы.** CustomTkinter перекрашивает заголовок окна на Windows через `withdraw()` + `deiconify()`, из-за чего окно пропадало и появлялось снова. Диалог отключает эту процедуру и выставляет атрибут тёмного заголовка сам, перерисовывая рамку через `SetWindowPos`, — окно остаётся на месте. **Чекбоксы** заменены на `CtkCheckBox` с той же внешностью, но с анимацией: заливка квадрата и прорисовка галочки вместо мгновенной подстановки глифа. Состояние по-прежнему хранится в `BooleanVar`, поэтому остальной код не менялся. **Подсказки** были прямоугольными рядом со скруглёнными полями — теперь скруглены, с прозрачными углами и коротким появлением. **Кнопка перегенерации секрета** использовала текстовый символ `↺`, который в разных шрифтах выглядит по-разному и смещён от центра. Теперь это нарисованная круговая стрелка. ## Детали реализации - Иконки (стрелка списка, галочки, круговая стрелка) рисуются через Pillow с четырёхкратным суперсэмплингом и учитывают масштаб виджетов CustomTkinter, поэтому не «лесенят» на HiDPI. Pillow уже есть в зависимостях; если его нет, есть запасной путь на примитивах Canvas. - Скруглённые углы всплывающих окон сделаны через прозрачный ключевой цвет окна (Windows), с запасным вариантом заливки там, где оконный менеджер этого не умеет. - Обработчики закрытия списка вешаются на окно один раз и не снимаются через `unbind(sequence, funcid)`: на Python < 3.13 такой вызов удаляет все обработчики события у окна, включая собственные обработчики CustomTkinter. ## Проверка - `ruff check .` — без замечаний - `python -m unittest discover -s tests -t .` — 56 тестов проходят - Диалог проверялся вручную в светлой и тёмной теме: открытие/закрытие списков, выбор значения, переключение языка и темы, наведение на подсказки. ## Скриншоты <img width="690" height="1030" alt="1-настройки-светлая" src="https://github.com/user-attachments/assets/8febc79f-124d-4bd4-a617-0b21be337be2" /> <img width="690" height="1030" alt="2-настройки-тёмная" src="https://github.com/user-attachments/assets/8bbf4dac-d2e8-45e2-b9bd-7b3127a4a7d0" /> <img width="690" height="333" alt="3-список-светлая" src="https://github.com/user-attachments/assets/e27d612e-4c32-49e6-9579-57e3632d6fcf" /> <img width="690" height="333" alt="4-список-тёмная" src="https://github.com/user-attachments/assets/d9804c4e-feae-4d9b-b809-da0e57faf842" /> <img width="690" height="222" alt="5-чекбокс" src="https://github.com/user-attachments/assets/7acb4c5b-ca5f-4708-93d1-a54e22d33a31" /> <img width="990" height="294" alt="6-подсказка" src="https://github.com/user-attachments/assets/744cf9a0-09ed-44ca-b592-53cea659b3ed" /> --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
mirror-bot added the pull-request label 2026-09-08 16:02:14 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Utilities/tg-ws-proxy#115