Mostly working Reader
This commit is contained in:
207
lib/read.py
207
lib/read.py
@@ -1,80 +1,133 @@
|
||||
import json
|
||||
|
||||
from PyDictionary import PyDictionary # type: ignore[import-untyped]
|
||||
from PyQt6.QtCore import Qt, pyqtSlot
|
||||
from PyQt6.QtCore import QRect, Qt, pyqtSlot
|
||||
from PyQt6.QtGui import (
|
||||
QBrush,
|
||||
QColor,
|
||||
QFont,
|
||||
QPainter,
|
||||
QPainterPath,
|
||||
QTextCharFormat,
|
||||
QTextCursor,
|
||||
QTextDocument,
|
||||
QTextListFormat,
|
||||
)
|
||||
from PyQt6.QtSql import QSqlDatabase, QSqlQuery, QSqlQueryModel
|
||||
from PyQt6.QtWidgets import QDialog
|
||||
from PyQt6.QtWidgets import QDialog, QPushButton
|
||||
|
||||
from main import query_error
|
||||
from ui.EditDialog import Ui_Dialog
|
||||
|
||||
|
||||
class EditDialog(QDialog, Ui_Dialog):
|
||||
def __init__(self, book_id: int, person_id: int) -> None:
|
||||
def __init__(self, person_id: int) -> None:
|
||||
super(EditDialog, self).__init__()
|
||||
self.book_id = book_id
|
||||
self.person_id = person_id
|
||||
self.setupUi(self)
|
||||
self.current_paragraph(self.person_id)
|
||||
self.load_book(self.person_id)
|
||||
blockNumber = self.block
|
||||
self.paraEdit.setReadOnly(True)
|
||||
self.defEdit.setReadOnly(True)
|
||||
self.show_section(self.section_id)
|
||||
self.block = blockNumber
|
||||
self.savePosition()
|
||||
self.stackedWidget.setCurrentIndex(0)
|
||||
self.nextParaBtn = QPushButton(parent=self.widget)
|
||||
self.nextParaBtn.setObjectName("nextParaBtn")
|
||||
self.verticalLayout.addWidget(self.nextParaBtn)
|
||||
self.nextParaBtn.setText("Next Paragraph")
|
||||
self.defineBtn.clicked.connect(self.defineAction)
|
||||
self.showBtn.clicked.connect(self.showAction)
|
||||
self.nextBtn.clicked.connect(self.nextAction)
|
||||
self.prevBtn.clicked.connect(self.prevAction)
|
||||
self.nextParaBtn.clicked.connect(self.nextParaAction)
|
||||
self.paraEdit.verticalScrollBar().valueChanged.connect(self.scrollSlot)
|
||||
return
|
||||
|
||||
def current_paragraph(self, person_id: int) -> None:
|
||||
query = QSqlQuery()
|
||||
query.prepare("SELECT * FROM people WHERE person_id = :person_id")
|
||||
query.bindValue(":person_id", person_id)
|
||||
query.exec()
|
||||
query.next()
|
||||
paragraph_id = query.value("paragraph_id")
|
||||
self.display_paragraph(paragraph_id)
|
||||
@pyqtSlot(int)
|
||||
def scrollSlot(self, value):
|
||||
self.update()
|
||||
return
|
||||
|
||||
def display_paragraph(self, paragraph_id: int) -> None:
|
||||
self.paragraph_id = paragraph_id
|
||||
def load_book(self, person_id: int) -> None:
|
||||
query = QSqlQuery()
|
||||
query.prepare("SELECT * FROM paragraphs WHERE paragraph_id = :paragraph_id")
|
||||
query.bindValue(":paragraph_id", paragraph_id)
|
||||
query.exec()
|
||||
query.next()
|
||||
self.section_id = query.value("section_id")
|
||||
self.paraSequence = query.value("sequence")
|
||||
cursor = self.paraEdit.textCursor()
|
||||
cursor.movePosition(QTextCursor.MoveOperation.Start)
|
||||
cursor.movePosition(
|
||||
QTextCursor.MoveOperation.End, QTextCursor.MoveMode.KeepAnchor
|
||||
)
|
||||
cursor.removeSelectedText()
|
||||
cursor.insertHtml(query.value("content"))
|
||||
query.prepare(
|
||||
"SELECT * FROM word_paragraph " "WHERE paragraph_id = :paragraph_id"
|
||||
"SELECT pb.* FROM people p "
|
||||
"LEFT JOIN person_book pb "
|
||||
"ON (p.book_id = pb.book_id "
|
||||
"AND p.person_id = pb.person_id) "
|
||||
"WHERE p.person_id = :person_id"
|
||||
)
|
||||
query.bindValue(":paragraph_id", self.paragraph_id)
|
||||
query.bindValue(":person_id", person_id)
|
||||
if not query.exec():
|
||||
query_error(query)
|
||||
if not query.next():
|
||||
self.done(0)
|
||||
self.book_id = query.value("book_id")
|
||||
self.section_id = query.value("section_id")
|
||||
self.block = query.value("block")
|
||||
self.sections = []
|
||||
self.section_map = {}
|
||||
self.sequence_map = {}
|
||||
query.prepare(
|
||||
"SELECT * FROM sections " "WHERE book_id = :book_id " "ORDER BY sequence"
|
||||
)
|
||||
query.bindValue(":book_id", self.book_id)
|
||||
if not query.exec():
|
||||
query_error(query)
|
||||
def_format = QTextCharFormat()
|
||||
def_format.setFontUnderline(True)
|
||||
cursor = QTextCursor(self.paraEdit.document())
|
||||
while query.next():
|
||||
start = query.value("start")
|
||||
end = query.value("end")
|
||||
cursor.setPosition(start, QTextCursor.MoveMode.MoveAnchor)
|
||||
cursor.setPosition(end, QTextCursor.MoveMode.KeepAnchor)
|
||||
cursor.setCharFormat(def_format)
|
||||
cursor.setPosition(0)
|
||||
self.sections.append(query.value("content"))
|
||||
self.section_map[query.value("section_id")] = query.value("sequence")
|
||||
self.sequence_map[query.value("sequence")] = query.value("section_id")
|
||||
return
|
||||
|
||||
def show_section(self, section_id, start=True):
|
||||
sequence = self.section_map[section_id]
|
||||
self.setWindowTitle(f"Section {sequence}")
|
||||
self.paraEdit.clear()
|
||||
cursor = self.paraEdit.textCursor()
|
||||
cursor.insertHtml(self.sections[sequence])
|
||||
if start:
|
||||
self.block = 0
|
||||
else:
|
||||
self.block = self.paraEdit.document().blockCount() - 1
|
||||
textBlock = self.paraEdit.document().findBlockByNumber(self.block)
|
||||
cursor.setPosition(textBlock.position())
|
||||
self.paraEdit.setTextCursor(cursor)
|
||||
self.paraEdit.ensureCursorVisible()
|
||||
return
|
||||
|
||||
def mousePressEvent(self, event):
|
||||
return
|
||||
|
||||
def paintEvent(self, e):
|
||||
position = self.paraEdit.document().findBlockByNumber(self.block).position()
|
||||
cursor = self.paraEdit.textCursor()
|
||||
cursor.setPosition(position)
|
||||
rect = self.paraEdit.cursorRect(cursor)
|
||||
# print(rect)
|
||||
pos = self.paraEdit.mapToParent(self.paraEdit.pos())
|
||||
painter = QPainter(self)
|
||||
brush = QBrush()
|
||||
brush.setColor(QColor("green"))
|
||||
brush.setStyle(Qt.BrushStyle.SolidPattern)
|
||||
path = QPainterPath()
|
||||
path.moveTo(0, 0)
|
||||
path.lineTo(pos.x() - 1.0, pos.y() / 2.0)
|
||||
path.lineTo(0, pos.y())
|
||||
path.lineTo(0, 0)
|
||||
# XXX - Replace the guess with a calculated value
|
||||
painter.translate(1.0, pos.y() + rect.y() + 12)
|
||||
painter.fillPath(path, brush)
|
||||
|
||||
@pyqtSlot()
|
||||
def nextParaAction(self) -> None:
|
||||
self.block += 1
|
||||
if self.block >= self.paraEdit.document().blockCount():
|
||||
self.nextAction()
|
||||
return
|
||||
self.savePosition()
|
||||
return
|
||||
|
||||
@pyqtSlot()
|
||||
@@ -234,44 +287,58 @@ class EditDialog(QDialog, Ui_Dialog):
|
||||
self.display_definition()
|
||||
return
|
||||
|
||||
def scrollTo(self, position):
|
||||
cursor = self.paraEdit.textCursor()
|
||||
cursor.setPosition(position)
|
||||
rect = self.paraEdit.cursorRect(cursor)
|
||||
print(rect)
|
||||
return
|
||||
|
||||
def savePosition(self) -> None:
|
||||
cursor = self.paraEdit.textCursor()
|
||||
cursor.setPosition(
|
||||
self.paraEdit.document().findBlockByNumber(self.block).position()
|
||||
)
|
||||
self.paraEdit.setTextCursor(cursor)
|
||||
self.scrollTo(cursor.position())
|
||||
self.paraEdit.ensureCursorVisible()
|
||||
self.update()
|
||||
query = QSqlQuery()
|
||||
query.prepare(
|
||||
"UPDATE person_book SET section_id = :section_id, "
|
||||
"block = :block "
|
||||
"WHERE book_id = :book_id "
|
||||
"AND person_id = :person_id"
|
||||
)
|
||||
query.bindValue(":section_id", self.section_id)
|
||||
query.bindValue(":block", self.block)
|
||||
query.bindValue(":book_id", self.book_id)
|
||||
query.bindValue(":person_id", self.person_id)
|
||||
if not query.exec():
|
||||
query_error(query)
|
||||
return
|
||||
|
||||
@pyqtSlot()
|
||||
def nextAction(self) -> None:
|
||||
if self.stackedWidget.currentIndex() == 1:
|
||||
self.nextDefinition()
|
||||
return
|
||||
paraQuery = QSqlQuery()
|
||||
paraQuery.prepare(
|
||||
"SELECT * FROM paragraphs WHERE "
|
||||
"section_id=:section_id AND sequence = :sequence"
|
||||
)
|
||||
paraQuery.bindValue(":section_id", self.section_id)
|
||||
paraQuery.bindValue(":sequence", self.paraSequence + 1)
|
||||
if not paraQuery.exec():
|
||||
query_error(paraQuery)
|
||||
if not paraQuery.next():
|
||||
secQuery = QSqlQuery()
|
||||
secQuery.prepare(
|
||||
"SELECT * FROM sections WHERE book_id=:book_id "
|
||||
"AND sequence = "
|
||||
"(SELECT sequence FROM sections WHERE "
|
||||
"section_id = :section_id)+1"
|
||||
)
|
||||
secQuery.bindValue(":book_id", self.book_id)
|
||||
secQuery.bindValue(":section_id", self.section_id)
|
||||
if not secQuery.exec():
|
||||
query_error(secQuery)
|
||||
if not secQuery.next():
|
||||
return
|
||||
self.paraSequence = 0
|
||||
self.section_id = secQuery.value("section_id")
|
||||
paraQuery.bindValue(":section_id", self.section_id)
|
||||
paraQuery.bindValue(":sequence", self.paraSequence)
|
||||
if not paraQuery.exec():
|
||||
query_error(paraQuery)
|
||||
paraQuery.next()
|
||||
self.display_paragraph(paraQuery.value("paragraph_id"))
|
||||
sequence = self.section_map[self.section_id]
|
||||
sequence += 1
|
||||
self.section_id = self.sequence_map[sequence]
|
||||
self.show_section(self.section_id)
|
||||
self.savePosition()
|
||||
return
|
||||
|
||||
@pyqtSlot()
|
||||
def prevAction(self) -> None:
|
||||
if self.stackedWidget.currentIndex() == 1:
|
||||
return
|
||||
sequence = self.section_map[self.section_id]
|
||||
if sequence < 1:
|
||||
return
|
||||
sequence -= 1
|
||||
self.section_id = self.sequence_map[sequence]
|
||||
self.show_section(self.section_id, False)
|
||||
self.savePosition()
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user