#!/usr/bin/env python3 import faulthandler import os import signal import sys from typing import Any, cast from PyQt6.QtCore import QResource, QSettings, Qt, pyqtSlot from PyQt6.QtGui import QFontDatabase from PyQt6.QtSql import QSqlDatabase, QSqlQuery from PyQt6.QtWidgets import QApplication, QScrollArea from lib import Word from lib.sounds import SoundOff from lib.utils import query_error from lib.words import Definition class DefinitionArea(QScrollArea): def __init__(self, w: Word, *args: Any, **kwargs: Any) -> None: super(DefinitionArea, self).__init__(*args, *kwargs) self.definition = Definition(w) self.setWidget(self.definition) self.setWidgetResizable(True) self.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOn) self.definition.newWord.connect(self.newWord) return @pyqtSlot(str) def newWord(self, word:str) -> None: print(f"newWord: {word}") w = Word(word) self.definition.setWord(w) return def closeEvent(self, event): settings = QSettings("Troglodite", "esl_reader") settings.setValue("geometry", self.saveGeometry()) super(DefinitionArea, self).closeEvent(event) return def main() -> int: db = QSqlDatabase() db = db.addDatabase("QSQLITE") db.setDatabaseName("test.db") if not db.open(): raise Exception(db.lastError()) app = QApplication(sys.argv) # # Set Default settings # settings = QSettings("Troglodite", "esl_reader") settings.beginGroup("font") if not settings.contains("display/url"): settings.setValue( "display/url", ":/fonts/opendyslexic/OpenDyslexic-Regular.otf" ) if not settings.contains("display/name"): settings.setValue("display/name", "OpenDyslexic") if not settings.contains("phonic/name"): settings.setValue("phonic/name", "Gentium") settings.endGroup() if not settings.contains("keys/mw-api"): settings.setValue("keys/mw-api", "51d9df34-ee13-489e-8656-478c215e846c") # # Setup resources # if not QResource.registerResource( os.path.join(os.path.dirname(__file__), "ui/resources.rcc"), "/" ): raise Exception("Unable to register resources.rcc") settings.beginGroup("font") for name in settings.childGroups(): if settings.contains(f"{name}/url"): QFontDatabase.addApplicationFont(settings.value(f"{name}/url")) settings.endGroup() query = QSqlQuery() if not query.exec( "CREATE TABLE IF NOT EXISTS words " "(word_id INTEGER PRIMARY KEY AUTOINCREMENT, " "word TEXT, source TEXT, definition TEXT)" ): query_error(query) word = Word("lower") snd = SoundOff() print("Pre widget") widget = DefinitionArea(word) # xnoqa: F841 print("post widget") settings = QSettings("Troglodite", "esl_reader") geometry = settings.value("geometry") if geometry is not None: widget.restoreGeometry(geometry) d = cast(Definition, widget.widget()) assert d is not None d.pronounce.connect(snd.playSound) widget.show() return app.exec() if __name__ == "__main__": faulthandler.register(signal.Signals.SIGUSR1) faulthandler.register(signal.Signals.SIGTERM) faulthandler.register(signal.Signals.SIGHUP) faulthandler.enable() sys.exit(main())