def widget_select(self, item): if self.audiowidget is not None: self.audiowidget.close() self.audiowidget.deleteLater() self.type = item if item is 0: self.audiowidget = Levels_Widget(self, self.logger) elif item is 1: self.audiowidget = Scope_Widget(self, self.logger) elif item is 2: self.audiowidget = Spectrum_Widget(self, self.logger) elif item is 3: self.audiowidget = Spectrogram_Widget(self, self.parent().parent().audiobackend, self.logger) elif item is 4: self.audiowidget = OctaveSpectrum_Widget(self, self.logger) elif item is 5: self.audiowidget = Generator_Widget(self, self.parent().parent().audiobackend, self.logger) elif item is 6: self.audiowidget = Delay_Estimator_Widget(self, self.logger) elif item is 7: self.audiowidget = LongLevelWidget(self, self.logger) else: self.audiowidget = Levels_Widget(self, self.logger) self.audiowidget.set_buffer(self.parent().parent().audiobuffer) self.parent().parent().audiobuffer.new_data_available.connect(self.audiowidget.handle_new_data) self.layout.addWidget(self.audiowidget) self.control_bar.combobox_select.setCurrentIndex(item)
def widget_select(self, item): if self.audiowidget is not None: self.audiowidget.close() self.audiowidget.deleteLater() self.type = item if item is 0: self.audiowidget = Levels_Widget(self, self.logger) elif item is 1: self.audiowidget = Scope_Widget(self, self.sharedGLWidget, self.logger) elif item is 2: self.audiowidget = Spectrum_Widget(self, self.sharedGLWidget, self.logger) elif item is 3: self.audiowidget = Spectrogram_Widget(self, self.parent().audiobackend, self.logger) elif item is 4: self.audiowidget = OctaveSpectrum_Widget(self, self.logger) elif item is 5: self.audiowidget = Generator_Widget(self, self.parent().audiobackend, self.logger) elif item is 6: self.audiowidget = Delay_Estimator_Widget(self, self.logger) self.audiowidget.set_buffer(self.parent().audiobuffer) self.layout.addWidget(self.audiowidget) self.controlBar.comboBox_select.setCurrentIndex(item)
def widget_select(self, item): if self.audiowidget is not None: self.audiowidget.close() self.type = item if item is 0: self.audiowidget = Levels_Widget(self, self.logger) elif item is 1: self.audiowidget = Scope_Widget(self, self.logger) elif item is 2: self.audiowidget = Spectrum_Widget(self, self.logger) elif item is 3: self.audiowidget = Spectrogram_Widget(self, self.logger) self.audiowidget.timer.start() elif item is 4: self.audiowidget = OctaveSpectrum_Widget(self, self.logger) elif item is 5: self.audiowidget = Generator_Widget( self, self.parent.parent().audiobackend, self.logger) self.audiowidget.set_buffer(self.parent.parent().audiobuffer) if self.audiowidget.update is not None: self.connect(self.parent.parent().display_timer, QtCore.SIGNAL('timeout()'), self.audiowidget.update) self.layout.addWidget(self.audiowidget) self.controlBar.comboBox_select.setCurrentIndex(item)
def widget_select(self, item): if self.audiowidget is not None: self.audiowidget.close() self.audiowidget.deleteLater() self.type = item if item is 0: self.audiowidget = Levels_Widget(self, self.logger) elif item is 1: self.audiowidget = Scope_Widget(self, self.logger) elif item is 2: self.audiowidget = Spectrum_Widget(self, self.logger) elif item is 3: self.audiowidget = Spectrogram_Widget(self, self.parent().audiobackend, self.logger) elif item is 4: self.audiowidget = OctaveSpectrum_Widget(self, self.logger) elif item is 5: self.audiowidget = Generator_Widget(self, self.parent().audiobackend, self.logger) elif item is 6: self.audiowidget = Delay_Estimator_Widget(self, self.logger) elif item is 7: self.audiowidget = LongLevelWidget(self, self.logger) else: self.audiowidget = Levels_Widget(self, self.logger) self.audiowidget.set_buffer(self.parent().audiobuffer) self.parent().audiobuffer.new_data_available.connect( self.audiowidget.handle_new_data) self.layout.addWidget(self.audiowidget) self.control_bar.combobox_select.setCurrentIndex(item)
class Dock(QtWidgets.QDockWidget): def __init__(self, parent, logger, name, widget_type=0): super().__init__(name, parent) self.setObjectName(name) self.logger = logger self.control_bar = ControlBar(self) self.control_bar.combobox_select.activated.connect(self.widget_select) self.control_bar.settings_button.clicked.connect(self.settings_slot) self.dockwidget = QtWidgets.QWidget(self) self.layout = QtWidgets.QVBoxLayout(self.dockwidget) self.layout.addWidget(self.control_bar) self.layout.setContentsMargins(0, 0, 0, 0) self.dockwidget.setLayout(self.layout) self.setWidget(self.dockwidget) self.audiowidget = None self.widget_select(widget_type) # note that by default the closeEvent is accepted, no need to do it explicitely def closeEvent(self, event): self.parent().dockmanager.close_dock(self) # slot def widget_select(self, item): if self.audiowidget is not None: self.audiowidget.close() self.audiowidget.deleteLater() self.type = item if item is 0: self.audiowidget = Levels_Widget(self, self.logger) elif item is 1: self.audiowidget = Scope_Widget(self, self.logger) elif item is 2: self.audiowidget = Spectrum_Widget(self, self.logger) elif item is 3: self.audiowidget = Spectrogram_Widget(self, self.parent().audiobackend, self.logger) elif item is 4: self.audiowidget = OctaveSpectrum_Widget(self, self.logger) elif item is 5: self.audiowidget = Generator_Widget(self, self.parent().audiobackend, self.logger) elif item is 6: self.audiowidget = Delay_Estimator_Widget(self, self.logger) elif item is 7: self.audiowidget = LongLevelWidget(self, self.logger) else: self.audiowidget = Levels_Widget(self, self.logger) self.audiowidget.set_buffer(self.parent().audiobuffer) self.parent().audiobuffer.new_data_available.connect( self.audiowidget.handle_new_data) self.layout.addWidget(self.audiowidget) self.control_bar.combobox_select.setCurrentIndex(item) def canvasUpdate(self): if self.audiowidget is not None: self.audiowidget.canvasUpdate() def pause(self): if self.audiowidget is not None: self.audiowidget.pause() def restart(self): if self.audiowidget is not None: self.audiowidget.restart() # slot def settings_slot(self, checked): self.audiowidget.settings_called(checked) # method def saveState(self, settings): settings.setValue("type", self.type) self.audiowidget.saveState(settings) # method def restoreState(self, settings): widget_type = settings.value("type", 0, type=int) self.widget_select(widget_type) self.audiowidget.restoreState(settings)
def __init__(self): QMainWindow.__init__(self) self.logger = logging.getLogger(__name__) # exception hook that logs to console, file, and display a message box self.errorDialogOpened = False sys.excepthook = self.excepthook # Setup the user interface self.ui = Ui_MainWindow() self.ui.setupUi(self) # Initialize the audio data ring buffer self.audiobuffer = AudioBuffer() # Initialize the audio backend # signal containing new data from the audio callback thread, processed as numpy array AudioBackend().new_data_available.connect( self.audiobuffer.handle_new_data) # this timer is used to update widgets that just need to display as fast as they can self.display_timer = QtCore.QTimer() self.display_timer.setInterval( SMOOTH_DISPLAY_TIMER_PERIOD_MS) # constant timing # slow timer self.slow_timer = QtCore.QTimer() self.slow_timer.setInterval(SLOW_TIMER_PERIOD_MS) # constant timing self.about_dialog = About_Dialog(self, self.slow_timer) self.settings_dialog = Settings_Dialog(self) self.level_widget = Levels_Widget(self) self.level_widget.set_buffer(self.audiobuffer) self.audiobuffer.new_data_available.connect( self.level_widget.handle_new_data) self.hboxLayout = QHBoxLayout(self.ui.centralwidget) self.hboxLayout.setContentsMargins(0, 0, 0, 0) self.hboxLayout.addWidget(self.level_widget) self.centralLayout = TileLayout() self.centralLayout.setContentsMargins(0, 0, 0, 0) self.hboxLayout.addLayout(self.centralLayout) self.dockmanager = DockManager(self) # timer ticks self.display_timer.timeout.connect(self.dockmanager.canvasUpdate) self.display_timer.timeout.connect(self.level_widget.canvasUpdate) self.display_timer.timeout.connect(AudioBackend().fetchAudioData) # toolbar clicks self.ui.actionStart.triggered.connect(self.timer_toggle) self.ui.actionSettings.triggered.connect(self.settings_called) self.ui.actionAbout.triggered.connect(self.about_called) self.ui.actionNew_dock.triggered.connect(self.dockmanager.new_dock) # restore the settings and widgets geometries self.restoreAppState() # make sure the toolbar is shown # in case it was closed by mistake (before it was made impossible) self.ui.toolBar.setVisible(True) # prevent from hiding or moving the toolbar self.ui.toolBar.toggleViewAction().setVisible(True) self.ui.toolBar.setMovable(False) self.ui.toolBar.setFloatable(False) # start timers self.timer_toggle() self.slow_timer.start() self.logger.info("Init finished, entering the main loop")
class Friture( QMainWindow, ): def __init__(self): QMainWindow.__init__(self) self.logger = logging.getLogger(__name__) # exception hook that logs to console, file, and display a message box self.errorDialogOpened = False sys.excepthook = self.excepthook # Setup the user interface self.ui = Ui_MainWindow() self.ui.setupUi(self) # Initialize the audio data ring buffer self.audiobuffer = AudioBuffer() # Initialize the audio backend # signal containing new data from the audio callback thread, processed as numpy array AudioBackend().new_data_available.connect( self.audiobuffer.handle_new_data) # this timer is used to update widgets that just need to display as fast as they can self.display_timer = QtCore.QTimer() self.display_timer.setInterval( SMOOTH_DISPLAY_TIMER_PERIOD_MS) # constant timing # slow timer self.slow_timer = QtCore.QTimer() self.slow_timer.setInterval(SLOW_TIMER_PERIOD_MS) # constant timing self.about_dialog = About_Dialog(self, self.slow_timer) self.settings_dialog = Settings_Dialog(self) self.level_widget = Levels_Widget(self) self.level_widget.set_buffer(self.audiobuffer) self.audiobuffer.new_data_available.connect( self.level_widget.handle_new_data) self.hboxLayout = QHBoxLayout(self.ui.centralwidget) self.hboxLayout.setContentsMargins(0, 0, 0, 0) self.hboxLayout.addWidget(self.level_widget) self.centralLayout = TileLayout() self.centralLayout.setContentsMargins(0, 0, 0, 0) self.hboxLayout.addLayout(self.centralLayout) self.dockmanager = DockManager(self) # timer ticks self.display_timer.timeout.connect(self.dockmanager.canvasUpdate) self.display_timer.timeout.connect(self.level_widget.canvasUpdate) self.display_timer.timeout.connect(AudioBackend().fetchAudioData) # toolbar clicks self.ui.actionStart.triggered.connect(self.timer_toggle) self.ui.actionSettings.triggered.connect(self.settings_called) self.ui.actionAbout.triggered.connect(self.about_called) self.ui.actionNew_dock.triggered.connect(self.dockmanager.new_dock) # restore the settings and widgets geometries self.restoreAppState() # make sure the toolbar is shown # in case it was closed by mistake (before it was made impossible) self.ui.toolBar.setVisible(True) # prevent from hiding or moving the toolbar self.ui.toolBar.toggleViewAction().setVisible(True) self.ui.toolBar.setMovable(False) self.ui.toolBar.setFloatable(False) # start timers self.timer_toggle() self.slow_timer.start() self.logger.info("Init finished, entering the main loop") # exception hook that logs to console, file, and display a message box def excepthook(self, exception_type, exception_value, traceback_object): gui_message = fileexcepthook(exception_type, exception_value, traceback_object) # we do not want to flood the user with message boxes when the error happens repeatedly on each timer event if not self.errorDialogOpened: self.errorDialogOpened = True errorBox(gui_message) self.errorDialogOpened = False # slot def settings_called(self): self.settings_dialog.show() # slot def about_called(self): self.about_dialog.show() # event handler def closeEvent(self, event): AudioBackend().close() self.saveAppState() event.accept() # method def saveAppState(self): settings = QtCore.QSettings("Friture", "Friture") settings.beginGroup("Docks") self.dockmanager.saveState(settings) settings.endGroup() settings.beginGroup("MainWindow") windowGeometry = self.saveGeometry() settings.setValue("windowGeometry", windowGeometry) windowState = self.saveState() settings.setValue("windowState", windowState) settings.endGroup() settings.beginGroup("AudioBackend") self.settings_dialog.saveState(settings) settings.endGroup() # method def migrateSettings(self): settings = QtCore.QSettings("Friture", "Friture") # 1. move the central widget to a normal dock if settings.contains("CentralWidget/type"): settings.beginGroup("CentralWidget") centralWidgetKeys = settings.allKeys() children = { key: settings.value(key, type=QtCore.QVariant) for key in centralWidgetKeys } settings.endGroup() if not settings.contains("Docks/central/type"): # write them to a new dock instead for key, value in children.items(): settings.setValue("Docks/central/" + key, value) # add the new dock name to dockNames docknames = settings.value("Docks/dockNames", []) docknames = ["central"] + docknames settings.setValue("Docks/dockNames", docknames) settings.remove("CentralWidget") # 2. remove any level widget if settings.contains("Docks/dockNames"): docknames = settings.value("Docks/dockNames", []) if docknames == None: docknames = [] newDockNames = [] for dockname in docknames: widgetType = settings.value("Docks/" + dockname + "/type", 0, type=int) if widgetType == 0: settings.remove("Docks/" + dockname) else: newDockNames.append(dockname) settings.setValue("Docks/dockNames", newDockNames) # method def restoreAppState(self): self.migrateSettings() settings = QtCore.QSettings("Friture", "Friture") settings.beginGroup("Docks") self.dockmanager.restoreState(settings) settings.endGroup() settings.beginGroup("MainWindow") self.restoreGeometry( settings.value("windowGeometry", type=QtCore.QByteArray)) self.restoreState(settings.value("windowState", type=QtCore.QByteArray)) settings.endGroup() settings.beginGroup("AudioBackend") self.settings_dialog.restoreState(settings) settings.endGroup() # slot def timer_toggle(self): if self.display_timer.isActive(): self.logger.info("Timer stop") self.display_timer.stop() self.ui.actionStart.setText("Start") AudioBackend().pause() self.dockmanager.pause() else: self.logger.info("Timer start") self.display_timer.start() self.ui.actionStart.setText("Stop") AudioBackend().restart() self.dockmanager.restart()
class CentralWidget(QtWidgets.QWidget): def __init__(self, parent, logger, name, widget_type=0): super().__init__(parent) self.setObjectName(name) self.logger = logger self.control_bar = ControlBar(self) self.control_bar.combobox_select.activated.connect(self.widget_select) self.control_bar.settings_button.clicked.connect(self.settings_slot) self.label = QtWidgets.QLabel(self) self.label.setText( " Central dock ") # spaces before and after for nicer alignment self.control_bar.layout.insertWidget(0, self.label) self.layout = QtWidgets.QVBoxLayout(self) self.layout.addWidget(self.control_bar) self.layout.setContentsMargins(0, 0, 0, 0) self.setLayout(self.layout) self.audiowidget = None self.widget_select(widget_type) # slot def widget_select(self, item): if self.audiowidget is not None: self.audiowidget.close() self.audiowidget.deleteLater() self.type = item if item is 0: self.audiowidget = Levels_Widget(self, self.logger) elif item is 1: self.audiowidget = Scope_Widget(self, self.logger) elif item is 2: self.audiowidget = Spectrum_Widget(self, self.logger) elif item is 3: self.audiowidget = Spectrogram_Widget( self, self.parent().parent().audiobackend, self.logger) elif item is 4: self.audiowidget = OctaveSpectrum_Widget(self, self.logger) elif item is 5: self.audiowidget = Generator_Widget( self, self.parent().parent().audiobackend, self.logger) elif item is 6: self.audiowidget = Delay_Estimator_Widget(self, self.logger) elif item is 7: self.audiowidget = LongLevelWidget(self, self.logger) else: self.audiowidget = Levels_Widget(self, self.logger) self.audiowidget.set_buffer(self.parent().parent().audiobuffer) self.parent().parent().audiobuffer.new_data_available.connect( self.audiowidget.handle_new_data) self.layout.addWidget(self.audiowidget) self.control_bar.combobox_select.setCurrentIndex(item) def canvasUpdate(self): if self.audiowidget is not None: self.audiowidget.canvasUpdate() def pause(self): if self.audiowidget is not None: try: self.audiowidget.pause() except AttributeError: pass def restart(self): if self.audiowidget is not None: try: self.audiowidget.restart() except AttributeError: pass # slot def settings_slot(self, checked): self.audiowidget.settings_called(checked) # method def saveState(self, settings): settings.setValue("type", self.type) self.audiowidget.saveState(settings) # method def restoreState(self, settings): widget_type = settings.value("type", DEFAULT_CENTRAL_WIDGET, type=int) self.widget_select(widget_type) self.audiowidget.restoreState(settings)
class CentralWidget(QtWidgets.QWidget): def __init__(self, parent, logger, name, widget_type=0): super().__init__(parent) self.setObjectName(name) self.logger = logger self.control_bar = ControlBar(self) self.control_bar.combobox_select.activated.connect(self.widget_select) self.control_bar.settings_button.clicked.connect(self.settings_slot) self.label = QtWidgets.QLabel(self) self.label.setText(" Central dock ") # spaces before and after for nicer alignment self.control_bar.layout.insertWidget(0, self.label) self.layout = QtWidgets.QVBoxLayout(self) self.layout.addWidget(self.control_bar) self.layout.setContentsMargins(0, 0, 0, 0) self.setLayout(self.layout) self.audiowidget = None self.widget_select(widget_type) # slot def widget_select(self, item): if self.audiowidget is not None: self.audiowidget.close() self.audiowidget.deleteLater() self.type = item if item is 0: self.audiowidget = Levels_Widget(self, self.logger) elif item is 1: self.audiowidget = Scope_Widget(self, self.logger) elif item is 2: self.audiowidget = Spectrum_Widget(self, self.logger) elif item is 3: self.audiowidget = Spectrogram_Widget(self, self.parent().parent().audiobackend, self.logger) elif item is 4: self.audiowidget = OctaveSpectrum_Widget(self, self.logger) elif item is 5: self.audiowidget = Generator_Widget(self, self.parent().parent().audiobackend, self.logger) elif item is 6: self.audiowidget = Delay_Estimator_Widget(self, self.logger) elif item is 7: self.audiowidget = LongLevelWidget(self, self.logger) else: self.audiowidget = Levels_Widget(self, self.logger) self.audiowidget.set_buffer(self.parent().parent().audiobuffer) self.parent().parent().audiobuffer.new_data_available.connect(self.audiowidget.handle_new_data) self.layout.addWidget(self.audiowidget) self.control_bar.combobox_select.setCurrentIndex(item) def canvasUpdate(self): if self.audiowidget is not None: self.audiowidget.canvasUpdate() def pause(self): if self.audiowidget is not None: try: self.audiowidget.pause() except AttributeError: pass def restart(self): if self.audiowidget is not None: try: self.audiowidget.restart() except AttributeError: pass # slot def settings_slot(self, checked): self.audiowidget.settings_called(checked) # method def saveState(self, settings): settings.setValue("type", self.type) self.audiowidget.saveState(settings) # method def restoreState(self, settings): widget_type = settings.value("type", DEFAULT_CENTRAL_WIDGET, type=int) self.widget_select(widget_type) self.audiowidget.restoreState(settings)
class Dock(QtWidgets.QDockWidget): def __init__(self, parent, logger, name, widget_type=0): super().__init__(name, parent) self.setObjectName(name) self.logger = logger self.control_bar = ControlBar(self) self.control_bar.combobox_select.activated.connect(self.widget_select) self.control_bar.settings_button.clicked.connect(self.settings_slot) self.dockwidget = QtWidgets.QWidget(self) self.layout = QtWidgets.QVBoxLayout(self.dockwidget) self.layout.addWidget(self.control_bar) self.layout.setContentsMargins(0, 0, 0, 0) self.dockwidget.setLayout(self.layout) self.setWidget(self.dockwidget) self.audiowidget = None self.widget_select(widget_type) # note that by default the closeEvent is accepted, no need to do it explicitely def closeEvent(self, event): self.parent().dockmanager.close_dock(self) # slot def widget_select(self, item): if self.audiowidget is not None: self.audiowidget.close() self.audiowidget.deleteLater() self.type = item if item is 0: self.audiowidget = Levels_Widget(self, self.logger) elif item is 1: self.audiowidget = Scope_Widget(self, self.logger) elif item is 2: self.audiowidget = Spectrum_Widget(self, self.logger) elif item is 3: self.audiowidget = Spectrogram_Widget(self, self.parent().audiobackend, self.logger) elif item is 4: self.audiowidget = OctaveSpectrum_Widget(self, self.logger) elif item is 5: self.audiowidget = Generator_Widget(self, self.parent().audiobackend, self.logger) elif item is 6: self.audiowidget = Delay_Estimator_Widget(self, self.logger) elif item is 7: self.audiowidget = LongLevelWidget(self, self.logger) else: self.audiowidget = Levels_Widget(self, self.logger) self.audiowidget.set_buffer(self.parent().audiobuffer) self.parent().audiobuffer.new_data_available.connect(self.audiowidget.handle_new_data) self.layout.addWidget(self.audiowidget) self.control_bar.combobox_select.setCurrentIndex(item) def canvasUpdate(self): if self.audiowidget is not None: self.audiowidget.canvasUpdate() def pause(self): if self.audiowidget is not None: self.audiowidget.pause() def restart(self): if self.audiowidget is not None: self.audiowidget.restart() # slot def settings_slot(self, checked): self.audiowidget.settings_called(checked) # method def saveState(self, settings): settings.setValue("type", self.type) self.audiowidget.saveState(settings) # method def restoreState(self, settings): widget_type = settings.value("type", 0) self.widget_select(widget_type) self.audiowidget.restoreState(settings)