#!/usr/bin/env python3 # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho # SPDX-License-Identifier: GPL-2.0-or-later # --------------------------------------------------------------------------------------------------------------------- # Imports (Global) from qt_compat import qt_config if qt_config == 5: from PyQt5.QtCore import QRectF from PyQt5.QtGui import QPainter, QPixmap from PyQt5.QtSvg import QSvgWidget from PyQt5.QtWidgets import QPushButton elif qt_config == 6: from PyQt6.QtCore import QRectF from PyQt6.QtGui import QPainter, QPixmap from PyQt6.QtSvgWidgets import QSvgWidget from PyQt6.QtWidgets import QPushButton # --------------------------------------------------------------------------------------------------------------------- # Widget Class class LEDButton(QPushButton): # unset UNSET = -1 # normal OFF = 0 BLUE = 1 GREEN = 2 RED = 3 YELLOW = 4 # extra CALF = 5 def __init__(self, parent): QPushButton.__init__(self, parent) self.fLastColor = self.UNSET self.fColor = self.UNSET self.fImage = QSvgWidget() self.fImage.load(":/scalable/led_off.svg") self.fRect = QRectF(self.fImage.rect()) self.setCheckable(True) self.setText("") self.setColor(self.BLUE) def setColor(self, color): self.fColor = color if color == self.CALF: self.fLastColor = self.UNSET if self._loadImageNowIfNeeded(): #if isinstance(self.fImage, QPixmap): #size = self.fImage.width() #else: #size = self.fImage.sizeHint().width() self.fRect = QRectF(self.fImage.rect()) self.setFixedSize(self.fImage.size()) def paintEvent(self, event): painter = QPainter(self) event.accept() self._loadImageNowIfNeeded() if isinstance(self.fImage, QPixmap): size = self.fImage.width() rect = QRectF(0, 0, size, size) painter.drawPixmap(rect, self.fImage, rect) else: size = self.fImage.sizeHint().width() rect = QRectF(0, 0, size, size) self.fImage.renderer().render(painter, rect) def _loadImageNowIfNeeded(self): if self.isChecked(): if self.fLastColor == self.fColor: return False if self.fColor == self.OFF: img = ":/scalable/led_off.svg" elif self.fColor == self.BLUE: img = ":/scalable/led_blue.svg" elif self.fColor == self.GREEN: img = ":/scalable/led_green.svg" elif self.fColor == self.RED: img = ":/scalable/led_red.svg" elif self.fColor == self.YELLOW: img = ":/scalable/led_yellow.svg" elif self.fColor == self.CALF: img = ":/bitmaps/led_calf_on.png" else: return False self.fLastColor = self.fColor elif self.fLastColor != self.OFF: img = ":/bitmaps/led_calf_off.png" if self.fColor == self.CALF else ":/scalable/led_off.svg" self.fLastColor = self.OFF else: return False if img.endswith(".png"): if not isinstance(self.fImage, QPixmap): self.fImage = QPixmap() else: if not isinstance(self.fImage, QSvgWidget): self.fImage = QSvgWidget() self.fImage.load(img) self.update() return True # ---------------------------------------------------------------------------------------------------------------------