diff --git a/Makefile b/Makefile index db11f66..5a31d90 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,6 @@ -main.py: ui/*.py +main.py: ui/*.py ui/resources.rcc %.py:%.ui pyuic6 $< >$@ +ui/%.rcc:ui/%.qrc ui/*.css ui/*/*.otf + rcc --binary $< -o $@ diff --git a/lib/read.py b/lib/read.py index 2567dea..6aa6767 100644 --- a/lib/read.py +++ b/lib/read.py @@ -1,16 +1,29 @@ import json +import os +import re from typing import cast import requests -from PyQt6.QtCore import QPoint, QRect, Qt, QTimer, pyqtSlot +from PyQt6.QtCore import ( + QFile, + QIODeviceBase, + QPoint, + QRect, + QResource, + Qt, + QTimer, + pyqtSlot, +) from PyQt6.QtGui import ( QBrush, QColor, QFont, + QKeyEvent, QMouseEvent, QPainter, QPainterPath, QPaintEvent, + QTextBlockFormat, QTextCharFormat, QTextCursor, QTextDocument, @@ -29,21 +42,28 @@ class EditDialog(QDialog, Ui_Dialog): def __init__(self, person_id: int) -> None: super(EditDialog, self).__init__() self.person_id = person_id + if not QResource.registerResource( + os.path.join(os.path.dirname(__file__), "../ui/resources.rcc"), "/" + ): + raise Exception("Unable to register resources.rcc") + styleSheet = QResource(":/display.css").data().decode("utf-8") self.setupUi(self) # # Override UI # - font = QFont() - font.setFamily("OpenDyslexic") - font.setPointSize(14) - self.paraEdit.setFont(font) + self.printBtn = QPushButton() + self.printBtn.setText("Print") + self.printBtn.setObjectName("printBtn") + self.verticalLayout.addWidget(self.printBtn) # # End overrides # self.load_book(self.person_id) blockNumber = self.block self.paraEdit.setReadOnly(True) + self.paraEdit.document().setDefaultStyleSheet(styleSheet) self.defEdit.setReadOnly(True) + self.defEdit.document().setDefaultStyleSheet(styleSheet) self.show_section(self.section_id) self.block = blockNumber self.savePosition() @@ -54,10 +74,72 @@ class EditDialog(QDialog, Ui_Dialog): self.prevBtn.clicked.connect(self.prevAction) self.nextParaBtn.clicked.connect(self.nextParaAction) self.prevParaBtn.clicked.connect(self.prevParaAction) + self.printBtn.clicked.connect(self.printAction) self.paraEdit.verticalScrollBar().valueChanged.connect(self.scrollSlot) self.scrollBtn.clicked.connect(self.scrollAction) return + def defToHtml(self, word: str, definition) -> str: + html = f'

{word}

' + "\n" + try: + html += f"

{definition['phonetic']}

" + "\n" + except Exception: + pass + html += '\n

\n" + return html + + @pyqtSlot() + def printAction(self) -> None: + html = "\n\n\n" + html += ( + '' + + "\n" + ) + html += ( + '' + + "\n" + ) + html += '\n\n\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" + ) + 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 += "


\n" + html += '
' + "\n" + text = self.sections[self.section_map[self.section_id]] + text = re.sub(r"", "", text) + html += text + html += "\n
\n" + html += "\n\n\n" + qf = QFile("out.html") + if qf.open(QIODeviceBase.OpenModeFlag.WriteOnly): + qf.write(html.encode("utf-8")) + qf.close() + print("Printed!") + return + @pyqtSlot() def scrollAction(self) -> None: position = ( @@ -200,18 +282,26 @@ class EditDialog(QDialog, Ui_Dialog): definition = json.loads(query.value("definition")) try: phonetic = definition["phonetic"] + def_format.setToolTip( + f'{word}:
{phonetic}
' + ) + cursor.mergeCharFormat(def_format) except: - phonetic = "" - def_format.setToolTip( - f'{word}:
{phonetic}
' - ) - cursor.setCharFormat(def_format) + pass return + # + # Event handlers + # def mousePressEvent(self, event: QMouseEvent | None) -> None: return + def keyPressEvent(self, event: QKeyEvent) -> None: + print(event) + super().keyPressEvent(event) + return + def paintEvent(self, e: QPaintEvent | None) -> None: idx = self.stackedWidget.currentIndex() if idx > 0: @@ -328,19 +418,19 @@ class EditDialog(QDialog, Ui_Dialog): query.bindValue(":end", end) if not query.exec(): query_error(query) - if query.next(): - return - query.prepare( - "INSERT INTO word_block VALUES " - "( :word_id, :section_id, :block, :start, :end)" - ) - query.bindValue(":word_id", word_id) - query.bindValue(":section_id", self.section_id) - query.bindValue(":block", blockNum) - query.bindValue(":start", start) - query.bindValue(":end", end) - if not query.exec(): - query_error(query) + if not query.next(): + query.prepare( + "INSERT INTO word_block VALUES " + "( :word_id, :section_id, :block, :start, :end)" + ) + query.bindValue(":word_id", word_id) + query.bindValue(":section_id", self.section_id) + query.bindValue(":block", blockNum) + query.bindValue(":start", start) + query.bindValue(":end", end) + if not query.exec(): + query_error(query) + def_format = QTextCharFormat() def_format.setFontUnderline(True) cursor = QTextCursor(self.paraEdit.document()) @@ -351,7 +441,7 @@ class EditDialog(QDialog, Ui_Dialog): cursor.setPosition( end + textBlock.position(), QTextCursor.MoveMode.KeepAnchor ) - cursor.setCharFormat(def_format) + cursor.mergeCharFormat(def_format) return def display_definition(self) -> None: @@ -377,47 +467,10 @@ class EditDialog(QDialog, Ui_Dialog): definition = json.loads(query.value("definition")) self.defEdit.document().clear() cursor = self.defEdit.textCursor() - - h1_size = 48 - h1_weight = QFont.Weight.Bold - p_size = 16 - p_weight = QFont.Weight.Normal - - word_format = QTextCharFormat() - word_format.setFontPointSize(h1_size) - word_format.setFontWeight(h1_weight) - cursor.insertText(word, word_format) - typeFormat = QTextListFormat() - typeFormat.setStyle(QTextListFormat.Style.ListDisc) - typeFormat.setIndent(1) - defFormat = QTextListFormat() - defFormat.setStyle(QTextListFormat.Style.ListCircle) - defFormat.setIndent(2) - word_format.setFontWeight(p_weight) - word_format.setFontPointSize(p_size) - phonetic_format = QTextCharFormat() - phonetic_format.setFontPointSize(32) - phonetic_format.setFontFamily("TeX Gyre Heros") - try: - cursor.insertBlock() - cursor.insertText(definition["phonetic"], phonetic_format) - except Exception: - pass - cursor.setCharFormat(word_format) - for meaning in definition["meanings"]: - cursor.insertList(typeFormat) - cursor.insertText(meaning["partOfSpeech"]) - cursor.insertList(defFormat) - first = True - for a_def in meaning["definitions"]: - if not first: - cursor.insertBlock() - cursor.insertText(a_def["definition"]) - # TODO: synonyms - # TODO: antonyms - first = False + cursor.insertHtml(self.defToHtml(word,definition)) cursor.setPosition(0) self.defEdit.setTextCursor(cursor) + print(self.defEdit.document().toHtml()) return @pyqtSlot() diff --git a/main.py b/main.py index 7297a54..b7b6dce 100755 --- a/main.py +++ b/main.py @@ -341,10 +341,18 @@ if __name__ == "__main__": for fileName in os.listdir("ui"): if not fileName.endswith(".py"): continue - uiName = fileName[:-3] + ".ui" - if os.path.getmtime("ui/" + uiName) > os.path.getmtime( - "ui/" + fileName - ): + uiName = "ui/" + fileName[:-3] + ".ui" + rccName = "ui/" + fileName[:-3] + ".qrc" + if not os.path.isfile(uiName) and not os.path.isfile(rccName): + outOfDate.append(filenName) + continue + if os.path.isfile(uiName) and os.path.getmtime( + uiName + ) > os.path.getmtime("ui/" + fileName): + outOfDate.append(fileName) + if os.path.isfile(rccName) and os.path.getmtime( + rccName + ) > os.path.getmtime("ui/" + fileName): outOfDate.append(fileName) if len(outOfDate) > 0: print(f"UI out of date: {', '.join(outOfDate)}") diff --git a/ui/EditDialog.ui b/ui/EditDialog.ui index ddd4313..966c4e5 100644 --- a/ui/EditDialog.ui +++ b/ui/EditDialog.ui @@ -118,6 +118,8 @@ - + + + diff --git a/ui/display.css b/ui/display.css new file mode 100644 index 0000000..4327686 --- /dev/null +++ b/ui/display.css @@ -0,0 +1,23 @@ +body { + font-family: "opendyslexic", sans-serif; +} +hr { + height: 2px; + border-width: 0; +} +h1 { + font-size: 48px; + font-weight: Bold; +} +h3 { + font-size: 40px; + font-weight: Normal; +} +p, li { + max-width: 66ch; + font-size: 24px; +} +p.phonetic { + font-family: "Tex Gyre Heros", sans-serif; + font-size: 32px; +} diff --git a/ui/opendyslexic/OpenDyslexic-Bold.otf b/ui/opendyslexic/OpenDyslexic-Bold.otf new file mode 100644 index 0000000..4c492e2 Binary files /dev/null and b/ui/opendyslexic/OpenDyslexic-Bold.otf differ diff --git a/ui/opendyslexic/OpenDyslexic-BoldItalic.otf b/ui/opendyslexic/OpenDyslexic-BoldItalic.otf new file mode 100644 index 0000000..f71b430 Binary files /dev/null and b/ui/opendyslexic/OpenDyslexic-BoldItalic.otf differ diff --git a/ui/opendyslexic/OpenDyslexic-Italic.otf b/ui/opendyslexic/OpenDyslexic-Italic.otf new file mode 100644 index 0000000..fdead4d Binary files /dev/null and b/ui/opendyslexic/OpenDyslexic-Italic.otf differ diff --git a/ui/opendyslexic/OpenDyslexic-Regular.otf b/ui/opendyslexic/OpenDyslexic-Regular.otf new file mode 100644 index 0000000..1226d2a Binary files /dev/null and b/ui/opendyslexic/OpenDyslexic-Regular.otf differ diff --git a/ui/opendyslexic/OpenDyslexicAlta-Bold.otf b/ui/opendyslexic/OpenDyslexicAlta-Bold.otf new file mode 100644 index 0000000..37f6d5e Binary files /dev/null and b/ui/opendyslexic/OpenDyslexicAlta-Bold.otf differ diff --git a/ui/opendyslexic/OpenDyslexicAlta-BoldItalic.otf b/ui/opendyslexic/OpenDyslexicAlta-BoldItalic.otf new file mode 100644 index 0000000..df71ef7 Binary files /dev/null and b/ui/opendyslexic/OpenDyslexicAlta-BoldItalic.otf differ diff --git a/ui/opendyslexic/OpenDyslexicAlta-Italic.otf b/ui/opendyslexic/OpenDyslexicAlta-Italic.otf new file mode 100644 index 0000000..5233fe0 Binary files /dev/null and b/ui/opendyslexic/OpenDyslexicAlta-Italic.otf differ diff --git a/ui/opendyslexic/OpenDyslexicAlta-Regular.otf b/ui/opendyslexic/OpenDyslexicAlta-Regular.otf new file mode 100644 index 0000000..6eb4a3e Binary files /dev/null and b/ui/opendyslexic/OpenDyslexicAlta-Regular.otf differ diff --git a/ui/opendyslexic/OpenDyslexicMono-Regular.otf b/ui/opendyslexic/OpenDyslexicMono-Regular.otf new file mode 100644 index 0000000..543d46b Binary files /dev/null and b/ui/opendyslexic/OpenDyslexicMono-Regular.otf differ diff --git a/ui/print.css b/ui/print.css new file mode 100644 index 0000000..1a689da --- /dev/null +++ b/ui/print.css @@ -0,0 +1,23 @@ +body { + font-family: "Open-Dyslexic", sans-serif; +} +hr { + height: 2px; + border-width: 0; +} +h1 { + font-size: 48px; + font-weight: Bold; +} +h3 { + font-size: 40px; + font-weight: Normal; +} +p, li { + max-width: 66ch; + font-size: 24px; +} +p.phonetic { + font-family: "TexGyreHeros", sans-serif; + font-size: 32px; +} diff --git a/ui/resources.qrc b/ui/resources.qrc new file mode 100644 index 0000000..9e3560b --- /dev/null +++ b/ui/resources.qrc @@ -0,0 +1,7 @@ + + + print.css + display.css + opendyslexic/OpenDyslexic-Regular.otf + + diff --git a/ui/resources.rcc b/ui/resources.rcc new file mode 100644 index 0000000..4999042 Binary files /dev/null and b/ui/resources.rcc differ