Skip to content

Commit

Permalink
Merge pull request #159 from rainzee/refactor/button
Browse files Browse the repository at this point in the history
refactor: impl the code outline draft
  • Loading branch information
ChinaIceF authored Oct 25, 2024
2 parents b6a04bf + 64c8941 commit 707bf7d
Showing 1 changed file with 86 additions and 0 deletions.
86 changes: 86 additions & 0 deletions siui/components/button.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# NOTE This is the refactor of button component. It's working in progress. It will
# replace button once it's done. Now it's draft, code may be ugly and verbose temporarily.

from PyQt5.QtCore import QRect, QRectF, Qt
from PyQt5.QtGui import QColor, QIcon, QPainter, QPainterPath, QPaintEvent
from PyQt5.QtWidgets import QApplication, QPushButton, QVBoxLayout, QWidget


class SiPushButton(QPushButton):
def __init__(self, parent: QWidget | None = None) -> None:
super().__init__(parent)

@classmethod
def withText(cls, text: str, parent: QWidget | None = None) -> "SiPushButton":
cls = cls(parent)
cls.setText(text)
return cls

@classmethod
def withIcon(cls, icon: QIcon, parent: QWidget | None = None) -> "SiPushButton":
cls = cls(parent)
cls.setIcon(icon)
return cls

def withTextAndIcon(cls, text: str, icon: str, parent: QWidget | None = None) -> "SiPushButton":
cls = cls(parent)
cls.setText(text)
cls.setIcon(icon)
return cls

@property
def bottomBorderHeight(self) -> int:
return round(self.rect().height() * 0.125)

@staticmethod
def _drawBackgroundPath(rect: QRect) -> QPainterPath:
path = QPainterPath()
path.addRoundedRect(QRectF(0, 0, rect.width(), rect.height()), 40, 40)
return path

def _drawBackgroundRect(self, painter: QPainter, rect: QRect) -> None:
painter.setBrush(QColor("#2D2932"))
painter.drawPath(self._drawBackgroundPath(rect))

def _drawButtonPath(self, rect: QRect) -> QPainterPath:
path = QPainterPath()
path.addRoundedRect(QRectF(0, 0, rect.width(), rect.height() - self.bottomBorderHeight), 40, 40)
return path

def _drawBbuttonRect(self, painter: QPainter, rect: QRect) -> None:
painter.setBrush(QColor("#4C4554"))
painter.drawPath(self._drawButtonPath(rect))

def enterEvent(self, event) -> None:
super().enterEvent(event)

def leaveEvent(self, event) -> None:
super().leaveEvent(event)

def resizeEvent(self, event) -> None:
super().resizeEvent(event)

def paintEvent(self, event: QPaintEvent) -> None:
painter = QPainter(self)
painter.setRenderHint(QPainter.RenderHint.Antialiasing)
painter.setPen(Qt.PenStyle.NoPen)
rect = self.rect()
self._drawBackgroundRect(painter, rect)
self._drawBbuttonRect(painter, rect)


class Window(QWidget):
def __init__(self) -> None:
super().__init__()
self.resize(600, 800)
self.btn = SiPushButton(self)
self.btn.setFixedSize(2400, 320)
self.main_layout = QVBoxLayout(self)
self.main_layout.addWidget(self.btn, alignment=Qt.AlignmentFlag.AlignCenter)


if __name__ == "__main__":
app = QApplication([])
window = Window()
window.show()
app.exec()

0 comments on commit 707bf7d

Please sign in to comment.