Fix #2086609 [[Enhancement] Add Restore defaults button to the Configure Read aloud window](https://bugs.launchpad.net/calibre/+bug/2086609)

This commit is contained in:
Kovid Goyal 2024-11-04 19:43:48 +05:30
parent 327c5c86de
commit 0d37f50833
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 34 additions and 8 deletions

View File

@ -5,6 +5,7 @@ from qt.core import (
QAbstractItemView, QAbstractItemView,
QCheckBox, QCheckBox,
QDialog, QDialog,
QDialogButtonBox,
QDoubleSpinBox, QDoubleSpinBox,
QFont, QFont,
QFormLayout, QFormLayout,
@ -39,6 +40,8 @@ from calibre.gui2.tts.types import (
) )
from calibre.gui2.widgets2 import Dialog, QComboBox from calibre.gui2.widgets2 import Dialog, QComboBox
embedding_engine_name = 'piper'
class EngineChoice(QWidget): class EngineChoice(QWidget):
@ -63,6 +66,9 @@ class EngineChoice(QWidget):
ec.currentIndexChanged.connect(self.current_changed) ec.currentIndexChanged.connect(self.current_changed)
self.update_description() self.update_description()
def restore_defaults(self):
self.engine_choice.setCurrentIndex(0)
@property @property
def value(self) -> str: def value(self) -> str:
return self.engine_choice.currentData() return self.engine_choice.currentData()
@ -347,23 +353,35 @@ class EngineSpecificConfig(QWidget):
if self.engine_name and self.engine_name != engine_name: if self.engine_name and self.engine_name != engine_name:
self.engine_specific_settings[self.engine_name] = self.as_settings() self.engine_specific_settings[self.engine_name] = self.as_settings()
self.engine_name = engine_name self.engine_name = engine_name
metadata = available_engines()[engine_name]
tts = create_tts_backend(force_engine=engine_name)
if engine_name not in self.voice_data: if engine_name not in self.voice_data:
tts = create_tts_backend(force_engine=engine_name)
self.voice_data[engine_name] = tts.available_voices self.voice_data[engine_name] = tts.available_voices
if self.for_embedding: if self.for_embedding:
self.engine_specific_settings[engine_name] = EngineSpecificSettings.create_from_config(engine_name, TTS_EMBEDED_CONFIG) self.engine_specific_settings[engine_name] = EngineSpecificSettings.create_from_config(engine_name, TTS_EMBEDED_CONFIG)
else: else:
self.engine_specific_settings[engine_name] = EngineSpecificSettings.create_from_config(engine_name) self.engine_specific_settings[engine_name] = EngineSpecificSettings.create_from_config(engine_name)
self.default_output_modules[engine_name] = tts.default_output_module self.default_output_modules[engine_name] = tts.default_output_module
return self.initialize_widgets_from_settings()
def restore_defaults(self):
if self.for_embedding:
self.engine_specific_settings[embedding_engine_name] = EngineSpecificSettings.create_from_config(embedding_engine_name, TTS_EMBEDED_CONFIG)
else:
for engine_name in available_engines():
self.engine_specific_settings[engine_name] = EngineSpecificSettings.create_from_prefs(engine_name)
self.initialize_widgets_from_settings()
def initialize_widgets_from_settings(self):
tts = create_tts_backend(force_engine=self.engine_name)
metadata = available_engines()[self.engine_name]
self.output_module.blockSignals(True) self.output_module.blockSignals(True)
self.output_module.clear() self.output_module.clear()
if metadata.has_multiple_output_modules: if metadata.has_multiple_output_modules:
self.layout().setRowVisible(self.output_module, True) self.layout().setRowVisible(self.output_module, True)
self.output_module.addItem(_('System default (currently {})').format(tts.default_output_module), '') self.output_module.addItem(_('System default (currently {})').format(tts.default_output_module), '')
for om in self.voice_data[engine_name]: for om in self.voice_data[self.engine_name]:
self.output_module.addItem(om, om) self.output_module.addItem(om, om)
if (idx := self.output_module.findData(self.engine_specific_settings[engine_name].output_module)) > -1: if (idx := self.output_module.findData(self.engine_specific_settings[self.engine_name].output_module)) > -1:
self.output_module.setCurrentIndex(idx) self.output_module.setCurrentIndex(idx)
else: else:
self.layout().setRowVisible(self.output_module, False) self.layout().setRowVisible(self.output_module, False)
@ -394,7 +412,7 @@ class EngineSpecificConfig(QWidget):
self.audio_device.addItem(_('System default (currently {})').format(self.default_audio_device.description), '') self.audio_device.addItem(_('System default (currently {})').format(self.default_audio_device.description), '')
for ad in self.all_audio_devices: for ad in self.all_audio_devices:
self.audio_device.addItem(ad.description, ad.id.hex()) self.audio_device.addItem(ad.description, ad.id.hex())
if cad := self.engine_specific_settings[engine_name].audio_device_id: if cad := self.engine_specific_settings[self.engine_name].audio_device_id:
if (idx := self.audio_device.findData(cad.id.hex())): if (idx := self.audio_device.findData(cad.id.hex())):
self.audio_device.setCurrentIndex(idx) self.audio_device.setCurrentIndex(idx)
self.layout().setRowVisible(self.audio_device, True) self.layout().setRowVisible(self.audio_device, True)
@ -483,9 +501,16 @@ class ConfigDialog(Dialog):
h = QHBoxLayout() h = QHBoxLayout()
l.addLayout(h) l.addLayout(h)
h.addWidget(b), h.addStretch(10), h.addWidget(self.bb) h.addWidget(b), h.addStretch(10), h.addWidget(self.bb)
self.restore_defaults_button = b = self.bb.addButton(_('Restore &defaults'), QDialogButtonBox.ButtonRole.ActionRole)
b.setToolTip(_('Restore all Read aloud settings ot their defaults'))
b.clicked.connect(self.restore_defaults)
self.initial_engine_choice = ec.value self.initial_engine_choice = ec.value
self.set_engine(self.initial_engine_choice) self.set_engine(self.initial_engine_choice)
def restore_defaults(self):
self.engine_choice.restore_defaults()
self.engine_specific_config.restore_defaults()
def set_engine(self, engine_name: str) -> None: def set_engine(self, engine_name: str) -> None:
metadata = self.engine_specific_config.set_engine(engine_name) metadata = self.engine_specific_config.set_engine(engine_name)
self.voice_button.setVisible(metadata.has_managed_voices) self.voice_button.setVisible(metadata.has_managed_voices)
@ -532,7 +557,7 @@ class EmbeddingConfig(QWidget):
self.l = l = QVBoxLayout(self) self.l = l = QVBoxLayout(self)
self.engine_specific_config = esc = EngineSpecificConfig(self, for_embedding=True) self.engine_specific_config = esc = EngineSpecificConfig(self, for_embedding=True)
l.addWidget(esc) l.addWidget(esc)
self.engine_specific_config.set_engine('piper') self.engine_specific_config.set_engine(embedding_engine_name)
def save_settings(self): def save_settings(self):
s = self.engine_specific_config.as_settings() s = self.engine_specific_config.as_settings()
@ -571,4 +596,4 @@ def develop():
if __name__ == '__main__': if __name__ == '__main__':
develop() develop_embedding()

View File

@ -133,7 +133,8 @@ class EngineSpecificSettings(NamedTuple):
preferred_voices: dict[str, str] | None = None preferred_voices: dict[str, str] | None = None
@classmethod @classmethod
def create_from_prefs(cls, engine_name: str, prefs: dict[str, object]) -> 'EngineSpecificSettings': def create_from_prefs(cls, engine_name: str, prefs: dict[str, object] | None = None) -> 'EngineSpecificSettings':
prefs = prefs or {}
adev = prefs.get('audio_device_id') adev = prefs.get('audio_device_id')
audio_device_id = None audio_device_id = None
if adev: if adev: