From ff2d1b99de302ce51512a8a3a3f5a8154bc48ee1 Mon Sep 17 00:00:00 2001
From: Jan Rach <rachj@students.zcu.cz>
Date: Wed, 2 Jun 2021 14:46:54 +0200
Subject: [PATCH] Re: #9016 - Topic close plot reaction implemented

---
 aswi2021vochomurka/view/main_view.py | 45 +++++++++++++++++++++++-----
 1 file changed, 37 insertions(+), 8 deletions(-)

diff --git a/aswi2021vochomurka/view/main_view.py b/aswi2021vochomurka/view/main_view.py
index 8e34463..76e9388 100644
--- a/aswi2021vochomurka/view/main_view.py
+++ b/aswi2021vochomurka/view/main_view.py
@@ -23,6 +23,7 @@ class Worker(QObject, SubscriberCallback):
     disconnected = pyqtSignal()
     error = pyqtSignal(Exception)
     newMessage = pyqtSignal(Message)
+    closeTopic = pyqtSignal(str)
     subscriber: Subscriber = None
     params: SubscriberParams
 
@@ -48,10 +49,11 @@ class Worker(QObject, SubscriberCallback):
 
     def onMessage(self, message: Message):
         self.newMessage.emit(message)
-        # self.window.plot(message)
 
     def onCloseTopic(self, topic: str):
-        pass
+        print("Close topic")
+        self.closeTopic.emit(topic)
+        #pass
 
 
 class MainView(QMainWindow):
@@ -66,9 +68,11 @@ class MainView(QMainWindow):
 
         self.dataIndex = 0
         self.dataDict = {}
-
         self.canvasDict = {}
         self.figureDict = {}
+        self.widgetDict = {}
+
+        self.widgetList = []
 
         # self.toolbar = NavigationToolbar(self.canvas, self)
 
@@ -126,7 +130,7 @@ class MainView(QMainWindow):
 
             figure = plt.figure(figsize=[500, 500])
             canvas = FigureCanvas(figure)
-            layout = QHBoxLayout()
+            self.layout = QHBoxLayout()
 
             plt.plot(self.dataDict[message.topic])
 
@@ -134,18 +138,40 @@ class MainView(QMainWindow):
             self.figureDict[message.topic] = figure
 
             widget = QWidget()
-            widget.setLayout(layout)
+            self.widgetDict[message.topic] = widget
+            self.widgetList.append(widget)
+            widget.setLayout(self.layout)
             button = QPushButton(':')
             button.setFixedSize(QSize(40, 40))
-            layout.addWidget(canvas)
-            layout.addWidget(button)
-            layout.setAlignment(button, QtCore.Qt.AlignTop)
+            self.layout.addWidget(canvas)
+            self.layout.addWidget(button)
+            self.layout.setAlignment(button, QtCore.Qt.AlignTop)
             widget.setMinimumSize(QSize(500, 500))
 
             self.grid.addWidget(widget, int(self.chartsNum / 2), self.chartsNum % 2)
 
             self.chartsNum += 1
 
+    def deletePlot(self, topic: str):
+        widget = self.widgetDict[topic]
+        self.widgetList.remove(widget)
+        widget.setParent(None)
+
+        del self.widgetDict[topic]
+        del self.canvasDict[topic]
+        del self.figureDict[topic]
+        del self.dataDict[topic]
+
+        self.reorganizePlots()
+
+    def reorganizePlots(self):
+        count = 0
+        for widget in self.widgetList:
+            self.grid.addWidget(widget, int(count / 2), count % 2)
+            count += 1
+
+        self.chartsNum -= 1
+
     def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
         self.worker.stop()
 
@@ -172,6 +198,9 @@ class MainView(QMainWindow):
         self.worker.newMessage.connect(
             lambda message: self.plot(message)
         )
+        self.worker.closeTopic.connect(
+            lambda topic: self.deletePlot(topic)
+        )
         self.worker.window = self
         self.workerThread.start()
 
-- 
GitLab