From 6607e1938e79aa9638ac2f44bb7c7f764d32b560 Mon Sep 17 00:00:00 2001 From: Olivier Keshavjee Date: Thu, 2 Jul 2015 17:33:05 +0200 Subject: [PATCH] References as module, cleaner --- src/models/references.py | 130 ++++++++++++++++++------------ src/ui/cheatSheet.py | 14 ++-- src/ui/editors/completer.py | 3 +- src/ui/search.py | 1 - src/ui/views/textEditCompleter.py | 10 +-- 5 files changed, 95 insertions(+), 63 deletions(-) diff --git a/src/models/references.py b/src/models/references.py index f55f4662..6814d848 100644 --- a/src/models/references.py +++ b/src/models/references.py @@ -6,14 +6,39 @@ from enums import * from functions import * import re +############################################################################### +# SHORT REFERENCES +############################################################################### -def infoForRef(ref): - match = re.fullmatch("::(\w):(\d+?)::", ref) + +RegEx = r"::(\w):(\d+?)::" +RegExNonCapturing = r"::\w:\d+?::" +EmptyRef = "::{}:{}::" +PersoLetter = "C" +TextLetter = "T" +PlotLetter = "P" + +def plotReference(plotID): + return EmptyRef.format(PlotLetter, plotID) + +def persoReference(persoID): + return EmptyRef.format(PersoLetter, persoID) + +def textReference(outlineID): + return EmptyRef.format(TextLetter, outlineID) + + +############################################################################### +# READABLE INFOS +############################################################################### + +def infos(ref): + match = re.fullmatch(RegEx, ref) if match: _type = match.group(1) _ref = match.group(2) - if _type == "T": + if _type == TextLetter: m = mainWindow().mdlOutline idx = m.getIndexByID(_ref) @@ -35,7 +60,7 @@ def infoForRef(ref): POV = "" if item.POV(): POV = "{text}".format( - ref="::C:{}::".format(item.POV()), + ref=getPersoReference(item.POV()), text=mainWindow().mdlPersos.getPersoNameByID(item.POV())) status = item.status() @@ -54,7 +79,7 @@ def infoForRef(ref): pathStr = [] for _id, title in path: pathStr.append("{text}".format( - ref="::T:{}::".format(_id), + ref=getTextReference(_id), text=title)) path = " > ".join(pathStr) @@ -99,7 +124,7 @@ def infoForRef(ref): return text - elif _type == "C": + elif _type == PersoLetter: m = mainWindow().mdlPersos index = m.getIndexFromID(_ref) name = m.name(index.row()) @@ -144,7 +169,7 @@ def infoForRef(ref): for t in lst: idx = oM.getIndexByID(t) listPOV += "
  • {text}".format( - link="::T:{}::".format(t), + link=getTextReference(t), text=oM.data(idx, Outline.title.value)) # List scences where character is referenced @@ -153,7 +178,7 @@ def infoForRef(ref): for t in lst: idx = oM.getIndexByID(t) listRefs += "
  • {text}".format( - link="::T:{}::".format(t), + link=getTextReference(t), text=oM.data(idx, Outline.title.value)) text = """

    {name}

    @@ -181,47 +206,13 @@ def infoForRef(ref): else: return qApp.translate("references", "Unknown reference: {}.").format(ref) -def refToLink(ref): - match = re.fullmatch("::(\w):(\d+?)::", ref) - if match: - _type = match.group(1) - _ref = match.group(2) - text = "" - if _type == "T": - m = mainWindow().mdlOutline - idx = m.getIndexByID(_ref) - if idx.isValid(): - item = idx.internalPointer() - text = item.title() - - elif _type == "C": - m = mainWindow().mdlPersos - text = m.item(int(_ref), Perso.name.value).text() - - if text: - return "{text}".format( - ref=ref, - text=text) - else: - return ref - -def linkifyAllRefs(text): - return re.sub(r"::(\w):(\d+?)::", lambda m: refToLink(m.group(0)), text) - -def basicT2TFormat(text): - text = re.sub("\*\*(.*?)\*\*", "\\1", text) - text = re.sub("//(.*?)//", "\\1", text) - text = re.sub("__(.*?)__", "\\1", text) - text = text.replace("\n", "
    ") - return text - -def tooltipForRef(ref): - match = re.fullmatch("::(\w):(\d+?)::", ref) +def tooltip(ref): + match = re.fullmatch(RegEx, ref) if match: _type = match.group(1) _ref = match.group(2) - if _type == "T": + if _type == TextLetter: m = mainWindow().mdlOutline idx = m.getIndexByID(_ref) @@ -235,7 +226,7 @@ def tooltipForRef(ref): return tooltip - elif _type == "C": + elif _type == PersoLetter: m = mainWindow().mdlPersos name = m.item(int(_ref), Perso.name.value).text() return qApp.translate("references", "Character: {}").format(name) @@ -243,13 +234,52 @@ def tooltipForRef(ref): else: return qApp.translate("references", "Unknown reference: {}.").format(ref) -def openReference(ref): - match = re.fullmatch("::(\w):(\d+?)::", ref) + +############################################################################### +# FUNCTIONS +############################################################################### + +def refToLink(ref): + match = re.fullmatch(RegEx, ref) + if match: + _type = match.group(1) + _ref = match.group(2) + text = "" + if _type == TextLetter: + m = mainWindow().mdlOutline + idx = m.getIndexByID(_ref) + if idx.isValid(): + item = idx.internalPointer() + text = item.title() + + elif _type == PersoLetter: + m = mainWindow().mdlPersos + text = m.item(int(_ref), Perso.name.value).text() + + if text: + return "{text}".format( + ref=ref, + text=text) + else: + return ref + +def linkifyAllRefs(text): + return re.sub(RegEx, lambda m: refToLink(m.group(0)), text) + +def basicT2TFormat(text): + text = re.sub("\*\*(.*?)\*\*", "\\1", text) + text = re.sub("//(.*?)//", "\\1", text) + text = re.sub("__(.*?)__", "\\1", text) + text = text.replace("\n", "
    ") + return text + +def open(ref): + match = re.fullmatch(RegEx, ref) if match: _type = match.group(1) _ref = match.group(2) - if _type == "C": + if _type == PersoLetter: mw = mainWindow() for i in range(mw.mdlPersos.rowCount()): @@ -262,7 +292,7 @@ def openReference(ref): print("Ref not found") return False - elif _type == "T": + elif _type == TextLetter: mw = mainWindow() index = mw.mdlOutline.getIndexByID(_ref) diff --git a/src/ui/cheatSheet.py b/src/ui/cheatSheet.py index 8bd0feaf..9faa642a 100644 --- a/src/ui/cheatSheet.py +++ b/src/ui/cheatSheet.py @@ -6,7 +6,7 @@ from enums import * from models.outlineModel import * from ui.cheatSheet_ui import * from functions import * -from models.references import * +import models.references as Ref class cheatSheet(QWidget, Ui_cheatSheet): @@ -23,6 +23,7 @@ class cheatSheet(QWidget, Ui_cheatSheet): self.listDelegate = listCompleterDelegate(self) self.list.setItemDelegate(self.listDelegate) self.list.itemActivated.connect(self.showInfos) + self.list.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.view.linkActivated.connect(self.openLink) self.view.linkHovered.connect(self.linkHovered) @@ -44,6 +45,7 @@ class cheatSheet(QWidget, Ui_cheatSheet): self.persoModel = mainWindow().mdlPersos self.outlineModel.dataChanged.connect(self.populateTimer.start) self.persoModel.dataChanged.connect(self.populateTimer.start) + self.populate() def populate(self): if self.persoModel: @@ -56,7 +58,7 @@ class cheatSheet(QWidget, Ui_cheatSheet): imp = [self.tr("Minor"), self.tr("Secondary"), self.tr("Main")][int(imp)] d.append((name, ID, imp)) - self.data[(self.tr("Characters"), "C")] = d + self.data[(self.tr("Characters"), Ref.PersoLetter)] = d if self.outlineModel: d = [] @@ -68,7 +70,7 @@ class cheatSheet(QWidget, Ui_cheatSheet): r = self.outlineModel.rootItem addChildren(r) - self.data[(self.tr("Texts"), "T")] = d + self.data[(self.tr("Texts"), Ref.TextLetter)] = d self.updateListFromData() @@ -100,14 +102,14 @@ class cheatSheet(QWidget, Ui_cheatSheet): i = self.list.currentItem() ref = i.data(Qt.UserRole) if ref: - self.view.setText(infoForRef(ref)) + self.view.setText(Ref.infos(ref)) def openLink(self, link): - openReference(link) + Ref.open(link) def linkHovered(self, link): if link: - QToolTip.showText(QCursor.pos(), tooltipForRef(link)) + QToolTip.showText(QCursor.pos(), Ref.tooltip(link)) def keyPressEvent(self, event): if event.key() in [Qt.Key_Up, Qt.Key_Down]: diff --git a/src/ui/editors/completer.py b/src/ui/editors/completer.py index 280d26a4..f5fad657 100644 --- a/src/ui/editors/completer.py +++ b/src/ui/editors/completer.py @@ -6,6 +6,7 @@ from enums import * from models.outlineModel import * from ui.editors.completer_ui import * from functions import * +import models.references as Ref class completer(QWidget, Ui_completer): @@ -45,7 +46,7 @@ class completer(QWidget, Ui_completer): self.addCategory(cat[0]) for item in filtered: i = QListWidgetItem(item[0]) - i.setData(Qt.UserRole, "::{}:{}::".format(cat[1], item[1])) + i.setData(Qt.UserRole, Ref.EmptyRef.format(cat[1], item[1])) i.setData(Qt.UserRole+1, item[2]) self.list.addItem(i) diff --git a/src/ui/search.py b/src/ui/search.py index 9858541c..de6010fe 100644 --- a/src/ui/search.py +++ b/src/ui/search.py @@ -6,7 +6,6 @@ from enums import * from models.outlineModel import * from ui.search_ui import * from functions import * -from models.references import * class search(QWidget, Ui_search): diff --git a/src/ui/views/textEditCompleter.py b/src/ui/views/textEditCompleter.py index 73c7c50a..ef3f2c61 100644 --- a/src/ui/views/textEditCompleter.py +++ b/src/ui/views/textEditCompleter.py @@ -6,7 +6,7 @@ from enums import * from functions import * from ui.views.textEditView import * from ui.editors.completer import * -from models.references import * +import models.references as Ref import settings import re @@ -53,7 +53,7 @@ class textEditCompleter(textEditView): cursor.select(QTextCursor.BlockUnderCursor) text = cursor.selectedText() pos -= cursor.selectionStart() - match = re.findall(r"::\w:\d+?::", text) + match = re.findall(Ref.RegExNonCapturing, text) for m in match: if text.find(m) <= pos <= text.find(m) + len(m): return m @@ -123,7 +123,7 @@ class textEditCompleter(textEditView): if ref: if not qApp.overrideCursor(): qApp.setOverrideCursor(Qt.PointingHandCursor) - QToolTip.showText(self.mapToGlobal(event.pos()), tooltipForRef(ref)) + QToolTip.showText(self.mapToGlobal(event.pos()), Ref.tooltip(ref)) def mouseReleaseEvent(self, event): textEditView.mouseReleaseEvent(self, event) @@ -132,7 +132,7 @@ class textEditCompleter(textEditView): cursor = self.cursorForPosition(event.pos()) ref = self.refUnderCursor(cursor) if ref: - openReference(ref) + Ref.open(ref) qApp.restoreOverrideCursor() def resizeEvent(self, event): @@ -143,7 +143,7 @@ class textEditCompleter(textEditView): cursor = self.textCursor() fm = QFontMetrics(self.font()) refs = [] - for txt in re.finditer(r"::(\w):(\d+?)::", self.toPlainText()): + for txt in re.finditer(Ref.RegEx, self.toPlainText()): cursor.setPosition(txt.start()) r = self.cursorRect(cursor) r.setWidth(fm.width(txt.group(0)))