""" Provides a helper tool to (de-)activate multiple people at once. """ import sys # pylint: disable=E0611 from PySide6.QtWidgets import ( QApplication, QGridLayout, QInputDialog, QLineEdit, QMainWindow, QMessageBox, QPushButton, QSizePolicy, QToolBar, QWidget, ) from PySide6.QtGui import QIcon, QAction, QActionGroup from PySide6.QtCore import QObject, QSize, Qt, Signal, Slot # pylint: enable=E0611 import qdarkstyle from piket_client.model import Person, ServerStatus class ActivationButton(QPushButton): def __init__(self, person, *args, **kwargs): super().__init__(*args, **kwargs) self.setCheckable(True) self.person = person self.setText(self.person.name) self.setChecked(self.person.active) self.toggled.connect(self.process_toggled) def process_toggled(self, new_state: bool) -> None: self.person = self.person.set_active(new_state) class ActivationButtons(QWidget): def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) self.layout = QGridLayout() self.setLayout(self.layout) self.init_ui() def init_ui(self) -> None: ps = Person.get_all() num_columns = round(len(ps) / 10) + 1 for index, person in enumerate(ps): button = ActivationButton(person, self) self.layout.addWidget(button, index // num_columns, index % num_columns) class ActiveStateMainWindow(QMainWindow): def __init__(self) -> None: super().__init__() self.toolbar = None self.init_ui() def init_ui(self) -> None: """ Initialize the UI: construct main widget, toolbar. """ self.setWindowState(Qt.WindowActive | Qt.WindowFullScreen) font_metrics = self.fontMetrics() icon_size = font_metrics.height() * 1.45 # Toolbar self.toolbar = QToolBar() self.toolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) self.toolbar.setIconSize(QSize(icon_size, icon_size)) # Left self.toolbar.addAction("Afsluiten", self.quit) self.addToolBar(self.toolbar) # Build main widget ps = Person.get_all() self.main_widget = ActivationButtons() self.setCentralWidget(self.main_widget) def quit(self) -> None: """ Exit immediately. """ QApplication.instance().quit() def main() -> None: """ Main entry point of GUI client. """ app = QApplication(sys.argv) # Set dark theme app.setStyleSheet(qdarkstyle.load_stylesheet_pyside6()) # Enlarge font size font = app.font() size = font.pointSize() font.setPointSize(size * 0.8) app.setFont(font) # Test connectivity server_running, info = ServerStatus.is_server_running() if not server_running: LOG.critical("Could not connect to server", extra={"info": info}) QMessageBox.critical( None, "Help er is iets kapot", "Kan niet starten omdat de server niet reageert, stuur een foto van " "dit naar Maarten: " + repr(info), ) return 1 # Load main window main_window = ActiveStateMainWindow() main_window.show() app.exec_() if __name__ == "__main__": main()