From 30c930d4519354f7fec5eec8fad26ca414b6e9ba Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Tue, 21 Mar 2023 11:54:19 +0100
Subject: [PATCH] network: Minor change.

---
 src/view/NetworkWindow.py       | 10 ++++-
 src/view/network/GraphWidget.py | 69 ++++++++++++++-------------------
 src/view/ui/Network.ui          | 15 +++++++
 3 files changed, 53 insertions(+), 41 deletions(-)

diff --git a/src/view/NetworkWindow.py b/src/view/NetworkWindow.py
index 99cf5fdb..36835515 100644
--- a/src/view/NetworkWindow.py
+++ b/src/view/NetworkWindow.py
@@ -11,7 +11,7 @@ from PyQt5.QtCore import (
 )
 
 from PyQt5.QtWidgets import (
-    QTableView, QItemDelegate, QComboBox, QLineEdit, QHBoxLayout,
+    QTableView, QItemDelegate, QComboBox, QLineEdit, QHBoxLayout, QSlider,
 )
 
 class LineEditDelegate(QItemDelegate):
@@ -128,9 +128,15 @@ class NetworkWindow(ASubWindow):
 
         # Graph Widget
 
-        self.graph_widget = GraphWidget(self.graph)
+        self.graph_widget = GraphWidget(self.graph, parent=self)
         self.graph_layout = self.find(QHBoxLayout, "horizontalLayout_graph")
         self.graph_layout.addWidget(self.graph_widget)
+        # self.zoom_slider = QSlider(Qt.Orientation.Vertical, parent=self)
+        # self.zoom_slider.setMinimum(0)
+        # self.zoom_slider.setMaximum(99)
+        # self.zoom_slider.setValue(50)
+        # self.graph_layout.addWidget(self.zoom_slider)
+        # self.zoom_slider.valueChanged.connect(self.graph_widget.scaleViewSlider)
 
         # Nodes table
 
diff --git a/src/view/network/GraphWidget.py b/src/view/network/GraphWidget.py
index a224d3ee..a444465f 100644
--- a/src/view/network/GraphWidget.py
+++ b/src/view/network/GraphWidget.py
@@ -7,7 +7,7 @@ from model.network.Edge import Edge
 from model.network.Graph import Graph
 
 from PyQt5.QtCore import (
-    qAbs, QLineF, QPointF, qrand, QRectF, QSizeF, qsrand,
+    qAbs, QLineF, QPointF, QPoint, qrand, QRectF, QSizeF, qsrand,
     Qt, QTime
 )
 from PyQt5.QtGui import (
@@ -20,28 +20,16 @@ from PyQt5.QtWidgets import (
     QGraphicsView, QStyle
 )
 
-class LandMark(QGraphicsItem):
-     def paint(self, painter, option, widget):
-         painter.setPen(QPen(Qt.black, 0))
-
-         painter.drawLine(-500, -500, 500, 500)
-         painter.drawLine(-500, 500, 500, -500)
-
-         painter.drawLine(-500, -500, 500, -500)
-         painter.drawLine(500, -500, 500, 500)
-         painter.drawLine(500, 500, -500, 500)
-         painter.drawLine(-500, 500, -500, -500)
-
 class NodeItem(QGraphicsItem):
     Type = QGraphicsItem.UserType + 1
 
-    def __init__(self, node, graphWidget):
+    def __init__(self, node, graph_widget):
         super(NodeItem, self).__init__()
 
         self.node = node
         self.setPos(QPointF(self.node.pos.x, self.node.pos.y))
 
-        self.graph = graphWidget
+        self.graph = graph_widget
         self.newPos = QPointF()
 
         self.setFlag(QGraphicsItem.ItemIsMovable)
@@ -84,11 +72,11 @@ class NodeItem(QGraphicsItem):
             gradient.setColorAt(1, Qt.darkYellow)
 
         painter.setBrush(QBrush(gradient))
-        painter.setPen(QPen(Qt.black, 0))
+        # painter.setPen(QPen(Qt.black, 0))
         painter.drawEllipse(-10, -10, 20, 20)
 
         painter.setFont(QFont("Arial", 20))
-        painter.drawText(QRectF(-10, -10, 20, 20), Qt.AlignCenter, self.node.name)
+        painter.drawText(QPoint(-10, -10), self.node.name)
 
     def itemChange(self, change, value):
         if change == QGraphicsItem.ItemPositionHasChanged:
@@ -166,9 +154,13 @@ class EdgeItem(QGraphicsItem):
         penWidth = 1.0
         extra = (penWidth + self.arrowSize) / 2.0
 
-        return QRectF(self.sourcePoint,
-                QSizeF(self.destPoint.x() - self.sourcePoint.x(),
-                        self.destPoint.y() - self.sourcePoint.y())).normalized().adjusted(-extra, -extra, extra, extra)
+        return QRectF(
+            self.sourcePoint,
+            QSizeF(
+                self.destPoint.x() - self.sourcePoint.x(),
+                self.destPoint.y() - self.sourcePoint.y()
+            )
+        ).normalized().adjusted(-extra, -extra, extra, extra)
 
     def paint(self, painter, option, widget):
         if not self.source or not self.dest:
@@ -204,14 +196,15 @@ class EdgeItem(QGraphicsItem):
 
 
 class GraphWidget(QGraphicsView):
-    def __init__(self, graph):
-        super(GraphWidget, self).__init__()
+    def __init__(self, graph, parent=None):
+        super(GraphWidget, self).__init__(parent=parent)
 
         self.timerId = 0
+        self.parent = parent
 
         scene = QGraphicsScene(self)
         scene.setItemIndexMethod(QGraphicsScene.NoIndex)
-        scene.setSceneRect(-500, -500, 500, 500)
+        scene.setSceneRect(0, 0, 10000, 10000)
         self.setScene(scene)
         self.setCacheMode(QGraphicsView.CacheBackground)
         self.setViewportUpdateMode(QGraphicsView.BoundingRectViewportUpdate)
@@ -219,7 +212,7 @@ class GraphWidget(QGraphicsView):
         self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
         self.setResizeAnchor(QGraphicsView.AnchorViewCenter)
 
-        scene.addItem(LandMark())
+        # scene.addItem(LandMark())
 
         self.graph = graph
         for node in self.graph.nodes():
@@ -228,7 +221,8 @@ class GraphWidget(QGraphicsView):
         # for edge in self.graph.edges():
         #     scene.addItem(EdgeItem(edge))
 
-        self.scale(0.8, 0.8)
+        self.scale(1, 1)
+        self.previousScale = 1
         self.setMinimumSize(400, 400)
 
     def itemMoved(self):
@@ -257,20 +251,15 @@ class GraphWidget(QGraphicsView):
         else:
             super(GraphWidget, self).keyPressEvent(event)
 
-    def timerEvent(self, event):
-        nodes = [item for item in self.scene().items() if isinstance(item, Node)]
+    def drawBackground(self, painter, rect):
+        sceneRect = self.sceneRect()
 
-        for node in nodes:
-            node.calculateForces()
-
-        itemsMoved = False
-        for node in nodes:
-            if node.advance():
-                itemsMoved = True
-
-        if not itemsMoved:
-            self.killTimer(self.timerId)
-            self.timerId = 0
+        gradient = QLinearGradient(sceneRect.topLeft(), sceneRect.bottomRight())
+        gradient.setColorAt(0, Qt.lightGray)
+        gradient.setColorAt(1, Qt.lightGray)
+        painter.fillRect(rect.intersected(sceneRect), QBrush(gradient))
+        painter.setBrush(Qt.NoBrush)
+        painter.drawRect(sceneRect)
 
     def wheelEvent(self, event):
         self.scaleView(math.pow(2.0, -event.angleDelta().y() / 240.0))
@@ -278,7 +267,9 @@ class GraphWidget(QGraphicsView):
     def scaleView(self, scaleFactor):
         factor = self.transform().scale(scaleFactor, scaleFactor).mapRect(QRectF(0, 0, 1, 1)).width()
 
-        if factor < 0.07 or factor > 100:
+        if factor < 0.05 or factor > 1.5:
             return
 
+        # print(f"{scaleFactor} : {factor}")
+
         self.scale(scaleFactor, scaleFactor)
diff --git a/src/view/ui/Network.ui b/src/view/ui/Network.ui
index 54513b99..1372ae77 100644
--- a/src/view/ui/Network.ui
+++ b/src/view/ui/Network.ui
@@ -33,6 +33,18 @@
           <iconset>
            <normaloff>ressources/gtk_add.png</normaloff>ressources/gtk_add.png</iconset>
          </property>
+         <property name="checkable">
+          <bool>true</bool>
+         </property>
+         <property name="autoRepeat">
+          <bool>false</bool>
+         </property>
+         <property name="default">
+          <bool>false</bool>
+         </property>
+         <property name="flat">
+          <bool>false</bool>
+         </property>
         </widget>
        </item>
        <item>
@@ -44,6 +56,9 @@
           <iconset>
            <normaloff>ressources/gtk-remove.png</normaloff>ressources/gtk-remove.png</iconset>
          </property>
+         <property name="checkable">
+          <bool>true</bool>
+         </property>
         </widget>
        </item>
        <item>
-- 
GitLab