Source code for amaze.visu.widgets.lists

from typing import Optional

from PyQt5.QtCore import pyqtSignal
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import (
    QSizePolicy,
    QWidget,
    QVBoxLayout,
    QHBoxLayout,
    QComboBox,
    QDoubleSpinBox,
    QToolButton,
    QLayout,
)

from .combobox import ZoomingComboBox
from ...misc import resources
from ...misc.resources import Sign, Signs


[docs] class SignList(QWidget): dataChanged = pyqtSignal() def __init__(self, controls: Optional[dict[str, QWidget]] = None): super().__init__() outer_layout = QVBoxLayout() top_layout = QHBoxLayout() inner_layout = QVBoxLayout() self.inner_layout = inner_layout outer_layout.addLayout(top_layout) outer_layout.addLayout(inner_layout) if controls: for w in controls.values(): top_layout.addWidget(w) top_layout.addStretch() self.button_add = b_add = QToolButton() b_add.setIcon(QIcon.fromTheme("list-add")) top_layout.addWidget(b_add) self.setLayout(outer_layout) self.setContentsMargins(0, 0, 0, 0) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum) b_add.clicked.connect(lambda: self.add_row()) self._rows = [] self._original_max_height = self.maximumHeight() def count(self): return self.inner_layout.count() def signs(self): return [ self._sign(self.inner_layout.itemAt(i).widget()) for i in range(self.inner_layout.count()) ] def set_signs(self, signs: Signs): while self.count(): self.remove_row(self.inner_layout.itemAt(0).widget()) for sign in signs: self.add_row(sign) @staticmethod def _sign(w: QWidget): assert isinstance(w, QWidget) assert isinstance(w.layout(), QLayout) cb, sb = w.layout().itemAt(0).widget(), w.layout().itemAt(1).widget() assert isinstance(cb, QComboBox) and isinstance(sb, QDoubleSpinBox) return Sign(cb.currentText(), sb.value())
[docs] def hide(self, hide: bool = True): # self.setMaximumHeight(0 if hide else self._original_max_height) self.setVisible(not hide)
def add_row(self, sign=None): sign = sign or Sign() w = QWidget() w.setContentsMargins(0, 0, 0, 0) w.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum) layout = QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(5) sb = QDoubleSpinBox() cb = ZoomingComboBox(value_getter=sb.value) tb = QToolButton() cb.addItems(resources.names()) cb.setCurrentText(sign.name) layout.addWidget(cb, 2) sb.setRange(0, 1) sb.setSingleStep(0.05) sb.setValue(sign.value) layout.addWidget(sb, 1) tb.setIcon(QIcon.fromTheme("edit-delete")) layout.addWidget(tb, 0) w.setLayout(layout) self.inner_layout.addWidget(w) self.dataChanged.emit() tb.clicked.connect(lambda: self.remove_row(w)) cb.currentTextChanged.connect(self.dataChanged) sb.valueChanged.connect(self.dataChanged) def remove_row(self, source: QWidget): self.inner_layout.removeWidget(source) source.setParent(None) self.dataChanged.emit()