瀏覽代碼

QTableWidget remplacé par un QTreeView pour l'affichage des resultats

omassot 7 年之前
父節點
當前提交
d15e823c9e
共有 4 個文件被更改,包括 31 次插入162 次删除
  1. 1 2
      core/validator.py
  2. 0 68
      ui/checkframe.ui
  3. 23 51
      ui/dlg_main.py
  4. 7 41
      ui/dlg_main.ui

+ 1 - 2
core/validator.py

@@ -51,7 +51,7 @@ class BaseValidator():
     def log_error(self, validation_error):
         self._current_checkpoint_valid = False
         self.errors.append(validation_error)
-         
+
     @classmethod
     def submit(cls, report_name=""):
         validator = cls()
@@ -80,7 +80,6 @@ class BaseValidator():
         except ValidatorInterruption:
             raise
         except:
-#             logger.error("".join(traceback.format_exception(*sys.exc_info())))
             logger.exception("Une erreur s'est produite")
             self.log_error(TechnicalValidationError("Contrôle des données interrompu"))
             self.checkpoint("Validation Métier [interrompu]")

+ 0 - 68
ui/checkframe.ui

@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Frame</class>
- <widget class="QFrame" name="Frame">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>393</width>
-    <height>29</height>
-   </rect>
-  </property>
-  <property name="font">
-   <font>
-    <family>Verdana</family>
-    <pointsize>9</pointsize>
-   </font>
-  </property>
-  <property name="windowTitle">
-   <string>Frame</string>
-  </property>
-  <property name="frameShape">
-   <enum>QFrame::StyledPanel</enum>
-  </property>
-  <property name="frameShadow">
-   <enum>QFrame::Raised</enum>
-  </property>
-  <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1">
-   <property name="spacing">
-    <number>12</number>
-   </property>
-   <property name="leftMargin">
-    <number>12</number>
-   </property>
-   <property name="topMargin">
-    <number>3</number>
-   </property>
-   <property name="rightMargin">
-    <number>3</number>
-   </property>
-   <property name="bottomMargin">
-    <number>3</number>
-   </property>
-   <item>
-    <widget class="QLabel" name="lbl_icon">
-     <property name="text">
-      <string/>
-     </property>
-     <property name="pixmap">
-      <pixmap>rsc/circles-loader.png</pixmap>
-     </property>
-     <property name="scaledContents">
-      <bool>false</bool>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QLabel" name="lbl_message">
-     <property name="text">
-      <string>...</string>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>

+ 23 - 51
ui/dlg_main.py

@@ -6,8 +6,9 @@ from qgis.core import QgsProject  # @UnresolvedImport
 
 from PyQt5 import QtWidgets
 from PyQt5 import uic
-from PyQt5.Qt import QIcon, QPixmap, Qt, QTableWidgetItem, QHeaderView
-from PyQt5.QtWidgets import QApplication
+from PyQt5.Qt import Qt
+from PyQt5.QtGui import QIcon, QPixmap
+from PyQt5.QtWidgets import QApplication, QTreeWidgetItem
 
 from core.constants import MAIN, RSCDIR
 
@@ -15,12 +16,9 @@ from core.constants import MAIN, RSCDIR
 logger = logging.getLogger("mncheck")
 
 Ui_Main, _ = uic.loadUiType(MAIN / 'ui'/ 'dlg_main.ui')
-Ui_ChkFrame, _ = uic.loadUiType(MAIN / 'ui'/ 'checkframe.ui')
-
 
 SCHEMAS = ["mn1_rec", "mn2_rec", "mn3_pro", "mn3_exe", "mn3_rec"]
 
-
 class DlgMain(QtWidgets.QDialog):
     def __init__(self, iface, parent=None):
         super(DlgMain, self).__init__(parent)
@@ -42,8 +40,6 @@ class DlgMain(QtWidgets.QDialog):
         self.ui.btn_settings.setIcon(QIcon(RSCDIR / "settings.png"))
         self.ui.btn_settings.clicked.connect(self.show_settings)
 
-        self.ui.tbl_layers.horizontalHeaderItem(1).setTextAlignment(Qt.AlignLeft)
-
         self.ui.cbb_schemas.addItem("Schéma MN v1 REC", 0)
         self.ui.cbb_schemas.addItem("Schéma MN v2 REC", 1)
 #         self.ui.cbb_schemas.addItem("Schéma MN v3 PRO", 2)
@@ -51,12 +47,10 @@ class DlgMain(QtWidgets.QDialog):
 #         self.ui.cbb_schemas.addItem("Schéma MN v3 REC", 4)
         self.ui.cbb_schemas.currentIndexChanged.connect(self.update_layers_list)
         
+        self.ui.tree_report.setColumnWidth(0, 35)
+        
         self.update_layers_list()
     
-    def clear_layers_table(self):
-        while self.ui.tbl_layers.rowCount():
-            self.ui.tbl_layers.removeRow(0)
-    
     def selected_validator(self):
         schema_lib_name = SCHEMAS[int(self.ui.cbb_schemas.itemData(self.ui.cbb_schemas.currentIndex()))]
         logger.info("Selected schema: %s", schema_lib_name)
@@ -76,36 +70,27 @@ class DlgMain(QtWidgets.QDialog):
 
         self.ui.btn_run.setEnabled(True)
 
-        self.clear_layers_table()
+        self.ui.tree_report.clear()
 
         for layername in expected:
             
-            cur_row = self.ui.tbl_layers.rowCount()
-            self.ui.tbl_layers.insertRow(cur_row)
+            item = QTreeWidgetItem()
             
-            lbl_icon, lbl_layer, lbl_message = QTableWidgetItem(), QTableWidgetItem(), QTableWidgetItem()
-
-            lbl_layer.setText(layername)
-
             if layername.lower() in found:
-                lbl_icon.setIcon(QIcon(QPixmap(RSCDIR / "ok_16.png")))
+                item.setIcon(0, QIcon(QPixmap(RSCDIR / "ok_16.png")))
+                item.setText(1, layername)
             else:
-                lbl_icon.setIcon(QIcon(QPixmap(RSCDIR / "error_16.png")))
-                lbl_message.setText("La couche est introuvable")
+                item.setIcon(0, QIcon(QPixmap(RSCDIR / "error_16.png")))
+                item.setText(1, f"{layername}: La couche est introuvable")
                 self.ui.btn_run.setEnabled(False)
                 
-            self.ui.tbl_layers.setItem(cur_row, 0, lbl_icon)
-            self.ui.tbl_layers.setItem(cur_row, 1, lbl_layer)
-            self.ui.tbl_layers.setItem(cur_row, 2, lbl_message)
-        
-        self.ui.tbl_layers.horizontalHeader().setSectionResizeMode(0, QHeaderView.Fixed)
-        self.ui.tbl_layers.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeToContents)
-        self.ui.tbl_layers.horizontalHeader().setSectionResizeMode(2, QHeaderView.Stretch)
+            self.ui.tree_report.addTopLevelItem(item)
+
 
     def run(self):
         
         QApplication.setOverrideCursor(Qt.WaitCursor)
-        self.clear_layers_table()
+        self.ui.tree_report.clear()
         
         validator = self.selected_validator()
         
@@ -125,35 +110,22 @@ class DlgMain(QtWidgets.QDialog):
         
         logger.debug(f"Rapport d'exec: {report}")
         
-        for chk in report["checkpoints"]:
-            cur_row = self.ui.tbl_layers.rowCount()
-            self.ui.tbl_layers.insertRow(cur_row)
+        for type_err in report["errors"]:
+            topitem = QTreeWidgetItem()
             
-            lbl_icon, lbl_checkpoint = QTableWidgetItem(), QTableWidgetItem()
+            topitem.setIcon(0, QIcon(QPixmap(RSCDIR / "error_16.png")))
+            topitem.setText(1, "{} ({})".format(type_err, len(report["errors"][type_err]["list"])))
             
-            lbl_checkpoint.setText(chk["name"])
-            lbl_icon.setIcon(QIcon(QPixmap(RSCDIR / ("ok_16.png" if chk["valid"] else "error_16.png"))))
+            self.ui.tree_report.addTopLevelItem(topitem)
             
-            self.ui.tbl_layers.setItem(cur_row, 0, lbl_icon)
-            self.ui.tbl_layers.setItem(cur_row, 1, lbl_checkpoint)
-            if not chk["valid"]:
-                self.ui.tbl_layers.setItem(cur_row, 2, QTableWidgetItem("Des erreurs ont été trouvées"))
-
-        for type_err in report["errors"]:
             for err in report["errors"][type_err]["list"]:
-                cur_row = self.ui.tbl_layers.rowCount()
-                self.ui.tbl_layers.insertRow(cur_row)
                 
-                lbl_icon, lbl_field, lbl_err = QTableWidgetItem(), QTableWidgetItem(), QTableWidgetItem()
+                item = QTreeWidgetItem()
                 
-                lbl_field.setText(f"{err['layername']}.{err['field']}")
-                lbl_err.setText(f"{type_err}: {err['message']}")
-#                 lbl_icon.setIcon(QIcon(QPixmap(RSCDIR / "error_16.png")))
+                item.setText(1, "{} > {}: {}".format(err["layername"], err["field"], err["message"]))
+                
+                topitem.addChild(item)
                 
-#                 self.ui.tbl_layers.setItem(cur_row, 0, lbl_icon)
-                self.ui.tbl_layers.setItem(cur_row, 1, lbl_field)
-                self.ui.tbl_layers.setItem(cur_row, 2, lbl_err)
-    
     def show_help(self):
         pass
     

+ 7 - 41
ui/dlg_main.ui

@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>490</width>
-    <height>448</height>
+    <width>532</width>
+    <height>537</height>
    </rect>
   </property>
   <property name="font">
@@ -139,55 +139,21 @@
     </layout>
    </item>
    <item>
-    <widget class="QTableWidget" name="tbl_layers">
-     <property name="editTriggers">
-      <set>QAbstractItemView::NoEditTriggers</set>
+    <widget class="QTreeWidget" name="tree_report">
+     <property name="indentation">
+      <number>15</number>
      </property>
-     <property name="dragDropOverwriteMode">
-      <bool>false</bool>
-     </property>
-     <property name="selectionMode">
-      <enum>QAbstractItemView::NoSelection</enum>
-     </property>
-     <property name="cornerButtonEnabled">
-      <bool>false</bool>
-     </property>
-     <attribute name="horizontalHeaderVisible">
-      <bool>false</bool>
-     </attribute>
-     <attribute name="horizontalHeaderDefaultSectionSize">
-      <number>30</number>
-     </attribute>
-     <attribute name="horizontalHeaderMinimumSectionSize">
-      <number>30</number>
-     </attribute>
-     <attribute name="horizontalHeaderStretchLastSection">
-      <bool>true</bool>
-     </attribute>
-     <attribute name="verticalHeaderVisible">
+     <attribute name="headerVisible">
       <bool>false</bool>
      </attribute>
      <column>
       <property name="text">
        <string>icon</string>
       </property>
-      <property name="textAlignment">
-       <set>AlignHCenter|AlignVCenter|AlignCenter</set>
-      </property>
-     </column>
-     <column>
-      <property name="text">
-       <string>layer</string>
-      </property>
-      <property name="font">
-       <font>
-        <family>Verdana</family>
-       </font>
-      </property>
      </column>
      <column>
       <property name="text">
-       <string>message</string>
+       <string>text</string>
       </property>
      </column>
     </widget>