12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- """
- Provides the graphical front-end for Piket.
- """
- import sys
- from urllib.parse import urljoin
- from PySide2.QtWidgets import QApplication, QPushButton, QGridLayout, QWidget
- from PySide2.QtGui import QFont
- import requests
- from piket_client.sound import PLOP_WAVE
- def plop() -> None:
- """ Asynchronously play the plop sound. """
- PLOP_WAVE.play()
- SERVER_URL = "http://127.0.0.1:5000"
- def get_people():
- request = requests.get(urljoin(SERVER_URL, "/people"))
- return request.json()["people"]
- class NameButton(QPushButton):
- """ Wraps a QPushButton to provide a counter. """
- def __init__(self, person: dict, *args, **kwargs) -> None:
- self.person_id = person["id"]
- self.name = person["name"]
- self.count = person["count"]
- super().__init__(self.current_label, *args, **kwargs)
- self.clicked.connect(self.plop)
- @property
- def current_label(self) -> str:
- return f"{self.name} ({self.count})"
- def plop(self) -> None:
- r = requests.post(
- urljoin(SERVER_URL, f"people/{self.person_id}/add_consumption")
- )
- if r.status_code == 200:
- json = r.json()
- person = json["person"]
- self.count = person["count"]
- self.setText(self.current_label)
- plop()
- else:
- print("Oh shit kapot")
- class NameButtons(QWidget):
- def __init__(self) -> None:
- super().__init__()
- self.layout = None
- self.init_ui()
- def init_ui(self) -> None:
- self.layout = QGridLayout()
- for index, person in enumerate(get_people()):
- button = NameButton(person)
- self.layout.addWidget(button, index // 2, index % 2)
- self.setLayout(self.layout)
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- font = app.font()
- size = font.pointSize()
- font.setPointSize(size * 1.75)
- app.setFont(font)
- name_buttons = NameButtons()
- name_buttons.show()
- app.exec_()
|