Przeglądaj źródła

Ajout de la recherche dans l'arbre, correction du bug à la sauvegarde
sur les gros projets

olivier.massot 7 lat temu
rodzic
commit
ee12fac642
4 zmienionych plików z 78 dodań i 11 usunięć
  1. 27 3
      Viewer.py
  2. 12 6
      core.py
  3. 2 2
      main.py
  4. 37 0
      qt_viewer.ui

+ 27 - 3
Viewer.py

@@ -1,5 +1,5 @@
 '''
-
+@author: olivier.massot
 '''
 
 from PyQt5 import uic
@@ -13,6 +13,7 @@ from PyQt5.Qt import Qt, QEvent, QGraphicsScene, QPointF, QFileDialog, \
 from PyQt5.QtWidgets import QMainWindow, QGraphicsView
 from path import Path
 
+from core import ModuleObject
 import core
 
 
@@ -290,6 +291,8 @@ class Viewer(QMainWindow):
         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.ui.btnSearchTree.clicked.connect(self.searchTree)
+        self.ui.searchBoxTree.returnPressed.connect(self.searchTree)
 
         self._title = "<unknown>"
 
@@ -532,6 +535,23 @@ class Viewer(QMainWindow):
             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 searchTree(self):
+        filterStr = self.ui.searchBoxTree.text()
+        if not filterStr:
+            return
+
+        items = self.ui.treeWidget.findItems(filterStr, Qt.MatchContains | Qt.MatchRecursive, 1)
+        if not items:
+            QMessageBox.warning(self, "Recherche", "Aucun résultat pour '{}'".format(filterStr))
+
+        try:
+            start = items.index(self.ui.treeWidget.currentItem()) + 1
+        except ValueError:
+            start = 0
+        match = (items[start:] + items[:start])[0]
+        self.ui.treeWidget.setCurrentItem(match)
+        self.ui.treeWidget.scrollTo(self.ui.treeWidget.indexFromItem(match, 1))
+
     def edit_selected_item(self):
         index = self.ui.treeWidget.currentItem().data(2, 0)
         obj = core.Analyse.objects[index]
@@ -578,6 +598,7 @@ class DetailsDialog(QDialog):
         self.ui.btn_edit.clicked.connect(self.edit_mention)
         self.ui.btn_del.clicked.connect(self.del_mention)
         self.ui.btn_ok.clicked.connect(self.ok)
+        self.ui.btn_cancel.clicked.connect(self.ok)
 
         self.ui.lbl_title.setText("{}: {}".format(self.obj.type_, self.obj.name_))
 
@@ -611,7 +632,7 @@ class DetailsDialog(QDialog):
             item = QTableWidgetItem("{}".format(mention.obj.type_))
             self.ui.tbl_mentions.setItem(index, 2, item)
 
-            item = QTableWidgetItem("{}".format(mention.objname))
+            item = QTableWidgetItem("{}".format(mention.objname) if mention.obj.type_ != "Module" else "{}.{}".format(mention.obj.name_, mention.objname))
             self.ui.tbl_mentions.setItem(index, 3, item)
 
             item = QTableWidgetItem("{}".format(mention.quote))
@@ -688,6 +709,9 @@ class DetailsDialog(QDialog):
     def ok(self):
         self.done(1)
 
+    def cancel(self):
+        self.done(0)
+
     def keyPressEvent(self, e):
         if e.key() == Qt.Key_Delete:
             if self.ui.tbl_mentions.currentRow() < 0:
@@ -737,4 +761,4 @@ class ObjectSelectorDialog(QDialog):
     def done(self, status):
         if not status:
             self.obj = None
-        super(ObjectSelectorDialog, self).done(status)
+        super(ObjectSelectorDialog, self).done(status)

+ 12 - 6
core.py

@@ -1,6 +1,4 @@
 '''
-
-
 @author: olivier.massot
 '''
 import pickle
@@ -42,9 +40,19 @@ class Mention():
         self.line = line
         self.objname = objname
         self.quote = quote
-        self.obj = obj
+        self._obj_index = None
         self.warnings = warnings
 
+        self.obj = obj
+
+    @property
+    def obj(self):
+        return Analyse.objects[self._obj_index]
+
+    @obj.setter
+    def obj(self, value):
+        self._obj_index = Analyse.objects.index(value)
+
 class AccessObject():
     type_ = "<unknown>"
     _valid_file_exts = (".bas")
@@ -80,15 +88,13 @@ class AccessObject():
             self._sourcecode = self.sourcefile.text()
         return self._sourcecode
 
-    SUBSTR = {92: "\\", 47: "/", 58: ":", 42: "*", 63:"?", 34:"\"", 60:"<", 62:">", 124:"|" }
     @staticmethod
     def path_to_name(path):
         name_ = path.name.stripext()
-        for ascii_code, char in AccessObject.SUBSTR.items():
+        for ascii_code, char in {92: "\\", 47: "/", 58: ":", 42: "*", 63:"?", 34:"\"", 60:"<", 62:">", 124:"|" }.items():
             name_ = name_.replace("[{}]".format(ascii_code), char)
         return name_
 
-
 class TableObject(AccessObject):
     type_ = "Table"
     _valid_file_exts = (".xml", ".lnkd")

+ 2 - 2
main.py

@@ -1,14 +1,14 @@
 '''
-
 @author: olivier.massot, mars 2017
 '''
 import sys
 
 from PyQt5.Qt import QApplication, QMessageBox
-# import ipdb
 
 from Viewer import Viewer
 
+# TODO: La sauvegarde lève une RecursionError lorsqu'il y a des references circulaires
+# TODO: editer un objet sur double-clic
 
 if __name__ == '__main__':
     app = QApplication(sys.argv)

+ 37 - 0
qt_viewer.ui

@@ -571,6 +571,43 @@
                  </column>
                 </widget>
                </item>
+               <item>
+                <layout class="QHBoxLayout" name="horizontalLayout_3">
+                 <property name="topMargin">
+                  <number>5</number>
+                 </property>
+                 <property name="bottomMargin">
+                  <number>0</number>
+                 </property>
+                 <item>
+                  <widget class="QLineEdit" name="searchBoxTree">
+                   <property name="minimumSize">
+                    <size>
+                     <width>0</width>
+                     <height>30</height>
+                    </size>
+                   </property>
+                  </widget>
+                 </item>
+                 <item>
+                  <widget class="QToolButton" name="btnSearchTree">
+                   <property name="minimumSize">
+                    <size>
+                     <width>30</width>
+                     <height>30</height>
+                    </size>
+                   </property>
+                   <property name="text">
+                    <string>...</string>
+                   </property>
+                   <property name="icon">
+                    <iconset>
+                     <normaloff>rsc/search.png</normaloff>rsc/search.png</iconset>
+                   </property>
+                  </widget>
+                 </item>
+                </layout>
+               </item>
               </layout>
              </widget>
             </widget>