Procházet zdrojové kódy

完成菜单栏 – Report – Report Exception,
新增动态窗口MultiForm

mrh před 3 roky
rodič
revize
c5ad203838
8 změnil soubory, kde provedl 406 přidání a 45 odebrání
  1. 1 0
      gui.py
  2. 23 11
      main_windows.py
  3. 54 34
      sub_windows.py
  4. 3 0
      ui/Form.ui
  5. 29 0
      ui/ReportException.py
  6. 170 0
      ui/ReportException.ui
  7. 1 0
      ui/ui_Form.py
  8. 125 0
      ui/ui_ReportException.py

+ 1 - 0
gui.py

@@ -25,6 +25,7 @@ def run_forever(GUI):
     mainWindows = MainWindow(GUI)
     mainWindows.sig.connect(handle_signal)
     GUI.Elaborate("top", True)
+    mainWindows.reportException()
     app.exec_()
     
 def run_in_thread(GUI:QObject):

+ 23 - 11
main_windows.py

@@ -15,6 +15,7 @@ from sub_windows import SubWindows,LineEditWin,FormWindow, get_sub_win_list,get_
 from ui.About import AboutWindow
 from ui.Elaborate import Elaborate
 from ui.Read_Timing_Constraint import ReadTimeWindow
+from ui.ReportException import ReportExceptionWindow
 import GuiType
 
 
@@ -105,19 +106,15 @@ class MainWindow(Ui_MainWindow, QMainWindow):
         self.statusbar.addWidget(self.status_label)
         self.loader = QUiLoader()
         
-        self.actionCopy.triggered.connect(self.action_copy)
-        self.actionPast.triggered.connect(self.action_paste)
-        self.actionSelect_all.triggered.connect(self.action_select_all)
-        self.actionAnalyze.triggered.connect(self.show_analyze_window)
-        self.actionRead_Timing_Constraint.triggered.connect(self.read_timing_constraint)
-        self.actionRead_Power_Intent
-        self.actionElaborate.triggered.connect(self.elaborate_window)
-        self.actionReload_Design.triggered.connect(self.reload_design)
         
-        # MENUE
+        # -- MENUE --
         # file
         self.actionStop_GUI.triggered.connect(GUI.Stop)
         self.actionExit.triggered.connect(GUI.Exit)
+        # Edit
+        self.actionCopy.triggered.connect(self.action_copy)
+        self.actionPast.triggered.connect(self.action_paste)
+        self.actionSelect_all.triggered.connect(self.action_select_all)
         # View
         self.actionIncr_Font
         self.actionDecr_Font
@@ -128,8 +125,11 @@ class MainWindow(Ui_MainWindow, QMainWindow):
         self.actionSave_as_Default
         self.actionPreferences
         # Design
-        self.actionReport_Exceptions.triggered.connect(self.about)
-        self.actionReport_Virtual_Timing.triggered.connect(self.add_sub_win)
+        self.actionAnalyze.triggered.connect(self.show_analyze_window)
+        self.actionElaborate.triggered.connect(self.elaborate_window)
+        self.actionRead_Timing_Constraint.triggered.connect(self.read_timing_constraint)
+        self.actionRead_Power_Intent
+        self.actionReload_Design.triggered.connect(self.reload_design)
         # Windows
         # 先实例一个 ActionGroup,等到创建动态窗口的时候,才会在 菜单栏-Window 中添加Action
         self.action_win_group = QActionGroup(self)
@@ -142,6 +142,10 @@ class MainWindow(Ui_MainWindow, QMainWindow):
         self.actionLog.triggered.connect(self.action_tab_widget)
         self.actionHistory.triggered.connect(self.action_tab_widget)
         self.actionMessages.triggered.connect(self.action_tab_widget)
+        # Report
+        self.actionReport_Exceptions.triggered.connect(self.reportException)
+        self.actionReport_Clocks.triggered.connect(self.reportClocks)
+        self.actionReport_Virtual_Timing
         
         self.actionAbout.triggered.connect(self.about)
         self.textEdit.document().contentsChanged.connect(self.textEdit_change_size)
@@ -271,6 +275,14 @@ class MainWindow(Ui_MainWindow, QMainWindow):
         d = Elaborate(self)
         d.exec_()
     
+    def reportException(self):
+        d = ReportExceptionWindow(self)
+        d.exec_()
+    
+    def reportClocks(self):
+        d = ReportExceptionWindow(self)
+        d.exec_()
+    
     def outputWritten(self, text):
         cursor = self.LogText.textCursor()
         cursor.movePosition(QTextCursor.End)

+ 54 - 34
sub_windows.py

@@ -102,28 +102,42 @@ class FormWindow(Ui_Form, MdiSubWindow):
         return model
 
 
-class MultiFormWin(FormWindow):
-    def __init__(self, mdiArea:QMdiArea, instan:GuiType._GuiWinFormMulti) -> None:
-        super().__init__()
+class MultiFormWin(Ui_Form, MdiSubWindow):
+    def __init__(self, mainWindow, instan:GuiType._GuiWinFormMulti) -> None:
+        super().__init__(mainWindow)
         self.setupUi(self)
-        self.setParent(mdiArea)
-        self.init_multi_form_ui(mdiArea)
-        self.reportButton.clicked.connect(self.report_table)
+        self.init_multi_form_ui()
+        self.setWindowTitle(instan.Title)
+        MultiFormWin.set_form_multi(self.tableView, self.sheets, instan.Forms)
+        
         self.instan = instan
- 
-    def set_form_multi(self, multi_form:GuiType._GuiFormMulti):
-        self.sheets.clear()
+        self.sheets.activated.connect(lambda index: MultiFormWin.activate_table_sheet(self.tableView, self.instan.Forms, index))
+        self.reportButton.clicked.connect(self.report_table)
+
+        width = self.tableView.horizontalHeader().width() * self.tableView.horizontalHeader().count() + 25
+        mdiArea:QMdiArea = mainWindow.mdiArea
+        mdisub = mdiArea.addSubWindow(self)
+        mdisub.resize(width, self.height())
+        mdisub.show()
+        
+    def set_form_multi(tableView:QTableView, sheets:QComboBox, multi_form:GuiType._GuiFormMulti):
+        sheets.clear()
         for sheet_name in multi_form.Names:
-            self.sheets.addItem(sheet_name)
-        if self.sheets.count() > 0:
-            form = multi_form.GetForm(self.sheets.currentIndex())
+            sheets.addItem(sheet_name)
+        if sheets.count() > 0:
+            form = multi_form.GetForm(sheets.currentIndex())
             model = FormWindow.get_form_model(form)
-            self.tableView.setModel(model)
+            tableView.setModel(model)
 
+    def activate_table_sheet(tableView, form_multi_instan, index):
+        model = FormWindow.get_form_model(form_multi_instan.GetForm(index))
+        tableView.setModel(model)
+        print("active sheet")
+    
     def report_table(self):
         print("report test")
-            
-    def init_multi_form_ui(self,mdiArea:QMdiArea):
+    
+    def init_multi_form_ui(self):
         self.horizontalLayout_2 = QHBoxLayout()
         self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
         self.sheets = QComboBox(self.centralwidget)
@@ -132,6 +146,10 @@ class MultiFormWin(FormWindow):
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(self.sheets.sizePolicy().hasHeightForWidth())
+        self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
+        self.tableView.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+        self.tableView.customContextMenuRequested.connect(self.right_click_menu)
+        
         self.sheets.setSizePolicy(sizePolicy)
 
         self.horizontalLayout_2.addWidget(self.sheets)
@@ -144,9 +162,13 @@ class MultiFormWin(FormWindow):
         self.horizontalLayout_2.setStretch(1, 6)
 
         self.verticalLayout.insertLayout(0,self.horizontalLayout_2)
-        mdiArea.addSubWindow(self)
-        self.show()
 
+    def right_click_menu(self, pos):
+        pop_menu  = QMenu()
+        pop_menu.addAction(QAction('Crossprobe', pop_menu))
+        pop_menu.triggered.connect(lambda action: print(self.tableView.currentIndex().data()))
+        pop_menu.exec_(QCursor.pos())
+    
 
 class TreeWidgetItem(QTreeWidgetItem):
     def __init__(self, parent: int, tree_row:GuiType._GuiTreeRow):
@@ -212,7 +234,7 @@ class SideBarWin(Ui_SideBar, MdiSubWindow):
         self.treeWidget.itemCollapsed.connect(self.collapse_tree)
         self.treeWidget.currentItemChanged.connect(self.item_change)
         self.treeWidget.customContextMenuRequested.connect(self.right_click_menu)
-        self.sheets.activated.connect(self.activate_table_sheet)
+        self.sheets.activated.connect(lambda index: MultiFormWin.activate_table_sheet(self.tableView, self.form_multi_instan, index))
         self.tableView.customContextMenuRequested.connect(self.right_click_menu)
         
         mdiArea:QMdiArea = ui.mdiArea
@@ -306,7 +328,7 @@ class SideBarWin(Ui_SideBar, MdiSubWindow):
         if not item:
             return
         self.form_multi_instan = self.instance.GetForms(self.get_tree_names(item))
-        self.set_form_multi(self.form_multi_instan)
+        MultiFormWin.set_form_multi(self.tableView, self.sheets, self.form_multi_instan)
       
     def collapse_tree(self, item:TreeWidgetItem):
         # 取出并删除所有子节点
@@ -328,9 +350,17 @@ class SideBarWin(Ui_SideBar, MdiSubWindow):
             for row in sub_tree_rows:
                 self.set_tree_row(item, row)
     
-    def activate_table_sheet(self, index):
-        model = FormWindow.get_form_model(self.form_multi_instan.GetForm(index))
-        self.tableView.setModel(model)
+    # def activate_table_sheet(self, index):
+    #     model = FormWindow.get_form_model(self.form_multi_instan.GetForm(index))
+    #     self.tableView.setModel(model)
+    # def set_form_multi(self, multi_form:GuiType._GuiFormMulti):
+    #     self.sheets.clear()
+    #     for sheet_name in multi_form.Names:
+    #         self.sheets.addItem(sheet_name)
+    #     if self.sheets.count() > 0:
+    #         form = multi_form.GetForm(self.sheets.currentIndex())
+    #         model = FormWindow.get_form_model(form)
+    #         self.tableView.setModel(model)
     
     def set_tree_row(self, parent:TreeWidgetItem, tree_row:GuiType._GuiTreeRow):
         tree_widget_item = self.add_tree_row(parent, tree_row)
@@ -347,16 +377,6 @@ class SideBarWin(Ui_SideBar, MdiSubWindow):
         for tree_row in tree.TreeRows:
             # 根节点
             self.set_tree_row(self.treeWidget, tree_row)
-
-        
-    def set_form_multi(self, multi_form:GuiType._GuiFormMulti):
-        self.sheets.clear()
-        for sheet_name in multi_form.Names:
-            self.sheets.addItem(sheet_name)
-        if self.sheets.count() > 0:
-            form = multi_form.GetForm(self.sheets.currentIndex())
-            model = FormWindow.get_form_model(form)
-            self.tableView.setModel(model)
         
 
 class SubWindows(QObject):
@@ -368,7 +388,7 @@ class SubWindows(QObject):
         self.info = {}
     
     def add_win_form_multi(self, instance:GuiType._GuiWinFormMulti):
-        form_multi_win = MultiFormWin(self.ui.mdiArea)
+        form_multi_win = MultiFormWin(self.ui, instance)
         form_multi_win.setWindowTitle(instance.Title)
         form_multi_win.sheets.currentIndexChanged.connect(lambda:self.change_table_sheet(form_multi_win))
         self.set_form_multi_table(form_multi_win,instance.Forms)
@@ -398,7 +418,7 @@ class SubWindows(QObject):
     
     def add_windows(self, instance):
         if isinstance(instance, GuiType._GuiWinFormMulti):
-            self.add_win_form_multi(instance)
+            MultiFormWin(self.ui, instance)
         elif isinstance(instance, GuiType._GuiSideBar):
             self.side_bar.init_win_data(instance)
             

+ 3 - 0
ui/Form.ui

@@ -26,6 +26,9 @@
         <property name="editTriggers">
          <set>QAbstractItemView::NoEditTriggers</set>
         </property>
+        <attribute name="verticalHeaderVisible">
+         <bool>false</bool>
+        </attribute>
        </widget>
       </item>
       <item>

+ 29 - 0
ui/ReportException.py

@@ -0,0 +1,29 @@
+import threading
+from PySide2.QtWidgets import *
+from PySide2.QtCore import *
+from PySide2.QtGui import *
+from ui.ui_ReportException import Ui_ReportException
+
+class ReportExceptionWindow(Ui_ReportException, QDialog):
+    def __init__(self, mainWindow) -> None:
+        super().__init__()
+        self.setupUi(self)
+        self.lineEdit.setValidator(QRegExpValidator(QRegExp("[0-9]+$")))
+        self.lineEdit.setPlaceholderText("please enter a number")
+        self.btn_ok.clicked.connect(self.reportException)
+        self.mainWindow = mainWindow
+        self.move(mainWindow.x()+(mainWindow.width()-self.width())/2,mainWindow.y()+(mainWindow.height()-self.height())/2)
+
+    def reportException(self):
+        mcp = self.mult_cycle_path.isChecked()
+        fp = self.false_path.isChecked()
+        mdp = self.max_delay_path.isChecked()
+        limit_text = self.lineEdit.text()
+        if limit_text:
+            limit = int(limit_text)
+        else:
+            limit = 0
+        thread = threading.Thread(target=self.mainWindow.GUI.ReportExceptions, args=(mcp, fp, mdp, limit))
+        thread.start()
+        self.close()
+    

+ 170 - 0
ui/ReportException.ui

@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ReportException</class>
+ <widget class="QDialog" name="ReportException">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>311</width>
+    <height>180</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>ReportException</string>
+  </property>
+  <property name="windowIcon">
+   <iconset resource="img.qrc">
+    <normaloff>:/icon/resource/todo-line.png</normaloff>:/icon/resource/todo-line.png</iconset>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0">
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout_3">
+       <item>
+        <spacer name="horizontalSpacer_3">
+         <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>
+        <layout class="QVBoxLayout" name="verticalLayout_2">
+         <item>
+          <widget class="QCheckBox" name="false_path">
+           <property name="text">
+            <string>False Path</string>
+           </property>
+           <property name="checked">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QCheckBox" name="max_delay_path">
+           <property name="text">
+            <string>Max Delay Path</string>
+           </property>
+           <property name="checked">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QCheckBox" name="mult_cycle_path">
+           <property name="text">
+            <string>MultCycle Path</string>
+           </property>
+           <property name="checked">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </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>
+      </layout>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout">
+       <item>
+        <widget class="QLabel" name="label">
+         <property name="text">
+          <string>Endpoint Limit</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLineEdit" name="lineEdit"/>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout_2">
+       <item>
+        <spacer name="horizontalSpacer">
+         <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="QPushButton" name="btn_ok">
+         <property name="text">
+          <string>OK</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="btn_cancel">
+         <property name="text">
+          <string>Cancel</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="horizontalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="img.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>btn_cancel</sender>
+   <signal>clicked()</signal>
+   <receiver>ReportException</receiver>
+   <slot>close()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>196</x>
+     <y>148</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>155</x>
+     <y>89</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>

+ 1 - 0
ui/ui_Form.py

@@ -34,6 +34,7 @@ class Ui_Form(object):
         self.tableView = QTableView(self.centralwidget)
         self.tableView.setObjectName(u"tableView")
         self.tableView.setEditTriggers(QAbstractItemView.NoEditTriggers)
+        self.tableView.verticalHeader().setVisible(False)
 
         self.verticalLayout.addWidget(self.tableView)
 

+ 125 - 0
ui/ui_ReportException.py

@@ -0,0 +1,125 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'ReportException.ui'
+##
+## Created by: Qt User Interface Compiler version 5.15.0
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide2.QtCore import (QCoreApplication, QDate, QDateTime, QMetaObject,
+    QObject, QPoint, QRect, QSize, QTime, QUrl, Qt)
+from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont,
+    QFontDatabase, QIcon, QKeySequence, QLinearGradient, QPalette, QPainter,
+    QPixmap, QRadialGradient)
+from PySide2.QtWidgets import *
+
+import img_rc
+
+class Ui_ReportException(object):
+    def setupUi(self, ReportException):
+        if not ReportException.objectName():
+            ReportException.setObjectName(u"ReportException")
+        ReportException.resize(311, 180)
+        icon = QIcon()
+        icon.addFile(u":/icon/resource/todo-line.png", QSize(), QIcon.Normal, QIcon.Off)
+        ReportException.setWindowIcon(icon)
+        self.gridLayout = QGridLayout(ReportException)
+        self.gridLayout.setObjectName(u"gridLayout")
+        self.verticalLayout = QVBoxLayout()
+        self.verticalLayout.setObjectName(u"verticalLayout")
+        self.horizontalLayout_3 = QHBoxLayout()
+        self.horizontalLayout_3.setObjectName(u"horizontalLayout_3")
+        self.horizontalSpacer_3 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+
+        self.horizontalLayout_3.addItem(self.horizontalSpacer_3)
+
+        self.verticalLayout_2 = QVBoxLayout()
+        self.verticalLayout_2.setObjectName(u"verticalLayout_2")
+        self.false_path = QCheckBox(ReportException)
+        self.false_path.setObjectName(u"false_path")
+        self.false_path.setChecked(True)
+
+        self.verticalLayout_2.addWidget(self.false_path)
+
+        self.max_delay_path = QCheckBox(ReportException)
+        self.max_delay_path.setObjectName(u"max_delay_path")
+        self.max_delay_path.setChecked(True)
+
+        self.verticalLayout_2.addWidget(self.max_delay_path)
+
+        self.mult_cycle_path = QCheckBox(ReportException)
+        self.mult_cycle_path.setObjectName(u"mult_cycle_path")
+        self.mult_cycle_path.setChecked(True)
+
+        self.verticalLayout_2.addWidget(self.mult_cycle_path)
+
+
+        self.horizontalLayout_3.addLayout(self.verticalLayout_2)
+
+        self.horizontalSpacer_4 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+
+        self.horizontalLayout_3.addItem(self.horizontalSpacer_4)
+
+
+        self.verticalLayout.addLayout(self.horizontalLayout_3)
+
+        self.horizontalLayout = QHBoxLayout()
+        self.horizontalLayout.setObjectName(u"horizontalLayout")
+        self.label = QLabel(ReportException)
+        self.label.setObjectName(u"label")
+
+        self.horizontalLayout.addWidget(self.label)
+
+        self.lineEdit = QLineEdit(ReportException)
+        self.lineEdit.setObjectName(u"lineEdit")
+
+        self.horizontalLayout.addWidget(self.lineEdit)
+
+
+        self.verticalLayout.addLayout(self.horizontalLayout)
+
+        self.horizontalLayout_2 = QHBoxLayout()
+        self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
+        self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+
+        self.horizontalLayout_2.addItem(self.horizontalSpacer)
+
+        self.btn_ok = QPushButton(ReportException)
+        self.btn_ok.setObjectName(u"btn_ok")
+
+        self.horizontalLayout_2.addWidget(self.btn_ok)
+
+        self.btn_cancel = QPushButton(ReportException)
+        self.btn_cancel.setObjectName(u"btn_cancel")
+
+        self.horizontalLayout_2.addWidget(self.btn_cancel)
+
+        self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+
+        self.horizontalLayout_2.addItem(self.horizontalSpacer_2)
+
+
+        self.verticalLayout.addLayout(self.horizontalLayout_2)
+
+
+        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
+
+
+        self.retranslateUi(ReportException)
+        self.btn_cancel.clicked.connect(ReportException.close)
+
+        QMetaObject.connectSlotsByName(ReportException)
+    # setupUi
+
+    def retranslateUi(self, ReportException):
+        ReportException.setWindowTitle(QCoreApplication.translate("ReportException", u"ReportException", None))
+        self.false_path.setText(QCoreApplication.translate("ReportException", u"False Path", None))
+        self.max_delay_path.setText(QCoreApplication.translate("ReportException", u"Max Delay Path", None))
+        self.mult_cycle_path.setText(QCoreApplication.translate("ReportException", u"MultCycle Path", None))
+        self.label.setText(QCoreApplication.translate("ReportException", u"Endpoint Limit", None))
+        self.btn_ok.setText(QCoreApplication.translate("ReportException", u"OK", None))
+        self.btn_cancel.setText(QCoreApplication.translate("ReportException", u"Cancel", None))
+    # retranslateUi
+