Files
cursopython2023/aula202-calculadora/buttons.py

59 lines
1.8 KiB
Python

from display import Display
from PySide6.QtCore import Slot
from PySide6.QtWidgets import QGridLayout, QPushButton
from utils import isEmpty, isNumOrDot
from variables import MEDIUM_FONT_SIZE
class Button(QPushButton):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.configStyle()
def configStyle(self):
font = self.font()
font.setPixelSize(MEDIUM_FONT_SIZE)
self.setFont(font)
self.setMinimumSize(75, 75)
self.setCheckable(True)
class ButtonsGrid(QGridLayout):
def __init__(self, display: Display, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
self._gridMask = [
['C', '', '^', '/'],
['7', '8', '9', '*'],
['4', '5', '6', '-'],
['1', '2', '3', '+'],
['', '0', '.', '='],
]
self.display = display
self._makeGrid()
def _makeGrid(self):
for rowNumber, rowData in enumerate(self._gridMask):
for colNumber, buttonText in enumerate(rowData):
button = Button(buttonText)
if not isNumOrDot(buttonText) and not isEmpty(buttonText):
button.setProperty('cssClass', 'specialButton')
self.addWidget(button, rowNumber, colNumber)
buttonSlot = self._makeButtonDisplaySlot(
self._insertButtonTextToDisplay,
button,
)
button.clicked.connect(buttonSlot) # type: ignore
def _makeButtonDisplaySlot(self, func, *args, **kwargs):
@Slot(bool)
def realSlot(_):
func(*args, **kwargs)
return realSlot
def _insertButtonTextToDisplay(self, button):
button_text = button.text()
self.display.insert(button_text)