mirror of
https://github.com/bec-project/bec_widgets.git
synced 2025-07-14 03:31:50 +02:00
306 lines
12 KiB
Python
306 lines
12 KiB
Python
import pytest
|
|
from qtpy.QtCore import QEasingCurve
|
|
from qtpy.QtWidgets import QPushButton, QVBoxLayout, QWidget
|
|
|
|
from bec_widgets.utils.collapsible_panel_manager import CollapsiblePanelManager, DimensionAnimator
|
|
from bec_widgets.widgets.containers.layout_manager.layout_manager import LayoutManagerWidget
|
|
|
|
|
|
@pytest.fixture
|
|
def reference_widget(qtbot):
|
|
widget = QWidget()
|
|
layout = QVBoxLayout(widget)
|
|
btn = QPushButton("Reference")
|
|
layout.addWidget(btn)
|
|
qtbot.addWidget(widget)
|
|
widget.setVisible(True)
|
|
qtbot.waitExposed(widget)
|
|
return widget
|
|
|
|
|
|
@pytest.fixture
|
|
def layout_manager(qtbot, reference_widget):
|
|
manager = LayoutManagerWidget()
|
|
qtbot.addWidget(manager)
|
|
manager.add_widget(reference_widget, row=0, col=0)
|
|
manager.setVisible(True)
|
|
qtbot.waitExposed(manager)
|
|
return manager
|
|
|
|
|
|
@pytest.fixture
|
|
def panel_manager(layout_manager, reference_widget):
|
|
manager = CollapsiblePanelManager(layout_manager, reference_widget)
|
|
return manager
|
|
|
|
|
|
@pytest.fixture
|
|
def test_panel_widget(qtbot):
|
|
widget = QWidget()
|
|
qtbot.addWidget(widget)
|
|
return widget
|
|
|
|
|
|
def test_dimension_animator_width_setting(qtbot, test_panel_widget):
|
|
animator = DimensionAnimator(test_panel_widget, "left")
|
|
animator.panel_width = 100
|
|
assert animator.panel_width == 100
|
|
assert test_panel_widget.width() == 100
|
|
|
|
|
|
def test_dimension_animator_height_setting(qtbot, test_panel_widget):
|
|
animator = DimensionAnimator(test_panel_widget, "top")
|
|
animator.panel_height = 150
|
|
assert animator.panel_height == 150
|
|
assert test_panel_widget.height() == 150
|
|
|
|
|
|
def test_add_panel(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("left", test_panel_widget, target_size=200)
|
|
assert panel_manager.panels["left"]["widget"] == test_panel_widget
|
|
# Initially hidden
|
|
assert not test_panel_widget.isVisible()
|
|
assert test_panel_widget.maximumWidth() == 0
|
|
|
|
|
|
def test_add_panel_no_target_size(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("top", test_panel_widget)
|
|
assert panel_manager.panels["top"]["target_size"] == 150
|
|
assert not test_panel_widget.isVisible()
|
|
|
|
|
|
def test_add_panel_invalid_direction(panel_manager, test_panel_widget):
|
|
with pytest.raises(ValueError) as exc_info:
|
|
panel_manager.add_panel("invalid", test_panel_widget)
|
|
assert "Direction must be one of 'left', 'right', 'top', 'bottom'." in str(exc_info.value)
|
|
|
|
|
|
def test_toggle_panel_show(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("left", test_panel_widget, target_size=200)
|
|
assert not test_panel_widget.isVisible()
|
|
|
|
panel_manager.toggle_panel("left", animation=False)
|
|
assert test_panel_widget.isVisible()
|
|
|
|
|
|
def test_toggle_panel_hide(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("left", test_panel_widget, target_size=200)
|
|
panel_manager.toggle_panel("left", animation=False)
|
|
assert test_panel_widget.isVisible()
|
|
|
|
panel_manager.toggle_panel("left", animation=False)
|
|
assert not test_panel_widget.isVisible()
|
|
|
|
|
|
def test_toggle_panel_scale(panel_manager, test_panel_widget, reference_widget):
|
|
reference_widget.resize(800, 600)
|
|
panel_manager.add_panel("right", test_panel_widget)
|
|
panel_manager.toggle_panel("right", scale=0.25, animation=False)
|
|
assert test_panel_widget.isVisible()
|
|
assert test_panel_widget.maximumWidth() == 200
|
|
|
|
|
|
def test_toggle_panel_ensure_max(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("bottom", test_panel_widget, target_size=150)
|
|
panel_manager.toggle_panel("bottom", ensure_max=True, animation=False)
|
|
assert test_panel_widget.isVisible()
|
|
assert test_panel_widget.maximumHeight() == 150
|
|
panel_manager.toggle_panel("bottom", ensure_max=True, animation=False)
|
|
assert not test_panel_widget.isVisible()
|
|
assert test_panel_widget.maximumHeight() == 16777215
|
|
|
|
|
|
def test_toggle_panel_easing_curve(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("top", test_panel_widget, target_size=100, duration=500)
|
|
panel_manager.toggle_panel("top", easing_curve=QEasingCurve.OutBounce, animation=True)
|
|
assert panel_manager.animations.get(test_panel_widget) is not None
|
|
|
|
|
|
def test_toggle_nonexistent_panel(panel_manager):
|
|
with pytest.raises(ValueError) as exc_info:
|
|
panel_manager.toggle_panel("invalid")
|
|
assert "No panel found in direction 'invalid'." in str(exc_info.value)
|
|
|
|
|
|
def test_toggle_panel_without_animation(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("left", test_panel_widget, target_size=200)
|
|
panel_manager.toggle_panel("left", animation=False)
|
|
assert test_panel_widget.isVisible()
|
|
assert test_panel_widget.maximumWidth() == 200
|
|
panel_manager.toggle_panel("left", animation=False)
|
|
assert not test_panel_widget.isVisible()
|
|
|
|
|
|
def test_after_hide_reset(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("left", test_panel_widget, target_size=200)
|
|
panel_manager.toggle_panel("left", ensure_max=True, animation=False)
|
|
assert test_panel_widget.isVisible()
|
|
panel_manager.toggle_panel("left", ensure_max=True, animation=False)
|
|
assert not test_panel_widget.isVisible()
|
|
assert test_panel_widget.minimumWidth() == 0
|
|
assert test_panel_widget.maximumWidth() == 0
|
|
|
|
|
|
def test_toggle_panel_repeated(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("right", test_panel_widget, target_size=200)
|
|
panel_manager.toggle_panel("right", animation=False)
|
|
assert test_panel_widget.isVisible()
|
|
panel_manager.toggle_panel("right", animation=False)
|
|
assert not test_panel_widget.isVisible()
|
|
panel_manager.toggle_panel("right", animation=False)
|
|
assert test_panel_widget.isVisible()
|
|
|
|
|
|
def test_toggle_panel_with_custom_duration(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("bottom", test_panel_widget, target_size=150, duration=1000)
|
|
panel_manager.toggle_panel("bottom", duration=2000, animation=True)
|
|
animation = panel_manager.animations.get(test_panel_widget)
|
|
assert animation is not None
|
|
assert animation.duration() == 2000
|
|
|
|
|
|
def test_toggle_panel_ensure_max_scale(panel_manager, test_panel_widget, reference_widget):
|
|
reference_widget.resize(1000, 800)
|
|
panel_manager.add_panel("top", test_panel_widget)
|
|
panel_manager.toggle_panel("top", ensure_max=True, scale=0.5, animation=False)
|
|
assert test_panel_widget.isVisible()
|
|
assert test_panel_widget.maximumHeight() == 400
|
|
|
|
|
|
def test_no_animation_mode(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("left", test_panel_widget, target_size=200)
|
|
panel_manager.toggle_panel("left", animation=False)
|
|
assert test_panel_widget.isVisible()
|
|
panel_manager.toggle_panel("left", animation=False)
|
|
assert not test_panel_widget.isVisible()
|
|
|
|
|
|
def test_toggle_panel_nondefault_easing(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("right", test_panel_widget, target_size=200)
|
|
panel_manager.toggle_panel("right", easing_curve=QEasingCurve.InCurve, animation=True)
|
|
animation = panel_manager.animations.get(test_panel_widget)
|
|
assert animation is not None
|
|
assert animation.easingCurve() == QEasingCurve.InCurve
|
|
|
|
|
|
def test_toggle_panel_ensure_max_no_animation(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("bottom", test_panel_widget, target_size=150)
|
|
panel_manager.toggle_panel("bottom", ensure_max=True, animation=False)
|
|
assert test_panel_widget.isVisible()
|
|
assert test_panel_widget.maximumHeight() == 150
|
|
panel_manager.toggle_panel("bottom", ensure_max=True, animation=False)
|
|
assert not test_panel_widget.isVisible()
|
|
assert test_panel_widget.maximumHeight() == 16777215
|
|
|
|
|
|
def test_toggle_panel_new_target_size(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("left", test_panel_widget, target_size=200)
|
|
panel_manager.toggle_panel("left", target_size=300, animation=False)
|
|
assert test_panel_widget.isVisible()
|
|
assert test_panel_widget.maximumWidth() == 300
|
|
panel_manager.toggle_panel("left", animation=False)
|
|
assert not test_panel_widget.isVisible()
|
|
|
|
|
|
def test_toggle_panel_new_duration(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("left", test_panel_widget, target_size=200, duration=300)
|
|
panel_manager.toggle_panel("left", duration=1000, animation=True)
|
|
animation = panel_manager.animations.get(test_panel_widget)
|
|
assert animation.duration() == 1000
|
|
|
|
|
|
def test_toggle_panel_wrong_direction(panel_manager):
|
|
with pytest.raises(ValueError) as exc:
|
|
panel_manager.toggle_panel("unknown_direction")
|
|
assert "No panel found in direction 'unknown_direction'." in str(exc.value)
|
|
|
|
|
|
def test_toggle_panel_no_panels(panel_manager):
|
|
with pytest.raises(ValueError) as exc:
|
|
panel_manager.toggle_panel("top")
|
|
assert "No panel found in direction 'top'." in str(exc.value)
|
|
|
|
|
|
def test_multiple_panels_interaction(panel_manager):
|
|
widget_left = QWidget()
|
|
widget_right = QWidget()
|
|
panel_manager.add_panel("left", widget_left, target_size=200)
|
|
panel_manager.add_panel("right", widget_right, target_size=300)
|
|
|
|
panel_manager.toggle_panel("left", animation=False)
|
|
assert widget_left.isVisible()
|
|
|
|
panel_manager.toggle_panel("right", animation=False)
|
|
assert widget_right.isVisible()
|
|
|
|
panel_manager.toggle_panel("left", animation=False)
|
|
assert not widget_left.isVisible()
|
|
assert widget_right.isVisible()
|
|
|
|
panel_manager.toggle_panel("right", animation=False)
|
|
assert not widget_right.isVisible()
|
|
|
|
|
|
def test_panel_manager_custom_easing(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("top", test_panel_widget, target_size=150)
|
|
panel_manager.toggle_panel("top", easing_curve=QEasingCurve.InQuad, animation=True)
|
|
animation = panel_manager.animations.get(test_panel_widget)
|
|
assert animation is not None
|
|
assert animation.easingCurve() == QEasingCurve.InQuad
|
|
|
|
|
|
def test_toggle_panel_scale_no_animation(panel_manager, test_panel_widget, reference_widget):
|
|
reference_widget.resize(400, 300)
|
|
panel_manager.add_panel("bottom", test_panel_widget)
|
|
panel_manager.toggle_panel("bottom", scale=0.5, animation=False)
|
|
assert test_panel_widget.isVisible()
|
|
assert test_panel_widget.maximumHeight() == 150
|
|
panel_manager.toggle_panel("bottom", animation=False)
|
|
assert not test_panel_widget.isVisible()
|
|
|
|
|
|
def test_after_hide_reset_properties(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("left", test_panel_widget, target_size=200)
|
|
panel_manager.toggle_panel("left", ensure_max=True, animation=False)
|
|
panel_manager.toggle_panel("left", ensure_max=True, animation=False)
|
|
assert not test_panel_widget.isVisible()
|
|
assert test_panel_widget.minimumWidth() == 0
|
|
assert test_panel_widget.maximumWidth() == 0
|
|
|
|
|
|
def test_toggle_panel_no_animation_show_only(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("right", test_panel_widget, target_size=100)
|
|
panel_manager.toggle_panel("right", animation=False)
|
|
assert test_panel_widget.isVisible()
|
|
assert test_panel_widget.maximumWidth() == 100
|
|
|
|
|
|
def test_toggle_panel_no_animation_hide_only(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("left", test_panel_widget, target_size=100)
|
|
panel_manager.toggle_panel("left", animation=False)
|
|
assert test_panel_widget.isVisible()
|
|
panel_manager.toggle_panel("left", animation=False)
|
|
assert not test_panel_widget.isVisible()
|
|
|
|
|
|
def test_toggle_panel_easing_inout(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("top", test_panel_widget, target_size=120)
|
|
panel_manager.toggle_panel("top", easing_curve=QEasingCurve.InOutQuad, animation=True)
|
|
animation = panel_manager.animations.get(test_panel_widget)
|
|
assert animation is not None
|
|
assert animation.easingCurve() == QEasingCurve.InOutQuad
|
|
|
|
|
|
def test_toggle_panel_ensure_max_width(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("right", test_panel_widget, target_size=200)
|
|
panel_manager.toggle_panel("right", ensure_max=True, animation=False)
|
|
assert test_panel_widget.isVisible()
|
|
assert test_panel_widget.maximumWidth() == 200
|
|
|
|
|
|
def test_toggle_panel_invalid_direction_twice(panel_manager, test_panel_widget):
|
|
panel_manager.add_panel("left", test_panel_widget, target_size=200)
|
|
with pytest.raises(ValueError) as exc_info:
|
|
panel_manager.toggle_panel("invalid_direction")
|
|
assert "No panel found in direction 'invalid_direction'." in str(exc_info.value)
|