Source code for pyqt_reactive.widgets.shared.scrollable_form_body

"""Shared form body composition for tree-backed parameter editors."""

from __future__ import annotations

from dataclasses import dataclass

from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QScrollArea, QSplitter, QWidget

from pyqt_reactive.core.collapsible_splitter_helper import CollapsibleSplitterHelper


[docs] @dataclass(frozen=True) class ScrollableFormBodyParts: """Widgets created for a scrollable form body.""" body_widget: QWidget scroll_area: QScrollArea tree_widget: QWidget | None splitter: QSplitter | None splitter_helper: CollapsibleSplitterHelper | None
[docs] def create_scrollable_form_body( *, form_widget: QWidget, tree_widget: QWidget | None = None, tree_initial_size: int = 300, form_initial_size: int = 700, parent: QWidget | None = None, ) -> ScrollableFormBodyParts: """Create a scrollable form with an optional collapsible navigation tree.""" scroll_area = QScrollArea(parent) scroll_area.setWidgetResizable(True) scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded) scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) scroll_area.setWidget(form_widget) if tree_widget is None: return ScrollableFormBodyParts( body_widget=scroll_area, scroll_area=scroll_area, tree_widget=None, splitter=None, splitter_helper=None, ) splitter = QSplitter(Qt.Orientation.Horizontal, parent) splitter.setChildrenCollapsible(True) splitter.setHandleWidth(5) splitter.addWidget(tree_widget) splitter.addWidget(scroll_area) splitter.setSizes([tree_initial_size, form_initial_size]) splitter_helper = CollapsibleSplitterHelper(splitter, left_panel_index=0) splitter_helper.set_initial_size(tree_initial_size) return ScrollableFormBodyParts( body_widget=splitter, scroll_area=scroll_area, tree_widget=tree_widget, splitter=splitter, splitter_helper=splitter_helper, )