|
|
@@ -20,6 +20,7 @@ import core
|
|
|
Ui_window, _ = uic.loadUiType(Path(__file__).parent / 'qt_viewer.ui')
|
|
|
Ui_details, _ = uic.loadUiType(Path(__file__).parent / 'qt_details.ui')
|
|
|
Ui_select, _ = uic.loadUiType(Path(__file__).parent / 'qt_select_object.ui')
|
|
|
+Ui_warning, _ = uic.loadUiType(Path(__file__).parent / 'qt_warning.ui')
|
|
|
|
|
|
palette = {
|
|
|
"Table": QColor(240, 240, 20),
|
|
|
@@ -106,9 +107,6 @@ 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)
|
|
|
|
|
|
@@ -177,7 +175,7 @@ class GraphicsCloneDepObject(GraphicsDepObject):
|
|
|
super(GraphicsCloneDepObject, self).__init__(obj, childItem, parent)
|
|
|
self.bottom_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)))
|
|
|
+ and (type(item) in (GraphicsRootObject, GraphicsDepObject, GraphicsRefObject))))
|
|
|
|
|
|
self.setToolTip("L'objet [{}] '{}' a déjà été placé sur l'arbre".format(self.obj.type_, self.obj.name_))
|
|
|
|
|
|
@@ -228,7 +226,7 @@ class GraphicsCloneRefObject(GraphicsRefObject):
|
|
|
super(GraphicsCloneRefObject, self).__init__(obj, childItem, parent)
|
|
|
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)))
|
|
|
+ and (type(item) in (GraphicsRootObject, GraphicsDepObject, GraphicsRefObject))))
|
|
|
self.setToolTip("L'objet [{}] '{}' a déjà été placé sur l'arbre".format(self.obj.type_, self.obj.name_))
|
|
|
|
|
|
def html(self):
|
|
|
@@ -278,18 +276,22 @@ class Viewer(QMainWindow):
|
|
|
|
|
|
self.ui.progressBar.setVisible(False)
|
|
|
self.ui.stackedWidget.setCurrentIndex(0)
|
|
|
-
|
|
|
- self.ui.btn_test.clicked.connect(self.test)
|
|
|
+ self.ui.stackedView.setCurrentIndex(0)
|
|
|
|
|
|
self.ui.btn_select.clicked.connect(self.selectSourceDir)
|
|
|
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_zoom_center.clicked.connect(self.zoom_center)
|
|
|
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)
|
|
|
+ self.ui.btn_graphic_view.clicked.connect(self.switch_graphic_view)
|
|
|
+ self.ui.btn_table_view.clicked.connect(self.switch_table_view)
|
|
|
+ self.ui.searchBoxDeps.textChanged.connect(self.filterTblDeps)
|
|
|
+ self.ui.searchBoxRefs.textChanged.connect(self.filterTblRefs)
|
|
|
|
|
|
self._title = "<unknown>"
|
|
|
|
|
|
@@ -335,6 +337,18 @@ class Viewer(QMainWindow):
|
|
|
def zoom_minus(self):
|
|
|
self.ui.view.scale(0.8, 0.8)
|
|
|
|
|
|
+ def zoom_center(self):
|
|
|
+ root = next((item for item in GraphicsObject.items if type(item) is GraphicsRootObject))
|
|
|
+ rect = root.boundingRect()
|
|
|
+ rect.adjust(-200, -200, 200, 200)
|
|
|
+ self.ui.view.fitInView(rect, Qt.KeepAspectRatio)
|
|
|
+
|
|
|
+ def switch_graphic_view(self):
|
|
|
+ self.ui.stackedView.setCurrentIndex(0)
|
|
|
+
|
|
|
+ def switch_table_view(self):
|
|
|
+ self.ui.stackedView.setCurrentIndex(1)
|
|
|
+
|
|
|
def to_svg(self):
|
|
|
fileName, _ = QFileDialog.getSaveFileName(self, "Save File", "", "Svg File (*.svg)")
|
|
|
if not fileName:
|
|
|
@@ -350,8 +364,9 @@ class Viewer(QMainWindow):
|
|
|
painter.end()
|
|
|
|
|
|
def save(self):
|
|
|
+ if not core.Analyse.objects:
|
|
|
+ return
|
|
|
filepath, _ = QFileDialog.getSaveFileName(self, 'Enregistrer sous', '', "Access Analyser Files (*.acan)")
|
|
|
-
|
|
|
if filepath:
|
|
|
core.Analyse.dump_to(filepath)
|
|
|
|
|
|
@@ -359,6 +374,7 @@ class Viewer(QMainWindow):
|
|
|
filepath, _ = QFileDialog.getOpenFileName(self, 'Charger les données de', '', "Access Analyser Files (*.acan)")
|
|
|
if filepath:
|
|
|
core.Analyse.load_from(filepath)
|
|
|
+ self._title = Path(filepath).name
|
|
|
self.load()
|
|
|
|
|
|
def update_progression(self, i, total, msg=""):
|
|
|
@@ -378,26 +394,29 @@ class Viewer(QMainWindow):
|
|
|
source_dir = Path(source_dir)
|
|
|
|
|
|
self._title = source_dir
|
|
|
+ self.ui.stackedWidget.setCurrentIndex(0)
|
|
|
|
|
|
self.ui.progressBar.setVisible(True)
|
|
|
- self.ui.lbl_repertoire.setText(source_dir)
|
|
|
self.ui.txtPanel.clear()
|
|
|
|
|
|
- QApplication.setOverrideCursor(Qt.WaitCursor)
|
|
|
-
|
|
|
core.Analyse.run(source_dir)
|
|
|
|
|
|
- QApplication.restoreOverrideCursor()
|
|
|
- QMessageBox.information(self, "Analyse", "Analyse terminée: {} objets chargés en mémoire".format(len(core.Analyse.objects)))
|
|
|
-
|
|
|
- if core.Analyse.duplicates():
|
|
|
- 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.txtPanel.clear()
|
|
|
self.load()
|
|
|
|
|
|
+ duplicates = core.Analyse.duplicates()
|
|
|
+ if duplicates:
|
|
|
+ msg = "Les noms d'objets suivants sont utilisés simultanément par plusieurs objets:\n"
|
|
|
+ msg += "\n".join(["- {} ({})".format(key, ", ".join([obj.type_ for obj in val])) for key, val in duplicates.items()])
|
|
|
+ msg += "\n Veuillez corriger manuellement les rélérences des objets succeptibles de contenir des erreurs."
|
|
|
+ dlg = WarningDialog(msg, parent=self)
|
|
|
+ dlg.show()
|
|
|
+ dlg.exec_()
|
|
|
+
|
|
|
+ QMessageBox.information(self, "Analyse", "Analyse terminée: {} objets chargés en mémoire".format(len(core.Analyse.objects)))
|
|
|
+
|
|
|
def load(self):
|
|
|
self.clear_scene()
|
|
|
self.ui.treeWidget.clear()
|
|
|
@@ -422,13 +441,24 @@ class Viewer(QMainWindow):
|
|
|
|
|
|
self.ui.treeWidget.setColumnHidden(1, True)
|
|
|
self.ui.treeWidget.expandToDepth(1)
|
|
|
+
|
|
|
self.ui.btn_save.setEnabled(True)
|
|
|
|
|
|
+ def enable_view_buttons(self, enable):
|
|
|
+ self.ui.btn_zoom_plus.setEnabled(enable)
|
|
|
+ self.ui.btn_zoom_center.setEnabled(enable)
|
|
|
+ self.ui.btn_zoom_view.setEnabled(enable)
|
|
|
+ self.ui.btn_zoom_minus.setEnabled(enable)
|
|
|
+ self.ui.btn_graphic_view.setEnabled(enable)
|
|
|
+ self.ui.btn_table_view.setEnabled(enable)
|
|
|
+
|
|
|
def clear_scene(self):
|
|
|
self._scene.clear()
|
|
|
GraphicsObject.items = []
|
|
|
+ self.enable_view_buttons(False)
|
|
|
|
|
|
- def maj_scene_with(self, root_object):
|
|
|
+ def maj_view_with(self, root_object):
|
|
|
+ self.switch_graphic_view()
|
|
|
self.clear_scene()
|
|
|
root = GraphicsRootObject(root_object)
|
|
|
self._scene.addItem(root)
|
|
|
@@ -471,11 +501,25 @@ class Viewer(QMainWindow):
|
|
|
item._x -= (root.ref_emprise() - (cell_width + 2 * cell_spacing)) / 2
|
|
|
item.update()
|
|
|
|
|
|
-# # 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.ui.tblDeps.clearContents()
|
|
|
+ self.ui.tblRefs.clearContents()
|
|
|
+ self.ui.tblDeps.setRowCount(0)
|
|
|
+ self.ui.tblRefs.setRowCount(0)
|
|
|
+ self.ui.lblRootTitle.setText("{}: {}".format(root_object.type_, root_object.name_))
|
|
|
+
|
|
|
+ for item in GraphicsObject.items:
|
|
|
+ if type(item) is GraphicsDepObject:
|
|
|
+ row = self.ui.tblDeps.rowCount()
|
|
|
+ self.ui.tblDeps.insertRow(row)
|
|
|
+ self.ui.tblDeps.setItem(row, 0, QTableWidgetItem(item.obj.type_))
|
|
|
+ self.ui.tblDeps.setItem(row, 1, QTableWidgetItem(item.obj.name_))
|
|
|
+ if type(item) is GraphicsRefObject:
|
|
|
+ row = self.ui.tblRefs.rowCount()
|
|
|
+ self.ui.tblRefs.insertRow(row)
|
|
|
+ self.ui.tblRefs.setItem(row, 0, QTableWidgetItem(item.obj.type_))
|
|
|
+ self.ui.tblRefs.setItem(row, 1, QTableWidgetItem(item.obj.name_))
|
|
|
+
|
|
|
+ self.enable_view_buttons(True)
|
|
|
self.fit_in_view()
|
|
|
|
|
|
def treeItemSelected(self, item):
|
|
|
@@ -484,26 +528,34 @@ class Viewer(QMainWindow):
|
|
|
self.ui.btn_edit_item.setEnabled(False)
|
|
|
return
|
|
|
obj = core.Analyse.objects[index]
|
|
|
- self.maj_scene_with(obj)
|
|
|
+ self.maj_view_with(obj)
|
|
|
self.ui.btn_edit_item.setEnabled(True)
|
|
|
|
|
|
+ def filterTblDeps(self, filterStr):
|
|
|
+ for row in range(self.ui.tblDeps.rowCount()):
|
|
|
+ content = "{}{}".format(self.ui.tblDeps.item(row, 0).text(), self.ui.tblDeps.item(row, 1).text())
|
|
|
+ self.ui.tblDeps.setRowHidden(row, filterStr.lower() not in content.lower())
|
|
|
+
|
|
|
+ def filterTblRefs(self, filterStr):
|
|
|
+ for row in range(self.ui.tblRefs.rowCount()):
|
|
|
+ content = "{}{}".format(self.ui.tblRefs.item(row, 0).text(), self.ui.tblRefs.item(row, 1).text())
|
|
|
+ self.ui.tblRefs.setRowHidden(row, filterStr.lower() not in content.lower())
|
|
|
+
|
|
|
def edit_selected_item(self):
|
|
|
index = self.ui.treeWidget.currentItem().data(1, 0)
|
|
|
-
|
|
|
obj = core.Analyse.objects[index]
|
|
|
-
|
|
|
dlg = DetailsDialog(obj, self)
|
|
|
dlg.show()
|
|
|
r = dlg.exec_()
|
|
|
|
|
|
if r:
|
|
|
core.Analyse.build_trees()
|
|
|
- self.maj_scene_with(obj)
|
|
|
-
|
|
|
- def test(self):
|
|
|
- self.run(Path(__file__).parent / r"test\source")
|
|
|
+ self.maj_view_with(obj)
|
|
|
|
|
|
def keyPressEvent(self, e):
|
|
|
+ if e.key() == Qt.Key_S and e.modifiers() & Qt.ControlModifier:
|
|
|
+ self.save()
|
|
|
+ e.accept()
|
|
|
if e.key() == Qt.Key_Control:
|
|
|
self.ui.view.setDragMode(QGraphicsView.ScrollHandDrag)
|
|
|
e.accept()
|
|
|
@@ -538,7 +590,6 @@ class DetailsDialog(QDialog):
|
|
|
self.ui.tbl_mentions.setColumnWidth(2, 70)
|
|
|
self.ui.tbl_mentions.setColumnWidth(3, 150)
|
|
|
|
|
|
-
|
|
|
self.load_table()
|
|
|
|
|
|
def load_table(self):
|
|
|
@@ -633,6 +684,13 @@ class DetailsDialog(QDialog):
|
|
|
def ok(self):
|
|
|
self.done(1)
|
|
|
|
|
|
+ def keyPressEvent(self, e):
|
|
|
+ if e.key() == Qt.Key_Delete:
|
|
|
+ if self.ui.tbl_mentions.currentRow() < 0:
|
|
|
+ return
|
|
|
+ self.del_mention()
|
|
|
+ e.accept()
|
|
|
+
|
|
|
|
|
|
class ObjectSelectorDialog(QDialog):
|
|
|
|
|
|
@@ -677,3 +735,14 @@ class ObjectSelectorDialog(QDialog):
|
|
|
self.obj = None
|
|
|
super(ObjectSelectorDialog, self).done(status)
|
|
|
|
|
|
+
|
|
|
+class WarningDialog(QDialog):
|
|
|
+
|
|
|
+ def __init__(self, msg="", parent=None):
|
|
|
+ super (WarningDialog, self).__init__(parent)
|
|
|
+ self.createWidgets()
|
|
|
+ self.ui.displayText.setPlainText(msg)
|
|
|
+
|
|
|
+ def createWidgets(self):
|
|
|
+ self.ui = Ui_warning()
|
|
|
+ self.ui.setupUi(self)
|