Sfoglia il codice sorgente

Sauvegarde - Chargement: ok

olivier.massot 7 anni fa
parent
commit
64be11e067
2 ha cambiato i file con 54 aggiunte e 15 eliminazioni
  1. 43 14
      Viewer.py
  2. 11 1
      core.py

+ 43 - 14
Viewer.py

@@ -8,8 +8,8 @@ from PyQt5.Qt import Qt, QEvent, QGraphicsScene, QPointF, QFileDialog, \
     QGraphicsTextItem, QGraphicsItem, QGraphicsRectItem, \
     QBrush, QColor, QGraphicsLineItem, QLineF, \
     QPen, QPainter, QSvgGenerator, QSize, QRect, QGraphicsItemGroup, \
-    QGraphicsColorizeEffect, QFont, QDialog, QTableWidgetItem, QAbstractItemView, \
-    QListWidgetItem, QFrame, QInputDialog, QIcon, QPixmap
+    QGraphicsColorizeEffect, QFont, QDialog, QTableWidgetItem, \
+    QListWidgetItem, QInputDialog, QIcon, QPixmap
 from PyQt5.QtWidgets import QMainWindow, QGraphicsView
 from path import Path
 
@@ -106,13 +106,16 @@ class GraphicsObject(QGraphicsItemGroup):
         self._x, self._y = self.pos().x(), self.pos().y()
         self.update()
 
+    def mouseReleaseEvent(self, _):
+        self.obj._custom_position = (self.pos().x(), self.pos().y())
+
     def setShining(self, active):
         self.rect.graphicsEffect().setEnabled(active)
 
-    def hoverEnterEvent(self, *args, **kwargs):
+    def hoverEnterEvent(self, _):
         self.setShining(True)
 
-    def hoverLeaveEvent(self, *args, **kwargs):
+    def hoverLeaveEvent(self, _):
         self.setShining(False)
 
 class GraphicsRootObject(GraphicsObject):
@@ -176,6 +179,8 @@ class GraphicsCloneDepObject(GraphicsDepObject):
         self.clone_of = next((item for item in GraphicsObject.items if item.obj is obj
                                                                     and (type(item) is GraphicsDepObject or type(item) is GraphicsRefObject)))
 
+        self.setToolTip("L'objet [{}] '{}' a déjà été placé sur l'arbre".format(self.obj.type_, self.obj.name_))
+
     def html(self):
         return "* Clone *<br/>" + super(GraphicsCloneDepObject, self).html()
 
@@ -187,11 +192,11 @@ class GraphicsCloneDepObject(GraphicsDepObject):
     def deps(self, value):
         pass
 
-    def hoverEnterEvent(self, *args, **kwargs):
+    def hoverEnterEvent(self, _):
         self.setShining(True)
         self.clone_of.setShining(True)
 
-    def hoverLeaveEvent(self, *args, **kwargs):
+    def hoverLeaveEvent(self, _):
         self.setShining(False)
         self.clone_of.setShining(False)
 
@@ -224,6 +229,7 @@ class GraphicsCloneRefObject(GraphicsRefObject):
         self.top_anchor.setBrush(QColor("red"))
         self.clone_of = next((item for item in GraphicsObject.items if item.obj is obj
                                                                     and (type(item) is GraphicsDepObject or type(item) is GraphicsRefObject)))
+        self.setToolTip("L'objet [{}] '{}' a déjà été placé sur l'arbre".format(self.obj.type_, self.obj.name_))
 
     def html(self):
         return "* Clone *<br/>" + super(GraphicsCloneRefObject, self).html()
@@ -236,11 +242,11 @@ class GraphicsCloneRefObject(GraphicsRefObject):
     def refs(self, value):
         pass
 
-    def hoverEnterEvent(self, *args, **kwargs):
+    def hoverEnterEvent(self, _):
         self.setShining(True)
         self.clone_of.setShining(True)
 
-    def hoverLeaveEvent(self, *args, **kwargs):
+    def hoverLeaveEvent(self, _):
         self.setShining(False)
         self.clone_of.setShining(False)
 
@@ -279,7 +285,9 @@ class Viewer(QMainWindow):
         self.ui.btn_zoom_plus.clicked.connect(self.zoom_plus)
         self.ui.btn_zoom_minus.clicked.connect(self.zoom_minus)
         self.ui.btn_zoom_view.clicked.connect(self.fit_in_view)
-        self.ui.btn_svg.clicked.connect(self.to_png)
+        self.ui.btn_svg.clicked.connect(self.to_svg)
+        self.ui.btn_save.clicked.connect(self.save)
+        self.ui.btn_load.clicked.connect(self.open)
         self.ui.treeWidget.itemClicked.connect(self.treeItemSelected)
         self.ui.btn_edit_item.clicked.connect(self.edit_selected_item)
 
@@ -327,7 +335,7 @@ class Viewer(QMainWindow):
     def zoom_minus(self):
         self.ui.view.scale(0.8, 0.8)
 
-    def to_png(self):
+    def to_svg(self):
         fileName, _ = QFileDialog.getSaveFileName(self, "Save File", "", "Svg File (*.svg)")
         if not fileName:
             return
@@ -341,6 +349,18 @@ class Viewer(QMainWindow):
         self._scene.render(painter)
         painter.end()
 
+    def save(self):
+        filepath, _ = QFileDialog.getSaveFileName(self, 'Enregistrer sous', '', "Access Analyser Files (*.acan)")
+
+        if filepath:
+            core.Analyse.dump_to(filepath)
+
+    def open(self):
+        filepath, _ = QFileDialog.getOpenFileName(self, 'Charger les données de', '', "Access Analyser Files (*.acan)")
+        if filepath:
+            core.Analyse.load_from(filepath)
+        self.load()
+
     def update_progression(self, i, total, msg=""):
         self.ui.progressBar.setMaximum(total)
         self.ui.progressBar.setValue(i)
@@ -362,7 +382,6 @@ class Viewer(QMainWindow):
         self.ui.progressBar.setVisible(True)
         self.ui.lbl_repertoire.setText(source_dir)
         self.ui.txtPanel.clear()
-        self.ui.treeWidget.clear()
 
         QApplication.setOverrideCursor(Qt.WaitCursor)
 
@@ -375,8 +394,14 @@ class Viewer(QMainWindow):
             QMessageBox.warning(self, "Risque d'instabilités", "Attention! Des doublons ont été trouvés dans les noms des objets")
 
         self.ui.progressBar.setVisible(False)
-        self.ui.stackedWidget.setCurrentIndex(1)
+
         self.ui.txtPanel.clear()
+        self.load()
+
+    def load(self):
+        self.clear_scene()
+        self.ui.treeWidget.clear()
+        self.ui.stackedWidget.setCurrentIndex(1)
 
         topitem = QTreeWidgetItem()
         topitem.setText(0, "Objets")
@@ -397,6 +422,7 @@ class Viewer(QMainWindow):
 
         self.ui.treeWidget.setColumnHidden(1, True)
         self.ui.treeWidget.expandToDepth(1)
+        self.ui.btn_save.setEnabled(True)
 
     def clear_scene(self):
         self._scene.clear()
@@ -445,8 +471,11 @@ class Viewer(QMainWindow):
                 item._x -= (root.ref_emprise() - (cell_width + 2 * cell_spacing)) / 2
             item.update()
 
-        self.ui.btn_save.setEnabled(True)
-
+#         # on applique les positions customisees dans un deuxieme temps: plus propre en cas d'erreur
+#         for item in GraphicsObject.items:
+#             if hasattr(item.obj, "_custom_position"):
+#                 item._x, item._y = item.obj._custom_position
+#                 item.update()
         self.fit_in_view()
 
     def treeItemSelected(self, item):

+ 11 - 1
core.py

@@ -3,6 +3,7 @@
 
 @author: olivier.massot
 '''
+import pickle
 import re
 
 from _regex_core import MULTILINE
@@ -16,7 +17,6 @@ from path import Path
 # TODO: Stocker un aperçu du contexte de la ou des références dans le code source, pour contrôle ultérieur
 # TODO: Permettre de supprimer / ajouter des réferences
 # TODO: Verifier que la recherche puisse être Case sensitive?
-
 here = Path(__file__).parent.abspath()
 
 def recurse(acc_obj):
@@ -130,6 +130,16 @@ class Analyse():
     def ended(cls):
         pass
 
+    @classmethod
+    def dump_to(cls, filepath):
+        with open(filepath, 'wb') as f:
+            pickle.dump(cls.objects, f)
+
+    @classmethod
+    def load_from(cls, filepath):
+        with open(filepath, 'rb') as f:
+            cls.objects = pickle.load(f)
+
     @classmethod
     def load_objects(cls, source_dir):
         source_dir = Path(source_dir)