checkpoint prior to class

This commit is contained in:
Christopher T. Johnson
2023-12-15 10:25:52 -05:00
parent a03289db51
commit 11c4801b7f
7 changed files with 181 additions and 58 deletions

View File

@@ -12,6 +12,7 @@ from PyQt6.QtCore import (
QResource,
Qt,
QTimer,
QUrl,
pyqtSignal,
pyqtSlot,
)
@@ -30,6 +31,7 @@ from PyQt6.QtGui import (
QTextDocument,
QTextListFormat,
)
from PyQt6.QtMultimedia import QAudioOutput, QMediaDevices, QMediaPlayer
from PyQt6.QtSql import QSqlDatabase, QSqlQuery, QSqlQueryModel
from PyQt6.QtWidgets import QDialog, QPushButton
@@ -43,6 +45,7 @@ class EditDialog(QDialog, Ui_Dialog):
sessionSignal = pyqtSignal()
displayedWord = pyqtSignal(int)
newParagraph = pyqtSignal(int, int)
soundEffect = QMediaPlayer()
def __init__(self, session, person_id: int) -> None:
self.session = session
@@ -60,6 +63,16 @@ class EditDialog(QDialog, Ui_Dialog):
#
# End overrides
#
audioOutput = QAudioOutput()
dev = None
for output in QMediaDevices.audioOutputs():
if output.id().data().decode("UTF-8") == "virt-input":
dev = output
break
if dev:
audioOutput.setDevice(dev)
self.audioOutput = audioOutput
self.soundEffect.setAudioOutput(audioOutput)
self.load_book(self.person_id)
blockNumber = self.block
self.paraEdit.setReadOnly(True)
@@ -74,7 +87,7 @@ class EditDialog(QDialog, Ui_Dialog):
# Connect widgets
#
self.defineBtn.clicked.connect(self.defineAction)
self.printBtn.clicked.connect(self.printAction)
self.playBtn.clicked.connect(self.playAction)
self.scrollBtn.clicked.connect(self.scrollAction)
self.nextBtn.clicked.connect(self.nextAction)
self.prevBtn.clicked.connect(self.prevAction)
@@ -87,11 +100,46 @@ class EditDialog(QDialog, Ui_Dialog):
#
self.displayedWord.connect(self.session.addWord)
self.newParagraph.connect(self.session.addBlock)
self.soundEffect.errorOccurred.connect(self.mediaError)
self.soundEffect.playbackStateChanged.connect(self.changedState)
self.soundEffect.mediaStatusChanged.connect(self.changedStatus)
return
#
# slots
#
@pyqtSlot(QMediaPlayer.MediaStatus)
def changedStatus(self, status):
if status == QMediaPlayer.MediaStatus.LoadedMedia:
self.soundEffect.play()
audioOutput = self.soundEffect.audioOutput()
if not audioOutput:
self.soundEffect.setAudioOutput(self.audioOutput)
audioOutput = self.audioOutput
print(f"{status} No audioOutput???")
audioDevice = audioOutput.device()
print(audioDevice.description(), audioDevice.id().data())
print(status)
return
@pyqtSlot(QMediaPlayer.PlaybackState)
def changedState(self, status):
audioOutput = self.soundEffect.audioOutput()
if not audioOutput:
print(f"{status} No AudioOutput")
return
audioDevice = audioOutput.device()
print(audioDevice.description(), audioDevice.id().data())
print(status)
return
@pyqtSlot(QMediaPlayer.Error, str)
def mediaError(self, error, string):
print(error)
print(string)
return
@pyqtSlot()
def sessionAction(self) -> None:
self.sessionSignal.emit()
@@ -99,48 +147,53 @@ class EditDialog(QDialog, Ui_Dialog):
return
@pyqtSlot()
def printAction(self) -> None:
html = "<!DOCTYPE html>\n<html>\n<head>\n"
html += (
'<link href="https://fonts.cdnfonts.com/css/open-dyslexic" rel="stylesheet">'
+ "\n"
)
html += (
'<link href="https://fonts.cdnfonts.com/css/tex-gyre-heros" rel="stylesheet">'
+ "\n"
)
html += '<style type="text/css">\n'
style = QResource(":/print.css").data().decode("utf-8")
html += style
html += "</style>\n</head>\n<body>\n"
query = QSqlQuery()
query.prepare(
"SELECT w.* FROM word_block wb "
"LEFT JOIN words w "
"ON (w.word_id = wb.word_id) "
"WHERE wb.section_id = :section_id "
"ORDER BY w.word COLLATE NOCASE"
)
query.bindValue(":section_id", self.section_id)
if not query.exec():
query_error(query)
while query.next():
word = query.value("word")
definition = json.loads(query.value("definition"))
html += self.defToHtml(word, definition)
html += "\n"
html += "<hr/>\n"
html += '<div class="text">' + "\n"
text = self.sections[self.section_map[self.section_id]]
text = re.sub(r"</?body>", "", text)
html += text
html += "\n</div>\n"
html += "\n</body>\n</html>\n"
qf = QFile("out.html")
if qf.open(QIODeviceBase.OpenModeFlag.WriteOnly):
qf.write(html.encode("utf-8"))
qf.close()
print("Printed!")
def playAction(self) -> None:
print("playAction")
idx = self.stackedWidget.currentIndex()
if idx == 0: # Reading
# find word
cursor = self.paraEdit.textCursor()
fmt = cursor.charFormat()
if not fmt.fontUnderline():
self.addword()
cursor = self.paraEdit.textCursor()
textBlock = self.paraEdit.document().findBlock(cursor.position())
blockNum = textBlock.blockNumber()
query = QSqlQuery()
query.prepare(
"SELECT w.* FROM word_block wb "
"LEFT JOIN words w "
"ON (w.word_id = wb.word_id) "
"WHERE :position BETWEEN wb.start AND wb.end "
"AND wb.block = :block AND wb.section_id = :section_id"
)
query.bindValue(
":position", cursor.position() - textBlock.position()
)
query.bindValue(":block", blockNum)
query.bindValue(":section_id", self.section_id)
if not query.exec():
query_error(query)
if not query.next():
return
data = json.loads(query.value("definition"))
if "phonetics" in data:
self.phonetics = data["phonetics"]
else:
self.phonetics = None
print("Checking for phonetics")
if not self.phonetics:
return
print("Looking for audio")
for entry in self.phonetics:
if len(entry["audio"]) > 0:
self.soundEffect.setSource(QUrl(entry["audio"]))
if (
self.soundEffect.mediaStatus()
== QMediaPlayer.MediaStatus.LoadedMedia
):
self.soundEffect.play()
return
return
@pyqtSlot()
@@ -230,7 +283,12 @@ class EditDialog(QDialog, Ui_Dialog):
def defToHtml(self, word: str, definition) -> str:
html = f'<h1 class="def-word">{word}</h1>' + "\n"
try:
html += f"<p class=\"phonetic\">{definition['phonetic']}</p>" + "\n"
words = []
for phonetic in definition["phonetics"]:
if phonetic["text"] in words:
continue
words.append(phonetic["text"])
html += f'<p class="phonetic">{phonetic["text"]}</p>' + "\n"
except Exception:
pass
html += '<ul class="outer">' + "\n"
@@ -528,6 +586,10 @@ class EditDialog(QDialog, Ui_Dialog):
return
word = query.value("word")
definition = json.loads(query.value("definition"))
if "phonetics" in definition:
self.phonetics = definition["phonetics"]
else:
self.phonetics = None
self.defEdit.document().clear()
cursor = self.defEdit.textCursor()
cursor.insertHtml(self.defToHtml(word, definition))