From a17745a89a20b1da93a46f8113e6089636e6e714 Mon Sep 17 00:00:00 2001 From: Olivier Keshavjee Date: Thu, 3 Mar 2016 17:18:30 +0100 Subject: [PATCH] Corrects references, cheatsheet, storyline, ... --- manuskript/models/characterModel.py | 9 +++- manuskript/models/references.py | 62 ++++++++++++----------- manuskript/ui/cheatSheet.py | 4 +- manuskript/ui/editors/basicHighlighter.py | 2 +- manuskript/ui/views/characterTreeView.py | 7 +++ manuskript/ui/views/storylineView.py | 18 +++---- 6 files changed, 61 insertions(+), 41 deletions(-) diff --git a/manuskript/models/characterModel.py b/manuskript/models/characterModel.py index 72f525bf..85745344 100644 --- a/manuskript/models/characterModel.py +++ b/manuskript/models/characterModel.py @@ -39,7 +39,7 @@ class characterModel(QAbstractItemModel): if index.column() in c._data: return c._data[index.column()] else: - return QVariant() + return "" elif type(c) == CharacterInfo: if role == Qt.DisplayRole or role == Qt.EditRole: @@ -141,6 +141,7 @@ class characterModel(QAbstractItemModel): return r def getCharacterByID(self, ID): + ID = int(ID) for c in self.characters: if c.ID() == ID: return c @@ -274,6 +275,12 @@ class Character(): self._data[C.ID.value] = k + def listInfos(self): + r = [] + for i in self.infos: + r.append((i.description, i.value)) + return r + class CharacterInfo(): def __init__(self, character, description="", value=""): self.description = description diff --git a/manuskript/models/references.py b/manuskript/models/references.py index 6aeeb374..16663199 100644 --- a/manuskript/models/references.py +++ b/manuskript/models/references.py @@ -22,7 +22,7 @@ RegExNonCapturing = r"{\w:\d+:?.*?}" # The basic format of the references EmptyRef = "{{{}:{}:{}}}" EmptyRefSearchable = "{{{}:{}:" -PersoLetter = "C" +CharacterLetter = "C" TextLetter = "T" PlotLetter = "P" WorldLetter = "W" @@ -37,13 +37,13 @@ def plotReference(ID, searchable=False): return EmptyRefSearchable.format(PlotLetter, ID, "") -def persoReference(ID, searchable=False): +def characterReference(ID, searchable=False): """Takes the ID of a character and returns a reference for that character. @searchable: returns a stripped version that allows simple text search.""" if not searchable: - return EmptyRef.format(PersoLetter, ID, "") + return EmptyRef.format(CharacterLetter, ID, "") else: - return EmptyRefSearchable.format(PersoLetter, ID, "") + return EmptyRefSearchable.format(CharacterLetter, ID, "") def textReference(ID, searchable=False): @@ -103,7 +103,7 @@ def infos(ref): POV = "" if item.POV(): POV = "{text}".format( - ref=persoReference(item.POV()), + ref=characterReference(item.POV()), text=mainWindow().mdlCharacter.getCharacterByID(item.POV()).name()) # The status of the scene @@ -174,10 +174,12 @@ def infos(ref): return text # A character - elif _type == PersoLetter: + elif _type == CharacterLetter: m = mainWindow().mdlCharacter - index = m.getIndexFromID(_ref) - name = m.name(index.row()) + c = m.getCharacterByID(int(_ref)) + index = c.index() + + name = c.name() # Titles basicTitle = qApp.translate("references", "Basic infos") @@ -191,14 +193,16 @@ def infos(ref): # basic infos basic = [] for i in [ - (Perso.motivation, qApp.translate("references", "Motivation"), False), - (Perso.goal, qApp.translate("references", "Goal"), False), - (Perso.conflict, qApp.translate("references", "Conflict"), False), - (Perso.epiphany, qApp.translate("references", "Epiphany"), False), - (Perso.summarySentence, qApp.translate("references", "Short summary"), True), - (Perso.summaryPara, qApp.translate("references", "Longer summary"), True), + (Character.motivation, qApp.translate("references", "Motivation"), False), + (Character.goal, qApp.translate("references", "Goal"), False), + (Character.conflict, qApp.translate("references", "Conflict"), False), + (Character.epiphany, qApp.translate("references", "Epiphany"), False), + (Character.summarySentence, qApp.translate("references", "Short summary"), True), + (Character.summaryPara, qApp.translate("references", "Longer summary"), True), ]: + val = m.data(index.sibling(index.row(), i[0].value)) + if val: basic.append("{title}:{n}{val}".format( title=i[1], @@ -208,7 +212,7 @@ def infos(ref): # detailed infos detailed = [] - for _name, _val in m.listPersoInfos(index): + for _name, _val in c.listInfos(): detailed.append("{}: {}".format( _name, _val)) @@ -279,7 +283,7 @@ def infos(ref): for r in range(item.rowCount()): ID = item.child(r, 0).text() characters += "
  • {text}".format( - link=persoReference(ID), + link=characterReference(ID), text=pM.getPersoNameByID(ID)) # Resolution steps @@ -408,15 +412,16 @@ def shortInfos(ref): infos["path"] = item.path() return infos - elif _type == PersoLetter: + elif _type == CharacterLetter: - infos["type"] = PersoLetter + infos["type"] = CharacterLetter m = mainWindow().mdlCharacter - item = m.item(int(_ref), Perso.name.value) - if item: - infos["title"] = item.text() - infos["name"] = item.text() + c = m.getCharacterByID(int(_ref)) + + if c: + infos["title"] = c.name() + infos["name"] = c.name() return infos elif _type == PlotLetter: @@ -482,7 +487,7 @@ def tooltip(ref): tt += "
    {}".format(infos["path"]) return tt - elif infos["type"] == PersoLetter: + elif infos["type"] == CharacterLetter: return qApp.translate("references", "Character: {}").format(infos["title"]) elif infos["type"] == PlotLetter: @@ -515,9 +520,9 @@ def refToLink(ref): item = idx.internalPointer() text = item.title() - elif _type == PersoLetter: + elif _type == CharacterLetter: m = mainWindow().mdlCharacter - text = m.item(int(_ref), Perso.name.value).text() + text = m.getCharacterByID(int(_ref)).name() elif _type == PlotLetter: m = mainWindow().mdlPlots @@ -618,17 +623,16 @@ def open(ref): _type = match.group(1) _ref = match.group(2) - if _type == PersoLetter: + if _type == CharacterLetter: mw = mainWindow() - # FIXME - item = mw.lstPersos.getItemByID(_ref) + item = mw.lstCharacters.getItemByID(int(_ref)) if item: mw.tabMain.setCurrentIndex(mw.TabPersos) mw.lstCharacters.setCurrentItem(item) return True - print("Ref not found") + print("Error: Ref {} not found".format(ref)) return False elif _type == TextLetter: diff --git a/manuskript/ui/cheatSheet.py b/manuskript/ui/cheatSheet.py index 1ab6c2b0..2e3a4401 100644 --- a/manuskript/ui/cheatSheet.py +++ b/manuskript/ui/cheatSheet.py @@ -59,6 +59,8 @@ class cheatSheet(QWidget, Ui_cheatSheet): self.outlineModel.dataChanged.connect(self.populateTimer.start) self.characterModel.dataChanged.connect(self.populateTimer.start) + self.characterModel.rowsInserted.connect(self.populateTimer.start) + self.characterModel.rowsRemoved.connect(self.populateTimer.start) self.plotModel.dataChanged.connect(self.populateTimer.start) self.worldModel.dataChanged.connect(self.populateTimer.start) @@ -82,7 +84,7 @@ class cheatSheet(QWidget, Ui_cheatSheet): imp = [self.tr("Minor"), self.tr("Secondary"), self.tr("Main")][int(c.importance())] d.append((c.name(), c.ID(), imp)) - self.data[(self.tr("Characters"), Ref.PersoLetter)] = d + self.data[(self.tr("Characters"), Ref.CharacterLetter)] = d if self.outlineModel: d = [] diff --git a/manuskript/ui/editors/basicHighlighter.py b/manuskript/ui/editors/basicHighlighter.py index b5055060..f0d5050b 100644 --- a/manuskript/ui/editors/basicHighlighter.py +++ b/manuskript/ui/editors/basicHighlighter.py @@ -61,7 +61,7 @@ class basicHighlighter(QSyntaxHighlighter): fmt.setFontWeight(QFont.DemiBold) if txt.group(1) == Ref.TextLetter: fmt.setBackground(QBrush(QColor(Qt.blue).lighter(190))) - elif txt.group(1) == Ref.PersoLetter: + elif txt.group(1) == Ref.CharacterLetter: fmt.setBackground(QBrush(QColor(Qt.yellow).lighter(170))) elif txt.group(1) == Ref.PlotLetter: fmt.setBackground(QBrush(QColor(Qt.red).lighter(170))) diff --git a/manuskript/ui/views/characterTreeView.py b/manuskript/ui/views/characterTreeView.py index 71e354a1..2bfbe55d 100644 --- a/manuskript/ui/views/characterTreeView.py +++ b/manuskript/ui/views/characterTreeView.py @@ -161,6 +161,13 @@ class characterTreeView(QTreeWidget): ID = self.currentCharacterID() return self._model.getCharacterByID(ID) + def getItemByID(self, ID): + for t in range(self.topLevelItemCount()): + for i in range(self.topLevelItem(t).childCount()): + item = self.topLevelItem(t).child(i) + if item.data(0, Qt.UserRole) == ID: + return item + def mouseDoubleClickEvent(self, event): item = self.currentItem() # Catching double clicks to forbid collapsing of toplevel items diff --git a/manuskript/ui/views/storylineView.py b/manuskript/ui/views/storylineView.py index f5f40840..e10fc81e 100644 --- a/manuskript/ui/views/storylineView.py +++ b/manuskript/ui/views/storylineView.py @@ -71,16 +71,16 @@ class storylineView(QWidget, Ui_storylineView): return r - def persosReferences(self): + def charactersReferences(self): "Returns a list of character references" if not self._mdlCharacter: pass - IDs = self._mdlCharacter.getPersosByImportance() + chars = self._mdlCharacter.getCharactersByImportance() r = [] - for importance in IDs: - for ID in importance: - ref = references.persoReference(ID) + for importance in chars: + for c in importance: + ref = references.characterReference(c.ID()) r.append(ref) return r @@ -118,7 +118,7 @@ class storylineView(QWidget, Ui_storylineView): trackedItems += self.plotReferences() if self.actCharacters.isChecked(): - trackedItems += self.persosReferences() + trackedItems += self.charactersReferences() ROWS_HEIGHT = len(trackedItems) * (LINE_HEIGHT + SPACING ) @@ -185,7 +185,7 @@ class storylineView(QWidget, Ui_storylineView): # Tests if POV scenePOV = False # Will hold true of character is POV of the current text, not containing folder - if references.type(ref) == references.PersoLetter: + if references.type(ref) == references.CharacterLetter: ID = references.ID(ref) c = child while c: @@ -221,8 +221,8 @@ class storylineView(QWidget, Ui_storylineView): itemsRect.setPos(0, MAX_LEVEL * LEVEL_HEIGHT + SPACING) for ref in trackedItems: - if references.type(ref) == references.PersoLetter: - color = QColor(self._mdlCharacter.getPersoColorByID(references.ID(ref))) + if references.type(ref) == references.CharacterLetter: + color = self._mdlCharacter.getCharacterByID(references.ID(ref)).color() else: color = randomColor()