mirror of
https://github.com/olivierkes/manuskript.git
synced 2024-05-13 17:32:24 +12:00
Working on a more flexible loading/saving system
This commit is contained in:
parent
aece6ca87f
commit
1f85ee6171
|
@ -179,6 +179,10 @@ def allPaths(suffix=None):
|
||||||
return paths
|
return paths
|
||||||
|
|
||||||
def lightBlue():
|
def lightBlue():
|
||||||
|
"""
|
||||||
|
A light blue used in several places in manuskript.
|
||||||
|
@return: QColor
|
||||||
|
"""
|
||||||
return QColor(Qt.blue).lighter(190)
|
return QColor(Qt.blue).lighter(190)
|
||||||
|
|
||||||
def totalObjects():
|
def totalObjects():
|
||||||
|
|
|
@ -1,156 +1,27 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# --!-- coding: utf8 --!--
|
# --!-- coding: utf8 --!--
|
||||||
|
|
||||||
import zipfile
|
# The loadSave file calls the propper functions to load and save file
|
||||||
|
# trying to detect the proper file format if it comes from an older version
|
||||||
|
|
||||||
from PyQt5.QtCore import QModelIndex, Qt
|
import manuskript.load_save.version_0 as v0
|
||||||
from PyQt5.QtGui import QColor, QStandardItem
|
import manuskript.load_save.version_1 as v1
|
||||||
from PyQt5.QtWidgets import qApp
|
|
||||||
from lxml import etree as ET
|
|
||||||
|
|
||||||
from manuskript.functions import iconColor, iconFromColorString
|
def saveProject(version=None):
|
||||||
|
|
||||||
try:
|
if version == 0:
|
||||||
import zlib # Used with zipfile for compression
|
v0.saveProject()
|
||||||
|
|
||||||
compression = zipfile.ZIP_DEFLATED
|
|
||||||
except:
|
|
||||||
compression = zipfile.ZIP_STORED
|
|
||||||
|
|
||||||
|
|
||||||
def saveFilesToZip(files, zipname):
|
|
||||||
"""Saves given files to zipname.
|
|
||||||
files is actually a list of (content, filename)."""
|
|
||||||
|
|
||||||
zf = zipfile.ZipFile(zipname, mode="w")
|
|
||||||
|
|
||||||
for content, filename in files:
|
|
||||||
zf.writestr(filename, content, compress_type=compression)
|
|
||||||
|
|
||||||
zf.close()
|
|
||||||
|
|
||||||
|
|
||||||
def loadFilesFromZip(zipname):
|
|
||||||
"""Returns the content of zipfile as a dict of filename:content."""
|
|
||||||
print(zipname)
|
|
||||||
zf = zipfile.ZipFile(zipname)
|
|
||||||
files = {}
|
|
||||||
for f in zf.namelist():
|
|
||||||
files[f] = zf.read(f)
|
|
||||||
return files
|
|
||||||
|
|
||||||
|
|
||||||
def saveStandardItemModelXML(mdl, xml=None):
|
|
||||||
"""Saves the given QStandardItemModel to XML.
|
|
||||||
If xml (filename) is given, saves to xml. Otherwise returns as string."""
|
|
||||||
|
|
||||||
root = ET.Element("model")
|
|
||||||
root.attrib["version"] = qApp.applicationVersion()
|
|
||||||
|
|
||||||
# Header
|
|
||||||
header = ET.SubElement(root, "header")
|
|
||||||
vHeader = ET.SubElement(header, "vertical")
|
|
||||||
for x in range(mdl.rowCount()):
|
|
||||||
vH = ET.SubElement(vHeader, "label")
|
|
||||||
vH.attrib["row"] = str(x)
|
|
||||||
vH.attrib["text"] = str(mdl.headerData(x, Qt.Vertical))
|
|
||||||
|
|
||||||
hHeader = ET.SubElement(header, "horizontal")
|
|
||||||
for y in range(mdl.columnCount()):
|
|
||||||
hH = ET.SubElement(hHeader, "label")
|
|
||||||
hH.attrib["row"] = str(y)
|
|
||||||
hH.attrib["text"] = str(mdl.headerData(y, Qt.Horizontal))
|
|
||||||
|
|
||||||
# Data
|
|
||||||
data = ET.SubElement(root, "data")
|
|
||||||
saveItem(data, mdl)
|
|
||||||
|
|
||||||
# print(qApp.tr("Saving to {}.").format(xml))
|
|
||||||
if xml:
|
|
||||||
ET.ElementTree(root).write(xml, encoding="UTF-8", xml_declaration=True, pretty_print=True)
|
|
||||||
else:
|
else:
|
||||||
return ET.tostring(root, encoding="UTF-8", xml_declaration=True, pretty_print=True)
|
v1.saveProject()
|
||||||
|
|
||||||
|
|
||||||
def saveItem(root, mdl, parent=QModelIndex()):
|
def loadProject(project):
|
||||||
for x in range(mdl.rowCount(parent)):
|
|
||||||
row = ET.SubElement(root, "row")
|
|
||||||
row.attrib["row"] = str(x)
|
|
||||||
|
|
||||||
for y in range(mdl.columnCount(parent)):
|
# Detect version
|
||||||
col = ET.SubElement(row, "col")
|
# FIXME
|
||||||
col.attrib["col"] = str(y)
|
version = 0
|
||||||
if mdl.data(mdl.index(x, y, parent), Qt.DecorationRole) != None:
|
|
||||||
color = iconColor(mdl.data(mdl.index(x, y, parent), Qt.DecorationRole)).name(QColor.HexArgb)
|
|
||||||
col.attrib["color"] = color if color != "#ff000000" else "#00000000"
|
|
||||||
if mdl.data(mdl.index(x, y, parent)) != "":
|
|
||||||
col.text = mdl.data(mdl.index(x, y, parent))
|
|
||||||
if mdl.hasChildren(mdl.index(x, y, parent)):
|
|
||||||
saveItem(col, mdl, mdl.index(x, y, parent))
|
|
||||||
|
|
||||||
|
if version == 0:
|
||||||
def loadStandardItemModelXML(mdl, xml, fromString=False):
|
v0.loadProject(project)
|
||||||
"""Load data to a QStandardItemModel mdl from xml.
|
|
||||||
By default xml is a filename. If fromString=True, xml is a string containg the data."""
|
|
||||||
|
|
||||||
# print(qApp.tr("Loading {}... ").format(xml), end="")
|
|
||||||
|
|
||||||
if not fromString:
|
|
||||||
try:
|
|
||||||
tree = ET.parse(xml)
|
|
||||||
except:
|
|
||||||
print("Failed.")
|
|
||||||
return
|
|
||||||
else:
|
else:
|
||||||
root = ET.fromstring(xml)
|
v1.loadProject(project)
|
||||||
|
|
||||||
# root = tree.getroot()
|
|
||||||
|
|
||||||
# Header
|
|
||||||
hLabels = []
|
|
||||||
vLabels = []
|
|
||||||
for l in root.find("header").find("horizontal").findall("label"):
|
|
||||||
hLabels.append(l.attrib["text"])
|
|
||||||
for l in root.find("header").find("vertical").findall("label"):
|
|
||||||
vLabels.append(l.attrib["text"])
|
|
||||||
|
|
||||||
# print(root.find("header").find("vertical").text)
|
|
||||||
|
|
||||||
# mdl.setVerticalHeaderLabels(vLabels)
|
|
||||||
# mdl.setHorizontalHeaderLabels(hLabels)
|
|
||||||
|
|
||||||
# Populates with empty items
|
|
||||||
for i in enumerate(vLabels):
|
|
||||||
row = []
|
|
||||||
for r in enumerate(hLabels):
|
|
||||||
row.append(QStandardItem())
|
|
||||||
mdl.appendRow(row)
|
|
||||||
|
|
||||||
# Data
|
|
||||||
data = root.find("data")
|
|
||||||
loadItem(data, mdl)
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def loadItem(root, mdl, parent=QModelIndex()):
|
|
||||||
for row in root:
|
|
||||||
r = int(row.attrib["row"])
|
|
||||||
for col in row:
|
|
||||||
c = int(col.attrib["col"])
|
|
||||||
item = mdl.itemFromIndex(mdl.index(r, c, parent))
|
|
||||||
if not item:
|
|
||||||
item = QStandardItem()
|
|
||||||
mdl.itemFromIndex(parent).setChild(r, c, item)
|
|
||||||
|
|
||||||
if col.text:
|
|
||||||
# mdl.setData(mdl.index(r, c, parent), col.text)
|
|
||||||
item.setText(col.text)
|
|
||||||
|
|
||||||
if "color" in col.attrib:
|
|
||||||
# mdl.itemFromIndex(mdl.index(r, c, parent)).setIcon(iconFromColorString(col.attrib["color"]))
|
|
||||||
item.setIcon(iconFromColorString(col.attrib["color"]))
|
|
||||||
|
|
||||||
if len(col) != 0:
|
|
||||||
# loadItem(col, mdl, mdl.index(r, c, parent))
|
|
||||||
loadItem(col, mdl, mdl.indexFromItem(item))
|
|
||||||
|
|
0
manuskript/load_save/__init__.py
Normal file
0
manuskript/load_save/__init__.py
Normal file
249
manuskript/load_save/version_0.py
Normal file
249
manuskript/load_save/version_0.py
Normal file
|
@ -0,0 +1,249 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# --!-- coding: utf8 --!--
|
||||||
|
|
||||||
|
# Version 0 of file saving format.
|
||||||
|
# Was used at the begining and up util version XXX when
|
||||||
|
# it was superseded by Version 1, which is more open and flexible
|
||||||
|
|
||||||
|
import zipfile
|
||||||
|
|
||||||
|
from PyQt5.QtCore import QModelIndex, Qt
|
||||||
|
from PyQt5.QtGui import QColor, QStandardItem
|
||||||
|
from PyQt5.QtWidgets import qApp
|
||||||
|
from lxml import etree as ET
|
||||||
|
|
||||||
|
from manuskript import settings
|
||||||
|
from manuskript.functions import iconColor, iconFromColorString, mainWindow
|
||||||
|
|
||||||
|
try:
|
||||||
|
import zlib # Used with zipfile for compression
|
||||||
|
|
||||||
|
compression = zipfile.ZIP_DEFLATED
|
||||||
|
except:
|
||||||
|
compression = zipfile.ZIP_STORED
|
||||||
|
|
||||||
|
###########################################################################################
|
||||||
|
# SAVE
|
||||||
|
###########################################################################################
|
||||||
|
|
||||||
|
def saveProject():
|
||||||
|
"""
|
||||||
|
Saves the whole project. Call this function to save the project in Version 0 format.
|
||||||
|
"""
|
||||||
|
|
||||||
|
files = []
|
||||||
|
mw = mainWindow()
|
||||||
|
|
||||||
|
files.append((saveStandardItemModelXML(mw.mdlFlatData),
|
||||||
|
"flatModel.xml"))
|
||||||
|
files.append((saveStandardItemModelXML(mw.mdlCharacter),
|
||||||
|
"perso.xml"))
|
||||||
|
files.append((saveStandardItemModelXML(mw.mdlWorld),
|
||||||
|
"world.xml"))
|
||||||
|
files.append((saveStandardItemModelXML(mw.mdlLabels),
|
||||||
|
"labels.xml"))
|
||||||
|
files.append((saveStandardItemModelXML(mw.mdlStatus),
|
||||||
|
"status.xml"))
|
||||||
|
files.append((saveStandardItemModelXML(mw.mdlPlots),
|
||||||
|
"plots.xml"))
|
||||||
|
files.append((mw.mdlOutline.saveToXML(),
|
||||||
|
"outline.xml"))
|
||||||
|
files.append((settings.save(),
|
||||||
|
"settings.pickle"))
|
||||||
|
|
||||||
|
saveFilesToZip(files, mw.currentProject)
|
||||||
|
|
||||||
|
def saveFilesToZip(files, zipname):
|
||||||
|
"""Saves given files to zipname.
|
||||||
|
files is actually a list of (content, filename)."""
|
||||||
|
|
||||||
|
zf = zipfile.ZipFile(zipname, mode="w")
|
||||||
|
|
||||||
|
for content, filename in files:
|
||||||
|
zf.writestr(filename, content, compress_type=compression)
|
||||||
|
|
||||||
|
zf.close()
|
||||||
|
|
||||||
|
def saveStandardItemModelXML(mdl, xml=None):
|
||||||
|
"""Saves the given QStandardItemModel to XML.
|
||||||
|
If xml (filename) is given, saves to xml. Otherwise returns as string."""
|
||||||
|
|
||||||
|
root = ET.Element("model")
|
||||||
|
root.attrib["version"] = qApp.applicationVersion()
|
||||||
|
|
||||||
|
# Header
|
||||||
|
header = ET.SubElement(root, "header")
|
||||||
|
vHeader = ET.SubElement(header, "vertical")
|
||||||
|
for x in range(mdl.rowCount()):
|
||||||
|
vH = ET.SubElement(vHeader, "label")
|
||||||
|
vH.attrib["row"] = str(x)
|
||||||
|
vH.attrib["text"] = str(mdl.headerData(x, Qt.Vertical))
|
||||||
|
|
||||||
|
hHeader = ET.SubElement(header, "horizontal")
|
||||||
|
for y in range(mdl.columnCount()):
|
||||||
|
hH = ET.SubElement(hHeader, "label")
|
||||||
|
hH.attrib["row"] = str(y)
|
||||||
|
hH.attrib["text"] = str(mdl.headerData(y, Qt.Horizontal))
|
||||||
|
|
||||||
|
# Data
|
||||||
|
data = ET.SubElement(root, "data")
|
||||||
|
saveItem(data, mdl)
|
||||||
|
|
||||||
|
# print(qApp.tr("Saving to {}.").format(xml))
|
||||||
|
if xml:
|
||||||
|
ET.ElementTree(root).write(xml, encoding="UTF-8", xml_declaration=True, pretty_print=True)
|
||||||
|
else:
|
||||||
|
return ET.tostring(root, encoding="UTF-8", xml_declaration=True, pretty_print=True)
|
||||||
|
|
||||||
|
|
||||||
|
def saveItem(root, mdl, parent=QModelIndex()):
|
||||||
|
for x in range(mdl.rowCount(parent)):
|
||||||
|
row = ET.SubElement(root, "row")
|
||||||
|
row.attrib["row"] = str(x)
|
||||||
|
|
||||||
|
for y in range(mdl.columnCount(parent)):
|
||||||
|
col = ET.SubElement(row, "col")
|
||||||
|
col.attrib["col"] = str(y)
|
||||||
|
if mdl.data(mdl.index(x, y, parent), Qt.DecorationRole) != None:
|
||||||
|
color = iconColor(mdl.data(mdl.index(x, y, parent), Qt.DecorationRole)).name(QColor.HexArgb)
|
||||||
|
col.attrib["color"] = color if color != "#ff000000" else "#00000000"
|
||||||
|
if mdl.data(mdl.index(x, y, parent)) != "":
|
||||||
|
col.text = mdl.data(mdl.index(x, y, parent))
|
||||||
|
if mdl.hasChildren(mdl.index(x, y, parent)):
|
||||||
|
saveItem(col, mdl, mdl.index(x, y, parent))
|
||||||
|
|
||||||
|
###########################################################################################
|
||||||
|
# LOAD
|
||||||
|
###########################################################################################
|
||||||
|
|
||||||
|
def loadProject(project):
|
||||||
|
|
||||||
|
files = loadFilesFromZip(project)
|
||||||
|
mw = mainWindow()
|
||||||
|
|
||||||
|
errors = []
|
||||||
|
|
||||||
|
if "flatModel.xml" in files:
|
||||||
|
loadStandardItemModelXML(mw.mdlFlatData,
|
||||||
|
files["flatModel.xml"], fromString=True)
|
||||||
|
else:
|
||||||
|
errors.append("flatModel.xml")
|
||||||
|
|
||||||
|
if "perso.xml" in files:
|
||||||
|
loadStandardItemModelXML(mw.mdlCharacter,
|
||||||
|
files["perso.xml"], fromString=True)
|
||||||
|
else:
|
||||||
|
errors.append("perso.xml")
|
||||||
|
|
||||||
|
if "world.xml" in files:
|
||||||
|
loadStandardItemModelXML(mw.mdlWorld,
|
||||||
|
files["world.xml"], fromString=True)
|
||||||
|
else:
|
||||||
|
errors.append("world.xml")
|
||||||
|
|
||||||
|
if "labels.xml" in files:
|
||||||
|
loadStandardItemModelXML(mw.mdlLabels,
|
||||||
|
files["labels.xml"], fromString=True)
|
||||||
|
else:
|
||||||
|
errors.append("perso.xml")
|
||||||
|
|
||||||
|
if "status.xml" in files:
|
||||||
|
loadStandardItemModelXML(mw.mdlStatus,
|
||||||
|
files["status.xml"], fromString=True)
|
||||||
|
else:
|
||||||
|
errors.append("perso.xml")
|
||||||
|
|
||||||
|
if "plots.xml" in files:
|
||||||
|
loadStandardItemModelXML(mw.mdlPlots,
|
||||||
|
files["plots.xml"], fromString=True)
|
||||||
|
else:
|
||||||
|
errors.append("perso.xml")
|
||||||
|
|
||||||
|
if "outline.xml" in files:
|
||||||
|
mw.mdlOutline.loadFromXML(files["outline.xml"], fromString=True)
|
||||||
|
else:
|
||||||
|
errors.append("perso.xml")
|
||||||
|
|
||||||
|
if "settings.pickle" in files:
|
||||||
|
settings.load(files["settings.pickle"], fromString=True)
|
||||||
|
else:
|
||||||
|
errors.append("perso.xml")
|
||||||
|
|
||||||
|
return errors
|
||||||
|
|
||||||
|
|
||||||
|
def loadFilesFromZip(zipname):
|
||||||
|
"""Returns the content of zipfile as a dict of filename:content."""
|
||||||
|
print(zipname)
|
||||||
|
zf = zipfile.ZipFile(zipname)
|
||||||
|
files = {}
|
||||||
|
for f in zf.namelist():
|
||||||
|
files[f] = zf.read(f)
|
||||||
|
return files
|
||||||
|
|
||||||
|
|
||||||
|
def loadStandardItemModelXML(mdl, xml, fromString=False):
|
||||||
|
"""Load data to a QStandardItemModel mdl from xml.
|
||||||
|
By default xml is a filename. If fromString=True, xml is a string containg the data."""
|
||||||
|
|
||||||
|
# print(qApp.tr("Loading {}... ").format(xml), end="")
|
||||||
|
|
||||||
|
if not fromString:
|
||||||
|
try:
|
||||||
|
tree = ET.parse(xml)
|
||||||
|
except:
|
||||||
|
print("Failed.")
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
root = ET.fromstring(xml)
|
||||||
|
|
||||||
|
# root = tree.getroot()
|
||||||
|
|
||||||
|
# Header
|
||||||
|
hLabels = []
|
||||||
|
vLabels = []
|
||||||
|
for l in root.find("header").find("horizontal").findall("label"):
|
||||||
|
hLabels.append(l.attrib["text"])
|
||||||
|
for l in root.find("header").find("vertical").findall("label"):
|
||||||
|
vLabels.append(l.attrib["text"])
|
||||||
|
|
||||||
|
# print(root.find("header").find("vertical").text)
|
||||||
|
|
||||||
|
# mdl.setVerticalHeaderLabels(vLabels)
|
||||||
|
# mdl.setHorizontalHeaderLabels(hLabels)
|
||||||
|
|
||||||
|
# Populates with empty items
|
||||||
|
for i in enumerate(vLabels):
|
||||||
|
row = []
|
||||||
|
for r in enumerate(hLabels):
|
||||||
|
row.append(QStandardItem())
|
||||||
|
mdl.appendRow(row)
|
||||||
|
|
||||||
|
# Data
|
||||||
|
data = root.find("data")
|
||||||
|
loadItem(data, mdl)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def loadItem(root, mdl, parent=QModelIndex()):
|
||||||
|
for row in root:
|
||||||
|
r = int(row.attrib["row"])
|
||||||
|
for col in row:
|
||||||
|
c = int(col.attrib["col"])
|
||||||
|
item = mdl.itemFromIndex(mdl.index(r, c, parent))
|
||||||
|
if not item:
|
||||||
|
item = QStandardItem()
|
||||||
|
mdl.itemFromIndex(parent).setChild(r, c, item)
|
||||||
|
|
||||||
|
if col.text:
|
||||||
|
# mdl.setData(mdl.index(r, c, parent), col.text)
|
||||||
|
item.setText(col.text)
|
||||||
|
|
||||||
|
if "color" in col.attrib:
|
||||||
|
# mdl.itemFromIndex(mdl.index(r, c, parent)).setIcon(iconFromColorString(col.attrib["color"]))
|
||||||
|
item.setIcon(iconFromColorString(col.attrib["color"]))
|
||||||
|
|
||||||
|
if len(col) != 0:
|
||||||
|
# loadItem(col, mdl, mdl.index(r, c, parent))
|
||||||
|
loadItem(col, mdl, mdl.indexFromItem(item))
|
81
manuskript/load_save/version_1.py
Normal file
81
manuskript/load_save/version_1.py
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# --!-- coding: utf8 --!--
|
||||||
|
|
||||||
|
# Version 1 of file saving format.
|
||||||
|
# Aims at providing a plain-text way of saving a project
|
||||||
|
# (except for some elements), allowing collaborative work
|
||||||
|
# versioning and third-partty editing.
|
||||||
|
import os
|
||||||
|
import zipfile
|
||||||
|
|
||||||
|
from manuskript import settings
|
||||||
|
from manuskript.functions import mainWindow
|
||||||
|
|
||||||
|
try:
|
||||||
|
import zlib # Used with zipfile for compression
|
||||||
|
|
||||||
|
compression = zipfile.ZIP_DEFLATED
|
||||||
|
except:
|
||||||
|
compression = zipfile.ZIP_STORED
|
||||||
|
|
||||||
|
|
||||||
|
def saveProject(zip=None):
|
||||||
|
"""
|
||||||
|
Saves the project. If zip is False, the project is saved as a multitude of plain-text files for the most parts
|
||||||
|
and some XML or zip? for settings and stuff.
|
||||||
|
If zip is True, everything is saved as a single zipped file. Easier to carry around, but does not allow
|
||||||
|
collaborative work, versionning, or third-party editing.
|
||||||
|
@param zip: if True, saves as a single file. If False, saves as plain-text. If None, tries to determine based on
|
||||||
|
settings.
|
||||||
|
@return: Nothing
|
||||||
|
"""
|
||||||
|
if zip is None:
|
||||||
|
zip = False
|
||||||
|
# Fixme
|
||||||
|
|
||||||
|
|
||||||
|
files = []
|
||||||
|
mw = mainWindow()
|
||||||
|
|
||||||
|
# files.append((saveStandardItemModelXML(mw.mdlFlatData),
|
||||||
|
# "flatModel.xml"))
|
||||||
|
# # files.append((saveStandardItemModelXML(self.mdlCharacter),
|
||||||
|
# # "perso.xml"))
|
||||||
|
# files.append((saveStandardItemModelXML(mw.mdlWorld),
|
||||||
|
# "world.xml"))
|
||||||
|
# files.append((saveStandardItemModelXML(mw.mdlLabels),
|
||||||
|
# "labels.xml"))
|
||||||
|
# files.append((saveStandardItemModelXML(mw.mdlStatus),
|
||||||
|
# "status.xml"))
|
||||||
|
# files.append((saveStandardItemModelXML(mw.mdlPlots),
|
||||||
|
# "plots.xml"))
|
||||||
|
# files.append((mw.mdlOutline.saveToXML(),
|
||||||
|
# "outline.xml"))
|
||||||
|
# files.append((settings.save(),
|
||||||
|
# "settings.pickle"))
|
||||||
|
|
||||||
|
files.append(("blabla", "test/machin.txt"))
|
||||||
|
files.append(("youpi", "encore/truc.txt"))
|
||||||
|
|
||||||
|
project = mw.currentProject
|
||||||
|
|
||||||
|
project = os.path.join(
|
||||||
|
os.path.dirname(project),
|
||||||
|
"_" + os.path.basename(project)
|
||||||
|
)
|
||||||
|
|
||||||
|
zf = zipfile.ZipFile(project, mode="w")
|
||||||
|
|
||||||
|
for content, filename in files:
|
||||||
|
zf.writestr(filename, content, compress_type=compression)
|
||||||
|
|
||||||
|
zf.close()
|
||||||
|
|
||||||
|
|
||||||
|
def loadProject(project):
|
||||||
|
"""
|
||||||
|
Loads a project.
|
||||||
|
@param project: the filename of the project to open.
|
||||||
|
@return: an array of errors, empty if None.
|
||||||
|
"""
|
||||||
|
pass
|
|
@ -11,9 +11,7 @@ from PyQt5.QtWidgets import QMainWindow, QHeaderView, qApp, QMenu, QActionGroup,
|
||||||
from manuskript import settings
|
from manuskript import settings
|
||||||
from manuskript.enums import Character, Subplot, Plot, World
|
from manuskript.enums import Character, Subplot, Plot, World
|
||||||
from manuskript.functions import AUC, wordCount, appPath
|
from manuskript.functions import AUC, wordCount, appPath
|
||||||
from manuskript.loadSave import loadStandardItemModelXML, loadFilesFromZip
|
from manuskript.loadSave import saveProject, loadProject
|
||||||
from manuskript.loadSave import saveFilesToZip
|
|
||||||
from manuskript.loadSave import saveStandardItemModelXML
|
|
||||||
from manuskript.models.characterModel import characterModel
|
from manuskript.models.characterModel import characterModel
|
||||||
from manuskript.models.outlineModel import outlineModel
|
from manuskript.models.outlineModel import outlineModel
|
||||||
from manuskript.models.plotModel import plotModel
|
from manuskript.models.plotModel import plotModel
|
||||||
|
@ -462,27 +460,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||||
self.currentProject = projectName
|
self.currentProject = projectName
|
||||||
QSettings().setValue("lastProject", projectName)
|
QSettings().setValue("lastProject", projectName)
|
||||||
|
|
||||||
# Saving
|
saveProject(version=0)
|
||||||
files = []
|
|
||||||
|
|
||||||
files.append((saveStandardItemModelXML(self.mdlFlatData),
|
|
||||||
"flatModel.xml"))
|
|
||||||
# files.append((saveStandardItemModelXML(self.mdlCharacter),
|
|
||||||
# "perso.xml"))
|
|
||||||
files.append((saveStandardItemModelXML(self.mdlWorld),
|
|
||||||
"world.xml"))
|
|
||||||
files.append((saveStandardItemModelXML(self.mdlLabels),
|
|
||||||
"labels.xml"))
|
|
||||||
files.append((saveStandardItemModelXML(self.mdlStatus),
|
|
||||||
"status.xml"))
|
|
||||||
files.append((saveStandardItemModelXML(self.mdlPlots),
|
|
||||||
"plots.xml"))
|
|
||||||
files.append((self.mdlOutline.saveToXML(),
|
|
||||||
"outline.xml"))
|
|
||||||
files.append((settings.save(),
|
|
||||||
"settings.pickle"))
|
|
||||||
|
|
||||||
saveFilesToZip(files, self.currentProject)
|
|
||||||
|
|
||||||
# Giving some feedback
|
# Giving some feedback
|
||||||
print(self.tr("Project {} saved.").format(self.currentProject))
|
print(self.tr("Project {} saved.").format(self.currentProject))
|
||||||
|
@ -501,56 +479,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||||
self.mdlWorld = worldModel(self)
|
self.mdlWorld = worldModel(self)
|
||||||
|
|
||||||
def loadDatas(self, project):
|
def loadDatas(self, project):
|
||||||
# Loading
|
|
||||||
files = loadFilesFromZip(project)
|
|
||||||
|
|
||||||
errors = []
|
errors = loadProject(project)
|
||||||
|
|
||||||
if "flatModel.xml" in files:
|
|
||||||
loadStandardItemModelXML(self.mdlFlatData,
|
|
||||||
files["flatModel.xml"], fromString=True)
|
|
||||||
else:
|
|
||||||
errors.append("flatModel.xml")
|
|
||||||
|
|
||||||
if "perso.xml" in files:
|
|
||||||
loadStandardItemModelXML(self.mdlCharacter,
|
|
||||||
files["perso.xml"], fromString=True)
|
|
||||||
else:
|
|
||||||
errors.append("perso.xml")
|
|
||||||
|
|
||||||
if "world.xml" in files:
|
|
||||||
loadStandardItemModelXML(self.mdlWorld,
|
|
||||||
files["world.xml"], fromString=True)
|
|
||||||
else:
|
|
||||||
errors.append("world.xml")
|
|
||||||
|
|
||||||
if "labels.xml" in files:
|
|
||||||
loadStandardItemModelXML(self.mdlLabels,
|
|
||||||
files["labels.xml"], fromString=True)
|
|
||||||
else:
|
|
||||||
errors.append("perso.xml")
|
|
||||||
|
|
||||||
if "status.xml" in files:
|
|
||||||
loadStandardItemModelXML(self.mdlStatus,
|
|
||||||
files["status.xml"], fromString=True)
|
|
||||||
else:
|
|
||||||
errors.append("perso.xml")
|
|
||||||
|
|
||||||
if "plots.xml" in files:
|
|
||||||
loadStandardItemModelXML(self.mdlPlots,
|
|
||||||
files["plots.xml"], fromString=True)
|
|
||||||
else:
|
|
||||||
errors.append("perso.xml")
|
|
||||||
|
|
||||||
if "outline.xml" in files:
|
|
||||||
self.mdlOutline.loadFromXML(files["outline.xml"], fromString=True)
|
|
||||||
else:
|
|
||||||
errors.append("perso.xml")
|
|
||||||
|
|
||||||
if "settings.pickle" in files:
|
|
||||||
settings.load(files["settings.pickle"], fromString=True)
|
|
||||||
else:
|
|
||||||
errors.append("perso.xml")
|
|
||||||
|
|
||||||
# Giving some feedback
|
# Giving some feedback
|
||||||
if not errors:
|
if not errors:
|
||||||
|
|
Loading…
Reference in a new issue