93 lines
3.1 KiB
Python
93 lines
3.1 KiB
Python
from __future__ import annotations
|
|
|
|
import os
|
|
import unittest
|
|
|
|
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
|
|
|
|
from PyQt6.QtCore import Qt
|
|
from PyQt6.QtWidgets import QApplication, QListWidget
|
|
from qfluentwidgets import ScrollBar
|
|
|
|
from ui.widgets.fluent_scrollbar import FluentScrollBars, install_fluent_scrollbars
|
|
|
|
|
|
class FluentScrollbarTests(unittest.TestCase):
|
|
@classmethod
|
|
def setUpClass(cls) -> None:
|
|
cls._app = QApplication.instance() or QApplication([])
|
|
|
|
def test_install_fluent_scrollbars_uses_qfluent_scrollbar(self) -> None:
|
|
widget = QListWidget()
|
|
|
|
bars = install_fluent_scrollbars(widget, vertical=True, horizontal=False)
|
|
|
|
self.assertIsInstance(bars, FluentScrollBars)
|
|
self.assertIsInstance(bars.vertical, ScrollBar)
|
|
self.assertIsNone(bars.horizontal)
|
|
self.assertIs(getattr(widget, "_zapret_fluent_scrollbars"), bars)
|
|
self.assertEqual(widget.verticalScrollBarPolicy(), Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
|
|
|
|
def test_install_fluent_scrollbars_is_idempotent(self) -> None:
|
|
widget = QListWidget()
|
|
|
|
first = install_fluent_scrollbars(widget, vertical=True, horizontal=False)
|
|
second = install_fluent_scrollbars(widget, vertical=True, horizontal=False)
|
|
|
|
self.assertIs(first, second)
|
|
|
|
def test_scrollbar_arrow_buttons_do_not_take_tab_focus(self) -> None:
|
|
widget = QListWidget()
|
|
|
|
bars = install_fluent_scrollbars(widget, vertical=True, horizontal=False)
|
|
|
|
buttons = [
|
|
child
|
|
for child in bars.vertical.findChildren(object)
|
|
if type(child).__name__ == "ArrowButton"
|
|
and hasattr(child, "setFocusPolicy")
|
|
]
|
|
|
|
self.assertTrue(buttons)
|
|
self.assertTrue(all(button.focusPolicy() == Qt.FocusPolicy.NoFocus for button in buttons))
|
|
|
|
def test_reserved_vertical_space_keeps_rows_away_from_visible_scrollbar(self) -> None:
|
|
widget = QListWidget()
|
|
widget.resize(180, 120)
|
|
for row in range(40):
|
|
widget.addItem(f"Profile {row}")
|
|
|
|
bars = install_fluent_scrollbars(
|
|
widget,
|
|
vertical=True,
|
|
horizontal=False,
|
|
reserve_vertical_space=True,
|
|
)
|
|
widget.show()
|
|
self._app.processEvents()
|
|
|
|
self.assertIsNotNone(bars.vertical)
|
|
self.assertGreater(widget.verticalScrollBar().maximum(), 0)
|
|
row_rect = widget.visualItemRect(widget.item(0)).adjusted(8, 2, -8, -2)
|
|
self.assertGreaterEqual(bars.vertical.geometry().left() - row_rect.right(), 8)
|
|
|
|
def test_reserved_vertical_space_is_not_used_without_scroll_range(self) -> None:
|
|
widget = QListWidget()
|
|
widget.resize(180, 120)
|
|
widget.addItem("Only one profile")
|
|
|
|
install_fluent_scrollbars(
|
|
widget,
|
|
vertical=True,
|
|
horizontal=False,
|
|
reserve_vertical_space=True,
|
|
)
|
|
widget.show()
|
|
self._app.processEvents()
|
|
|
|
self.assertEqual(widget.verticalScrollBar().maximum(), 0)
|
|
self.assertEqual(widget.viewportMargins().right(), 0)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|