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"
+ for meaning in definition["meanings"]:
+ html += f"- {meaning['partOfSpeech']}"
+ html += '
'
+ for a_def in meaning["definitions"]:
+ html += f"- {a_def['definition']}
\n"
+ html += "
\n"
+ 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"?body>", "", 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