]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Python GUI: Showing protocol names
authorMaria Matejka <mq@ucw.cz>
Mon, 22 May 2023 15:14:15 +0000 (17:14 +0200)
committerMaria Matejka <mq@ucw.cz>
Tue, 23 May 2023 11:45:04 +0000 (13:45 +0200)
python/gui_view.py

index 9d5075a1f515d0c5cb1919d689326e393c6334d4..2f5d8e53aff5dc224c59593ac220e318ed7cbb78 100644 (file)
@@ -1,9 +1,10 @@
 from PySide6.QtCore import (Qt, QEvent, QObject, QRunnable, QThreadPool, Signal, Slot)
-from PySide6.QtWidgets import (QApplication, QLabel, QMainWindow, QPushButton, QVBoxLayout, QWidget)
+from PySide6.QtWidgets import (QApplication, QLabel, QMainWindow, QPushButton, QHBoxLayout, QVBoxLayout, QWidget)
 
 from BIRD import BIRD
 
 import asyncio
+from datetime import datetime
 import signal
 import sys
 
@@ -67,8 +68,36 @@ class InitialLayout(QWidget):
 
         AsyncWorker.dispatch(f())
 
+class ProtocolView(QWidget):
+    def __init__(self, bp):
+        super().__init__()
+        self.bp = bp
+
+        self.layout = QHBoxLayout(self)
+        self.name_label = QLabel(self.bp.name)
+        self.name_label.setStyleSheet("font-weight: bold")
+        self.layout.addWidget(self.name_label)
+
+class ProtocolListView(QWidget):
+    def __init__(self, bird):
+        super().__init__()
+        self.bird = bird
+
+        self.layout = QVBoxLayout(self)
+        self.protocols = []
+
+    @Slot(object)
+    def redraw(self, protocols):
+        for p in self.protocols:
+            self.layout.removeWidget(p)
+
+        self.protocols = [ ProtocolView(p) for p in protocols.data.values() ]
+        for p in self.protocols:
+            self.layout.addWidget(p)
 
 class ConnectedLayout(QWidget):
+    redraw_signal = Signal()
+
     def __init__(self, bird):
         super().__init__()
         self.bird = bird
@@ -81,6 +110,36 @@ class ConnectedLayout(QWidget):
         self.status = QLabel(f"Status: {bird.status.status}")
         self.layout.addWidget(self.status)
 
+        self.protocols = ProtocolListView(self.bird)
+        self.layout.addWidget(self.protocols)
+
+        self.last_update = QLabel(f"Last update: {datetime.now()}")
+        self.layout.addWidget(self.last_update)
+
+        self.redraw_signal.connect(self.redraw_slot)
+        AsyncWorker.dispatch(self.updater())
+
+    async def updater(self):
+        async with self.bird as b:
+            await b.protocols.update()
+        self.redraw_signal.emit()
+
+        while True:
+            await asyncio.sleep(5)
+            async with self.bird as b:
+                await b.version.update()
+                await b.status.update()
+                await b.protocols.update()
+            self.redraw_signal.emit()
+
+    @Slot()
+    def redraw_slot(self):
+        self.status.setText(f"Status: {self.bird.status.status}")
+        self.main_info.setText(f"Connected to {self.bird.version.name} {self.bird.version.version}")
+        self.protocols.redraw(self.bird.protocols)
+        self.last_update.setText(f"Last update: {datetime.now()}")
+
+
 class MainWindow(QMainWindow):
     def __init__(self):
         super().__init__()