manuskript/manuskript/data/world.py
TheJackiMonster 8029522563
Implement save as functionality moving data paths
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
2023-03-21 23:37:17 +01:00

153 lines
4 KiB
Python

#!/usr/bin/env python
# --!-- coding: utf8 --!--
import os
from manuskript.data.abstractData import AbstractData
from manuskript.data.unique_id import UniqueIDHost, UniqueID
from manuskript.io.opmlFile import OpmlFile, OpmlOutlineItem
class WorldItem:
def __init__(self, world, UID: UniqueID, name: str = None):
self.world = world
if name is None:
name = "New item"
self.UID = UID
self.name = name
self.description = None
self.passion = None
self.conflict = None
self.children = list()
def remove(self):
for child in self.children:
child.remove()
self.world.removeItem(self)
def __iter__(self):
return self.children.__iter__()
def load(self):
self.world.load()
class World(AbstractData):
def __init__(self, path):
AbstractData.__init__(self, os.path.join(path, "world.opml"))
self.file = OpmlFile(self.dataPath)
self.host = UniqueIDHost()
self.items = dict()
self.top = list()
def changePath(self, path: str):
AbstractData.changePath(self, os.path.join(path, "world.opml"))
self.file = OpmlFile(self.dataPath)
def addItem(self, name: str = None, parent: WorldItem = None) -> WorldItem:
item = WorldItem(self, self.host.newID(), name)
if parent is None:
self.top.append(item)
else:
parent.children.append(item)
self.items[item.UID.value] = item
return item
def loadItem(self, ID: int, name: str = None) -> WorldItem:
item = WorldItem(self, self.host.loadID(ID), name)
self.items[item.UID.value] = item
return item
def removeItem(self, item: WorldItem):
for __item in self.items.values():
if item in __item.children:
__item.children.remove(item)
if item in self.top:
self.top.remove(item)
self.host.removeID(item.UID)
self.items.pop(item.UID.value)
def getItemByID(self, ID: int) -> WorldItem:
return self.items.get(ID, None)
def __iter__(self):
return self.items.values().__iter__()
@classmethod
def loadWorldItem(cls, world, outline: OpmlOutlineItem):
ID = outline.attributes.get("ID", None)
if ID is None:
return None
item = world.loadItem(int(ID), outline.attributes.get("name", None))
item.description = outline.attributes.get("description", None)
item.passion = outline.attributes.get("passion", None)
item.conflict = outline.attributes.get("conflict", None)
for child in outline.children:
childItem = cls.loadWorldItem(world, child)
if childItem is None:
continue
item.children.append(childItem)
return item
def load(self):
self.items.clear()
self.top.clear()
AbstractData.load(self)
try:
outlines = self.file.load()
for outline in outlines:
item = World.loadWorldItem(self, outline)
if item is None:
continue
self.top.append(item)
self.complete()
except FileNotFoundError:
self.complete(False)
@classmethod
def saveWorldItem(cls, item: WorldItem):
outline = OpmlOutlineItem()
outline.attributes["name"] = item.name
outline.attributes["ID"] = str(item.UID.value)
outline.attributes["description"] = item.description
outline.attributes["passion"] = item.passion
outline.attributes["conflict"] = item.conflict
for childItem in item.children:
outline.children.append(cls.saveWorldItem(childItem))
return outline
def save(self):
AbstractData.save(self)
outlines = list()
for item in self.top:
outlines.append(World.saveWorldItem(item))
self.file.save(outlines)
self.complete()