mirror of
https://github.com/olivierkes/manuskript.git
synced 2024-05-16 10:52:29 +12:00
Improve linking data changes
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
This commit is contained in:
parent
cfa7452292
commit
cf4e4bc794
|
@ -7,6 +7,7 @@ from manuskript.data.goal import GoalKind, Goal
|
|||
from manuskript.data.importance import Importance
|
||||
from manuskript.data.info import Info
|
||||
from manuskript.data.labels import LabelHost, Label
|
||||
from manuskript.data.links import LinkAction, Links
|
||||
from manuskript.data.outline import Outline, OutlineFolder, OutlineText
|
||||
from manuskript.data.plots import Plots, PlotLine, PlotStep
|
||||
from manuskript.data.project import Project
|
||||
|
|
|
@ -8,6 +8,7 @@ from collections.abc import Callable
|
|||
|
||||
from manuskript.data.color import Color
|
||||
from manuskript.data.importance import Importance
|
||||
from manuskript.data.links import LinkAction, Links
|
||||
from manuskript.data.unique_id import UniqueIDHost
|
||||
from manuskript.io.mmdFile import MmdFile
|
||||
from manuskript.util import safeFilename
|
||||
|
@ -18,7 +19,7 @@ class Character:
|
|||
def __init__(self, path, characters):
|
||||
self.file = MmdFile(path, 21)
|
||||
self.characters = characters
|
||||
self.links = list()
|
||||
self.links = Links()
|
||||
|
||||
self.UID = None
|
||||
self.name = None
|
||||
|
@ -35,20 +36,11 @@ class Character:
|
|||
self.color = None
|
||||
self.details = dict()
|
||||
|
||||
def link(self, callback: Callable[[int], None]):
|
||||
self.links.append(callback)
|
||||
|
||||
def unlink(self, callback: Callable[[int], None]):
|
||||
self.links.remove(callback)
|
||||
|
||||
def allowPOV(self) -> bool:
|
||||
return True if self.POV is None else self.POV
|
||||
|
||||
def remove(self):
|
||||
for link in self.links:
|
||||
link(self.UID.value)
|
||||
|
||||
self.links.clear()
|
||||
self.links.call(LinkAction.DELETE, self.UID, self)
|
||||
self.characters.remove(self)
|
||||
|
||||
@classmethod
|
||||
|
@ -87,6 +79,8 @@ class Character:
|
|||
for (key, value) in metadata.items():
|
||||
self.details[key] = value
|
||||
|
||||
self.links.call(LinkAction.RELOAD, self.UID, self)
|
||||
|
||||
def save(self):
|
||||
metadata = OrderedDict()
|
||||
|
||||
|
|
32
manuskript/data/links.py
Normal file
32
manuskript/data/links.py
Normal file
|
@ -0,0 +1,32 @@
|
|||
#!/usr/bin/env python
|
||||
# --!-- coding: utf8 --!--
|
||||
from collections.abc import Callable
|
||||
from enum import Enum, unique
|
||||
|
||||
from manuskript.data.unique_id import UniqueID
|
||||
|
||||
|
||||
@unique
|
||||
class LinkAction(Enum):
|
||||
DELETE = 0
|
||||
UPDATE = 1
|
||||
RELOAD = 2
|
||||
|
||||
|
||||
class Links:
|
||||
|
||||
def __init__(self):
|
||||
self.callbacks = list()
|
||||
|
||||
def add(self, callback: Callable[[LinkAction, UniqueID, any], None]):
|
||||
self.callbacks.append(callback)
|
||||
|
||||
def remove(self, callback: Callable[[LinkAction, UniqueID, any], None]):
|
||||
self.callbacks.remove(callback)
|
||||
|
||||
def call(self, action: LinkAction, UID: UniqueID, host: any):
|
||||
for callback in self.callbacks:
|
||||
callback(action, UID, host)
|
||||
|
||||
if action == LinkAction.DELETE:
|
||||
self.callbacks.clear()
|
|
@ -4,8 +4,9 @@
|
|||
import os
|
||||
|
||||
from lxml import etree
|
||||
from manuskript.data.characters import Characters
|
||||
from manuskript.data.characters import Characters, Character
|
||||
from manuskript.data.importance import Importance
|
||||
from manuskript.data.links import LinkAction, Links
|
||||
from manuskript.data.unique_id import UniqueIDHost, UniqueID
|
||||
from manuskript.io.xmlFile import XmlFile
|
||||
|
||||
|
@ -29,6 +30,7 @@ class PlotLine:
|
|||
def __init__(self, plots, UID: UniqueID, name: str = None, importance: Importance = Importance.MINOR):
|
||||
self.plots = plots
|
||||
self.host = UniqueIDHost()
|
||||
self.links = Links()
|
||||
|
||||
if name is None:
|
||||
name = "New plot"
|
||||
|
@ -41,38 +43,51 @@ class PlotLine:
|
|||
self.result = ""
|
||||
self.steps = list()
|
||||
|
||||
def addCharacterByID(self, ID: int):
|
||||
character = self.plots.characters.getByID(ID)
|
||||
def __linkActionCharacter(self, action: LinkAction, UID: UniqueID, character):
|
||||
if action == LinkAction.DELETE:
|
||||
self.removeCharacter(character, False)
|
||||
|
||||
self.links.call(LinkAction.UPDATE, self.UID, self)
|
||||
|
||||
def addCharacter(self, character: Character):
|
||||
if character is None:
|
||||
return
|
||||
|
||||
character.link(self.removeCharacterByID)
|
||||
character.links.add(self.__linkActionCharacter)
|
||||
|
||||
self.characters.append(character.UID.value)
|
||||
self.links.call(LinkAction.UPDATE, self.UID, self)
|
||||
|
||||
def removeCharacterByID(self, ID: int):
|
||||
character = self.plots.characters.getByID(ID)
|
||||
|
||||
def removeCharacter(self, character: Character, unlink: bool = True):
|
||||
if character is None:
|
||||
self.characters.remove(ID)
|
||||
else:
|
||||
character.unlink(self.removeCharacterByID)
|
||||
self.characters.remove(character.UID.value)
|
||||
return
|
||||
|
||||
if unlink:
|
||||
character.links.remove(self.__linkActionCharacter)
|
||||
|
||||
self.characters.remove(character.UID.value)
|
||||
self.links.call(LinkAction.UPDATE, self.UID, self)
|
||||
|
||||
def addStep(self, name: str, meta: str = "", summary: str = ""):
|
||||
step = PlotStep(self, self.host.newID(), name, meta, summary)
|
||||
self.steps.append(step)
|
||||
|
||||
self.links.call(LinkAction.UPDATE, self.UID, self)
|
||||
return step
|
||||
|
||||
def loadStep(self, ID: int, name: str, meta: str = "", summary: str = ""):
|
||||
step = PlotStep(self, self.host.loadID(ID), name, meta, summary)
|
||||
self.steps.append(step)
|
||||
|
||||
self.links.call(LinkAction.UPDATE, self.UID, self)
|
||||
return step
|
||||
|
||||
def removeStep(self, step: PlotStep):
|
||||
self.host.removeID(step.UID)
|
||||
self.steps.remove(step)
|
||||
|
||||
self.links.call(LinkAction.UPDATE, self.UID, self)
|
||||
|
||||
def __iter__(self):
|
||||
return self.steps.__iter__()
|
||||
|
||||
|
@ -96,9 +111,13 @@ class Plots:
|
|||
def loadLine(self, ID: int, name: str = None, importance: Importance = Importance.MINOR):
|
||||
line = PlotLine(self, self.host.loadID(ID), name, importance)
|
||||
self.lines[line.UID.value] = line
|
||||
|
||||
line.links.call(LinkAction.RELOAD, line.UID, line)
|
||||
return line
|
||||
|
||||
def removeLine(self, line: PlotLine):
|
||||
line.links.call(LinkAction.DELETE, line.UID, line)
|
||||
|
||||
self.host.removeID(line.UID)
|
||||
self.lines.pop(line.UID.value)
|
||||
|
||||
|
@ -136,12 +155,7 @@ class Plots:
|
|||
|
||||
for characterID in element.get("characters", "").split(','):
|
||||
try:
|
||||
character = plots.characters.getByID(int(characterID))
|
||||
|
||||
if character is None:
|
||||
continue
|
||||
|
||||
line.addCharacterByID(character.UID.value)
|
||||
line.addCharacter(plots.characters.getByID(int(characterID)))
|
||||
except ValueError:
|
||||
continue
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ import gi
|
|||
gi.require_version("Gtk", "3.0")
|
||||
from gi.repository import Gtk
|
||||
|
||||
from manuskript.data import Plots, PlotLine, PlotStep, Importance
|
||||
from manuskript.data import Plots, PlotLine, PlotStep, Importance, LinkAction
|
||||
from manuskript.ui.util import rgbaFromColor, pixbufFromColor
|
||||
from manuskript.util import validString, invalidString, validInt, invalidInt
|
||||
|
||||
|
@ -27,7 +27,7 @@ class PlotView:
|
|||
self.refreshPlotsStore()
|
||||
|
||||
self.charactersStore = builder.get_object("characters_store")
|
||||
self.refreshCharacterStore()
|
||||
self.refreshCharactersStore()
|
||||
|
||||
self.filteredPlotsStore = builder.get_object("filtered_plots_store")
|
||||
self.mainPlotsStore = builder.get_object("main_plots_store")
|
||||
|
@ -100,7 +100,7 @@ class PlotView:
|
|||
self.plotsStore.set_value(tree_iter, 1, validString(plotLine.name))
|
||||
self.plotsStore.set_value(tree_iter, 2, Importance.asValue(plotLine.importance))
|
||||
|
||||
def refreshCharacterStore(self):
|
||||
def refreshCharactersStore(self):
|
||||
self.charactersStore.clear()
|
||||
|
||||
for character in self.plots.characters:
|
||||
|
@ -113,7 +113,16 @@ class PlotView:
|
|||
self.charactersStore.set_value(tree_iter, 1, validString(character.name))
|
||||
self.charactersStore.set_value(tree_iter, 2, pixbufFromColor(character.color))
|
||||
|
||||
def __linkActionPlotLine(self, action, UID, plotLine):
|
||||
if action == LinkAction.DELETE:
|
||||
return
|
||||
|
||||
self.plotCharactersStore.refilter()
|
||||
|
||||
def loadPlotData(self, plotLine: PlotLine):
|
||||
if self.plotLine is not None:
|
||||
self.plotLine.links.remove(self.__linkActionPlotLine)
|
||||
|
||||
self.plotLine = None
|
||||
|
||||
self.importanceCombo.set_active(Importance.asValue(plotLine.importance))
|
||||
|
@ -124,9 +133,16 @@ class PlotView:
|
|||
|
||||
self.plotLine = plotLine
|
||||
|
||||
if self.plotLine is not None:
|
||||
self.plotLine.links.add(self.__linkActionPlotLine)
|
||||
|
||||
self.refreshCharactersStore()
|
||||
self.plotCharactersStore.refilter()
|
||||
|
||||
def unloadPlotData(self):
|
||||
if self.plotLine is not None:
|
||||
self.plotLine.links.remove(self.__linkActionPlotLine)
|
||||
|
||||
self.plotLine = None
|
||||
|
||||
self.nameBuffer.set_text("", -1)
|
||||
|
|
Loading…
Reference in a new issue