Digitale bierlijst

gui.py 2.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. """
  2. Provides the graphical front-end for Piket.
  3. """
  4. import sys
  5. from urllib.parse import urljoin
  6. from PySide2.QtWidgets import QApplication, QPushButton, QGridLayout, QWidget
  7. from PySide2.QtGui import QFont
  8. import requests
  9. from piket_client.sound import PLOP_WAVE
  10. def plop() -> None:
  11. """ Asynchronously play the plop sound. """
  12. PLOP_WAVE.play()
  13. SERVER_URL = "http://127.0.0.1:5000"
  14. def get_people():
  15. request = requests.get(urljoin(SERVER_URL, "/people"))
  16. return request.json()["people"]
  17. class NameButton(QPushButton):
  18. """ Wraps a QPushButton to provide a counter. """
  19. def __init__(self, person: dict, *args, **kwargs) -> None:
  20. self.person_id = person["id"]
  21. self.name = person["name"]
  22. self.count = person["count"]
  23. super().__init__(self.current_label, *args, **kwargs)
  24. self.clicked.connect(self.plop)
  25. @property
  26. def current_label(self) -> str:
  27. return f"{self.name} ({self.count})"
  28. def plop(self) -> None:
  29. r = requests.post(
  30. urljoin(SERVER_URL, f"people/{self.person_id}/add_consumption")
  31. )
  32. if r.status_code == 200:
  33. json = r.json()
  34. person = json["person"]
  35. self.count = person["count"]
  36. self.setText(self.current_label)
  37. plop()
  38. else:
  39. print("Oh shit kapot")
  40. class NameButtons(QWidget):
  41. def __init__(self) -> None:
  42. super().__init__()
  43. self.layout = None
  44. self.init_ui()
  45. def init_ui(self) -> None:
  46. self.layout = QGridLayout()
  47. for index, person in enumerate(get_people()):
  48. button = NameButton(person)
  49. self.layout.addWidget(button, index // 2, index % 2)
  50. self.setLayout(self.layout)
  51. if __name__ == "__main__":
  52. app = QApplication(sys.argv)
  53. font = app.font()
  54. size = font.pointSize()
  55. font.setPointSize(size * 1.75)
  56. app.setFont(font)
  57. name_buttons = NameButtons()
  58. name_buttons.show()
  59. app.exec_()