def _construct_UI(self): """ Construct User Interface from all input subwidgets """ # Subwidget for selecting filter with response type rt (LP, ...), # filter type ft (IIR, ...) and filter class fc (cheby1, ...) self.sel_fil = select_filter.SelectFilter(self) self.sel_fil.setObjectName("select_filter") # Subwidget for selecting the frequency unit and range self.f_units = freq_units.FreqUnits(self) self.f_units.setObjectName("freq_units") # Subwidget for Frequency Specs self.f_specs = freq_specs.FreqSpecs(self) self.f_specs.setObjectName("freq_specs") # Subwidget for Amplitude Specs self.a_specs = amplitude_specs.AmplitudeSpecs(self) self.a_specs.setObjectName("amplitude_specs") # Subwidget for Weight Specs self.w_specs = weight_specs.WeightSpecs(self) self.w_specs.setObjectName("weight_specs") # Subwidget for target specs (frequency and amplitude) self.t_specs = target_specs.TargetSpecs(self, title="Target Specifications") self.t_specs.setObjectName("target_specs") # Subwidget for displaying infos on the design method self.lblMsg = QtGui.QLabel(self) self.lblMsg.setWordWrap(True) # self.lblMsg.setFrameShape(QtGui.QFrame.StyledPanel|QtGui.QFrame.Sunken) layVMsg = QtGui.QVBoxLayout() layVMsg.addWidget(self.lblMsg) frmMsg = QtGui.QFrame() frmMsg.setFrameStyle(QtGui.QFrame.StyledPanel | QtGui.QFrame.Sunken) frmMsg.setLayout(layVMsg) frmMsg.setSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) self.butDesignFilt = QtGui.QPushButton("DESIGN FILTER", self) self.butQuit = QtGui.QPushButton("Quit", self) #---------------------------------------------------------------------- # LAYOUT for input specifications and buttons #---------------------------------------------------------------------- spcV = QtGui.QSpacerItem(10, 10, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) layGMain = QtGui.QGridLayout() layGMain.addWidget(self.sel_fil, 0, 0, 1, 2) # Design method (IIR - ellip, ...) layGMain.addWidget(self.f_units, 2, 0, 1, 2) # Frequency units layGMain.addWidget(self.f_specs, 3, 0, 1, 2) # Freq. specifications layGMain.addWidget(self.a_specs, 4, 0, 1, 2) # Amplitude specs layGMain.addWidget(self.w_specs, 5, 0, 1, 2) # Weight specs layGMain.addWidget(frmMsg, 6, 0, 1, 2) # Text message layGMain.addWidget(self.t_specs, 7, 0, 1, 2) # Target specs layGMain.addWidget(self.butDesignFilt, 8, 0) # <Design Filter> button layGMain.addWidget(self.butQuit, 8, 1) # <Quit> button layGMain.addItem(spcV, 9, 0, 1, 2) # spacer to allow for vert. expansion # layGMain.addWidget(HLine(self), 9,0,1,2) # create HLine layGMain.setContentsMargins(0, 0, 0, 0) # layGMain.setRowStretch(1,1) self.setLayout(layGMain) # main layout of widget #---------------------------------------------------------------------- # SIGNALS & SLOTS # # Changing the filter design requires updating UI because number or # kind of input fields changes -> Call update_all_UIs, emitting # sigFilterChanged when it's finished self.sel_fil.sigFiltChanged.connect(self.update_UI) # Changing the frequency unit requires re-display of frequency specs # but it does not influence the actual specs (no specsChanged ) self.f_units.sigUnitChanged.connect(self.f_specs.load_entries) self.f_units.sigUnitChanged.connect(self.t_specs.load_entries) self.f_units.sigUnitChanged.connect(self.sigViewChanged) # Activating the "Sort" button triggers sigSpecsChanged, requiring # sorting and storing the frequency entries self.f_units.sigSpecsChanged.connect(self.f_specs.sort_dict_freqs) self.f_units.sigSpecsChanged.connect( self.t_specs.f_specs.sort_dict_freqs) # Changing filter parameters / specs requires reloading of parameters # in other hierarchy levels, e.g. in the plot tabs # bundle sigSpecsChanged signals and propagate to next hierarchy level # self.f_units.sigSpecsChanged.connect(self.sigSpecsChanged) self.f_specs.sigSpecsChanged.connect(self.sigSpecsChanged) self.t_specs.sigSpecsChanged.connect(self.sigSpecsChanged) self.a_specs.sigSpecsChanged.connect(self.sigSpecsChanged) self.a_specs.sigUnitChanged.connect(self.sigViewChanged) self.w_specs.sigSpecsChanged.connect(self.sigSpecsChanged) # Other signal-slot connections self.butDesignFilt.clicked.connect(self.start_design_filt) self.butQuit.clicked.connect( self.sigQuit) # pass on to main application #---------------------------------------------------------------------- self.update_UI() # first time initialization self.start_design_filt() # design first filter using default values
def _construct_UI(self): """ Construct User Interface from all input subwidgets """ self.butLoadFilt = QPushButton("LOAD FILTER", self) self.butLoadFilt.setToolTip("Load filter from disk") self.butSaveFilt = QPushButton("SAVE FILTER", self) self.butSaveFilt.setToolTip("Save filter todisk") layHButtons1 = QHBoxLayout() layHButtons1.addWidget(self.butLoadFilt) # <Load Filter> button layHButtons1.addWidget(self.butSaveFilt) # <Save Filter> button layHButtons1.setContentsMargins(*params['wdg_margins_spc']) self.butDesignFilt = QPushButton("DESIGN FILTER", self) self.butDesignFilt.setToolTip("Design filter with chosen specs") self.butQuit = QPushButton("Quit", self) self.butQuit.setToolTip("Exit pyfda tool") layHButtons2 = QHBoxLayout() layHButtons2.addWidget(self.butDesignFilt) # <Design Filter> button layHButtons2.addWidget(self.butQuit) # <Quit> button layHButtons2.setContentsMargins(*params['wdg_margins']) # Subwidget for selecting filter with response type rt (LP, ...), # filter type ft (IIR, ...) and filter class fc (cheby1, ...) self.sel_fil = select_filter.SelectFilter(self) self.sel_fil.setObjectName("select_filter") self.sel_fil.sig_tx.connect(self.sig_rx_local) # Subwidget for selecting the frequency unit and range self.f_units = freq_units.FreqUnits(self) self.f_units.setObjectName("freq_units") self.f_units.sig_tx.connect(self.sig_rx_local) # Changing the frequency unit requires re-display of frequency specs # but it does not influence the actual specs (no specsChanged ) # Activating the "Sort" button emits 'view_changed'?specs_changed'?, requiring # sorting and storing the frequency entries # Changing filter parameters / specs requires reloading of parameters # in other hierarchy levels, e.g. in the plot tabs # Subwidget for Frequency Specs self.f_specs = freq_specs.FreqSpecs(self) self.f_specs.setObjectName("freq_specs") self.f_specs.sig_tx.connect(self.sig_rx_local) self.sig_tx.connect(self.f_specs.sig_rx) # Subwidget for Amplitude Specs self.a_specs = amplitude_specs.AmplitudeSpecs(self) self.a_specs.setObjectName("amplitude_specs") self.a_specs.sig_tx.connect(self.sig_rx_local) # Subwidget for Weight Specs self.w_specs = weight_specs.WeightSpecs(self) self.w_specs.setObjectName("weight_specs") self.w_specs.sig_tx.connect(self.sig_rx_local) # Subwidget for target specs (frequency and amplitude) self.t_specs = target_specs.TargetSpecs(self, title="Target Specifications") self.t_specs.setObjectName("target_specs") self.t_specs.sig_tx.connect(self.sig_rx_local) self.sig_tx.connect(self.t_specs.sig_rx) # Subwidget for displaying infos on the design method self.lblMsg = QLabel(self) self.lblMsg.setWordWrap(True) layVMsg = QVBoxLayout() layVMsg.addWidget(self.lblMsg) self.frmMsg = QFrame(self) self.frmMsg.setLayout(layVMsg) layVFrm = QVBoxLayout() layVFrm.addWidget(self.frmMsg) layVFrm.setContentsMargins(*params['wdg_margins']) # ---------------------------------------------------------------------- # LAYOUT for input specifications and buttons # ---------------------------------------------------------------------- layVMain = QVBoxLayout(self) layVMain.addLayout(layHButtons1) # <Load> & <Save> buttons layVMain.addWidget(self.sel_fil) # Design method (IIR - ellip, ...) layVMain.addLayout(layHButtons2) # <Design> & <Quit> buttons layVMain.addWidget(self.f_units) # Frequency units layVMain.addWidget(self.t_specs) # Target specs layVMain.addWidget(self.f_specs) # Freq. specifications layVMain.addWidget(self.a_specs) # Amplitude specs layVMain.addWidget(self.w_specs) # Weight specs layVMain.addLayout(layVFrm) # Text message layVMain.addStretch() layVMain.setContentsMargins(*params['wdg_margins']) self.setLayout(layVMain) # main layout of widget # ---------------------------------------------------------------------- # GLOBAL SIGNALS & SLOTs # ---------------------------------------------------------------------- self.sig_rx.connect(self.process_sig_rx) # ---------------------------------------------------------------------- # LOCAL SIGNALS & SLOTs # ---------------------------------------------------------------------- self.sig_rx_local.connect(self.process_sig_rx_local) self.butLoadFilt.clicked.connect(lambda: load_filter(self)) self.butSaveFilt.clicked.connect(lambda: save_filter(self)) self.butDesignFilt.clicked.connect(self.start_design_filt) self.butQuit.clicked.connect(self.quit_program) # emit 'quit_program' # ---------------------------------------------------------------------- self.update_UI() # first time initialization self.start_design_filt() # design first filter using default values
def _construct_UI(self): """ Construct User Interface from all input subwidgets """ # Subwidget for selecting filter with response type rt (LP, ...), # filter type ft (IIR, ...) and filter class fc (cheby1, ...) self.sel_fil = select_filter.SelectFilter(self) self.sel_fil.setObjectName("select_filter") # Subwidget for selecting the frequency unit and range self.f_units = freq_units.FreqUnits(self) self.f_units.setObjectName("freq_units") # Subwidget for Frequency Specs self.f_specs = freq_specs.FreqSpecs(self) self.f_specs.setObjectName("freq_specs") # Subwidget for Amplitude Specs self.a_specs = amplitude_specs.AmplitudeSpecs(self) self.a_specs.setObjectName("amplitude_specs") # Subwidget for Weight Specs self.w_specs = weight_specs.WeightSpecs(self) self.w_specs.setObjectName("weight_specs") # Subwidget for target specs (frequency and amplitude) self.t_specs = target_specs.TargetSpecs(self, title="Target Specifications") self.t_specs.setObjectName("target_specs") # Subwidget for displaying infos on the design method self.lblMsg = QLabel(self) self.lblMsg.setWordWrap(True) layVMsg = QVBoxLayout() layVMsg.addWidget(self.lblMsg) self.frmMsg = QFrame(self) self.frmMsg.setLayout(layVMsg) layVFrm = QVBoxLayout() layVFrm.addWidget(self.frmMsg) layVFrm.setContentsMargins(*params['wdg_margins']) self.butDesignFilt = QPushButton("DESIGN FILTER", self) self.butQuit = QPushButton("Quit", self) layHButtons = QHBoxLayout() layHButtons.addWidget(self.butDesignFilt) # <Design Filter> button layHButtons.addWidget(self.butQuit) # <Quit> button layHButtons.setContentsMargins(*params['wdg_margins']) #---------------------------------------------------------------------- # LAYOUT for input specifications and buttons #---------------------------------------------------------------------- layVMain = QVBoxLayout(self) layVMain.addWidget(self.sel_fil) # Design method (IIR - ellip, ...) layVMain.addLayout(layHButtons) # <Design> & <Quit> buttons layVMain.addWidget(self.f_units) # Frequency units layVMain.addWidget(self.t_specs) # Target specs layVMain.addWidget(self.f_specs) # Freq. specifications layVMain.addWidget(self.a_specs) # Amplitude specs layVMain.addWidget(self.w_specs) # Weight specs layVMain.addLayout(layVFrm) # Text message layVMain.addStretch() layVMain.setContentsMargins(*params['wdg_margins']) self.setLayout(layVMain) # main layout of widget #---------------------------------------------------------------------- # SIGNALS & SLOTS # # Changing the filter design requires updating UI because number or # kind of input fields changes -> Call update_all_UIs, emitting # sigFilterChanged when it's finished self.sel_fil.sigFiltChanged.connect(self.update_UI) # Changing the frequency unit requires re-display of frequency specs # but it does not influence the actual specs (no specsChanged ) self.f_units.sigUnitChanged.connect(self.f_specs.load_dict) self.f_units.sigUnitChanged.connect(self.t_specs.load_dict) self.f_units.sigUnitChanged.connect(self.sigViewChanged) # Activating the "Sort" button triggers sigSpecsChanged, requiring # sorting and storing the frequency entries self.f_units.sigSpecsChanged.connect(self.f_specs.sort_dict_freqs) self.f_units.sigSpecsChanged.connect( self.t_specs.f_specs.sort_dict_freqs) # Changing filter parameters / specs requires reloading of parameters # in other hierarchy levels, e.g. in the plot tabs # bundle sigSpecsChanged signals and propagate to next hierarchy level # self.f_units.sigSpecsChanged.connect(self.sigSpecsChanged) self.f_specs.sigSpecsChanged.connect(self.sigSpecsChanged) self.t_specs.sigSpecsChanged.connect(self.sigSpecsChanged) self.a_specs.sigSpecsChanged.connect(self.sigSpecsChanged) self.a_specs.sigUnitChanged.connect(self.sigViewChanged) self.w_specs.sigSpecsChanged.connect(self.sigSpecsChanged) # Other signal-slot connections self.butDesignFilt.clicked.connect(self.start_design_filt) self.butQuit.clicked.connect( self.sigQuit) # pass on to main application #---------------------------------------------------------------------- self.update_UI() # first time initialization self.start_design_filt() # design first filter using default values