zapret-kvn/tests/test_app_adaptive_buttons.py
loop-uh 774fa0bd21
Some checks failed
Windows project source guards / test (push) Failing after 45s
Кнопки: подпись уходит в подсказку, когда ряду не хватает места
- AdaptiveButtonRow: следит за шириной ряда (с учётом переполнения
  прокручиваемой страницы) и сворачивает кнопки со значком с конца ряда в
  квадратные значки, текст — в подсказку; появится место — возвращает.
- fluent_fixes: у PushButton в режиме «только значок» значок рисуется по
  центру (оригинал сдвигал его под подпись — значок съезжал и обрезался).
- Применено: строка сервера на панели (вместо кнопок-близнецов), панель
  инструментов подписок, логов и конфигов; их кнопкам добавлены значки.
Проверено рендером на win10: на 860 px «Сбросить к шаблону» сворачивается
в значок, остальные ряды помещаются с подписями.
2026-09-26 18:25:16 +03:00

93 lines
3.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Кнопки со значком сворачиваются в значок, когда ряду не хватает места.
Keep the ``test_app_*`` prefix (QApplication before tests/test_engine_process_stop.py).
"""
from __future__ import annotations
import os
import unittest
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
from PyQt6.QtCore import QEventLoop, QTimer
from PyQt6.QtWidgets import QApplication, QHBoxLayout, QWidget
_existing = QApplication.instance()
if _existing is not None and not isinstance(_existing, QApplication):
raise RuntimeError("widget tests need a QApplication")
app = _existing or QApplication([])
import xray_fluent.ui # noqa: F401 (fluent_fixes: центрированный значок)
from qfluentwidgets import FluentIcon as FIF, PushButton
from xray_fluent.ui.adaptive_buttons import AdaptiveButtonRow
def _spin(ms: int = 30) -> None:
loop = QEventLoop()
QTimer.singleShot(ms, loop.quit)
loop.exec()
class AdaptiveButtonRowTests(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.host = QWidget()
cls.row = QHBoxLayout(cls.host)
cls.first = PushButton(FIF.SYNC, "Проверить обновления подписок", cls.host)
cls.second = PushButton(FIF.DOWNLOAD, "Полностью обновить без кэша", cls.host)
cls.second.setToolTip("Своя подсказка")
cls.plain = PushButton("Без значка", cls.host)
for widget in (cls.first, cls.second, cls.plain):
cls.row.addWidget(widget)
cls.row.addStretch(1)
cls.fit = AdaptiveButtonRow(cls.row, [cls.first, cls.second, cls.plain])
cls.host.show()
@classmethod
def tearDownClass(cls) -> None:
cls.host.hide()
def _resize(self, width: int) -> None:
self.host.setMinimumWidth(0)
self.host.resize(width, 60)
_spin()
self.fit.update_now()
_spin()
def test_wide_row_keeps_texts(self) -> None:
self._resize(1200)
self.assertEqual(self.first.text(), "Проверить обновления подписок")
self.assertEqual(self.second.text(), "Полностью обновить без кэша")
self.assertFalse(getattr(self.first, "_zk_icon_only", False))
def test_narrow_row_collapses_from_the_end_with_text_in_tooltip(self) -> None:
self._resize(1200)
needed = self.row.minimumSize().width()
self._resize(needed - 40) # не хватает немного — сворачивается последняя кнопка со значком
self.assertEqual(self.second.text(), "")
self.assertTrue(self.second._zk_icon_only)
self.assertEqual(self.second.toolTip(), "Своя подсказка")
self.assertEqual(self.first.text(), "Проверить обновления подписок")
self.assertEqual(self.plain.text(), "Без значка") # без значка не сворачивается
self._resize(200)
self.assertEqual(self.first.text(), "")
self.assertEqual(self.first.toolTip(), "Проверить обновления подписок")
self.assertEqual(self.first.width(), 36)
def test_widening_restores_texts(self) -> None:
self._resize(200)
self._resize(1400)
self.assertEqual(self.first.text(), "Проверить обновления подписок")
self.assertEqual(self.second.text(), "Полностью обновить без кэша")
self.assertEqual(self.second.toolTip(), "Своя подсказка")
self.assertFalse(self.second._zk_icon_only)
def test_icon_only_paints(self) -> None:
self._resize(200)
self.assertFalse(self.first.grab().isNull())
if __name__ == "__main__":
unittest.main()