Source code for symupy.postprocess.visunet.qtutils

import functools
import logging
from inspect import signature, _empty

from PyQt5.QtCore import QThread, Qt, QObject, pyqtSignal
from PyQt5.QtWidgets import (
    QApplication,
    QWidget,
    QHBoxLayout,
    QSlider,
    QLabel,
    QComboBox,
    QLineEdit,
    QDialog,
    QFormLayout,
    QPushButton,
    QVBoxLayout,
)
from PyQt5.QtGui import QIntValidator


[docs]def waitcursor(func): @functools.wraps(func) def wrapper(*args, **kwargs): QApplication.setOverrideCursor(Qt.WaitCursor) value = func(*args, **kwargs) QApplication.restoreOverrideCursor() return value return wrapper
[docs]class ConsoleWindowLogHandler(logging.Handler, QObject): sigLog = pyqtSignal(str) def __init__(self): logging.Handler.__init__(self) QObject.__init__(self) self.setFormatter(logging.Formatter("%(levelname)s: %(message)s"))
[docs] def emit(self, logRecord): logRecord = self.format(logRecord) # message = str(logRecord.getMessage()) self.sigLog.emit(logRecord)
[docs]class Slider(QWidget): def __init__(self, name=" ", parent=None): super().__init__(parent) self.layout = QHBoxLayout() self.setLayout(self.layout) self.name = QLabel(name, self) self.layout.addWidget(self.name) self.slider = QSlider(Qt.Horizontal) # self.slider.setRange(min, max) self.slider.setFocusPolicy(Qt.NoFocus) self.slider.setPageStep(5) self.layout.addWidget(self.slider) self.slider.valueChanged.connect(self.updateLabel) self.line_edit = QLineEdit("", self) self.line_edit.setFixedWidth(40) self.line_edit.setValidator(QIntValidator()) self.line_edit.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.line_edit.editingFinished.connect(self.updateSlider) # self.line_edit.setMinimumWidth(80) # self.layout.addSpacing(5) self.layout.addWidget(self.line_edit) self.valueChanged = self.slider.valueChanged
[docs] def updateLabel(self, value): self.line_edit.setText(str(value))
[docs] def updateSlider(self): self.slider.setValue(int(self.line_edit.text()))
[docs] def value(self): return self.slider.value()
[docs] def setRange(self, min, max): self.slider.setRange(min, max) self.updateLabel(self.value())
[docs] def setName(self, name): self.name.setText(name)
[docs]class LabelComboBox(QWidget): def __init__(self, name=" ", parent=None): super().__init__(parent) self.layout = QHBoxLayout() self.setLayout(self.layout) self.name = QLabel(name, self) self.layout.addWidget(self.name) self.widget = QComboBox() self.layout.addWidget(self.widget) self.name.setAlignment(Qt.AlignLeft) self.currentIndexChanged = self.widget.currentIndexChanged
[docs] def setItems(self, items): self.widget.clear() [self.widget.addItem(str(it)) for it in items]
[docs] def setName(self, name): self.name.setText(name)
[docs] def value(self): return self.widget.currentText()
[docs]class LabelLineEdit(QWidget): def __init__(self, name=" ", parent=None): super().__init__(parent) self.layout = QHBoxLayout() self.setLayout(self.layout) self.name = QLabel(name, self) self.layout.addWidget(self.name) self.widget = QLineEdit() self.layout.addWidget(self.widget) self.name.setAlignment(Qt.AlignLeft)
[docs] def value(self): return self.widget.text()
[docs]class Worker(QThread): def __init__(self, func, args): super(Worker, self).__init__() self.func = func self.args = args
[docs] def run(self): self.func(*self.args)
[docs]class TripSelector(QDialog): def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("Choose Trip") self.layout = QVBoxLayout() self.layout.setAlignment(Qt.AlignTop) self.setLayout(self.layout) self.vehid = LabelLineEdit("VEH id") self.layout.addWidget(self.vehid) self.button_select = QPushButton("Select") self.layout.addWidget(self.button_select) self.button_select.clicked.connect(self.select)
[docs] def select(self): self.accept()
[docs]class ODSelector(QDialog): def __init__(self, func, parent=None): super().__init__(parent) self.setWindowTitle("Choose OD") self.layout = QFormLayout() self.setLayout(self.layout) sig = signature(func) self.widgets = list() maxsize = max([len(item) for item in sig.parameters.keys()]) for name, param in sig.parameters.items(): label = QLabel(name) edit = QLineEdit() self.widgets.append(edit) self.layout.addRow(label, edit) if param.default != _empty: edit.setText(str(param.default)) self.button_select = QPushButton("Select") self.layout.addWidget(self.button_select) self.button_select.clicked.connect(self.select) self.values = list()
[docs] def select(self): for line_edit in self.widgets: self.values.append(line_edit.text()) self.accept()