|
|
@@ -1,8 +1,8 @@ |
|
|
|
#!/usr/bin/env python3 |
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
|
|
|
|
# Svg Button, a custom Qt widget |
|
|
|
# Copyright (C) 2020 Filipe Coelho <falktx@falktx.com> |
|
|
|
# Scalable Button, a custom Qt widget |
|
|
|
# Copyright (C) 2013-2020 Filipe Coelho <falktx@falktx.com> |
|
|
|
# |
|
|
|
# This program is free software; you can redistribute it and/or |
|
|
|
# modify it under the terms of the GNU General Public License as |
|
|
@@ -20,39 +20,52 @@ |
|
|
|
# Imports (Global) |
|
|
|
|
|
|
|
from PyQt5.QtCore import QPointF, QRectF |
|
|
|
from PyQt5.QtGui import QColor, QFont, QPainter |
|
|
|
from PyQt5.QtGui import QColor, QFont, QPainter, QPixmap |
|
|
|
from PyQt5.QtSvg import QSvgWidget |
|
|
|
from PyQt5.QtWidgets import QPushButton |
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------------------------------------ |
|
|
|
# Widget Class |
|
|
|
|
|
|
|
|
|
|
|
class ScalableButton(QPushButton): |
|
|
|
def __init__(self, parent): |
|
|
|
QPushButton.__init__(self, parent) |
|
|
|
|
|
|
|
self.fSvgNormal = QSvgWidget() |
|
|
|
self.fSvgDown = QSvgWidget() |
|
|
|
self.fSvgHover = QSvgWidget() |
|
|
|
|
|
|
|
self.fIsHovered = False |
|
|
|
|
|
|
|
self.fImageNormal = None |
|
|
|
self.fImageDown = None |
|
|
|
self.fImageHover = None |
|
|
|
self.fImageRect = QRectF() |
|
|
|
self.fIsHovered = False |
|
|
|
self.fTopText = "" |
|
|
|
self.fTopTextColor = QColor() |
|
|
|
self.fTopTextFont = QFont() |
|
|
|
|
|
|
|
self.setText("") |
|
|
|
|
|
|
|
def setSvgs(self, normal, down, hover): |
|
|
|
self.fSvgNormal.load(normal) |
|
|
|
self.fSvgDown.load(down) |
|
|
|
self.fSvgHover.load(hover) |
|
|
|
def setPixmaps(self, normal, down, hover): |
|
|
|
self.fImageNormal = QPixmap() |
|
|
|
self.fImageDown = QPixmap() |
|
|
|
self.fImageHover = QPixmap() |
|
|
|
self._loadImages(normal, down, hover) |
|
|
|
|
|
|
|
width = self.fSvgNormal.sizeHint().width() |
|
|
|
height = self.fSvgNormal.sizeHint().height() |
|
|
|
def setSvgs(self, normal, down, hover): |
|
|
|
self.fImageNormal = QSvgWidget() |
|
|
|
self.fImageDown = QSvgWidget() |
|
|
|
self.fImageHover = QSvgWidget() |
|
|
|
self._loadImages(normal, down, hover) |
|
|
|
|
|
|
|
def _loadImages(self, normal, down, hover): |
|
|
|
self.fImageNormal.load(normal) |
|
|
|
self.fImageDown.load(down) |
|
|
|
self.fImageHover.load(hover) |
|
|
|
|
|
|
|
if isinstance(self.fImageNormal, QPixmap): |
|
|
|
width = self.fImageNormal.width() |
|
|
|
height = self.fImageNormal.height() |
|
|
|
else: |
|
|
|
width = self.fImageNormal.sizeHint().width() |
|
|
|
height = self.fImageNormal.sizeHint().height() |
|
|
|
|
|
|
|
self.fSvgRect = QRectF(0, 0, width, height) |
|
|
|
self.fImageRect = QRectF(0, 0, width, height) |
|
|
|
|
|
|
|
self.setMinimumSize(width, height) |
|
|
|
self.setMaximumSize(width, height) |
|
|
@@ -74,19 +87,14 @@ class ScalableButton(QPushButton): |
|
|
|
painter = QPainter(self) |
|
|
|
event.accept() |
|
|
|
|
|
|
|
if not self.isEnabled(): |
|
|
|
painter.save() |
|
|
|
painter.setOpacity(0.2) |
|
|
|
self.fSvgNormal.renderer().render(painter, self.fSvgRect) |
|
|
|
painter.restore() |
|
|
|
|
|
|
|
elif self.isChecked() or self.isDown(): |
|
|
|
self.fSvgDown.renderer().render(painter, self.fSvgRect) |
|
|
|
if self.fImageNormal is None: |
|
|
|
return |
|
|
|
|
|
|
|
elif self.fIsHovered: |
|
|
|
self.fSvgHover.renderer().render(painter, self.fSvgRect) |
|
|
|
if isinstance(self.fImageNormal, QPixmap): |
|
|
|
self.paintEventPixmap(painter) |
|
|
|
else: |
|
|
|
self.fSvgNormal.renderer().render(painter, self.fSvgRect) |
|
|
|
self.paintEventSvg(painter) |
|
|
|
|
|
|
|
if not self.fTopText: |
|
|
|
return |
|
|
|
|
|
|
@@ -96,3 +104,35 @@ class ScalableButton(QPushButton): |
|
|
|
painter.setFont(self.fTopTextFont) |
|
|
|
painter.drawText(QPointF(10, 16), self.fTopText) |
|
|
|
painter.restore() |
|
|
|
|
|
|
|
def paintEventPixmap(self, painter): |
|
|
|
if not self.isEnabled(): |
|
|
|
painter.save() |
|
|
|
painter.setOpacity(0.2) |
|
|
|
painter.drawPixmap(self.fImageRect, self.fImageNormal, self.fImageRect) |
|
|
|
painter.restore() |
|
|
|
|
|
|
|
elif self.isChecked() or self.isDown(): |
|
|
|
painter.drawPixmap(self.fImageRect, self.fImageDown, self.fImageRect) |
|
|
|
|
|
|
|
elif self.fIsHovered: |
|
|
|
painter.drawPixmap(self.fImageRect, self.fImageHover, self.fImageRect) |
|
|
|
|
|
|
|
else: |
|
|
|
painter.drawPixmap(self.fImageRect, self.fImageNormal, self.fImageRect) |
|
|
|
|
|
|
|
def paintEventSvg(self, painter): |
|
|
|
if not self.isEnabled(): |
|
|
|
painter.save() |
|
|
|
painter.setOpacity(0.2) |
|
|
|
self.fImageNormal.renderer().render(painter, self.fImageRect) |
|
|
|
painter.restore() |
|
|
|
|
|
|
|
elif self.isChecked() or self.isDown(): |
|
|
|
self.fImageDown.renderer().render(painter, self.fImageRect) |
|
|
|
|
|
|
|
elif self.fIsHovered: |
|
|
|
self.fImageHover.renderer().render(painter, self.fImageRect) |
|
|
|
|
|
|
|
else: |
|
|
|
self.fImageNormal.renderer().render(painter, self.fImageRect) |