Selaa lähdekoodia

完成 SideBar 树形控件和表格

mrh 3 vuotta sitten
vanhempi
sitoutus
568c0d0e80
12 muutettua tiedostoa jossa 445 lisäystä ja 93 poistoa
  1. 1 1
      GuiShell.py
  2. 17 34
      GuiType.py
  3. 2 1
      gui.py
  4. 6 11
      main_windows.py
  5. 153 19
      sub_windows.py
  6. 84 0
      ui/Form.ui
  7. 3 3
      ui/MainWindows.ui
  8. 19 18
      ui/SideBar.ui
  9. 84 0
      ui/ui_Form.py
  10. 2 2
      ui/ui_MainWindows.py
  11. 72 0
      ui/ui_SideBar.py
  12. 2 4
      ui/ui_form_multi.py

+ 1 - 1
GuiShell.py

@@ -102,7 +102,7 @@ class _GuiMain():
         self.SideBar = _GuiSideBar("Hierarchy", _GuiTree(["", "DFFs", "SubModules"], [_GuiTreeRow([_GuiTreeRow([], "SubDesign1", [
                                     "12", "0"]), _GuiTreeRow([_GuiTreeRow([], "Sub3", ["5", "0"])], "SubDesign2", ["34", "1"])], "DemoDesign", ["123", "2"]),]))
         print("Elaborate Done")
-        return
+        return gui.signale(self.SideBar)
 
     def ReadTimingConstraint(self, filename):
         assert isinstance(filename, str)

+ 17 - 34
GuiType.py

@@ -12,34 +12,21 @@ class _GuiForm():
 
 
 class _GuiFormMulti():
-    def __init__(self):
+    def __init__(self, name_forms):
         self.Names = []
         self.__Forms = []
-
-    def GetForm(self, index):  # can be further modify to lazy eval
-        return self.__Forms[index]
-
-    def __init__(self, name_forms):
         for nf in name_forms:
             self.Names.append(nf[0])
             self.__Forms.append(nf[1])
 
-# Forms = _GuiFormMulti([["Sheet1", _GuiForm( ["Col1", "Col2"], [["a1","a2"],["b1","b2"],["c1","c2"]])], ["Sheet2", _GuiForm( ["Col1", "Col2"], [["d1","d2"],["e1","e2"],["f1","f2"]])]])
-
+    def GetForm(self, index):  # can be further modify to lazy eval
+        return self.__Forms[index]
 
-class _GuiTreeRow():
-    def __init__(self):
-        self.HasSubTreeRows = False
-        self.Name = ""
-        self.Row = []
-        self.__SubTreeRows = []
 
-    def GetSubTreeRows(self):
-        return self.__SubTreeRows
+# Forms = _GuiFormMulti([["Sheet1", _GuiForm( ["Col1", "Col2"], [["a1","a2"],["b1","b2"],["c1","c2"]])], ["Sheet2", _GuiForm( ["Col1", "Col2"], [["d1","d2"],["e1","e2"],["f1","f2"]])]])
 
-    def GetID(self):
-        pass
 
+class  _GuiTreeRow():
     def __init__(self, treerows, name, row):
         self.Name = name
         self.Row = row
@@ -48,17 +35,21 @@ class _GuiTreeRow():
             self.__SubTreeRows = treerows
         else:
             self.HasSubTreeRows = False
+            self.__SubTreeRows = []
+
+    def GetSubTreeRows(self):
+        return self.__SubTreeRows
+
+    def GetID(self):
+        pass
+
 
 # TreeRow = _GuiTreeRow([], "SubDesign1", ["12", "0"])
 # TreeRow = _GuiTreeRow([_GuiTreeRow([], "Sub3", ["5", "0"])], "SubDesign2", ["34", "1"])
 
 
 class _GuiTree():
-    def __init__(self):
-        self.FixedRow = []
-        self.TreeRows = []
-
-    def __init__(self, fixed_row, treerows):
+    def __init__(self, fixed_row, treerows:_GuiTreeRow):
         self.FixedRow = fixed_row
         self.TreeRows = treerows
 
@@ -70,10 +61,6 @@ class _GuiTree():
 
 
 class _GuiWinText():
-    def __init__(self):
-        self.Title = ""
-        self.Text = ""
-
     def __init__(self, title, text):
         self.Title = title
         self.Text = text
@@ -105,9 +92,9 @@ class _GuiWinTree():
 
 
 class _GuiSideBar():
-    def __init__(self, tree):
-        self.Title = ""
-        self.Tree = None
+    def __init__(self, title, tree:_GuiTree):
+        self.Title = title
+        self.Tree = tree
 
     def GetForms(self, treenames):
         return _GuiFormMulti([["Sheet1", _GuiForm(["Col1", "Col2"], [[treename, "ok"] for treename in treenames])], ["Sheet2", _GuiForm(["Col1", "Col2"], [[treename, "fail"] for treename in treenames])]])
@@ -116,10 +103,6 @@ class _GuiSideBar():
         line = 1000
         return _GuiWinLinedText(name, ("Text Start\n\n"+'\n'.join([str(x) for x in treenames])+'\n'.join(['generated line '+str(x) for x in range(line*2)])+"\n\nText End").split("\n"), line)
 
-    def __init__(self, title, tree):
-        self.Title = title
-        self.Tree = tree
-
 
 class _GuiMessages():  # to be further defined
     def __init__(self):

+ 2 - 1
gui.py

@@ -44,8 +44,9 @@ def run_forever(GUI):
     QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts)
     app = QApplication(sys.argv)
     mainWindows = MainWindow(GUI)
-    mainWindows.show()
     mainWindows.sig.connect(handle_signal)
+    # TODO test
+    mainWindows.GUI.Elaborate("ela", True)
     app.exec_()
     
 def run_in_thread(GUI:QObject):

+ 6 - 11
main_windows.py

@@ -9,7 +9,7 @@ from PySide2 import QtCore
 from PySide2.QtGui import QTextCursor
 from ui.ui_MainWindows import Ui_MainWindow
 from ui.ui_TimingAnalyze import Ui_TimingWindow
-from ui.ui_Hier_1 import Ui_Hier_1
+from hier import HierWin
 from sub_windows import SubWindows
 
 class DcShell(QObject):
@@ -86,13 +86,10 @@ class MainWindow(Ui_MainWindow, QMainWindow):
     def __init__(self, GUI) -> None:
         super().__init__()
         self.setupUi(self)
-        self.h_ui = Ui_Hier_1()
-        self.h_ui.setupUi(self.h_ui)
+        # 这里显示一下是为了能获取到 mdiArea 的尺寸,给 sub_windows 使用
+        self.show()
+        
         self.loader = QUiLoader()
-        self.timing = self.loader.load("ui/TimingAnalyze.ui")
-        self.mdiArea.addSubWindow(self.h_ui)
-        self.mdiArea.addSubWindow(self.timing)
-        self.mdiArea.tileSubWindows()
         self.actionReport_Virtual_Timing.triggered.connect(self.add_sub_win)
 
         self.lineEdit.returnPressed.connect(self.lineEdit_function)
@@ -101,18 +98,16 @@ class MainWindow(Ui_MainWindow, QMainWindow):
         sys.stderr = sys.stdout
         # sys.stderr.newText.connect(self.outputWritten)
         self.GUI = GUI
-
+        self.setWindowTitle(GUI.Title)
+        
         self.dc_shell_thread = QThread(self)
         self.dc_shell = DcShell(self.dc_shell_thread, GUI)
         self.dc_shell.moveToThread(self.dc_shell_thread)
         self.dc_shell_thread.started.connect(self.dc_shell.run)
-        # self.dc_shell_thread.finished.connect(self.dc_shell_thread.deleteLater)
         self.dc_shell_thread.start()
         
         self.sub_win = SubWindows(self)
         self.sub_win.sig.connect(self.sub_win.add_windows)
-        # self.dc_shell.sig.connect(self.outputWritten)
-        # sys.stdout = Stream2(self.dc_shell.sig)
 
     def outputWritten(self, text):
         cursor = self.LogText.textCursor()

+ 153 - 19
sub_windows.py

@@ -5,34 +5,175 @@ from PySide2.QtGui import *
 from PySide2.QtUiTools import QUiLoader
 # from main_windows import MainWindow
 from ui.ui_TimingAnalyze import Ui_TimingWindow
-from ui.ui_form_multi import Ui_form_multi
-from ui.ui_Hier_1 import Ui_Hier_1
+from ui.ui_Form import Ui_Form
+from ui.ui_SideBar import Ui_SideBar
 import GuiType
 
-class MultiFormWin(Ui_form_multi,QMainWindow):
-    def __init__(self, parent) -> None:
+class MultiFormWin(Ui_Form,QMainWindow):
+    def __init__(self, mdiArea) -> None:
         super().__init__()
         self.setupUi(self)
-        self.setParent(parent)
+        self.setParent(mdiArea)
+        self.init_multi_form_ui(mdiArea)
         self.models = []
+        self.reportButton.clicked.connect(self.report_table)
+
+    def report_table(self):
+        print("report test")
+    
+    def init_multi_form_ui(self,mdiArea:QMdiArea):
+        self.horizontalLayout_2 = QHBoxLayout()
+        self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
+        self.sheets = QComboBox(self.centralwidget)
+        self.sheets.setObjectName(u"sheets")
+        sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.sheets.sizePolicy().hasHeightForWidth())
+        self.sheets.setSizePolicy(sizePolicy)
+
+        self.horizontalLayout_2.addWidget(self.sheets)
+
+        self.horizontalSpacer_3 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+
+        self.horizontalLayout_2.addItem(self.horizontalSpacer_3)
+
+        self.horizontalLayout_2.setStretch(0, 3)
+        self.horizontalLayout_2.setStretch(1, 6)
+
+        self.verticalLayout.insertLayout(0,self.horizontalLayout_2)
+        mdiArea.addSubWindow(self)
+        # mdiArea.currentSubWindow
+        self.show()
+
+class TreeWidgetItem(QTreeWidgetItem):
+    def __init__(self, parent: int, tree_row:GuiType._GuiTreeRow):
+        super().__init__(parent)    
+        self.tree_row = tree_row
+
+class SideBarWin(Ui_SideBar, QMainWindow):
+    def __init__(self, ui, instance:GuiType._GuiSideBar) -> None:
+        super().__init__()
+        self.setupUi(self)
+        self.ui = ui
+        mdiArea:QMdiArea = ui.mdiArea
+        # self.mdisubwin 是用于管理子窗口的,在子窗口中,是由 mdiArea 来管理显示/隐藏、大小、关闭等
+        self.mdisubwin = mdiArea.addSubWindow(self)
+        self.mdisubwin.setAttribute(Qt.WA_DeleteOnClose)
+        self.mdisubwin.resize(self.width(), mdiArea.height())
+        self.mdisubwin.show()
+        self.instance = instance
+        self.init_win_data(instance)
+        self.form_multi_temp = None
+        self.treeWidget.itemExpanded.connect(self.expand_tree)
+        self.treeWidget.itemCollapsed.connect(self.collapse_tree)
+        self.treeWidget.itemActivated.connect(self.activated_tree_node)
+        self.sheets.activated.connect(self.activate_table_sheet)
+    
+    # 侧边栏只有一个,只需要 update 即可
+    def init_win_data(self, instance:GuiType._GuiSideBar):
+        if self.treeWidget.topLevelItemCount():
+            for i in range(self.treeWidget.topLevelItemCount()):
+                # 获取这个 item 并删除
+                self.treeWidget.takeTopLevelItem(i)
+
+        self.ui.setWindowTitle(self.ui.GUI.Title)
+        self.instance = instance
+        self.setWindowTitle(self.instance.Title)
+        self.set_tree(self.instance.Tree)
+        self.mdisubwin.update()
+
+    # 添加一行树节点,改节点包含 n 列数据
+    def add_tree_row(self, parent, tree_row:GuiType._GuiTreeRow):
+        item = TreeWidgetItem(parent, tree_row)
+        item.setText(0,tree_row.Name)
+        for i in range(0, len(tree_row.Row)):
+            item.setText(i+1,tree_row.Row[i])
+        return item
+    
+    def activated_tree_node(self, item:TreeWidgetItem, column):
+        # 如果含有子节点,由展开信号来处理
+        if item.tree_row.HasSubTreeRows:
+            return
+        self.form_multi_temp = self.instance.GetForms(list(item.text(0)))
+        self.set_form_multi(self.form_multi_temp)
+    
+    def collapse_tree(self, item:TreeWidgetItem):
+        # 取出并删除所有子节点
+        childrens = item.takeChildren()
+        if not childrens:
+            return
+        
+        if item.tree_row.HasSubTreeRows:
+            # 只添加一个子节点,让父节点变成可展开形式
+            sub_tree_row:GuiType._GuiTreeRow = item.tree_row.GetSubTreeRows()[0]
+            self.add_tree_row(item, sub_tree_row)
+            # if item.tree_row.HasSubTreeRows:
+            #     sub_tree_rows = item.tree_row.GetSubTreeRows()[1:]
+            #     for row in sub_tree_rows:
+            #         self.set_tree_row(item, row)
+        
+    def expand_tree(self, item:TreeWidgetItem):
+        if item.tree_row.HasSubTreeRows:
+            sub_tree_rows = item.tree_row.GetSubTreeRows()[1:]
+            for row in sub_tree_rows:
+                self.set_tree_row(item, row)
+    
+    def activate_table_sheet(self, index):
+        self.set_form(self.form_multi_temp.GetForm(index))
+    
+    def set_tree_row(self, parent:TreeWidgetItem, tree_row:GuiType._GuiTreeRow):
+        tree_widget_item = self.add_tree_row(parent, tree_row)
+        if tree_row.HasSubTreeRows:
+            # 只添加一个子节点,让父节点变成可展开形式
+            sub_tree_row:GuiType._GuiTreeRow = tree_row.GetSubTreeRows()[0]
+            self.add_tree_row(tree_widget_item, sub_tree_row)
+    
+    def set_tree(self, tree:GuiType._GuiTree):
+        # 树
+        header_item = self.treeWidget.headerItem()
+        for i in range(len(tree.FixedRow)):
+            header_item.setText(i, tree.FixedRow[i])
+        for tree_row in tree.TreeRows:
+            # 根节点
+            self.set_tree_row(self.treeWidget, tree_row)
+
+    def set_form(self, form:GuiType._GuiForm):
+        model = QStandardItemModel(0, len(form.FixedRow))
+        model.setHorizontalHeaderLabels(form.FixedRow)
+        for row in form.Rows:
+            row_items=[QStandardItem(text) for text in row]
+            model.appendRow(row_items)
+        self.tableView.setModel(model)
+        return 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())
+            self.set_form(form)
+        
 
 class SubWindows(QObject):
     sig = Signal(object)
     def __init__(self, parent):
         super().__init__(parent)
         self.ui = parent
+        self.side_bar = SideBarWin(self.ui, self.ui.GUI.SideBar)
         self.info = {}
     
     def add_win_form_multi(self, instance:GuiType._GuiWinFormMulti):
         form_multi_win = MultiFormWin(self.ui.mdiArea)
         # form_multi_win:Ui_form_multi
-        self.ui.mdiArea.addSubWindow(form_multi_win)
+        # self.ui.mdiArea.addSubWindow(form_multi_win)
         form_multi_win.setWindowTitle(instance.Title)
         # form_multi_win.sheets.currentIndexChanged.connect(lambda:self.change_table_sheet(form_multi_win))
         form_multi_win.sheets.currentIndexChanged.connect(lambda:self.change_table_sheet(form_multi_win))
         self.set_form_multi_table(form_multi_win,instance.Forms)
-        form_multi_win.show()
-        
+        self.ui.mdiArea.activeSubWindow().resize(self.ui.mdiArea.width()/2,self.ui.mdiArea.height())
+        self.ui.mdiArea.activeSubWindow().move(form_multi_win.width(),0)
     
     def set_form_multi_table(self, win:MultiFormWin, multi_form:GuiType._GuiFormMulti):
         multi_form:GuiType._GuiFormMulti
@@ -50,7 +191,6 @@ class SubWindows(QObject):
             win.models.append(model)
         if win.sheets.count() > 0:
             win.sheets.setCurrentIndex(0)
-            # win.tableView.setCurrentIndex()(models.keys()[0])
             win.tableView.setModel(win.models[0])
     
     def change_table_sheet(self, win:MultiFormWin):
@@ -61,15 +201,9 @@ class SubWindows(QObject):
     def add_windows(self, instance):
         if isinstance(instance, GuiType._GuiWinFormMulti):
             self.add_win_form_multi(instance)
+        elif isinstance(instance, GuiType._GuiSideBar):
+            
+            self.side_bar.init_win_data(instance)
 
 if __name__ == '__main__':            
-    m = GuiType._GuiWinFormMulti('multi', 1)
-    # print(dir(GuiType))
-    # Gui_class = [e for e in dir(GuiType) if not e.startswith('__')]
-    # print(type(Gui_class[0]))
-    # print(GuiType.__builtins__)
-    # print(isclass(GuiType._GuiWinFormMulti))
-    # print(m.__dict__)
-    print(dir(m))
-    print(m.__str__())
-    print(m.__class__)
+    m = GuiType._GuiWinFormMulti('multi', 1)

+ 84 - 0
ui/Form.ui

@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QMainWindow" name="Form">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>398</width>
+    <height>392</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>MainWindow</string>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <layout class="QGridLayout" name="gridLayout">
+    <item row="0" column="0">
+     <layout class="QVBoxLayout" name="verticalLayout" stretch="12,1">
+      <item>
+       <widget class="QTableView" name="tableView"/>
+      </item>
+      <item>
+       <layout class="QHBoxLayout" name="horizontalLayout" stretch="1,3,1">
+        <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="reportButton">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>Report Virtual Timing</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>
+  <widget class="QMenuBar" name="menubar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>398</width>
+     <height>23</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QStatusBar" name="statusbar"/>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 3 - 3
ui/MainWindows.ui

@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>800</width>
-    <height>721</height>
+    <width>890</width>
+    <height>806</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -97,7 +97,7 @@
     <rect>
      <x>0</x>
      <y>0</y>
-     <width>800</width>
+     <width>890</width>
      <height>23</height>
     </rect>
    </property>

+ 19 - 18
ui/form_multi.ui → ui/SideBar.ui

@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>form_multi</class>
- <widget class="QMainWindow" name="form_multi">
+ <class>SideBar</class>
+ <widget class="QMainWindow" name="SideBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>627</width>
-    <height>270</height>
+    <width>569</width>
+    <height>360</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -16,17 +16,18 @@
   <widget class="QWidget" name="centralwidget">
    <layout class="QGridLayout" name="gridLayout">
     <item row="0" column="0">
-     <layout class="QHBoxLayout" name="horizontalLayout">
-      <item>
-       <widget class="QTreeWidget" name="treeWidget">
-        <column>
-         <property name="text">
-          <string notr="true">1</string>
-         </property>
-        </column>
-       </widget>
-      </item>
-      <item>
+     <widget class="QSplitter" name="splitter">
+      <property name="orientation">
+       <enum>Qt::Horizontal</enum>
+      </property>
+      <widget class="QTreeWidget" name="treeWidget">
+       <column>
+        <property name="text">
+         <string/>
+        </property>
+       </column>
+      </widget>
+      <widget class="QWidget" name="verticalLayoutWidget">
        <layout class="QVBoxLayout" name="verticalLayout">
         <item>
          <widget class="QComboBox" name="sheets"/>
@@ -39,8 +40,8 @@
          </widget>
         </item>
        </layout>
-      </item>
-     </layout>
+      </widget>
+     </widget>
     </item>
    </layout>
   </widget>
@@ -49,7 +50,7 @@
     <rect>
      <x>0</x>
      <y>0</y>
-     <width>627</width>
+     <width>569</width>
      <height>23</height>
     </rect>
    </property>

+ 84 - 0
ui/ui_Form.py

@@ -0,0 +1,84 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'Form.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 *
+
+
+class Ui_Form(object):
+    def setupUi(self, Form):
+        if not Form.objectName():
+            Form.setObjectName(u"Form")
+        Form.resize(398, 392)
+        self.centralwidget = QWidget(Form)
+        self.centralwidget.setObjectName(u"centralwidget")
+        self.gridLayout = QGridLayout(self.centralwidget)
+        self.gridLayout.setObjectName(u"gridLayout")
+        self.verticalLayout = QVBoxLayout()
+        self.verticalLayout.setObjectName(u"verticalLayout")
+        self.tableView = QTableView(self.centralwidget)
+        self.tableView.setObjectName(u"tableView")
+
+        self.verticalLayout.addWidget(self.tableView)
+
+        self.horizontalLayout = QHBoxLayout()
+        self.horizontalLayout.setObjectName(u"horizontalLayout")
+        self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+
+        self.horizontalLayout.addItem(self.horizontalSpacer)
+
+        self.reportButton = QPushButton(self.centralwidget)
+        self.reportButton.setObjectName(u"reportButton")
+        sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.reportButton.sizePolicy().hasHeightForWidth())
+        self.reportButton.setSizePolicy(sizePolicy)
+
+        self.horizontalLayout.addWidget(self.reportButton)
+
+        self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
+
+        self.horizontalLayout.addItem(self.horizontalSpacer_2)
+
+        self.horizontalLayout.setStretch(0, 1)
+        self.horizontalLayout.setStretch(1, 3)
+        self.horizontalLayout.setStretch(2, 1)
+
+        self.verticalLayout.addLayout(self.horizontalLayout)
+
+        self.verticalLayout.setStretch(0, 12)
+        self.verticalLayout.setStretch(1, 1)
+
+        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
+
+        Form.setCentralWidget(self.centralwidget)
+        self.menubar = QMenuBar(Form)
+        self.menubar.setObjectName(u"menubar")
+        self.menubar.setGeometry(QRect(0, 0, 398, 23))
+        Form.setMenuBar(self.menubar)
+        self.statusbar = QStatusBar(Form)
+        self.statusbar.setObjectName(u"statusbar")
+        Form.setStatusBar(self.statusbar)
+
+        self.retranslateUi(Form)
+
+        QMetaObject.connectSlotsByName(Form)
+    # setupUi
+
+    def retranslateUi(self, Form):
+        Form.setWindowTitle(QCoreApplication.translate("Form", u"MainWindow", None))
+        self.reportButton.setText(QCoreApplication.translate("Form", u"Report Virtual Timing", None))
+    # retranslateUi
+

+ 2 - 2
ui/ui_MainWindows.py

@@ -21,7 +21,7 @@ class Ui_MainWindow(object):
     def setupUi(self, MainWindow):
         if not MainWindow.objectName():
             MainWindow.setObjectName(u"MainWindow")
-        MainWindow.resize(800, 721)
+        MainWindow.resize(890, 806)
         self.actionStop_GUI = QAction(MainWindow)
         self.actionStop_GUI.setObjectName(u"actionStop_GUI")
         self.actionExit = QAction(MainWindow)
@@ -187,7 +187,7 @@ class Ui_MainWindow(object):
         MainWindow.setCentralWidget(self.centralwidget)
         self.menubar = QMenuBar(MainWindow)
         self.menubar.setObjectName(u"menubar")
-        self.menubar.setGeometry(QRect(0, 0, 800, 23))
+        self.menubar.setGeometry(QRect(0, 0, 890, 23))
         self.menuFile = QMenu(self.menubar)
         self.menuFile.setObjectName(u"menuFile")
         self.menuEdit = QMenu(self.menubar)

+ 72 - 0
ui/ui_SideBar.py

@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'SideBar.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 *
+
+
+class Ui_SideBar(object):
+    def setupUi(self, SideBar):
+        if not SideBar.objectName():
+            SideBar.setObjectName(u"SideBar")
+        SideBar.resize(569, 360)
+        self.centralwidget = QWidget(SideBar)
+        self.centralwidget.setObjectName(u"centralwidget")
+        self.gridLayout = QGridLayout(self.centralwidget)
+        self.gridLayout.setObjectName(u"gridLayout")
+        self.splitter = QSplitter(self.centralwidget)
+        self.splitter.setObjectName(u"splitter")
+        self.splitter.setOrientation(Qt.Horizontal)
+        self.treeWidget = QTreeWidget(self.splitter)
+        self.treeWidget.headerItem().setText(0, "")
+        self.treeWidget.setObjectName(u"treeWidget")
+        self.splitter.addWidget(self.treeWidget)
+        self.verticalLayoutWidget = QWidget(self.splitter)
+        self.verticalLayoutWidget.setObjectName(u"verticalLayoutWidget")
+        self.verticalLayout = QVBoxLayout(self.verticalLayoutWidget)
+        self.verticalLayout.setObjectName(u"verticalLayout")
+        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
+        self.sheets = QComboBox(self.verticalLayoutWidget)
+        self.sheets.setObjectName(u"sheets")
+
+        self.verticalLayout.addWidget(self.sheets)
+
+        self.tableView = QTableView(self.verticalLayoutWidget)
+        self.tableView.setObjectName(u"tableView")
+        self.tableView.setTabKeyNavigation(True)
+
+        self.verticalLayout.addWidget(self.tableView)
+
+        self.splitter.addWidget(self.verticalLayoutWidget)
+
+        self.gridLayout.addWidget(self.splitter, 0, 0, 1, 1)
+
+        SideBar.setCentralWidget(self.centralwidget)
+        self.menubar = QMenuBar(SideBar)
+        self.menubar.setObjectName(u"menubar")
+        self.menubar.setGeometry(QRect(0, 0, 569, 23))
+        SideBar.setMenuBar(self.menubar)
+        self.statusbar = QStatusBar(SideBar)
+        self.statusbar.setObjectName(u"statusbar")
+        SideBar.setStatusBar(self.statusbar)
+
+        self.retranslateUi(SideBar)
+
+        QMetaObject.connectSlotsByName(SideBar)
+    # setupUi
+
+    def retranslateUi(self, SideBar):
+        SideBar.setWindowTitle(QCoreApplication.translate("SideBar", u"MainWindow", None))
+    # retranslateUi
+

+ 2 - 4
ui/ui_form_multi.py

@@ -28,9 +28,7 @@ class Ui_form_multi(object):
         self.horizontalLayout = QHBoxLayout()
         self.horizontalLayout.setObjectName(u"horizontalLayout")
         self.treeWidget = QTreeWidget(self.centralwidget)
-        __qtreewidgetitem = QTreeWidgetItem()
-        __qtreewidgetitem.setText(0, u"1");
-        self.treeWidget.setHeaderItem(__qtreewidgetitem)
+        self.treeWidget.headerItem().setText(0, "")
         self.treeWidget.setObjectName(u"treeWidget")
 
         self.horizontalLayout.addWidget(self.treeWidget)
@@ -39,7 +37,7 @@ class Ui_form_multi(object):
         self.verticalLayout.setObjectName(u"verticalLayout")
         self.sheets = QComboBox(self.centralwidget)
         self.sheets.setObjectName(u"sheets")
-    
+
         self.verticalLayout.addWidget(self.sheets)
 
         self.tableView = QTableView(self.centralwidget)