import json import os from PyQt6.QtCore import Qt, pyqtSlot from PyQt6.QtWidgets import QDialog, QListWidgetItem, QAbstractItemView from PyQt6.QtMultimedia import QMediaDevices from ui.Preferences import Ui_Dialog class Preferences(QDialog, Ui_Dialog): _instance = None def __new__(cls): if cls._instance: return cls._instance cls._instance = super(Preferences, cls).__new__(cls) return cls._instance @pyqtSlot(int) def done(self,r): self.hide() super().done(r) return @pyqtSlot() def exec(self): self.show() super().exec() return @pyqtSlot() def open(self): self.show() super().open() return def __init__(self, *args, **kwargs): super(Preferences, self).__init__(*args, **kwargs) self.setupUi(self) self.hide() # # Overrides # self.alertList.setSelectionMode(QAbstractItemView.SelectionMode.MultiSelection) self.playerList.setSelectionMode(QAbstractItemView.SelectionMode.MultiSelection) self.readerCombo.setEditable(False) self.phoneticsCombo.setEditable(False) # # End OverRides # for index, output in enumerate(QMediaDevices.audioOutputs()): identifier = output.id().data().decode("utf-8") description = output.description() self.alertList.addItem(description) self.playerList.addItem(description) self.setCurrent() return def setCurrent(self): if os.path.exists('preferences.json'): with open('preferences.json','r') as f: self.preferences = json.load(f) else: self.preferences = { 'readerFont': 'OpenDyslexic', 'phoneticFont': 'Gentium', 'alertOutputs': [ 'default' ], 'playerOutputs': [ 'Feed for virtual microphone' ] } for output in self.preferences['alertOutputs']: if output == 'default': output = QMediaDevices.defaultAudioOutput().description() for item in self.alertList.findItems(output,Qt.MatchFlag.MatchExactly): item.setSelected(True) for output in self.preferences['playerOutputs']: if output == 'default': output = QMediaDevices.defaultAudioOutput().description() for item in self.playerList.findItems(output,Qt.MatchFlag.MatchExactly ): item.setSelected(True) index = self.readerCombo.findText(self.preferences['readerFont']) if index >= 0: self.readerCombo.setCurrentIndex(index) index = self.phoneticsCombo.findText(self.preferences['phoneticFont']) if index >= 0: self.phoneticsCombo.setCurrentIndex(index) return def get(self, name:str =None): if not name: return self.preferences return self.preferences[name] def accept(self): self.preferences['readerFont'] = self.readerCombo.currentFont().family() self.preferences['phoneticFont'] =self.phoneticsCombo.currentFont().family() self.preferences['alertOutputs'] = [ x.data(Qt.ItemDataRole.DisplayRole) for x in self.alertList.selectedItems() ] self.preferences['playerOutputs'] = [ x.data(Qt.ItemDataRole.DisplayRole) for x in self.playerList.selectedItems() ] with open('preferences.json','w') as f: json.dump(self.preferences,f,indent=2) super().accept() return