magscope.ui.panel_layout

Contents

magscope.ui.panel_layout#

Shared helpers for draggable control panel layouts.

Attributes#

Classes#

_TitleDragFilter

Convert title-area drags into wrapper move operations.

PanelWrapper

Wrap a panel widget and make its title initiate drag-and-drop.

ReorderableColumn

Vertical column of draggable panels with drop support.

PanelLayoutManager

Coordinate draggable panel columns and persist their layout.

Module Contents#

magscope.ui.panel_layout.PANEL_MIME_TYPE = 'application/x-magscope-panel'[source]#
class magscope.ui.panel_layout._TitleDragFilter(wrapper: PanelWrapper, target: PyQt6.QtWidgets.QWidget)[source]#

Bases: PyQt6.QtCore.QObject

Convert title-area drags into wrapper move operations.

_wrapper[source]#
target[source]#
_drag_start[source]#
_dragging = False[source]#
eventFilter(obj, event)[source]#
drag_finished() None[source]#
class magscope.ui.panel_layout.PanelWrapper(manager: PanelLayoutManager, panel_id: str, widget: PyQt6.QtWidgets.QWidget, *, draggable: bool = True)[source]#

Bases: PyQt6.QtWidgets.QFrame

Wrap a panel widget and make its title initiate drag-and-drop.

_manager[source]#
panel_id[source]#
panel_widget[source]#
column: ReorderableColumn | None = None[source]#
_drag_filters: list[_TitleDragFilter] = [][source]#
draggable = True[source]#
_drop_accepted = False[source]#
_attach_title_drag() None[source]#
_register_drag_source(widget: PyQt6.QtWidgets.QWidget | None) None[source]#
start_drag() None[source]#
mark_drop_accepted() None[source]#
class magscope.ui.panel_layout.ReorderableColumn(name: str, pinned_ids: Iterable[str] | None = None)[source]#

Bases: PyQt6.QtWidgets.QWidget

Vertical column of draggable panels with drop support.

name[source]#
_layout[source]#
_placeholder: PyQt6.QtWidgets.QFrame | None = None[source]#
_pinned_ids[source]#
_active_drag_height: int | None = None[source]#
_manager: PanelLayoutManager | None = None[source]#
set_manager(manager: PanelLayoutManager | None) None[source]#
panels() list[PanelWrapper][source]#
panel_ids() list[str][source]#
add_panel(wrapper: PanelWrapper, index: int | None = None) None[source]#
remove_panel(wrapper: PanelWrapper) None[source]#
clear_panels() None[source]#
begin_drag(wrapper: PanelWrapper) int[source]#
cancel_drag(wrapper: PanelWrapper, index: int) None[source]#
finish_drag() None[source]#
_target_index(index: int | None) int[source]#
_drop_index(cursor_y: float) int[source]#
_locked_prefix_length() int[source]#
_constrain_index(wrapper: PanelWrapper, index: int) int[source]#
_constrained_drop_index(wrapper: PanelWrapper, cursor_y: float) int[source]#
_ensure_placeholder() PyQt6.QtWidgets.QFrame[source]#
_update_placeholder(wrapper: PanelWrapper | None, cursor_y: float) None[source]#
clear_placeholder() None[source]#
_placeholder_index() int | None[source]#
dragEnterEvent(event) None[source]#
dragMoveEvent(event) None[source]#
dragLeaveEvent(event) None[source]#
dropEvent(event) None[source]#
_wrapper_from_event(event) PanelWrapper | None[source]#
class magscope.ui.panel_layout.PanelLayoutManager(settings: QSettings | None, settings_group: str, columns: dict[str, ReorderableColumn] | Iterable[tuple[str, ReorderableColumn]], *, on_layout_changed: Callable[[dict[str, list[str]]], None] | None = None, on_drag_active_changed: Callable[[bool], None] | None = None)[source]#

Coordinate draggable panel columns and persist their layout.

_settings: PyQt6.QtCore.QSettings | None[source]#
_settings_group[source]#
_wrappers: dict[str, PanelWrapper][source]#
_default_columns: dict[str, str][source]#
_default_order: list[str] = [][source]#
_on_layout_changed = None[source]#
_on_drag_active_changed = None[source]#
_active_drag_count = 0[source]#
wrapper_for_id(panel_id: str) PanelWrapper | None[source]#
register_panel(panel_id: str, widget: PyQt6.QtWidgets.QWidget, default_column: str, *, draggable: bool = True) PanelWrapper[source]#
restore_layout() None[source]#
save_layout() None[source]#
current_layout() dict[str, list[str]][source]#
layout_changed() None[source]#
notify_drag_started() None[source]#
notify_drag_finished() None[source]#
_normalise_panel_list(stored) list[str] | None[source]#
_load_layout() OrderedDict[str, list[str]][source]#
stored_layout() OrderedDict[str, list[str]][source]#
stored_column_names() list[str][source]#
add_column(name: str, column: ReorderableColumn, index: int | None = None) None[source]#
remove_column(name: str) None[source]#