119 lines
3.7 KiB
Python
119 lines
3.7 KiB
Python
import json
|
|
import os
|
|
|
|
from PyQt6.QtCore import Qt, pyqtSlot
|
|
from PyQt6.QtMultimedia import QMediaDevices
|
|
from PyQt6.QtWidgets import QAbstractItemView, QDialog, QListWidgetItem
|
|
|
|
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
|