Files
linuxcncAllWasm/lib/python/qtvcp/widgets/led_widget.py
2026-08-20 06:17:39 +08:00

300 lines
8.8 KiB
Python

#!/usr/bin/env python3
# qtvcp
#
# Copyright (c) 2017 Chris Morley <chrisinnanaimo@hotmail.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
#################################################################################
from qtpy.QtCore import Property, Slot, Qt, QTimer, QSize
from qtpy.QtGui import QColor, QPainter, QBrush, QRadialGradient
from qtpy.QtWidgets import QWidget
from qtvcp.widgets.widget_baseclass import _HalWidgetBase, hal
from qtvcp import logger
# Instantiate the libraries with global reference
# LOG is for running code logging
LOG = logger.getLogger(__name__)
# Set the log level for this module
# LOG.setLevel(logger.INFO) # One of DEBUG, INFO, WARNING, ERROR, CRITICAL
class LED(QWidget, _HalWidgetBase):
def __init__(self, parent=None):
super(LED, self).__init__(parent)
self._diamX = 0
self._diamY = 0
self._diameter = 15
self._color = QColor("red")
self._off_color = QColor("black")
self._gradient = True
self._on_gradient_color = Qt.white
self._off_gradient_color = Qt.white
self._border_color = QColor("black")
self._alignment = Qt.AlignCenter
self.state = False
self.flash = False
self._state = False
self._flashing = False
self._flashRate = 200
self._timer = QTimer()
self._timer.timeout.connect(self.toggleState)
self.setDiameter(self._diameter)
self.setGradient(self._gradient)
self._halpin_option = True
def _hal_init(self):
if (self._halpin_option):
if self._pin_name_ == '':
pname = self.HAL_NAME_
else:
pname = self._pin_name_
self.hal_pin = self.HAL_GCOMP_.newpin(pname, hal.HAL_BIT, hal.HAL_IN)
self.hal_pin.value_changed.connect(lambda s: self.change_state(s))
@Slot(bool)
def change_state(self, data):
self.state = data
if data and self.flash:
self.setFlashing(True)
elif data and not self.flash:
self.setState(True)
else:
self.setFlashing(False)
self.setState(False)
def paintEvent(self, event):
painter = QPainter()
x = 0
y = 0
if self._alignment & Qt.AlignLeft:
x = 0
elif self._alignment & Qt.AlignRight:
x = self.width() - self._diameter
elif self._alignment & Qt.AlignHCenter:
x = (self.width() - self._diameter) // 2
elif self._alignment & Qt.AlignJustify:
x = 0
if self._alignment & Qt.AlignTop:
y = 0
elif self._alignment & Qt.AlignBottom:
y = self.height() - self._diameter
elif self._alignment & Qt.AlignVCenter:
y = (self.height() - self._diameter) // 2
if self._gradient:
gradient = QRadialGradient(x + self._diameter / 2, y + self._diameter / 2,
self._diameter * 0.4, self._diameter * 0.4, self._diameter * 0.4)
if self._state:
gradient.setColorAt(0, self._on_gradient_color)
gradient.setColorAt(1, self._color)
else:
gradient.setColorAt(0, self._off_gradient_color)
gradient.setColorAt(1, self._off_color)
brush = QBrush(gradient)
else:
brush = QBrush(self._color if self._state else self._off_color)
painter.begin(self)
painter.setPen(self._border_color)
painter.setRenderHint(QPainter.Antialiasing, True)
painter.setBrush(brush)
painter.drawEllipse(x, y, self._diameter - 1, self._diameter - 1)
painter.end()
def minimumSizeHint(self):
return QSize(self._diameter, self._diameter)
def sizeHint(self):
return QSize(self._diameter, self._diameter)
def getDiameter(self):
return self._diameter
def set_halpin_option(self, value):
self._halpin_option = value
def get_halpin_option(self):
return self._halpin_option
def reset_halpin_option(self):
self._halpin_option = True
@Slot(int)
def setDiameter(self, value):
self._diameter = value
self.update()
def getColor(self):
return self._color
@Slot(QColor)
def setColor(self, value):
self._color = value
self.update()
def getOffColor(self):
return self._off_color
@Slot(QColor)
def setOffColor(self, value):
self._off_color = value
self.update()
def getOnGradientColor(self):
return self._on_gradient_color
@Slot(QColor)
def setOnGradientColor(self, value):
self._on_gradient_color = value
self.update()
def resetOnGradientColor(self, value):
self._on_gradient_color = Qt.white
self.update()
def getOffGradientColor(self):
return self._off_gradient_color
@Slot(QColor)
def setOffGradientColor(self, value):
self._off_gradient_color = value
self.update()
def resetOffGradientColor(self, value):
self._off_gradient_color = Qt.white
self.update()
def getGradient(self):
return self._gradient
@Slot(bool)
def setGradient(self, value):
self._gradient = value
self.update()
def resetGradient(self):
self._gradient = True
def getBorderColor(self):
return self._border_color
@Slot(QColor)
def setBorderColor(self, value):
self._border_color = value
self.update()
def getAlignment(self):
return self._alignment
@Slot(object)
def setAlignment(self, value):
self._alignment = value
self.update()
def resetAlignment(self):
self._alignment = Qt.AlignCenter
@Slot(bool)
@Slot(int)
def setState(self, value):
self.state = self._state = value
self.update()
def getState(self):
return self.state
def resetState(self):
self.state = self._state = False
@Slot()
def toggleState(self):
self._state = not self._state
self.update()
def isFlashing(self):
return self._flashing
@Slot(bool)
def setFlashing(self, value):
self._flashing = value
if self._flashRate > 0 and value:
if self._timer.isActive():
return
self._timer.start(self._flashRate)
else:
self._timer.stop()
# make sure when flashing stops led ends up at state
self._state = self.state
self.update()
# flash when state on
def setFlashState(self, value):
self.flash = value
self.update()
def getFlashState(self):
return self.flash
def getFlashRate(self):
return self._flashRate
@Slot(int)
def setFlashRate(self, value):
self._flashRate = value
self.update()
def set_pin_name(self, value):
self._pin_name_ = value
def get_pin_name(self):
return self._pin_name_
def reset_pin_name(self):
self._pin_name_ = ''
pin_name = Property(str, get_pin_name, set_pin_name, reset_pin_name)
halpin_option = Property(bool, get_halpin_option, set_halpin_option, reset_halpin_option)
diameter = Property(int, getDiameter, setDiameter)
gradient = Property(bool, getGradient, setGradient, resetGradient)
color = Property(QColor, getColor, setColor)
off_color = Property(QColor, getOffColor, setOffColor)
off_gradient_color = Property(QColor, getOffGradientColor, setOffGradientColor, resetOffGradientColor)
on_gradient_color = Property(QColor, getOnGradientColor, setOnGradientColor, resetOnGradientColor)
border_color = Property(QColor, getBorderColor, setBorderColor)
alignment = Property(int, getAlignment, setAlignment, resetAlignment)
currentstate = Property(bool, getState, setState, resetState)
flashing = Property(bool, getFlashState, setFlashState)
flashRate = Property(int, getFlashRate, setFlashRate)
if __name__ == "__main__":
import sys
from qtpy.QtWidgets import QApplication
app = QApplication(sys.argv)
led = LED()
led.show()
# Flash always when method called test
#led.setFlashing(True)
# this shouldn't matter
#led.setState(False)
# Flash only when state on test
led.setFlashState(True)
# only flash when this is true
led.change_state(False)
sys.exit(app.exec())