mirror of
https://github.com/olivierkes/manuskript.git
synced 2024-06-01 10:39:34 +12:00
Add profiling function and implement loading on idle task
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
This commit is contained in:
parent
e368cc7f73
commit
038e101386
|
@ -212,10 +212,18 @@ class OutlineFolder(OutlineItem):
|
||||||
|
|
||||||
return count
|
return count
|
||||||
|
|
||||||
def load(self, _: bool = True):
|
def load(self, optimized: bool = True):
|
||||||
metadata, _ = self.file.loadMMD(True)
|
metadata, _ = self.file.loadMMD(True)
|
||||||
OutlineItem.loadMetadata(self, metadata)
|
OutlineItem.loadMetadata(self, metadata)
|
||||||
self.state = OutlineState.COMPLETE
|
|
||||||
|
if optimized:
|
||||||
|
self.state = OutlineState.OPTIMIZED
|
||||||
|
else:
|
||||||
|
for item in self.items:
|
||||||
|
if item.state != OutlineState.COMPLETE:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.state = OutlineState.COMPLETE
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def saveItems(cls, folder, recursive: bool = True):
|
def saveItems(cls, folder, recursive: bool = True):
|
||||||
|
|
|
@ -16,6 +16,7 @@ from manuskript.data.world import World
|
||||||
from manuskript.data.outline import Outline
|
from manuskript.data.outline import Outline
|
||||||
from manuskript.data.revisions import Revisions
|
from manuskript.data.revisions import Revisions
|
||||||
from manuskript.io.mskFile import MskFile
|
from manuskript.io.mskFile import MskFile
|
||||||
|
from manuskript.util import profileTime
|
||||||
|
|
||||||
|
|
||||||
class Project:
|
class Project:
|
||||||
|
@ -62,17 +63,17 @@ class Project:
|
||||||
except BadZipFile or FileNotFoundError:
|
except BadZipFile or FileNotFoundError:
|
||||||
return
|
return
|
||||||
|
|
||||||
self.version.load()
|
profileTime(self.version.load)
|
||||||
self.info.load()
|
profileTime(self.info.load)
|
||||||
self.summary.load()
|
profileTime(self.summary.load)
|
||||||
self.labels.load()
|
profileTime(self.labels.load)
|
||||||
self.statuses.load()
|
profileTime(self.statuses.load)
|
||||||
self.settings.load()
|
profileTime(self.settings.load)
|
||||||
self.characters.load()
|
profileTime(self.characters.load)
|
||||||
self.plots.load()
|
profileTime(self.plots.load)
|
||||||
self.world.load()
|
profileTime(self.world.load)
|
||||||
self.outline.load()
|
profileTime(self.outline.load)
|
||||||
self.revisions.load()
|
profileTime(self.revisions.load)
|
||||||
|
|
||||||
self.file.setZipFile(self.settings.isEnabled("saveToZip"))
|
self.file.setZipFile(self.settings.isEnabled("saveToZip"))
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ from manuskript.ui.aboutDialog import AboutDialog
|
||||||
from manuskript.ui.settingsWindow import SettingsWindow
|
from manuskript.ui.settingsWindow import SettingsWindow
|
||||||
from manuskript.ui.startupWindow import StartupWindow
|
from manuskript.ui.startupWindow import StartupWindow
|
||||||
from manuskript.ui.util import bindMenuItem
|
from manuskript.ui.util import bindMenuItem
|
||||||
|
from manuskript.util import profileTime
|
||||||
|
|
||||||
|
|
||||||
class MainWindow:
|
class MainWindow:
|
||||||
|
@ -31,9 +32,9 @@ class MainWindow:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if data is None:
|
if data is None:
|
||||||
view = view_cls()
|
view = profileTime(view_cls)
|
||||||
else:
|
else:
|
||||||
view = view_cls(data)
|
view = profileTime(view_cls, data)
|
||||||
except Exception:
|
except Exception:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
import gi
|
import gi
|
||||||
|
|
||||||
gi.require_version("Gtk", "3.0")
|
gi.require_version("Gtk", "3.0")
|
||||||
from gi.repository import Gtk, Pango
|
from gi.repository import GObject, Gtk, Pango
|
||||||
|
|
||||||
from manuskript.data import Project, OutlineFolder, OutlineText, OutlineItem, OutlineState, Goal
|
from manuskript.data import Project, OutlineFolder, OutlineText, OutlineItem, OutlineState, Goal
|
||||||
from manuskript.ui.editor import GridItem
|
from manuskript.ui.editor import GridItem
|
||||||
|
@ -17,6 +17,7 @@ class EditorView:
|
||||||
def __init__(self, project: Project):
|
def __init__(self, project: Project):
|
||||||
self.project = project
|
self.project = project
|
||||||
self.outlineItem = None
|
self.outlineItem = None
|
||||||
|
self.outlineCompletion = []
|
||||||
self.editorItems = list()
|
self.editorItems = list()
|
||||||
|
|
||||||
builder = Gtk.Builder()
|
builder = Gtk.Builder()
|
||||||
|
@ -76,21 +77,9 @@ class EditorView:
|
||||||
|
|
||||||
self.statusStore.set_value(tree_iter, 0, validString(status.name))
|
self.statusStore.set_value(tree_iter, 0, validString(status.name))
|
||||||
|
|
||||||
def __appendOutlineItem(self, outlineItem: OutlineItem, parent_iter=None):
|
def __updateOutlineItem(self, tree_iter, outlineItem: OutlineItem):
|
||||||
tree_iter = self.outlineStore.append(parent_iter)
|
|
||||||
|
|
||||||
if tree_iter is None:
|
|
||||||
return
|
|
||||||
|
|
||||||
if outlineItem.state != OutlineState.COMPLETE:
|
|
||||||
outlineItem.load(False)
|
|
||||||
|
|
||||||
icon = iconByOutlineItemType(outlineItem)
|
icon = iconByOutlineItemType(outlineItem)
|
||||||
|
|
||||||
if type(outlineItem) is OutlineFolder:
|
|
||||||
for item in outlineItem:
|
|
||||||
self.__appendOutlineItem(item, tree_iter)
|
|
||||||
|
|
||||||
wordCount = validInt(outlineItem.textCount())
|
wordCount = validInt(outlineItem.textCount())
|
||||||
goal = validInt(outlineItem.goalCount())
|
goal = validInt(outlineItem.goalCount())
|
||||||
progress = 100 * safeFraction(wordCount, 0, goal)
|
progress = 100 * safeFraction(wordCount, 0, goal)
|
||||||
|
@ -105,6 +94,34 @@ class EditorView:
|
||||||
self.outlineStore.set_value(tree_iter, 7, progress)
|
self.outlineStore.set_value(tree_iter, 7, progress)
|
||||||
self.outlineStore.set_value(tree_iter, 8, icon)
|
self.outlineStore.set_value(tree_iter, 8, icon)
|
||||||
|
|
||||||
|
def __completeOutlineItem(self):
|
||||||
|
(tree_iter, outlineItem) = self.outlineCompletion.pop(0)
|
||||||
|
|
||||||
|
if outlineItem.state != OutlineState.COMPLETE:
|
||||||
|
outlineItem.load(False)
|
||||||
|
|
||||||
|
self.__updateOutlineItem(tree_iter, outlineItem)
|
||||||
|
|
||||||
|
return len(self.outlineCompletion) > 0
|
||||||
|
|
||||||
|
def __appendOutlineItem(self, outlineItem: OutlineItem, parent_iter=None):
|
||||||
|
tree_iter = self.outlineStore.append(parent_iter)
|
||||||
|
|
||||||
|
if tree_iter is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
if type(outlineItem) is OutlineFolder:
|
||||||
|
for item in outlineItem:
|
||||||
|
self.__appendOutlineItem(item, tree_iter)
|
||||||
|
|
||||||
|
if outlineItem.state != OutlineState.COMPLETE:
|
||||||
|
if len(self.outlineCompletion) == 0:
|
||||||
|
GObject.idle_add(self.__completeOutlineItem)
|
||||||
|
|
||||||
|
self.outlineCompletion.append((tree_iter, outlineItem))
|
||||||
|
|
||||||
|
self.__updateOutlineItem(tree_iter, outlineItem)
|
||||||
|
|
||||||
def refreshOutlineStore(self):
|
def refreshOutlineStore(self):
|
||||||
self.outlineStore.clear()
|
self.outlineStore.clear()
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
import gi
|
import gi
|
||||||
|
|
||||||
gi.require_version("Gtk", "3.0")
|
gi.require_version("Gtk", "3.0")
|
||||||
from gi.repository import Gtk
|
from gi.repository import GObject, Gtk
|
||||||
|
|
||||||
from manuskript.data import Outline, OutlineFolder, OutlineText, OutlineItem, OutlineState, Plots, PlotLine, Characters, Character, Importance, Goal
|
from manuskript.data import Outline, OutlineFolder, OutlineText, OutlineItem, OutlineState, Plots, PlotLine, Characters, Character, Importance, Goal
|
||||||
from manuskript.ui.util import rgbaFromColor, pixbufFromColor
|
from manuskript.ui.util import rgbaFromColor, pixbufFromColor
|
||||||
|
@ -16,6 +16,7 @@ class OutlineView:
|
||||||
def __init__(self, outline: Outline):
|
def __init__(self, outline: Outline):
|
||||||
self.outline = outline
|
self.outline = outline
|
||||||
self.outlineItem = None
|
self.outlineItem = None
|
||||||
|
self.outlineCompletion = []
|
||||||
|
|
||||||
builder = Gtk.Builder()
|
builder = Gtk.Builder()
|
||||||
builder.add_from_file("ui/outline.glade")
|
builder.add_from_file("ui/outline.glade")
|
||||||
|
@ -138,20 +139,9 @@ class OutlineView:
|
||||||
self.charactersStore.set_value(tree_iter, 1, validString(character.name))
|
self.charactersStore.set_value(tree_iter, 1, validString(character.name))
|
||||||
self.charactersStore.set_value(tree_iter, 2, pixbufFromColor(character.color))
|
self.charactersStore.set_value(tree_iter, 2, pixbufFromColor(character.color))
|
||||||
|
|
||||||
def __appendOutlineItem(self, outlineItem: OutlineItem, parent_iter=None):
|
def __updateOutlineItem(self, tree_iter, outlineItem: OutlineItem):
|
||||||
tree_iter = self.outlineStore.append(parent_iter)
|
|
||||||
|
|
||||||
if tree_iter is None:
|
|
||||||
return
|
|
||||||
|
|
||||||
if outlineItem.state != OutlineState.COMPLETE:
|
|
||||||
outlineItem.load(False)
|
|
||||||
|
|
||||||
if type(outlineItem) is OutlineFolder:
|
if type(outlineItem) is OutlineFolder:
|
||||||
icon = "folder-symbolic"
|
icon = "folder-symbolic"
|
||||||
|
|
||||||
for item in outlineItem:
|
|
||||||
self.__appendOutlineItem(item, tree_iter)
|
|
||||||
elif type(outlineItem) is OutlineText:
|
elif type(outlineItem) is OutlineText:
|
||||||
icon = "emblem-documents-symbolic"
|
icon = "emblem-documents-symbolic"
|
||||||
else:
|
else:
|
||||||
|
@ -176,6 +166,34 @@ class OutlineView:
|
||||||
self.outlineStore.set_value(tree_iter, 7, progress)
|
self.outlineStore.set_value(tree_iter, 7, progress)
|
||||||
self.outlineStore.set_value(tree_iter, 8, icon)
|
self.outlineStore.set_value(tree_iter, 8, icon)
|
||||||
|
|
||||||
|
def __completeOutlineItem(self):
|
||||||
|
(tree_iter, outlineItem) = self.outlineCompletion.pop(0)
|
||||||
|
|
||||||
|
if outlineItem.state != OutlineState.COMPLETE:
|
||||||
|
outlineItem.load(False)
|
||||||
|
|
||||||
|
self.__updateOutlineItem(tree_iter, outlineItem)
|
||||||
|
|
||||||
|
return len(self.outlineCompletion) > 0
|
||||||
|
|
||||||
|
def __appendOutlineItem(self, outlineItem: OutlineItem, parent_iter=None):
|
||||||
|
tree_iter = self.outlineStore.append(parent_iter)
|
||||||
|
|
||||||
|
if tree_iter is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
if type(outlineItem) is OutlineFolder:
|
||||||
|
for item in outlineItem:
|
||||||
|
self.__appendOutlineItem(item, tree_iter)
|
||||||
|
|
||||||
|
if outlineItem.state != OutlineState.COMPLETE:
|
||||||
|
if len(self.outlineCompletion) == 0:
|
||||||
|
GObject.idle_add(self.__completeOutlineItem)
|
||||||
|
|
||||||
|
self.outlineCompletion.append((tree_iter, outlineItem))
|
||||||
|
|
||||||
|
self.__updateOutlineItem(tree_iter, outlineItem)
|
||||||
|
|
||||||
def refreshOutlineStore(self):
|
def refreshOutlineStore(self):
|
||||||
self.outlineStore.clear()
|
self.outlineStore.clear()
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
import time
|
||||||
|
|
||||||
from manuskript.util.counter import CounterKind, CharCounter, WordCounter, PageCounter
|
from manuskript.util.counter import CounterKind, CharCounter, WordCounter, PageCounter
|
||||||
|
|
||||||
|
@ -70,3 +71,11 @@ def safeFraction(value, low, high) -> float:
|
||||||
return 1.0
|
return 1.0
|
||||||
else:
|
else:
|
||||||
return 1.0 * (value - low) / (high - low)
|
return 1.0 * (value - low) / (high - low)
|
||||||
|
|
||||||
|
|
||||||
|
def profileTime(func, *args):
|
||||||
|
start = time.perf_counter()
|
||||||
|
result = func(*args)
|
||||||
|
end = time.perf_counter()
|
||||||
|
print("{}.{}: {}".format(func.__module__, func.__name__, end - start))
|
||||||
|
return result
|
||||||
|
|
|
@ -9,6 +9,8 @@ _char_pattern_with_spaces = re.compile(r"[\S ]")
|
||||||
_char_pattern_without_spaces = re.compile(r"\S")
|
_char_pattern_without_spaces = re.compile(r"\S")
|
||||||
_word_pattern = re.compile(r"\S+")
|
_word_pattern = re.compile(r"\S+")
|
||||||
|
|
||||||
|
_whitespace = " \t\r\n"
|
||||||
|
|
||||||
|
|
||||||
@unique
|
@unique
|
||||||
class CounterKind(Enum):
|
class CounterKind(Enum):
|
||||||
|
|
Loading…
Reference in a new issue