|
|
@@ -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):
|