Example #1
0
    def _construct_UI(self):
        """
        Construct the main GUI, consisting of:
        - Subwindow for parameter selection [-> ChooseParams.ChooseParams()]
        - Filter Design button [-> self.startDesignFilt()]
        - Plot Window [-> plotAll.plotAll()]
        """

        # ============== UI Layout =====================================
        #        _widget = QtGui.QMainWindow() # this widget contains all subwidget groups
        #        _widget = QtGui.QDialog() # this widget contains all subwidget groups
        self.main_widget = QtGui.QWidget(
            self)  # this widget contains all subwidget groups

        layHMain = QtGui.QHBoxLayout(
            self.main_widget)  # horizontal layout of all groups

        # Instantiate subwidget groups
        self.inputTabWidgets = input_tab_widgets.InputTabWidgets(
            self)  # input widgets
        self.pltTabWidgets = plot_tab_widgets.PlotTabWidgets(
            self)  # plot widgets
        #        self.pltTabWidgets = plot_tab_widgets.MyStaticMplCanvas(self.main_widget, width=5, height=4, dpi=100)

        self.inputTabWidgets.setMaximumWidth(420)  # comment out for splitter
        layHMain.addWidget(self.inputTabWidgets)
        layHMain.addWidget(self.pltTabWidgets)
        layHMain.setContentsMargins(0, 0, 0, 0)  #(left, top, right, bottom)

        self.setWindowTitle('pyFDA - Python Filter Design and Analysis')

        self.main_widget.setFocus()
        # make main_widget occupy the main area of QMainWidget
        #   and make QMainWindow its parent !!!
        self.setCentralWidget(self.main_widget)

        #=============== Menubar =======================================

        #        aboutAction = QtGui.QAction('&About', self)
        #        aboutAction.setShortcut('Ctrl+A')
        #        aboutAction.setStatusTip('Info about pyFDA')
        #
        #        menubar = self.menuBar()
        #        fileMenu = menubar.addMenu('&About')
        #        fileMenu.addAction(aboutAction)

        #        self.statusMessage("Application is initialized.")

        #----------------------------------------------------------------------
        # SIGNALS & SLOTs
        #----------------------------------------------------------------------
        # Here, signals about spec and design changes from lower hierarchies
        # are distributed. At the moment, only changes in the input widgets are
        # routed to the plot widgets:
        #
        # sigSpecsChanged: signal indicating that filter SPECS have changed,
        # requiring partial update of some plot widgets:
        self.inputTabWidgets.sigSpecsChanged.connect(
            self.pltTabWidgets.update_view)
        #
        # sigFilterDesigned: signal indicating that filter has been DESIGNED,
        #  requiring full update of all plot widgets:
        self.inputTabWidgets.sigFilterDesigned.connect(
            self.pltTabWidgets.update_data)
        #
        # sigReadFilters: button has been pressed to rebuild filter tree:
        #        self.inputTabWidgets.inputFiles.sigReadFilters.connect(self.ftb.init_filters)

        # open pop-up "about" window
        #aboutAction.triggered.connect(self.aboutWindow)

        # trigger the close event in response to sigQuit generated in another subwidget:
        #        self.inputTabWidgets.inputSpecs.sigQuit.connect(self.close)

        logger.debug("Main routine initialized!")
Example #2
0
    def _construct_UI(self):
        """
        Construct the main GUI, consisting of:
            - Tabbed input widgets (left side)
            - Tabbed plot widgets (right side)
            - Logger window (right side, below plot tab)
        """

        # ============== UI Layout with H and V-Splitter =====================

        inputTabWidgets = input_tab_widgets.InputTabWidgets(self) # input widgets
        pltTabWidgets = plot_tab_widgets.PlotTabWidgets(self) # plot widgets
        self.loggerWin     = QPlainTextEdit(self)  # logger window
        self.loggerWin.setReadOnly(True)
        # set custom right-button context menu policy
        self.loggerWin.setContextMenuPolicy(Qt.CustomContextMenu)
        self.loggerWin.customContextMenuRequested.connect(self.logger_win_context_menu)
        # create context menu and define actions and shortcuts
        self.popMenu = QMenu(self)
        self.popMenu.addAction('Select &All', self.loggerWin.selectAll, "Ctrl+A")
        self.popMenu.addAction('&Copy Selected', self.loggerWin.copy)
        self.popMenu.addSeparator()
        self.popMenu.addAction('Clear &Window', self.loggerWin.clear)       

# =============================================================================
        # only needed for logging window height measured in lines
        # mSize = QFontMetrics(loggerWin.font())
        # row4_height = mSize.lineSpacing() * 4

        # add logger window underneath plot Tab Widgets
        spltVPltLogger = QSplitter(QtCore.Qt.Vertical)
        spltVPltLogger.addWidget(pltTabWidgets)
        spltVPltLogger.addWidget(self.loggerWin)

        # create horizontal splitter that contains all subwidget groups
        spltHMain = QSplitter(QtCore.Qt.Horizontal)
        spltHMain.addWidget(inputTabWidgets)
        spltHMain.addWidget(spltVPltLogger)
        spltHMain.setStretchFactor(1,4) # relative initial sizes of subwidgets
        spltHMain.setContentsMargins(*rc.params['wdg_margins'])
        spltHMain.setFocus()
        # make spltHMain occupy the main area of QMainWindow and make QMainWindow its parent !!!
        self.setCentralWidget(spltHMain)
        spltVPltLoggerH = spltVPltLogger.size().height()
        spltVPltLogger.setSizes([spltVPltLoggerH*0.95, spltVPltLoggerH*0.05 - 8])

        self.setWindowTitle('pyFDA - Python Filter Design and Analysis')

        #=============== Menubar =======================================

#        aboutAction = QAction('&About', self)
#        aboutAction.setShortcut('Ctrl+A')
#        aboutAction.setStatusTip('Info about pyFDA')
#
#        menubar = self.menuBar()
#        fileMenu = menubar.addMenu('&About')
#        fileMenu.addAction(aboutAction)

#        self.statusMessage("Application is initialized.")

        #----------------------------------------------------------------------
        # GLOBAL SIGNALS & SLOTs
        #----------------------------------------------------------------------
        self.sig_rx.connect(self.process_sig_rx)

        #----------------------------------------------------------------------
        # SIGNALS & SLOTs
        #----------------------------------------------------------------------
        # Here, signals about spec and design changes from lower hierarchies
        # are distributed. At the moment, only changes in the input widgets are
        # routed to the plot widgets:
        inputTabWidgets.sig_tx.connect(pltTabWidgets.sig_rx)
        inputTabWidgets.sig_tx.connect(self.process_sig_rx)
        pltTabWidgets.sig_tx.connect(inputTabWidgets.sig_rx)
        # open pop-up "about" window
        #aboutAction.triggered.connect(self.aboutWindow) 

        # trigger the close event in response to sigQuit generated in another subwidget:
        # inputTabWidgets.input_filter_specs.sigQuit.connect(self.close)

        # when a message has been written, pass it via signal-slot mechanism and
        # print it to logger window
        XStream.stdout().messageWritten.connect(self.loggerWin.appendHtml)
Example #3
0
    def _construct_UI(self):
        """
        Construct the main GUI, consisting of:
        - Subwindow for parameter selection [-> ChooseParams.ChooseParams()]
        - Filter Design button [-> self.startDesignFilt()]
        - Plot Window [-> plotAll.plotAll()]
        """

        # ============== UI Layout =====================================
        self.main_widget = QWidget(
            self)  # this widget contains all subwidget groups

        layHMain = QHBoxLayout(
            self.main_widget)  # horizontal layout of all groups

        # Instantiate subwidget groups
        self.inputTabWidgets = input_tab_widgets.InputTabWidgets(
            self)  # input widgets
        self.pltTabWidgets = plot_tab_widgets.PlotTabWidgets(
            self)  # plot widgets
        # Test        self.pltTabWidgets = plot_tab_widgets.MyStaticMplCanvas(self.main_widget, width=5, height=4, dpi=100)

        if SPLITTER:  # use splitter design (variable ratio for input / plot subwidget sizes)
            layVInput = QVBoxLayout()
            layVInput.addWidget(self.inputTabWidgets)
            layVPlt = QVBoxLayout()
            layVPlt.addWidget(self.pltTabWidgets)

            frmInput = QFrame()
            frmInput.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken)
            frmInput.setLayout(layVInput)
            frmInput.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)

            frmPlt = QFrame()
            frmPlt.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken)
            frmPlt.setLayout(layVPlt)
            frmPlt.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)

            splitter = QSplitter(QtCore.Qt.Horizontal)
            splitter.addWidget(frmInput)
            splitter.addWidget(frmPlt)
            splitter.setStretchFactor(
                1, 4)  # factors for the initial sizes of subwidgets
            #            splitter.setSizes([200,600])

            layHMain.addWidget(splitter)

        else:  # no splitter design, only use layHMain layout
            self.inputTabWidgets.setMaximumWidth(
                420)  # comment out for splitter
            layHMain.addWidget(self.inputTabWidgets)
            layHMain.addWidget(self.pltTabWidgets)
            layHMain.setContentsMargins(0, 0, 0,
                                        0)  #(left, top, right, bottom)

        self.setWindowTitle('pyFDA - Python Filter Design and Analysis')

        if SCROLL:
            # Create scroll area and "monitor" _widget whether scrollbars are needed
            scrollArea = QScrollArea()
            scrollArea.setWidget(
                self.main_widget)  # make main widget "scrollable"

            #============= Set behaviour of scroll area ======================
            # scroll bars appear when the scroll area shrinks below this size:
            scrollArea.setMinimumSize(QtCore.QSize(800, 500))
            #        scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded) #default
            #        scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded) # default
            scrollArea.setSizePolicy(QSizePolicy.MinimumExpanding,
                                     QSizePolicy.MinimumExpanding)

            # Size of monitored widget is allowed to grow:
            scrollArea.setWidgetResizable(True)

        self.main_widget.setFocus()
        # make main_widget occupy the main area of QMainWidget
        #   and make QMainWindow its parent !!!
        self.setCentralWidget(self.main_widget)

        #=============== Menubar =======================================

        #        aboutAction = QAction('&About', self)
        #        aboutAction.setShortcut('Ctrl+A')
        #        aboutAction.setStatusTip('Info about pyFDA')
        #
        #        menubar = self.menuBar()
        #        fileMenu = menubar.addMenu('&About')
        #        fileMenu.addAction(aboutAction)

        #        self.statusMessage("Application is initialized.")

        #----------------------------------------------------------------------
        # SIGNALS & SLOTs
        #----------------------------------------------------------------------
        # Here, signals about spec and design changes from lower hierarchies
        # are distributed. At the moment, only changes in the input widgets are
        # routed to the plot widgets:
        #
        # sigSpecsChanged: signal indicating that filter SPECS have changed,
        # requiring partial update of some plot widgets:
        self.inputTabWidgets.sigSpecsChanged.connect(
            self.pltTabWidgets.update_view)
        #
        # sigFilterDesigned: signal indicating that filter has been DESIGNED,
        #  requiring full update of all plot widgets:
        self.inputTabWidgets.sigFilterDesigned.connect(
            self.pltTabWidgets.update_data)
        #
        # sigReadFilters: button has been pressed to rebuild filter tree:
        self.inputTabWidgets.file_io.sigReadFilters.connect(
            self.ftb.init_filters)

        # open pop-up "about" window
        #aboutAction.triggered.connect(self.aboutWindow)

        # trigger the close event in response to sigQuit generated in another subwidget:
        self.inputTabWidgets.filter_specs.sigQuit.connect(self.close)

        logger.debug("Main routine initialized!")
Example #4
0
    def _construct_UI(self):
        """
        Construct the main GUI, consisting of:
        - Subwindow for parameter selection [-> ChooseParams.ChooseParams()]
        - Filter Design button [-> self.startDesignFilt()]
        - Plot Window [-> plotAll.plotAll()]
        """

        # ============== UI Layout =====================================
        self.main_widget = QWidget(
            self)  # this widget contains all subwidget groups

        layHMain = QHBoxLayout(
            self.main_widget)  # horizontal layout of all groups
        laySubWin = QSplitter(QtCore.Qt.Horizontal)
        laySubRight = QSplitter(QtCore.Qt.Vertical)

        # Instantiate subwidget groups
        self.inputTabWidgets = input_tab_widgets.InputTabWidgets(
            self)  # input widgets
        self.pltTabWidgets = plot_tab_widgets.PlotTabWidgets(
            self)  # plot widgets
        self.statusWin = QPlainTextEdit(self)  # status window
        mSize = QFontMetrics(self.statusWin.font())
        rowHt = mSize.lineSpacing()
        self.statusWin.setFixedHeight(4 * rowHt + 4)
        self.statusWin.setReadOnly(True)

        #self._title = QtGui.QLabel('Status Log')
        #self._title.setAlignment(QtCore.Qt.AlignCenter)

        # Add status window underneath plot Tab Widgets
        laySubRight.addWidget(self.pltTabWidgets)
        #laySub.addWidget(self._title)
        laySubRight.addWidget(self.statusWin)
        laySubRight.setStretchFactor(0,
                                     0)  # relative initial sizes of subwidgets
        #laySubRight.setStretchFactor(1,1) # relative initial sizes of subwidgets

        laySubWin.addWidget(self.inputTabWidgets)
        laySubWin.addWidget(laySubRight)
        laySubWin.setStretchFactor(1,
                                   4)  # relative initial sizes of subwidgets

        layHMain.addWidget(laySubWin)
        layHMain.setContentsMargins(*rc.params['wdg_margins'])

        self.setWindowTitle('pyFDA - Python Filter Design and Analysis')

        self.main_widget.setFocus()
        # make main_widget occupy the main area of QMainWidget
        #   and make QMainWindow its parent !!!
        self.setCentralWidget(self.main_widget)

        #=============== Menubar =======================================

        #        aboutAction = QAction('&About', self)
        #        aboutAction.setShortcut('Ctrl+A')
        #        aboutAction.setStatusTip('Info about pyFDA')
        #
        #        menubar = self.menuBar()
        #        fileMenu = menubar.addMenu('&About')
        #        fileMenu.addAction(aboutAction)

        #        self.statusMessage("Application is initialized.")

        #----------------------------------------------------------------------
        # SIGNALS & SLOTs
        #----------------------------------------------------------------------
        # Here, signals about spec and design changes from lower hierarchies
        # are distributed. At the moment, only changes in the input widgets are
        # routed to the plot widgets:
        #
        # sigViewChanged: signal indicating that filter VIEW has changed,
        # requiring partial update of some plot widgets:
        self.inputTabWidgets.sigViewChanged.connect(
            self.pltTabWidgets.update_view)
        #
        # sigSpecsChanged: signal indicating that filter SPECS have changed,
        # requiring partial update of some plot widgets:
        self.inputTabWidgets.sigSpecsChanged.connect(
            self.pltTabWidgets.update_view)

        #
        # sigFilterDesigned: signal indicating that filter has been DESIGNED,
        #  requiring full update of all plot widgets:
        self.inputTabWidgets.sigFilterDesigned.connect(
            self.pltTabWidgets.update_data)

        # open pop-up "about" window
        #aboutAction.triggered.connect(self.aboutWindow)

        # trigger the close event in response to sigQuit generated in another subwidget:
        self.inputTabWidgets.filter_specs.sigQuit.connect(self.close)

        XStream.stdout().messageWritten.connect(self.statusWin.appendPlainText)
Example #5
0
    def _construct_UI(self):
        """
        Construct the main GUI, consisting of:
        - Subwindow for parameter selection [-> ChooseParams.ChooseParams()]
        - Filter Design button [-> self.startDesignFilt()]
        - Plot Window [-> plotAll.plotAll()]
        """

        # ============== UI Layout =====================================
        self.main_widget = QWidget(self) # this widget contains all subwidget groups

        layHMain = QHBoxLayout(self.main_widget) # horizontal layout of all groups

        # Instantiate subwidget groups
        self.inputTabWidgets = input_tab_widgets.InputTabWidgets(self) # input widgets
        self.pltTabWidgets = plot_tab_widgets.PlotTabWidgets(self) # plot widgets

        if SPLITTER: # use splitter design (variable ratio for input / plot subwidget sizes)
            splitter = QSplitter(QtCore.Qt.Horizontal)
            splitter.addWidget(self.inputTabWidgets)
            splitter.addWidget(self.pltTabWidgets)            
            splitter.setStretchFactor(1,4) # relative initial sizes of subwidgets
#            splitter.setSizes([200,600]) # absolute initial sizes of subwidgets
            layHMain.addWidget(splitter)
            layHMain.setContentsMargins(*rc.params['wdg_margins'])

        else: # no splitter design, only use layHMain layout
            self.inputTabWidgets.setMaximumWidth(420)
            layHMain.addWidget(self.inputTabWidgets)
            layHMain.addWidget(self.pltTabWidgets)
            layHMain.setContentsMargins(0, 0, 0, 0) # R, T, L, B

        self.setWindowTitle('pyFDA - Python Filter Design and Analysis')
    
        self.main_widget.setFocus()
        # make main_widget occupy the main area of QMainWidget 
        #   and make QMainWindow its parent !!!
        self.setCentralWidget(self.main_widget)

        #=============== Menubar =======================================

#        aboutAction = QAction('&About', self)
#        aboutAction.setShortcut('Ctrl+A')
#        aboutAction.setStatusTip('Info about pyFDA')
#
#        menubar = self.menuBar()
#        fileMenu = menubar.addMenu('&About')
#        fileMenu.addAction(aboutAction)

#        self.statusMessage("Application is initialized.")


        #----------------------------------------------------------------------
        # SIGNALS & SLOTs
        #----------------------------------------------------------------------
        # Here, signals about spec and design changes from lower hierarchies
        # are distributed. At the moment, only changes in the input widgets are
        # routed to the plot widgets:
        #
        # sigViewChanged: signal indicating that filter VIEW has changed,
        # requiring partial update of some plot widgets:
        self.inputTabWidgets.sigViewChanged.connect(self.pltTabWidgets.update_view)
        #
        # sigSpecsChanged: signal indicating that filter SPECS have changed,
        # requiring partial update of some plot widgets:
        self.inputTabWidgets.sigSpecsChanged.connect(self.pltTabWidgets.update_view)

        #
        # sigFilterDesigned: signal indicating that filter has been DESIGNED,
        #  requiring full update of all plot widgets:
        self.inputTabWidgets.sigFilterDesigned.connect(self.pltTabWidgets.update_data)

        # open pop-up "about" window
        #aboutAction.triggered.connect(self.aboutWindow) 

        # trigger the close event in response to sigQuit generated in another subwidget:
        self.inputTabWidgets.filter_specs.sigQuit.connect(self.close)


        logger.info("Main routine initialized, using Qt {0}".format(QT_VERSION_STR))
Example #6
0
    def _construct_UI(self):
        """
        Construct the main GUI, consisting of:
        - Subwindow for parameter selection [-> ChooseParams.ChooseParams()]
        - Filter Design button [-> self.startDesignFilt()]
        - Plot Window [-> plotAll.plotAll()]
        """

        # ============== UI Layout with H and V-Splitter =====================

        inputTabWidgets = input_tab_widgets.InputTabWidgets(
            self)  # input widgets
        pltTabWidgets = plot_tab_widgets.PlotTabWidgets(self)  # plot widgets
        loggerWin = QPlainTextEdit(self)  # status window
        loggerWin.setReadOnly(True)
        # only needed for logging window height measured in lines
        # mSize = QFontMetrics(loggerWin.font())
        # row4_height = mSize.lineSpacing() * 4

        # add logger window underneath plot Tab Widgets
        spltVPltLogger = QSplitter(QtCore.Qt.Vertical)
        spltVPltLogger.addWidget(pltTabWidgets)
        spltVPltLogger.addWidget(loggerWin)

        # create horizontal splitter that contains all subwidget groups
        spltHMain = QSplitter(QtCore.Qt.Horizontal)
        spltHMain.addWidget(inputTabWidgets)
        spltHMain.addWidget(spltVPltLogger)
        spltHMain.setStretchFactor(1,
                                   4)  # relative initial sizes of subwidgets
        spltHMain.setContentsMargins(*rc.params['wdg_margins'])
        spltHMain.setFocus()
        # make spltHMain occupy the main area of QMainWindow and make QMainWindow its parent !!!
        self.setCentralWidget(spltHMain)
        spltVPltLoggerH = spltVPltLogger.size().height()
        spltVPltLogger.setSizes(
            [spltVPltLoggerH * 0.95, spltVPltLoggerH * 0.05 - 8])

        self.setWindowTitle('pyFDA - Python Filter Design and Analysis')

        #=============== Menubar =======================================

        #        aboutAction = QAction('&About', self)
        #        aboutAction.setShortcut('Ctrl+A')
        #        aboutAction.setStatusTip('Info about pyFDA')
        #
        #        menubar = self.menuBar()
        #        fileMenu = menubar.addMenu('&About')
        #        fileMenu.addAction(aboutAction)

        #        self.statusMessage("Application is initialized.")

        #----------------------------------------------------------------------
        # SIGNALS & SLOTs
        #----------------------------------------------------------------------
        # Here, signals about spec and design changes from lower hierarchies
        # are distributed. At the moment, only changes in the input widgets are
        # routed to the plot widgets:
        #
        # sigViewChanged: signal indicating that filter VIEW has changed,
        # requiring partial update of some plot widgets:
        inputTabWidgets.sigViewChanged.connect(pltTabWidgets.update_view)
        #
        # sigSpecsChanged: signal indicating that filter SPECS have changed,
        # requiring partial update of some plot widgets:
        inputTabWidgets.sigSpecsChanged.connect(pltTabWidgets.update_view)

        #
        # sigFilterDesigned: signal indicating that filter has been DESIGNED,
        #  requiring full update of all plot widgets:
        inputTabWidgets.sigFilterDesigned.connect(pltTabWidgets.update_data)

        # open pop-up "about" window
        #aboutAction.triggered.connect(self.aboutWindow)

        # trigger the close event in response to sigQuit generated in another subwidget:
        inputTabWidgets.filter_specs.sigQuit.connect(self.close)

        # when a message has been written, pass it via signal-slot mechanism and
        # print it to logger window
        XStream.stdout().messageWritten.connect(loggerWin.appendHtml)