From 2034111158eaf13234d34efcc6aee50aab3201de Mon Sep 17 00:00:00 2001 From: Florian Rau Date: Mon, 16 Jun 2025 19:28:19 +0100 Subject: [PATCH] add LED widget --- bpod_gui/ui/console/components/LED.py | 48 +++++++++++++++++++++ bpod_gui/ui/console/state_machine_widget.py | 5 +++ 2 files changed, 53 insertions(+) diff --git a/bpod_gui/ui/console/components/LED.py b/bpod_gui/ui/console/components/LED.py index e69de29..cf9dfc1 100644 --- a/bpod_gui/ui/console/components/LED.py +++ b/bpod_gui/ui/console/components/LED.py @@ -0,0 +1,48 @@ +from qtpy import QtWidgets, QtGui, QtCore +from qtpy.QtCore import Qt + + +class LED(QtWidgets.QAbstractButton): + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) + self.setCheckable(True) + + def sizeHint(self) -> QtCore.QSize: + return QtCore.QSize(35, 35) + + def paintEvent(self, e) -> None: + # base + size = min(self.size().toTuple()) + w_line = round(size / 25) * 2 + painter = QtGui.QPainter(self) + painter.setRenderHints(QtGui.QPainter.RenderHint.Antialiasing) + color = QtGui.QColor("red") + painter.setPen( + QtGui.QPen(color.darker(110 if self.isChecked() else 150), w_line) + ) + if self.isChecked(): + painter.setBrush(QtGui.QBrush(color)) + else: + gradient = QtGui.QRadialGradient(size / 2, size / 5 * 4, size * 0.5) + gradient.setColorAt(0, color) + gradient.setColorAt(1, color.darker(150)) + painter.setBrush(QtGui.QBrush(gradient)) + painter.drawEllipse(w_line / 2, w_line / 2, size - w_line, size - w_line) + + # glow + if self.isChecked(): + painter.setPen(QtGui.QPen(Qt.PenStyle.NoPen)) + gradient = QtGui.QRadialGradient(size / 2, size / 2, size / 2) + gradient.setColorAt(0, QtGui.QColor("white")) + gradient.setColorAt(0.3, QtGui.QColor("yellow")) + gradient.setColorAt(1, QtGui.QColor("transparent")) + painter.setBrush(QtGui.QBrush(gradient)) + painter.drawEllipse(0, 0, size, size) + + # reflection + painter.setPen(QtGui.QPen(Qt.PenStyle.NoPen)) + gradient = QtGui.QLinearGradient(0, 0, 0, size * 0.5) + gradient.setColorAt(0, QtGui.QColor("white")) + gradient.setColorAt(1, QtGui.QColor("transparent")) + painter.setBrush(QtGui.QBrush(gradient)) + painter.drawEllipse(size * 0.2, w_line, size * 0.6, size * 0.5) diff --git a/bpod_gui/ui/console/state_machine_widget.py b/bpod_gui/ui/console/state_machine_widget.py index dbad481..6ba0cd9 100644 --- a/bpod_gui/ui/console/state_machine_widget.py +++ b/bpod_gui/ui/console/state_machine_widget.py @@ -1,6 +1,9 @@ +from PySide6.QtGui import QColor from qtpy.QtCore import Qt from qtpy.QtWidgets import QWidget, QSizePolicy, QLabel, QGridLayout +from bpod_gui.ui.console.components.LED import LED + class StateMachineWidget(QWidget): def __init__(self): @@ -21,6 +24,8 @@ def __init__(self): ) self.behavior_ports_label.setProperty("type", "smw_underlined_header") self.grid_layout.addWidget(self.behavior_ports_label, 0, 0, 1, 2) + self.example_led = LED() + self.grid_layout.addWidget(self.example_led, 1, 0, 1, 2) self.bnc_in_label = QLabel() self.bnc_in_label.setText("BNC In")