Explorar o código

Ajoute: la fenetre de dialogue Avertissement, une vue alternative en
tables, et des fonctions de zoom

olivier.massot %!s(int64=7) %!d(string=hai) anos
pai
achega
9e55af00a9
Modificáronse 12 ficheiros con 583 adicións e 125 borrados
  1. 100 31
      Viewer.py
  2. 21 21
      core.py
  3. 2 1
      main.py
  4. 381 72
      qt_viewer.ui
  5. 79 0
      qt_warning.ui
  6. BIN=BIN
      rsc/graphic_view_16.png
  7. BIN=BIN
      rsc/text_view_16.png
  8. BIN=BIN
      rsc/warning_32.png
  9. BIN=BIN
      rsc/zoom_center.png
  10. BIN=BIN
      rsc/zoom_minus_16.png
  11. BIN=BIN
      rsc/zoom_plus_16.png
  12. BIN=BIN
      rsc/zoom_screen.png

+ 100 - 31
Viewer.py

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

+ 21 - 21
core.py

@@ -9,14 +9,8 @@ import re
 from _regex_core import MULTILINE
 from path import Path
 
-
-# TODO: gérer les cas où des objets de types différents portent le même nom. Ex: une table et un formulaire... Note: une requete et une table ne peuvent pas porter le même nom.
-# TODO: ignorer les commentaires dans les modules
-# TODO: ignorer les labels dans les formulaires et états
 # TODO: Gérer les références circulaires
-# 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):
@@ -59,7 +53,7 @@ class AccessObject():
     @classmethod
     def from_file(cls, file):
         file = Path(file)
-        if file.ext not in cls._valid_file_exts:
+        if file.ext.lower() not in cls._valid_file_exts:
             raise InvalidFileExt("Format de fichier d'entrée non valide ({})".format(file.name))
         obj = cls(AccessObject.path_to_name(file))
         obj.sourcefile = file
@@ -137,15 +131,31 @@ class Analyse():
 
     @classmethod
     def load_from(cls, filepath):
+        cls.objects = []
         with open(filepath, 'rb') as f:
             cls.objects = pickle.load(f)
+        cls.update_index()
+
+    @classmethod
+    def update_index(cls):
+        cls.index = {}
+        for obj in cls.objects:
+            if not obj.name_ in cls.index:
+                cls.index[obj.name_] = []
+            cls.index[obj.name_].append(obj)
+            if type(obj) is ModuleObject:
+                for fname in obj.functions:
+                    if not fname in cls.index:
+                        cls.index[fname] = []
+                    cls.index[fname].append(obj)
+
 
     @classmethod
     def load_objects(cls, source_dir):
         source_dir = Path(source_dir)
 
         cls.objects = []
-        cls.duplicated_names = []
+        cls.index = {}
 
         sourcemap = {
                     "tables": TableObject,
@@ -164,27 +174,18 @@ class Analyse():
 
                     cls.objects.append(obj)
 
-                    if type(obj) is not ModuleObject:
-                        if not obj.name_ in cls.index:
-                            cls.index[obj.name_] = []
-                        cls.index[obj.name_].append(obj)
-                    else:
-                        for fname in obj.functions:
-                            if not fname in cls.index:
-                                cls.index[fname] = []
-                            cls.index[fname].append(obj)
-
                 except InvalidFileExt:
                     print("Ignored unrecognized file: {}".format(file))
 
         cls.objects.sort(key=lambda x: (x._order, x.name_))
+        cls.update_index()
 
 
     @classmethod
     def parse_source(cls, subject):
 
         # On cherche le nom de chaque autre objet, ainsi que le nom des fonctions issues des modules
-        look_for = [obj.name_ for obj in cls.objects if obj is not subject] + list(sum([obj.functions for obj in cls.objects if obj is not subject], []))
+        look_for = [obj.name_ for obj in cls.objects if obj is not subject and type(object) is not ModuleObject] + list(sum([obj.functions for obj in cls.objects if obj is not subject], []))
 
         names = "|".join(list(set(look_for)))
 
@@ -262,7 +263,6 @@ class Analyse():
     def duplicates(cls):
         return {k: v for k, v in cls.index.items() if len(v) > 1}
 
-
 if __name__ == "__main__":
 
     source_dir = here / r"test\source"

+ 2 - 1
main.py

@@ -18,7 +18,8 @@ if __name__ == '__main__':
 
     SYS_HOOK = sys.excepthook
     def error_handler(typ, value, trace):
-        QApplication.restoreOverrideCursor()
+        while QApplication.overrideCursor():
+            QApplication.restoreOverrideCursor()
         QMessageBox.critical(iface, typ.__name__, "{}".format(value))
         SYS_HOOK(typ, value, trace)
     sys.excepthook = error_handler

+ 381 - 72
qt_viewer.ui

@@ -6,7 +6,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>886</width>
+    <width>854</width>
     <height>657</height>
    </rect>
   </property>
@@ -96,8 +96,14 @@
          </property>
          <item>
           <widget class="QPushButton" name="btn_select">
+           <property name="minimumSize">
+            <size>
+             <width>130</width>
+             <height>25</height>
+            </size>
+           </property>
            <property name="text">
-            <string/>
+            <string>Exécuter</string>
            </property>
            <property name="icon">
             <iconset>
@@ -109,22 +115,71 @@
           </widget>
          </item>
          <item>
-          <widget class="QLabel" name="lbl_repertoire">
-           <property name="font">
-            <font>
-             <pointsize>8</pointsize>
-             <italic>true</italic>
-            </font>
+          <widget class="QPushButton" name="btn_save">
+           <property name="enabled">
+            <bool>false</bool>
+           </property>
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="minimumSize">
+            <size>
+             <width>130</width>
+             <height>25</height>
+            </size>
+           </property>
+           <property name="toolTip">
+            <string>Enregistrer</string>
+           </property>
+           <property name="text">
+            <string>Enregistrer</string>
+           </property>
+           <property name="icon">
+            <iconset>
+             <normaloff>rsc/enregistrer_16.png</normaloff>rsc/enregistrer_16.png</iconset>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="btn_load">
+           <property name="minimumSize">
+            <size>
+             <width>130</width>
+             <height>25</height>
+            </size>
+           </property>
+           <property name="toolTip">
+            <string>Charger</string>
            </property>
            <property name="text">
-            <string>Veuillez sélectionner le répertoire des sources à analyser</string>
+            <string>Charger</string>
+           </property>
+           <property name="icon">
+            <iconset>
+             <normaloff>rsc/open_16.png</normaloff>rsc/open_16.png</iconset>
            </property>
           </widget>
          </item>
          <item>
-          <widget class="QPushButton" name="btn_test">
+          <widget class="QPushButton" name="btn_svg">
+           <property name="minimumSize">
+            <size>
+             <width>130</width>
+             <height>25</height>
+            </size>
+           </property>
+           <property name="toolTip">
+            <string>Exporter au format SVG</string>
+           </property>
            <property name="text">
-            <string>test</string>
+            <string>Exporter en SVG</string>
+           </property>
+           <property name="icon">
+            <iconset>
+             <normaloff>rsc/svg_16.png</normaloff>rsc/svg_16.png</iconset>
            </property>
           </widget>
          </item>
@@ -143,6 +198,12 @@
          </item>
          <item>
           <widget class="QProgressBar" name="progressBar">
+           <property name="minimumSize">
+            <size>
+             <width>160</width>
+             <height>21</height>
+            </size>
+           </property>
            <property name="value">
             <number>24</number>
            </property>
@@ -154,30 +215,227 @@
       <item>
        <layout class="QHBoxLayout" name="horizontalLayout_5">
         <item>
-         <widget class="QGraphicsView" name="view">
-          <property name="font">
-           <font>
-            <stylestrategy>PreferAntialias</stylestrategy>
-           </font>
-          </property>
-          <property name="verticalScrollBarPolicy">
-           <enum>Qt::ScrollBarAsNeeded</enum>
-          </property>
-          <property name="horizontalScrollBarPolicy">
-           <enum>Qt::ScrollBarAsNeeded</enum>
-          </property>
-          <property name="dragMode">
-           <enum>QGraphicsView::RubberBandDrag</enum>
-          </property>
-          <property name="transformationAnchor">
-           <enum>QGraphicsView::AnchorUnderMouse</enum>
-          </property>
-          <property name="resizeAnchor">
-           <enum>QGraphicsView::AnchorUnderMouse</enum>
-          </property>
-          <property name="viewportUpdateMode">
-           <enum>QGraphicsView::BoundingRectViewportUpdate</enum>
-          </property>
+         <widget class="QStackedWidget" name="stackedView">
+          <property name="currentIndex">
+           <number>1</number>
+          </property>
+          <widget class="QWidget" name="page_3">
+           <layout class="QHBoxLayout" name="horizontalLayout_6">
+            <property name="leftMargin">
+             <number>0</number>
+            </property>
+            <property name="topMargin">
+             <number>0</number>
+            </property>
+            <property name="rightMargin">
+             <number>0</number>
+            </property>
+            <property name="bottomMargin">
+             <number>0</number>
+            </property>
+            <item>
+             <widget class="QGraphicsView" name="view">
+              <property name="font">
+               <font>
+                <stylestrategy>PreferAntialias</stylestrategy>
+               </font>
+              </property>
+              <property name="verticalScrollBarPolicy">
+               <enum>Qt::ScrollBarAsNeeded</enum>
+              </property>
+              <property name="horizontalScrollBarPolicy">
+               <enum>Qt::ScrollBarAsNeeded</enum>
+              </property>
+              <property name="dragMode">
+               <enum>QGraphicsView::RubberBandDrag</enum>
+              </property>
+              <property name="transformationAnchor">
+               <enum>QGraphicsView::AnchorUnderMouse</enum>
+              </property>
+              <property name="resizeAnchor">
+               <enum>QGraphicsView::AnchorUnderMouse</enum>
+              </property>
+              <property name="viewportUpdateMode">
+               <enum>QGraphicsView::BoundingRectViewportUpdate</enum>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="page_4">
+           <layout class="QVBoxLayout" name="verticalLayout_5">
+            <item>
+             <widget class="QLabel" name="lblRootTitle">
+              <property name="font">
+               <font>
+                <pointsize>11</pointsize>
+               </font>
+              </property>
+              <property name="text">
+               <string>ObjectType: ObjectName</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <layout class="QHBoxLayout" name="horizontalLayout_7">
+              <item>
+               <widget class="QLabel" name="label_2">
+                <property name="text">
+                 <string>L'objet utilise les objets suivants:</string>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <spacer name="horizontalSpacer_4">
+                <property name="orientation">
+                 <enum>Qt::Horizontal</enum>
+                </property>
+                <property name="sizeHint" stdset="0">
+                 <size>
+                  <width>40</width>
+                  <height>20</height>
+                 </size>
+                </property>
+               </spacer>
+              </item>
+              <item>
+               <widget class="QLabel" name="label_4">
+                <property name="text">
+                 <string/>
+                </property>
+                <property name="pixmap">
+                 <pixmap>rsc/search.png</pixmap>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QLineEdit" name="searchBoxDeps">
+                <property name="minimumSize">
+                 <size>
+                  <width>150</width>
+                  <height>20</height>
+                 </size>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </item>
+            <item>
+             <widget class="QTableWidget" name="tblDeps">
+              <property name="editTriggers">
+               <set>QAbstractItemView::NoEditTriggers</set>
+              </property>
+              <property name="selectionMode">
+               <enum>QAbstractItemView::SingleSelection</enum>
+              </property>
+              <property name="selectionBehavior">
+               <enum>QAbstractItemView::SelectRows</enum>
+              </property>
+              <property name="showGrid">
+               <bool>false</bool>
+              </property>
+              <property name="gridStyle">
+               <enum>Qt::DotLine</enum>
+              </property>
+              <property name="sortingEnabled">
+               <bool>true</bool>
+              </property>
+              <attribute name="horizontalHeaderShowSortIndicator" stdset="0">
+               <bool>true</bool>
+              </attribute>
+              <attribute name="horizontalHeaderStretchLastSection">
+               <bool>true</bool>
+              </attribute>
+              <attribute name="verticalHeaderVisible">
+               <bool>false</bool>
+              </attribute>
+              <attribute name="verticalHeaderDefaultSectionSize">
+               <number>20</number>
+              </attribute>
+              <attribute name="verticalHeaderMinimumSectionSize">
+               <number>14</number>
+              </attribute>
+              <column>
+               <property name="text">
+                <string>Type</string>
+               </property>
+              </column>
+              <column>
+               <property name="text">
+                <string>Nom</string>
+               </property>
+              </column>
+             </widget>
+            </item>
+            <item>
+             <layout class="QHBoxLayout" name="horizontalLayout_8">
+              <property name="topMargin">
+               <number>10</number>
+              </property>
+              <item>
+               <widget class="QLabel" name="label_3">
+                <property name="text">
+                 <string>L'objet est utilisé par les objets suivants:</string>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <spacer name="horizontalSpacer_5">
+                <property name="orientation">
+                 <enum>Qt::Horizontal</enum>
+                </property>
+                <property name="sizeHint" stdset="0">
+                 <size>
+                  <width>40</width>
+                  <height>20</height>
+                 </size>
+                </property>
+               </spacer>
+              </item>
+              <item>
+               <widget class="QLabel" name="label_5">
+                <property name="text">
+                 <string/>
+                </property>
+                <property name="pixmap">
+                 <pixmap>rsc/search.png</pixmap>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QLineEdit" name="searchBoxRefs">
+                <property name="minimumSize">
+                 <size>
+                  <width>150</width>
+                  <height>20</height>
+                 </size>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </item>
+            <item>
+             <widget class="QTableWidget" name="tblRefs">
+              <attribute name="horizontalHeaderStretchLastSection">
+               <bool>true</bool>
+              </attribute>
+              <attribute name="verticalHeaderVisible">
+               <bool>false</bool>
+              </attribute>
+              <column>
+               <property name="text">
+                <string>Type</string>
+               </property>
+              </column>
+              <column>
+               <property name="text">
+                <string>Nom</string>
+               </property>
+              </column>
+             </widget>
+            </item>
+           </layout>
+          </widget>
          </widget>
         </item>
         <item>
@@ -309,30 +567,94 @@
          <number>0</number>
         </property>
         <item>
-         <widget class="QLabel" name="label_3">
+         <widget class="QToolButton" name="btn_zoom_minus">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="minimumSize">
+           <size>
+            <width>30</width>
+            <height>30</height>
+           </size>
+          </property>
+          <property name="toolTip">
+           <string>Zoom Moins</string>
+          </property>
           <property name="text">
-           <string>Zoom</string>
+           <string>-</string>
+          </property>
+          <property name="icon">
+           <iconset>
+            <normaloff>rsc/zoom_minus_16.png</normaloff>rsc/zoom_minus_16.png</iconset>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QToolButton" name="btn_zoom_plus">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="minimumSize">
+           <size>
+            <width>30</width>
+            <height>30</height>
+           </size>
+          </property>
+          <property name="toolTip">
+           <string>Zoom Plus</string>
+          </property>
           <property name="text">
            <string>+</string>
           </property>
+          <property name="icon">
+           <iconset>
+            <normaloff>rsc/zoom_plus_16.png</normaloff>rsc/zoom_plus_16.png</iconset>
+          </property>
          </widget>
         </item>
         <item>
-         <widget class="QToolButton" name="btn_zoom_view">
+         <widget class="QToolButton" name="btn_zoom_center">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="minimumSize">
+           <size>
+            <width>30</width>
+            <height>30</height>
+           </size>
+          </property>
+          <property name="toolTip">
+           <string>Centrer</string>
+          </property>
           <property name="text">
            <string>X</string>
           </property>
+          <property name="icon">
+           <iconset>
+            <normaloff>rsc/zoom_center.png</normaloff>rsc/zoom_center.png</iconset>
+          </property>
          </widget>
         </item>
         <item>
-         <widget class="QToolButton" name="btn_zoom_minus">
+         <widget class="QToolButton" name="btn_zoom_view">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="minimumSize">
+           <size>
+            <width>30</width>
+            <height>30</height>
+           </size>
+          </property>
+          <property name="toolTip">
+           <string>Vue globale</string>
+          </property>
           <property name="text">
-           <string>-</string>
+           <string>s</string>
+          </property>
+          <property name="icon">
+           <iconset>
+            <normaloff>rsc/zoom_screen.png</normaloff>rsc/zoom_screen.png</iconset>
           </property>
          </widget>
         </item>
@@ -353,53 +675,42 @@
          </spacer>
         </item>
         <item>
-         <widget class="QToolButton" name="btn_save">
+         <widget class="QToolButton" name="btn_graphic_view">
           <property name="enabled">
            <bool>false</bool>
           </property>
-          <property name="sizePolicy">
-           <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
-          </property>
-          <property name="toolTip">
-           <string>Enregistrer</string>
+          <property name="minimumSize">
+           <size>
+            <width>30</width>
+            <height>30</height>
+           </size>
           </property>
           <property name="text">
-           <string/>
+           <string>...</string>
           </property>
           <property name="icon">
            <iconset>
-            <normaloff>rsc/enregistrer_16.png</normaloff>rsc/enregistrer_16.png</iconset>
+            <normaloff>rsc/graphic_view_16.png</normaloff>rsc/graphic_view_16.png</iconset>
           </property>
          </widget>
         </item>
         <item>
-         <widget class="QToolButton" name="btn_load">
-          <property name="toolTip">
-           <string>Charger</string>
-          </property>
-          <property name="text">
-           <string/>
-          </property>
-          <property name="icon">
-           <iconset>
-            <normaloff>rsc/open_16.png</normaloff>rsc/open_16.png</iconset>
+         <widget class="QToolButton" name="btn_table_view">
+          <property name="enabled">
+           <bool>false</bool>
           </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QToolButton" name="btn_svg">
-          <property name="toolTip">
-           <string>Exporter au format SVG</string>
+          <property name="minimumSize">
+           <size>
+            <width>30</width>
+            <height>30</height>
+           </size>
           </property>
           <property name="text">
-           <string/>
+           <string>...</string>
           </property>
           <property name="icon">
            <iconset>
-            <normaloff>rsc/svg_16.png</normaloff>rsc/svg_16.png</iconset>
+            <normaloff>rsc/text_view_16.png</normaloff>rsc/text_view_16.png</iconset>
           </property>
          </widget>
         </item>
@@ -424,7 +735,7 @@
           <property name="minimumSize">
            <size>
             <width>200</width>
-            <height>0</height>
+            <height>30</height>
            </size>
           </property>
           <property name="text">
@@ -446,8 +757,6 @@
   </action>
  </widget>
  <tabstops>
-  <tabstop>btn_zoom_plus</tabstop>
-  <tabstop>btn_zoom_minus</tabstop>
   <tabstop>lbl_title</tabstop>
  </tabstops>
  <resources/>

+ 79 - 0
qt_warning.ui

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>482</width>
+    <height>253</height>
+   </rect>
+  </property>
+  <property name="minimumSize">
+   <size>
+    <width>249</width>
+    <height>253</height>
+   </size>
+  </property>
+  <property name="maximumSize">
+   <size>
+    <width>674</width>
+    <height>664</height>
+   </size>
+  </property>
+  <property name="font">
+   <font>
+    <family>Verdana</family>
+   </font>
+  </property>
+  <property name="windowTitle">
+   <string>Warning</string>
+  </property>
+  <property name="windowIcon">
+   <iconset>
+    <normaloff>rsc/icon.svg</normaloff>rsc/icon.svg</iconset>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QLabel" name="label_2">
+       <property name="maximumSize">
+        <size>
+         <width>40</width>
+         <height>40</height>
+        </size>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="pixmap">
+        <pixmap>rsc/warning_32.png</pixmap>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="label">
+       <property name="font">
+        <font>
+         <pointsize>12</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="text">
+        <string>Avertissement(s)</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QPlainTextEdit" name="displayText"/>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

BIN=BIN
rsc/graphic_view_16.png


BIN=BIN
rsc/text_view_16.png


BIN=BIN
rsc/warning_32.png


BIN=BIN
rsc/zoom_center.png


BIN=BIN
rsc/zoom_minus_16.png


BIN=BIN
rsc/zoom_plus_16.png


BIN=BIN
rsc/zoom_screen.png