Add profiling function and implement loading on idle task

Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
This commit is contained in:
TheJackiMonster 2023-02-03 14:42:46 +01:00
parent e368cc7f73
commit 038e101386
No known key found for this signature in database
GPG key ID: D850A5F772E880F9
7 changed files with 98 additions and 42 deletions

View file

@ -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):

View file

@ -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"))

View file

@ -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

View file

@ -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()

View file

@ -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()

View file

@ -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

View file

@ -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):