Merge branch 'gtk' into gtk

This commit is contained in:
Tobias Frisch 2023-02-03 15:38:50 +01:00 committed by GitHub
commit 3027e5a93a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 413 additions and 349 deletions

View file

@ -144,6 +144,9 @@ class Characters:
def load(self):
self.data.clear()
if not os.path.isdir(self.dir_path):
return
for filename in os.listdir(self.dir_path):
path = os.path.join(self.dir_path, filename)
@ -160,5 +163,9 @@ class Characters:
self.data[character.UID.value] = character
def save(self):
if not self.data:
return
os.makedirs(self.dir_path, exist_ok=True)
for character in self.data.values():
character.save()

View file

@ -4,6 +4,7 @@
import os
from collections import OrderedDict
from concurrent.futures import ThreadPoolExecutor
from enum import Enum, unique
from manuskript.data.goal import Goal
from manuskript.data.labels import LabelHost, Label
@ -120,12 +121,20 @@ class OutlineText(OutlineItem):
OutlineItem.__init__(self, path, outline)
self.text = ""
self.cache = dict()
def textCount(self, counterKind: CounterKind = None) -> int:
if counterKind is None:
counterKind = self.goalKind()
return super().textCount(counterKind) + countText(self.text, counterKind)
textHash = hash(self.text)
if textHash not in self.cache:
self.cache.clear()
self.cache[textHash] = True
if counterKind.name not in self.cache:
self.cache[counterKind.name] = super().textCount(counterKind) + countText(self.text, counterKind)
return self.cache[counterKind.name]
def load(self, optimized: bool = True):
metadata, body = self.file.loadMMD(optimized)
@ -184,34 +193,37 @@ class OutlineFolder(OutlineItem):
folder.items.append(item)
if recursive:
for item in folder.items:
if type(item) is OutlineFolder:
cls.loadItems(outline, item, recursive)
for item in filter(lambda outlineItem: type(outlineItem) is OutlineFolder, folder.items):
cls.loadItems(outline, item, recursive)
def textCount(self, counterKind: CounterKind = None) -> int:
if counterKind is None:
counterKind = self.goalKind()
count = super().textCount(counterKind)
for item in self.items:
count += item.textCount(counterKind)
count += sum(item.textCount(counterKind) for item in self.items)
return count
def goalCount(self) -> int:
count = super().goalCount()
if self.goal is None:
for item in self.items:
count += item.goalCount()
count += sum(item.goalCount() for item in self.items)
return count
def load(self, _: bool = True):
def load(self, optimized: bool = True):
metadata, _ = self.file.loadMMD(True)
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
def saveItems(cls, folder, recursive: bool = True):
@ -219,9 +231,8 @@ class OutlineFolder(OutlineItem):
item.save()
if recursive:
for item in folder.items:
if type(item) is OutlineFolder:
cls.saveItems(item, recursive)
for item in filter(lambda outlineItem: type(outlineItem) is OutlineFolder, folder.items):
cls.saveItems(item, recursive)
def save(self):
self.type = "folder"
@ -238,11 +249,15 @@ class Outline:
self.labels = labels
self.statuses = statuses
self.items = list()
self.cache = dict()
def __iter__(self):
return self.items.__iter__()
def getItemByID(self, ID: int) -> OutlineItem | None:
if ID in self.cache:
return self.cache.get(ID)
for item in self.all():
if item.UID.value == ID:
return item
@ -255,6 +270,7 @@ class Outline:
while len(queue) > 0:
item = queue.pop()
self.cache[item.UID.value] = item
if type(item) is OutlineFolder:
for child in item:
@ -268,11 +284,7 @@ class Outline:
if counterKind is None:
counterKind = self.goalKind()
count = 0
for item in self.items:
count += item.textCount(counterKind)
return count
return sum(item.textCount(counterKind) for item in self.items)
def goalKind(self) -> CounterKind:
if len(self.items) > 0:
@ -281,14 +293,11 @@ class Outline:
return CounterKind.WORDS
def goalCount(self) -> int:
count = 0
for item in self.items:
count += item.goalCount()
return count
return sum(item.goalCount() for item in self.items)
def load(self):
self.items.clear()
self.cache.clear()
names = os.listdir(self.dir_path)
names.sort()
@ -308,14 +317,12 @@ class Outline:
self.items.append(item)
for item in self.items:
if type(item) is OutlineFolder:
OutlineFolder.loadItems(self, item, True)
for item in filter(lambda outlineItem: type(outlineItem) is OutlineFolder, self.items):
OutlineFolder.loadItems(self, item, True)
def save(self):
for item in self.items:
item.save()
for item in self.items:
if type(item) is OutlineFolder:
OutlineFolder.saveItems(item, True)
for item in filter(lambda outlineItem: type(outlineItem) is OutlineFolder, self.items):
OutlineFolder.saveItems(item, True)

View file

@ -22,6 +22,7 @@ from manuskript.data.revisions import Revisions
from manuskript.data.characters_template import CharacterDetailTemplate
from manuskript.io.mskFile import MskFile
from manuskript.util import profileTime
class Project:
@ -69,17 +70,17 @@ class Project:
except BadZipFile or FileNotFoundError:
return
self.version.load()
self.info.load()
self.summary.load()
self.labels.load()
self.statuses.load()
self.settings.load()
self.characters.load()
self.plots.load()
self.world.load()
self.outline.load()
self.revisions.load()
profileTime(self.version.load)
profileTime(self.info.load)
profileTime(self.summary.load)
profileTime(self.labels.load)
profileTime(self.statuses.load)
profileTime(self.settings.load)
profileTime(self.characters.load)
profileTime(self.plots.load)
profileTime(self.world.load)
profileTime(self.outline.load)
profileTime(self.revisions.load)
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.startupWindow import StartupWindow
from manuskript.ui.util import bindMenuItem
from manuskript.util import profileTime
class MainWindow:
@ -31,9 +32,9 @@ class MainWindow:
try:
if data is None:
view = view_cls()
view = profileTime(view_cls)
else:
view = view_cls(data)
view = profileTime(view_cls, data)
except Exception:
return None
@ -65,7 +66,7 @@ class MainWindow:
self.generalView = MainWindow.packViewIntoSlot(builder, "general_slot", GeneralView, self.project.info)
self.summaryView = MainWindow.packViewIntoSlot(builder, "summary_slot", SummaryView, self.project.summary)
self.charactersView = MainWindow.packViewIntoSlot(builder, "characters_slot", CharactersView, self.project) # Just project because we need it for characters and the template
self.charactersView = MainWindow.packViewIntoSlot(builder, "characters_slot", CharactersView, self.project)
self.plotView = MainWindow.packViewIntoSlot(builder, "plot_slot", PlotView, self.project.plots)
self.worldView = MainWindow.packViewIntoSlot(builder, "world_slot", WorldView, self.project.world)
self.outlineView = MainWindow.packViewIntoSlot(builder, "outline_slot", OutlineView, self.project.outline)
@ -74,41 +75,41 @@ class MainWindow:
self.startupWindow = StartupWindow(self)
self.aboutDialog = AboutDialog(self)
self.frequencyWindow = FrequencyWindow(self)
self.character_template_window = CharacterTemplateEditorWindow(self)
self.characterTemplateWindow = CharacterTemplateEditorWindow(self)
self.settingsWindow = SettingsWindow(self)
self.windows = [
self.startupWindow,
self.aboutDialog,
self.frequencyWindow,
self.character_template_window,
self.characterTemplateWindow,
self.settingsWindow
]
bindMenuItem(builder, "open_menu_item", self.openAction)
bindMenuItem(builder, "save_menu_item", self.saveAction)
bindMenuItem(builder, "close_menu_item", self.closeAction)
bindMenuItem(builder, "quit_menu_item", self.quitAction)
bindMenuItem(builder, "open_menu_item", self._openAction)
bindMenuItem(builder, "save_menu_item", self._saveAction)
bindMenuItem(builder, "close_menu_item", self._closeAction)
bindMenuItem(builder, "quit_menu_item", self._quitAction)
bindMenuItem(builder, "settings_menu_item", self.settingsAction)
bindMenuItem(builder, "frequency_menu_item", self.frequencyAction)
bindMenuItem(builder, "character_details_template_editor", self.character_details_template_editor_action)
bindMenuItem(builder, "about_menu_item", self.aboutAction)
bindMenuItem(builder, "settings_menu_item", self._settingsAction)
bindMenuItem(builder, "frequency_menu_item", self._frequencyAction)
bindMenuItem(builder, "character_details_template_editor", self._characterDetailsTemplateEditorAction)
bindMenuItem(builder, "about_menu_item", self._aboutAction)
def getProject(self):
return self.project
def openAction(self, menuItem: Gtk.MenuItem):
def _openAction(self, menuItem: Gtk.MenuItem):
pass
def saveAction(self, menuItem: Gtk.MenuItem):
def _saveAction(self, menuItem: Gtk.MenuItem):
self.getProject().save()
def closeAction(self, menuItem: Gtk.MenuItem):
def _closeAction(self, menuItem: Gtk.MenuItem):
self.hide()
self.startupWindow.show()
def quitAction(self, menuItem: Gtk.MenuItem):
def _quitAction(self, menuItem: Gtk.MenuItem):
for window in self.windows:
window.hide()
@ -117,16 +118,16 @@ class MainWindow:
def getSettings(self):
return self.getProject().settings
def settingsAction(self, menuItem: Gtk.MenuItem):
def _settingsAction(self, menuItem: Gtk.MenuItem):
self.settingsWindow.show()
def frequencyAction(self, menuItem: Gtk.MenuItem):
def _frequencyAction(self, menuItem: Gtk.MenuItem):
self.frequencyWindow.show()
def character_details_template_editor_action(self, menuItem: Gtk.MenuItem):
self.character_template_window.show()
def _characterDetailsTemplateEditorAction(self, menuItem: Gtk.MenuItem):
self.characterTemplateWindow.show()
def aboutAction(self, menuItem: Gtk.MenuItem):
def _aboutAction(self, menuItem: Gtk.MenuItem):
self.aboutDialog.show()
def show(self):

View file

@ -28,19 +28,19 @@ class LabelsPage:
self.refreshLabelStore()
self.labelSelection = builder.get_object("label_selection")
self.labelSelection.connect("changed", self.labelSelectionChanged)
self.labelSelection.connect("changed", self._labelSelectionChanged)
self.addButton = builder.get_object("add_label")
self.removeButton = builder.get_object("remove_label")
self.addButton.connect("clicked", self.addClicked)
self.removeButton.connect("clicked", self.removeClicked)
self.addButton.connect("clicked", self._addClicked)
self.removeButton.connect("clicked", self._removeClicked)
self.colorButton = builder.get_object("color")
self.colorButton.connect("color-set", self.colorSet)
self.colorButton.connect("color-set", self._colorSet)
self.labelNameRenderer = builder.get_object("label_name")
self.labelNameRenderer.connect("edited", self.labelNameEdited)
self.labelNameRenderer.connect("edited", self._labelNameEdited)
self.unloadLabelData()
@ -70,7 +70,7 @@ class LabelsPage:
self.colorButton.set_rgba(rgbaFromColor(Color(0, 0, 0)))
def labelSelectionChanged(self, selection: Gtk.TreeSelection):
def _labelSelectionChanged(self, selection: Gtk.TreeSelection):
model, tree_iter = selection.get_selected()
if tree_iter is None:
@ -84,7 +84,7 @@ class LabelsPage:
else:
self.loadLabelData(label)
def addClicked(self, button: Gtk.Button):
def _addClicked(self, button: Gtk.Button):
label = self.labels.addLabel()
if label is None:
@ -98,7 +98,7 @@ class LabelsPage:
self.labelStore.set_value(tree_iter, 0, label.name)
self.labelStore.set_value(tree_iter, 1, pixbufFromColor(label.color))
def removeClicked(self, button: Gtk.Button):
def _removeClicked(self, button: Gtk.Button):
if self.label is None:
return
@ -112,7 +112,7 @@ class LabelsPage:
self.labels.removeLabel(name)
def colorSet(self, button: Gtk.ColorButton):
def _colorSet(self, button: Gtk.ColorButton):
if self.label is None:
return
@ -133,7 +133,7 @@ class LabelsPage:
row[1] = pixbufFromColor(color)
break
def labelNameEdited(self, renderer: Gtk.CellRendererText, path: str, text: str):
def _labelNameEdited(self, renderer: Gtk.CellRendererText, path: str, text: str):
if self.label is None:
return

View file

@ -27,16 +27,16 @@ class StatusPage:
self.refreshStatusStore()
self.statusSelection = builder.get_object("status_selection")
self.statusSelection.connect("changed", self.statusSelectionChanged)
self.statusSelection.connect("changed", self._statusSelectionChanged)
self.addButton = builder.get_object("add_status")
self.removeButton = builder.get_object("remove_status")
self.addButton.connect("clicked", self.addClicked)
self.removeButton.connect("clicked", self.removeClicked)
self.addButton.connect("clicked", self._addClicked)
self.removeButton.connect("clicked", self._removeClicked)
self.statusNameRenderer = builder.get_object("status_name")
self.statusNameRenderer.connect("edited", self.statusNameEdited)
self.statusNameRenderer.connect("edited", self._statusNameEdited)
self.unloadStatusData()
@ -57,7 +57,7 @@ class StatusPage:
def unloadStatusData(self):
self.status = None
def statusSelectionChanged(self, selection: Gtk.TreeSelection):
def _statusSelectionChanged(self, selection: Gtk.TreeSelection):
model, tree_iter = selection.get_selected()
if tree_iter is None:
@ -71,7 +71,7 @@ class StatusPage:
else:
self.loadStatusData(status)
def addClicked(self, button: Gtk.Button):
def _addClicked(self, button: Gtk.Button):
status = self.statuses.addStatus()
if status is None:
@ -84,7 +84,7 @@ class StatusPage:
self.statusStore.set_value(tree_iter, 0, status.name)
def removeClicked(self, button: Gtk.Button):
def _removeClicked(self, button: Gtk.Button):
if self.status is None:
return
@ -98,7 +98,7 @@ class StatusPage:
self.statuses.removeStatus(name)
def statusNameEdited(self, renderer: Gtk.CellRendererText, path: str, text: str):
def _statusNameEdited(self, renderer: Gtk.CellRendererText, path: str, text: str):
if self.status is None:
return

View file

@ -28,7 +28,7 @@ class TemplateEntry:
self.entryStack = builder.get_object("entry_stack")
self.deleteButton = builder.get_object("delete_button")
self.deleteButton.connect("clicked", self.deleteClicked)
self.deleteButton.connect("clicked", self._deleteClicked)
def bindTemplate(self, template: Template, level: TemplateLevel = None):
self.template = template
@ -49,7 +49,7 @@ class TemplateEntry:
self.entryStack.set_visible_child_name("page_entry")
def deleteClicked(self, button: Gtk.Button):
def _deleteClicked(self, button: Gtk.Button):
if self.template is None:
return

View file

@ -69,11 +69,11 @@ class StartupWindow(AbstractDialog):
self.demoTemplatesStore = builder.get_object("demo_templates_store")
self.fictionTemplatesStore.set_visible_func(
lambda model, iter, userdata: model[iter][2] == TemplateKind.FICTION.value)
lambda model, iterator, userdata: model[iterator][2] == TemplateKind.FICTION.value)
self.nonfictionTemplatesStore.set_visible_func(
lambda model, iter, userdata: model[iter][2] == TemplateKind.NONFICTION.value)
lambda model, iterator, userdata: model[iterator][2] == TemplateKind.NONFICTION.value)
self.demoTemplatesStore.set_visible_func(
lambda model, iter, userdata: model[iter][2] == TemplateKind.DEMO.value)
lambda model, iterator, userdata: model[iterator][2] == TemplateKind.DEMO.value)
self.fictionTemplatesStore.refilter()
self.nonfictionTemplatesStore.refilter()
@ -86,7 +86,7 @@ class StartupWindow(AbstractDialog):
]
for selection in self.templateSelections:
selection.connect("changed", self.templateSelectionChanged)
selection.connect("changed", self._templateSelectionChanged)
self.templateLevelsListbox = builder.get_object("template_levels_listbox")
@ -94,8 +94,8 @@ class StartupWindow(AbstractDialog):
self.addLevelButton = builder.get_object("add_level_button")
self.addGoalButton = builder.get_object("add_goal_button")
self.addLevelButton.connect("clicked", self.addLevelClicked)
self.addGoalButton.connect("clicked", self.addGoalClicked)
self.addLevelButton.connect("clicked", self._addLevelClicked)
self.addGoalButton.connect("clicked", self._addGoalClicked)
def loadTemplate(self, template: Template):
self.template = template
@ -123,7 +123,7 @@ class StartupWindow(AbstractDialog):
self.goalLabel.set_text(self.template.getGoalString())
def templateSelectionChanged(self, selection: Gtk.TreeSelection):
def _templateSelectionChanged(self, selection: Gtk.TreeSelection):
model, tree_iter = selection.get_selected()
if tree_iter is None:
@ -137,14 +137,14 @@ class StartupWindow(AbstractDialog):
self.loadTemplate(self.templates[index] if (index >= 0) and (index < len(self.templates)) else None)
def addLevelClicked(self, button: Gtk.Button):
def _addLevelClicked(self, button: Gtk.Button):
if self.template is None:
return
self.template.addLevel()
self.loadTemplate(self.template)
def addGoalClicked(self, button: Gtk.Button):
def _addGoalClicked(self, button: Gtk.Button):
if self.template is None:
return

View file

@ -27,8 +27,10 @@ class FrequencyWindow(AbstractDialog):
self.analyzeWords = builder.get_object("analyze_words")
self.analyzePhrases = builder.get_object("analyze_phrases")
self.wordLeaflet.bind_property("folded", self.back, "visible", GObject.BindingFlags.SYNC_CREATE)
self.wordLeaflet.bind_property("folded", self.headerBar, "show-close-button", GObject.BindingFlags.SYNC_CREATE |
self.wordLeaflet.bind_property("folded", self.back, "visible",
GObject.BindingFlags.SYNC_CREATE)
self.wordLeaflet.bind_property("folded", self.headerBar, "show-close-button",
GObject.BindingFlags.SYNC_CREATE |
GObject.BindingFlags.INVERT_BOOLEAN)
self.back.connect("clicked", self._backClicked)

View file

@ -13,8 +13,8 @@ from manuskript.util import validString, invalidString, validInt, invalidInt, un
class CharactersView:
def __init__(self,project):
self.character_template = project.character_template # The template for detailed info
def __init__(self, project):
self.characterTemplate = project.character_template # The template for detailed info
self.characters = project.characters
self.character = None
@ -34,15 +34,18 @@ class CharactersView:
self.filterCharactersBuffer = builder.get_object("filter_characters")
self.filterCharactersBuffer.connect("deleted-text", self.filterCharactersDeletedText)
self.filterCharactersBuffer.connect("inserted-text", self.filterCharactersInsertedText)
self.filterCharactersBuffer.connect("deleted-text", self._filterCharactersDeletedText)
self.filterCharactersBuffer.connect("inserted-text", self._filterCharactersInsertedText)
self.filteredCharactersStore.set_visible_func(self.filterCharacters)
self.filteredCharactersStore.set_visible_func(self._filterCharacters)
self.filteredCharactersStore.refilter()
self.mainCharactersStore.set_visible_func(lambda model, iter, userdata: model[iter][3] == Importance.MAIN.value)
self.secondaryCharactersStore.set_visible_func(lambda model, iter, userdata: model[iter][3] == Importance.SECONDARY.value)
self.minorCharactersStore.set_visible_func(lambda model, iter, userdata: model[iter][3] == Importance.MINOR.value)
self.mainCharactersStore.set_visible_func(lambda model, iterator, userdata:
model[iterator][3] == Importance.MAIN.value)
self.secondaryCharactersStore.set_visible_func(lambda model, iterator, userdata:
model[iterator][3] == Importance.SECONDARY.value)
self.minorCharactersStore.set_visible_func(lambda model, iterator, userdata:
model[iterator][3] == Importance.MINOR.value)
self.mainCharactersStore.refilter()
self.secondaryCharactersStore.refilter()
@ -55,39 +58,35 @@ class CharactersView:
]
for selection in self.characterSelections:
selection.connect("changed", self.characterSelectionChanged)
selection.connect("changed", self._characterSelectionChanged)
self.addCharacterButton = builder.get_object("add_character")
self.removeCharacterButton = builder.get_object("remove_character")
self.addCharacterButton.connect("clicked", self.addCharacterClicked)
self.removeCharacterButton.connect("clicked", self.removeCharacterClicked)
self.addCharacterButton.connect("clicked", self._addCharacterClicked)
self.removeCharacterButton.connect("clicked", self._removeCharacterClicked)
self.colorButton = builder.get_object("color")
self.importanceCombo = builder.get_object("importance")
self.allowPOVCheck = builder.get_object("allow_POV")
self.colorButton.connect("color-set", self.colorSet)
self.importanceCombo.connect("changed", self.importanceChanged)
self.allowPOVCheck.connect("toggled", self.allowPOVToggled)
self.colorButton.connect("color-set", self._colorSet)
self.importanceCombo.connect("changed", self._importanceChanged)
self.allowPOVCheck.connect("toggled", self._allowPOVToggled)
self.detailsStore = builder.get_object("details_store")
self.detailsSelection = builder.get_object("details_selection")
self.addDetailsButton = builder.get_object("add_details")
self.removeDetailsButton = builder.get_object("remove_details")
self.append_details_template_button = builder.get_object("appened_details_template")
self.appendDetailsTemplateButton = builder.get_object("appened_details_template")
self.detailsNameRenderer = builder.get_object("details_name")
self.detailsValueRenderer = builder.get_object("details_value")
self.addDetailsButton.connect("clicked", self.addDetailsClicked)
self.removeDetailsButton.connect("clicked", self.removeDetailsClicked)
# This is to append the template
self.append_details_template_button.connect("clicked", self.append_template_clicked)
self.detailsNameRenderer.connect("edited", self.detailsNameEdited)
self.detailsValueRenderer.connect("edited", self.detailsValueEdited)
self.addDetailsButton.connect("clicked", self._addDetailsClicked)
self.removeDetailsButton.connect("clicked", self._removeDetailsClicked)
self.appendDetailsTemplateButton.connect("clicked", self._appendTemplateClicked)
self.detailsNameRenderer.connect("edited", self._detailsNameEdited)
self.detailsValueRenderer.connect("edited", self._detailsValueEdited)
self.nameBuffer = builder.get_object("name")
self.motivationBuffer = builder.get_object("motivation")
@ -99,17 +98,17 @@ class CharactersView:
self.summaryBuffer = builder.get_object("summary")
self.notesBuffer = builder.get_object("notes")
self.nameBuffer.connect("deleted-text", self.nameDeletedText)
self.nameBuffer.connect("inserted-text", self.nameInsertedText)
self.nameBuffer.connect("deleted-text", self._nameDeletedText)
self.nameBuffer.connect("inserted-text", self._nameInsertedText)
self.motivationBuffer.connect("changed", self.motivationChanged)
self.goalBuffer.connect("changed", self.goalChanged)
self.conflictBuffer.connect("changed", self.conflictChanged)
self.epiphanyBuffer.connect("changed", self.epiphanyChanged)
self.oneSentenceBuffer.connect("changed", self.oneSentenceChanged)
self.oneParagraphBuffer.connect("changed", self.oneParagraphChanged)
self.summaryBuffer.connect("changed", self.summaryChanged)
self.notesBuffer.connect("changed", self.notesChanged)
self.motivationBuffer.connect("changed", self._motivationChanged)
self.goalBuffer.connect("changed", self._goalChanged)
self.conflictBuffer.connect("changed", self._conflictChanged)
self.epiphanyBuffer.connect("changed", self._epiphanyChanged)
self.oneSentenceBuffer.connect("changed", self._oneSentenceChanged)
self.oneParagraphBuffer.connect("changed", self._oneParagraphChanged)
self.summaryBuffer.connect("changed", self._summaryChanged)
self.notesBuffer.connect("changed", self._notesChanged)
self.unloadCharacterData()
@ -178,7 +177,7 @@ class CharactersView:
self.detailsStore.clear()
def characterSelectionChanged(self, selection: Gtk.TreeSelection):
def _characterSelectionChanged(self, selection: Gtk.TreeSelection):
model, tree_iter = selection.get_selected()
if tree_iter is None:
@ -196,7 +195,7 @@ class CharactersView:
else:
self.loadCharacterData(character)
def addCharacterClicked(self, button: Gtk.Button):
def _addCharacterClicked(self, button: Gtk.Button):
name = invalidString(self.filterCharactersBuffer.get_text())
character = self.characters.add(name)
@ -208,29 +207,29 @@ class CharactersView:
self.refreshCharacterStore()
def removeCharacterClicked(self, button: Gtk.Button):
def _removeCharacterClicked(self, button: Gtk.Button):
if self.character is None:
return
self.character.remove()
self.refreshCharacterStore()
def filterCharacters(self, model, iter, userdata):
name = validString(model[iter][1])
def _filterCharacters(self, model, iterator, userdata):
name = validString(model[iterator][1])
text = validString(self.filterCharactersBuffer.get_text())
return text.lower() in name.lower()
def filterCharactersChanged(self, buffer: Gtk.EntryBuffer):
def __filterCharactersChanged(self, buffer: Gtk.EntryBuffer):
self.filteredCharactersStore.refilter()
def filterCharactersDeletedText(self, buffer: Gtk.EntryBuffer, position: int, n_chars: int):
self.filterCharactersChanged(buffer)
def _filterCharactersDeletedText(self, buffer: Gtk.EntryBuffer, position: int, n_chars: int):
self.__filterCharactersChanged(buffer)
def filterCharactersInsertedText(self, buffer: Gtk.EntryBuffer, position: int, chars: str, n_chars: int):
self.filterCharactersChanged(buffer)
def _filterCharactersInsertedText(self, buffer: Gtk.EntryBuffer, position: int, chars: str, n_chars: int):
self.__filterCharactersChanged(buffer)
def colorSet(self, button: Gtk.ColorButton):
def _colorSet(self, button: Gtk.ColorButton):
if self.character is None:
return
@ -251,7 +250,7 @@ class CharactersView:
row[2] = pixbufFromColor(color)
break
def importanceChanged(self, combo: Gtk.ComboBox):
def _importanceChanged(self, combo: Gtk.ComboBox):
if self.character is None:
return
@ -290,13 +289,13 @@ class CharactersView:
selection.select_iter(row.iter)
break
def allowPOVToggled(self, button: Gtk.ToggleButton):
def _allowPOVToggled(self, button: Gtk.ToggleButton):
if self.character is None:
return
self.character.POV = button.get_active()
def addDetailsClicked(self, button: Gtk.Button):
def _addDetailsClicked(self, button: Gtk.Button):
if self.character is None:
return
@ -313,7 +312,7 @@ class CharactersView:
self.character.details[name] = value
def removeDetailsClicked(self, button: Gtk.Button):
def _removeDetailsClicked(self, button: Gtk.Button):
if self.character is None:
return
@ -326,20 +325,18 @@ class CharactersView:
model.remove(tree_iter)
self.character.details.pop(name)
# This is the the template code
# It appends the template onto the code
def append_template_clicked(self, button):
def _appendTemplateClicked(self, button: Gtk.Button):
if self.character is None:
return
# This following bit could be turned into a def
for x in self.character_template.details:
self.character.details[x]= self.character_template.details[x]
for (key, value) in self.characterTemplate.details.items():
self.character.details[key]= value
#We have to reload the charecter
self.loadCharacterData(self.character)
def detailsNameEdited(self, renderer: Gtk.CellRendererText, path: str, text: str):
def _detailsNameEdited(self, renderer: Gtk.CellRendererText, path: str, text: str):
if self.character is None:
return
@ -354,7 +351,7 @@ class CharactersView:
self.character.details[text_to_set] = self.character.details.pop(name)
def detailsValueEdited(self, renderer: Gtk.CellRendererText, path: str, text: str):
def _detailsValueEdited(self, renderer: Gtk.CellRendererText, path: str, text: str):
if self.character is None:
return
@ -368,7 +365,7 @@ class CharactersView:
self.character.details[name] = text
def nameChanged(self, buffer: Gtk.EntryBuffer):
def __nameChanged(self, buffer: Gtk.EntryBuffer):
if self.character is None:
return
@ -384,13 +381,13 @@ class CharactersView:
row[1] = validString(name)
break
def nameDeletedText(self, buffer: Gtk.EntryBuffer, position: int, n_chars: int):
self.nameChanged(buffer)
def _nameDeletedText(self, buffer: Gtk.EntryBuffer, position: int, n_chars: int):
self.__nameChanged(buffer)
def nameInsertedText(self, buffer: Gtk.EntryBuffer, position: int, chars: str, n_chars: int):
self.nameChanged(buffer)
def _nameInsertedText(self, buffer: Gtk.EntryBuffer, position: int, chars: str, n_chars: int):
self.__nameChanged(buffer)
def motivationChanged(self, buffer: Gtk.TextBuffer):
def _motivationChanged(self, buffer: Gtk.TextBuffer):
if self.character is None:
return
@ -401,7 +398,7 @@ class CharactersView:
self.character.motivation = invalidString(text)
def goalChanged(self, buffer: Gtk.TextBuffer):
def _goalChanged(self, buffer: Gtk.TextBuffer):
if self.character is None:
return
@ -412,7 +409,7 @@ class CharactersView:
self.character.goal = invalidString(text)
def conflictChanged(self, buffer: Gtk.TextBuffer):
def _conflictChanged(self, buffer: Gtk.TextBuffer):
if self.character is None:
return
@ -423,7 +420,7 @@ class CharactersView:
self.character.conflict = invalidString(text)
def epiphanyChanged(self, buffer: Gtk.TextBuffer):
def _epiphanyChanged(self, buffer: Gtk.TextBuffer):
if self.character is None:
return
@ -434,7 +431,7 @@ class CharactersView:
self.character.epiphany = invalidString(text)
def oneSentenceChanged(self, buffer: Gtk.TextBuffer):
def _oneSentenceChanged(self, buffer: Gtk.TextBuffer):
if self.character is None:
return
@ -445,7 +442,7 @@ class CharactersView:
self.character.summarySentence = invalidString(text)
def oneParagraphChanged(self, buffer: Gtk.TextBuffer):
def _oneParagraphChanged(self, buffer: Gtk.TextBuffer):
if self.character is None:
return
@ -456,7 +453,7 @@ class CharactersView:
self.character.summaryParagraph = invalidString(text)
def summaryChanged(self, buffer: Gtk.TextBuffer):
def _summaryChanged(self, buffer: Gtk.TextBuffer):
if self.character is None:
return
@ -467,7 +464,7 @@ class CharactersView:
self.character.summaryFull = invalidString(text)
def notesChanged(self, buffer: Gtk.TextBuffer):
def _notesChanged(self, buffer: Gtk.TextBuffer):
if self.character is None:
return

View file

@ -4,21 +4,20 @@
import gi
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.ui.editor import GridItem
from manuskript.ui.util import pixbufFromColor, iconByOutlineItemType
from manuskript.util import validString, validInt, safeFraction
import inspect
class EditorView:
def __init__(self, project: Project):
self.project = project
self.outlineItem = None
self.outlineCompletion = []
self.editorItems = list()
builder = Gtk.Builder()
@ -40,7 +39,7 @@ class EditorView:
self.editorTextBuffer = builder.get_object("editor_text")
self.editorFlowbox = builder.get_object("editor_flowbox")
self.editorFlowbox.connect("child-activated", self.editorFlowboxChildActivated)
self.editorFlowbox.connect("child-activated", self._editorFlowboxChildActivated)
self.upButtons = [
builder.get_object("up"),
@ -48,7 +47,7 @@ class EditorView:
]
for button in self.upButtons:
button.connect("clicked", self.upButtonClicked)
button.connect("clicked", self._upButtonClicked)
self.counterLabel = builder.get_object("counter")
self.counterProgressBar = builder.get_object("counter_progress")
@ -78,21 +77,9 @@ class EditorView:
self.statusStore.set_value(tree_iter, 0, validString(status.name))
def __appendOutlineItem(self, outlineItem: OutlineItem, parent_iter=None):
tree_iter = self.outlineStore.append(parent_iter)
if tree_iter is None:
return
if outlineItem.state != OutlineState.COMPLETE:
outlineItem.load(False)
def __updateOutlineItem(self, tree_iter, outlineItem: OutlineItem):
icon = iconByOutlineItemType(outlineItem)
if type(outlineItem) is OutlineFolder:
for item in outlineItem:
self.__appendOutlineItem(item, tree_iter)
wordCount = validInt(outlineItem.textCount())
goal = validInt(outlineItem.goalCount())
progress = 100 * safeFraction(wordCount, 0, goal)
@ -107,6 +94,34 @@ class EditorView:
self.outlineStore.set_value(tree_iter, 7, progress)
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):
self.outlineStore.clear()
@ -202,7 +217,7 @@ class EditorView:
self.outlineItem = outlineItem
def editorFlowboxChildActivated(self, box: Gtk.FlowBox, child: Gtk.FlowBoxChild):
def _editorFlowboxChildActivated(self, box: Gtk.FlowBox, child: Gtk.FlowBoxChild):
if child is None:
return
@ -212,7 +227,7 @@ class EditorView:
self.loadOutlineData(self.editorItems[index])
def upButtonClicked(self, button: Gtk.Button):
def _upButtonClicked(self, button: Gtk.Button):
if self.outlineItem is None:
return

View file

@ -55,77 +55,77 @@ class GeneralView:
self.emailBuffer.connect("deleted-text", self._emailDeletedText)
self.emailBuffer.connect("inserted-text", self._emailInsertedText)
def titleChanged(self, buffer: Gtk.EntryBuffer):
def __titleChanged(self, buffer: Gtk.EntryBuffer):
self.info.title = invalidString(buffer.get_text())
def subtitleChanged(self, buffer: Gtk.EntryBuffer):
def __subtitleChanged(self, buffer: Gtk.EntryBuffer):
self.info.subtitle = invalidString(buffer.get_text())
def seriesChanged(self, buffer: Gtk.EntryBuffer):
def __seriesChanged(self, buffer: Gtk.EntryBuffer):
self.info.serie = invalidString(buffer.get_text())
def volumeChanged(self, buffer: Gtk.EntryBuffer):
def __volumeChanged(self, buffer: Gtk.EntryBuffer):
self.info.volume = invalidString(buffer.get_text())
def genreChanged(self, buffer: Gtk.EntryBuffer):
def __genreChanged(self, buffer: Gtk.EntryBuffer):
self.info.genre = invalidString(buffer.get_text())
def licenseChanged(self, buffer: Gtk.EntryBuffer):
def __licenseChanged(self, buffer: Gtk.EntryBuffer):
self.info.license = invalidString(buffer.get_text())
def nameChanged(self, buffer: Gtk.EntryBuffer):
def __nameChanged(self, buffer: Gtk.EntryBuffer):
self.info.author = invalidString(buffer.get_text())
def emailChanged(self, buffer: Gtk.EntryBuffer):
def __emailChanged(self, buffer: Gtk.EntryBuffer):
self.info.email = invalidString(buffer.get_text())
def _titleDeletedText(self, buffer: Gtk.EntryBuffer, position, count):
self.titleChanged(buffer)
self.__titleChanged(buffer)
def _titleInsertedText(self, buffer: Gtk.EntryBuffer, position, value, count):
self.titleChanged(buffer)
self.__titleChanged(buffer)
def _subtitleDeletedText(self, buffer: Gtk.EntryBuffer, position, count):
self.subtitleChanged(buffer)
self.__subtitleChanged(buffer)
def _subtitleInsertedText(self, buffer: Gtk.EntryBuffer, position, value, count):
self.subtitleChanged(buffer)
self.__subtitleChanged(buffer)
def _seriesDeletedText(self, buffer: Gtk.EntryBuffer, position, count):
self.seriesChanged(buffer)
self.__seriesChanged(buffer)
def _seriesInsertedText(self, buffer: Gtk.EntryBuffer, position, value, count):
self.seriesChanged(buffer)
self.__seriesChanged(buffer)
def _volumeDeletedText(self, buffer: Gtk.EntryBuffer, position, count):
self.volumeChanged(buffer)
self.__volumeChanged(buffer)
def _volumeInsertedText(self, buffer: Gtk.EntryBuffer, position, value, count):
self.volumeChanged(buffer)
self.__volumeChanged(buffer)
def _genreDeletedText(self, buffer: Gtk.EntryBuffer, position, count):
self.genreChanged(buffer)
self.__genreChanged(buffer)
def _genreInsertedText(self, buffer: Gtk.EntryBuffer, position, value, count):
self.genreChanged(buffer)
self.__genreChanged(buffer)
def _licenseDeletedText(self, buffer: Gtk.EntryBuffer, position, count):
self.licenseChanged(buffer)
self.__licenseChanged(buffer)
def _licenseInsertedText(self, buffer: Gtk.EntryBuffer, position, value, count):
self.licenseChanged(buffer)
self.__licenseChanged(buffer)
def _nameDeletedText(self, buffer: Gtk.EntryBuffer, position, count):
self.nameChanged(buffer)
self.__nameChanged(buffer)
def _nameInsertedText(self, buffer: Gtk.EntryBuffer, position, value, count):
self.nameChanged(buffer)
self.__nameChanged(buffer)
def _emailDeletedText(self, buffer: Gtk.EntryBuffer, position, count):
self.emailChanged(buffer)
self.__emailChanged(buffer)
def _emailInsertedText(self, buffer: Gtk.EntryBuffer, position, value, count):
self.emailChanged(buffer)
self.__emailChanged(buffer)
def show(self):
self.widget.show_all()

View file

@ -4,7 +4,7 @@
import gi
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.ui.util import rgbaFromColor, pixbufFromColor
@ -16,6 +16,7 @@ class OutlineView:
def __init__(self, outline: Outline):
self.outline = outline
self.outlineItem = None
self.outlineCompletion = []
builder = Gtk.Builder()
builder.add_from_file("ui/outline.glade")
@ -42,11 +43,11 @@ class OutlineView:
self.minorPlotsStore = builder.get_object("minor_plots_store")
self.mainPlotsStore.set_visible_func(
lambda model, iter, userdata: model[iter][2] == Importance.MAIN.value)
lambda model, iterator, userdata: model[iterator][2] == Importance.MAIN.value)
self.secondaryPlotsStore.set_visible_func(
lambda model, iter, userdata: model[iter][2] == Importance.SECONDARY.value)
lambda model, iterator, userdata: model[iterator][2] == Importance.SECONDARY.value)
self.minorPlotsStore.set_visible_func(
lambda model, iter, userdata: model[iter][2] == Importance.MINOR.value)
lambda model, iterator, userdata: model[iterator][2] == Importance.MINOR.value)
self.mainPlotsStore.refilter()
self.secondaryPlotsStore.refilter()
@ -59,33 +60,33 @@ class OutlineView:
]
for selection in self.plotSelections:
selection.connect("changed", self.plotSelectionChanged)
selection.connect("changed", self._plotSelectionChanged)
self.filterOutlineBuffer = builder.get_object("filter_outline")
self.filterOutlineBuffer.connect("deleted-text", self.filterOutlineDeletedText)
self.filterOutlineBuffer.connect("inserted-text", self.filterOutlineInsertedText)
self.filterOutlineBuffer.connect("deleted-text", self._filterOutlineDeletedText)
self.filterOutlineBuffer.connect("inserted-text", self._filterOutlineInsertedText)
self.filteredOutlineStore = builder.get_object("filtered_outline_store")
self.filteredOutlineStore.set_visible_func(self.filterOutline)
self.filteredOutlineStore.set_visible_func(self._filterOutline)
self.filteredOutlineStore.refilter()
self.outlineSelection = builder.get_object("outline_selection")
self.outlineSelection.connect("changed", self.outlineSelectionChanged)
self.outlineSelection.connect("changed", self._outlineSelectionChanged)
self.goalBuffer = builder.get_object("goal")
self.oneLineSummaryBuffer = builder.get_object("one_line_summary")
self.fewSentencesSummaryBuffer = builder.get_object("few_sentences_summary")
self.goalBuffer.connect("deleted-text", self.goalDeletedText)
self.goalBuffer.connect("inserted-text", self.goalInsertedText)
self.goalBuffer.connect("deleted-text", self._goalDeletedText)
self.goalBuffer.connect("inserted-text", self._goalInsertedText)
self.oneLineSummaryBuffer.connect("deleted-text", self.oneLineSummaryDeletedText)
self.oneLineSummaryBuffer.connect("inserted-text", self.oneLineSummaryInsertedText)
self.oneLineSummaryBuffer.connect("deleted-text", self._oneLineSummaryDeletedText)
self.oneLineSummaryBuffer.connect("inserted-text", self._oneLineSummaryInsertedText)
self.fewSentencesSummaryBuffer.connect("changed", self.fewSentencesSummaryChanged)
self.fewSentencesSummaryBuffer.connect("changed", self._fewSentencesSummaryChanged)
self.unloadOutlineData()
@ -138,20 +139,9 @@ class OutlineView:
self.charactersStore.set_value(tree_iter, 1, validString(character.name))
self.charactersStore.set_value(tree_iter, 2, pixbufFromColor(character.color))
def __appendOutlineItem(self, outlineItem: OutlineItem, parent_iter=None):
tree_iter = self.outlineStore.append(parent_iter)
if tree_iter is None:
return
if outlineItem.state != OutlineState.COMPLETE:
outlineItem.load(False)
def __updateOutlineItem(self, tree_iter, outlineItem: OutlineItem):
if type(outlineItem) is OutlineFolder:
icon = "folder-symbolic"
for item in outlineItem:
self.__appendOutlineItem(item, tree_iter)
elif type(outlineItem) is OutlineText:
icon = "emblem-documents-symbolic"
else:
@ -176,13 +166,41 @@ class OutlineView:
self.outlineStore.set_value(tree_iter, 7, progress)
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):
self.outlineStore.clear()
for item in self.outline.items:
self.__appendOutlineItem(item)
def plotSelectionChanged(self, selection: Gtk.TreeSelection):
def _plotSelectionChanged(self, selection: Gtk.TreeSelection):
model, tree_iter = selection.get_selected()
if tree_iter is None:
@ -208,7 +226,7 @@ class OutlineView:
self.oneLineSummaryBuffer.set_text("", -1)
self.fewSentencesSummaryBuffer.set_text("", -1)
def outlineSelectionChanged(self, selection: Gtk.TreeSelection):
def _outlineSelectionChanged(self, selection: Gtk.TreeSelection):
model, tree_iter = selection.get_selected()
if tree_iter is None:
@ -231,8 +249,8 @@ class OutlineView:
title = validString(outlineItem.title)
return text in title.lower()
def filterOutline(self, model, iter, userdata):
outlineItem = self.outline.getItemByID(model[iter][0])
def _filterOutline(self, model, iterator, userdata):
outlineItem = self.outline.getItemByID(model[iterator][0])
if outlineItem is None:
return False
@ -240,16 +258,16 @@ class OutlineView:
text = validString(self.filterOutlineBuffer.get_text())
return self.__matchOutlineItemByText(outlineItem, text.lower())
def filterOutlineChanged(self, buffer: Gtk.EntryBuffer):
def __filterOutlineChanged(self, buffer: Gtk.EntryBuffer):
self.filteredOutlineStore.refilter()
def filterOutlineDeletedText(self, buffer: Gtk.EntryBuffer, position: int, n_chars: int):
self.filterOutlineChanged(buffer)
def _filterOutlineDeletedText(self, buffer: Gtk.EntryBuffer, position: int, n_chars: int):
self.__filterOutlineChanged(buffer)
def filterOutlineInsertedText(self, buffer: Gtk.EntryBuffer, position: int, chars: str, n_chars: int):
self.filterOutlineChanged(buffer)
def _filterOutlineInsertedText(self, buffer: Gtk.EntryBuffer, position: int, chars: str, n_chars: int):
self.__filterOutlineChanged(buffer)
def goalChanged(self, buffer: Gtk.EntryBuffer):
def __goalChanged(self, buffer: Gtk.EntryBuffer):
if self.outlineItem is None:
return
@ -274,13 +292,13 @@ class OutlineView:
row[7] = progress
break
def goalDeletedText(self, buffer: Gtk.EntryBuffer, position: int, n_chars: int):
self.goalChanged(buffer)
def _goalDeletedText(self, buffer: Gtk.EntryBuffer, position: int, n_chars: int):
self.__goalChanged(buffer)
def goalInsertedText(self, buffer: Gtk.EntryBuffer, position: int, chars: str, n_chars: int):
self.goalChanged(buffer)
def _goalInsertedText(self, buffer: Gtk.EntryBuffer, position: int, chars: str, n_chars: int):
self.__goalChanged(buffer)
def oneLineSummaryChanged(self, buffer: Gtk.EntryBuffer):
def __oneLineSummaryChanged(self, buffer: Gtk.EntryBuffer):
if self.outlineItem is None:
return
@ -289,13 +307,13 @@ class OutlineView:
self.outlineItem.summarySentence = summary
def oneLineSummaryDeletedText(self, buffer: Gtk.EntryBuffer, position: int, n_chars: int):
self.oneLineSummaryChanged(buffer)
def _oneLineSummaryDeletedText(self, buffer: Gtk.EntryBuffer, position: int, n_chars: int):
self.__oneLineSummaryChanged(buffer)
def oneLineSummaryInsertedText(self, buffer: Gtk.EntryBuffer, position: int, chars: str, n_chars: int):
self.oneLineSummaryChanged(buffer)
def _oneLineSummaryInsertedText(self, buffer: Gtk.EntryBuffer, position: int, chars: str, n_chars: int):
self.__oneLineSummaryChanged(buffer)
def fewSentencesSummaryChanged(self, buffer: Gtk.TextBuffer):
def _fewSentencesSummaryChanged(self, buffer: Gtk.TextBuffer):
if self.outlineItem is None:
return

View file

@ -37,18 +37,18 @@ class PlotView:
self.filterPlotsBuffer = builder.get_object("filter_plots")
self.filterPlotsBuffer.connect("deleted-text", self.filterPlotsDeletedText)
self.filterPlotsBuffer.connect("inserted-text", self.filterPlotsInsertedText)
self.filterPlotsBuffer.connect("deleted-text", self._filterPlotsDeletedText)
self.filterPlotsBuffer.connect("inserted-text", self._filterPlotsInsertedText)
self.filteredPlotsStore.set_visible_func(self.filterPlots)
self.filteredPlotsStore.set_visible_func(self._filterPlots)
self.filteredPlotsStore.refilter()
self.mainPlotsStore.set_visible_func(
lambda model, iter, userdata: model[iter][2] == Importance.MAIN.value)
lambda model, iterator, userdata: model[iterator][2] == Importance.MAIN.value)
self.secondaryPlotsStore.set_visible_func(
lambda model, iter, userdata: model[iter][2] == Importance.SECONDARY.value)
lambda model, iterator, userdata: model[iterator][2] == Importance.SECONDARY.value)
self.minorPlotsStore.set_visible_func(
lambda model, iter, userdata: model[iter][2] == Importance.MINOR.value)
lambda model, iterator, userdata: model[iterator][2] == Importance.MINOR.value)
self.mainPlotsStore.refilter()
self.secondaryPlotsStore.refilter()
@ -61,17 +61,17 @@ class PlotView:
]
for selection in self.plotSelections:
selection.connect("changed", self.plotSelectionChanged)
selection.connect("changed", self._plotSelectionChanged)
self.addPlotButton = builder.get_object("add_plot")
self.removePlotButton = builder.get_object("remove_plot")
self.addPlotButton.connect("clicked", self.addPlotClicked)
self.removePlotButton.connect("clicked", self.removePlotClicked)
self.addPlotButton.connect("clicked", self._addPlotClicked)
self.removePlotButton.connect("clicked", self._removePlotClicked)
self.importanceCombo = builder.get_object("importance")
self.importanceCombo.connect("changed", self.importanceChanged)
self.importanceCombo.connect("changed", self._importanceChanged)
self.resolutionStepsStore = builder.get_object("resolution_steps_store")
self.resolutionStepsSelection = builder.get_object("resolution_steps_selection")
@ -80,28 +80,28 @@ class PlotView:
self.resolutionStepsNameRenderer = builder.get_object("resolution_steps_name")
self.resolutionStepsMetaRenderer = builder.get_object("resolution_steps_meta")
self.resolutionStepsSelection.connect("changed", self.resolutionStepsSelectionChanged)
self.addResolutionStepButton.connect("clicked", self.addResolutionStepClicked)
self.removeResolutionStepButton.connect("clicked", self.removeResolutionStepClicked)
self.resolutionStepsNameRenderer.connect("edited", self.resolutionStepsNameEdited)
self.resolutionStepsMetaRenderer.connect("edited", self.resolutionStepsMetaEdited)
self.resolutionStepsSelection.connect("changed", self._resolutionStepsSelectionChanged)
self.addResolutionStepButton.connect("clicked", self._addResolutionStepClicked)
self.removeResolutionStepButton.connect("clicked", self._removeResolutionStepClicked)
self.resolutionStepsNameRenderer.connect("edited", self._resolutionStepsNameEdited)
self.resolutionStepsMetaRenderer.connect("edited", self._resolutionStepsMetaEdited)
self.nameBuffer = builder.get_object("name")
self.descriptionBuffer = builder.get_object("description")
self.resultBuffer = builder.get_object("result")
self.stepSummaryBuffer = builder.get_object("step_summary")
self.nameBuffer.connect("deleted-text", self.nameDeletedText)
self.nameBuffer.connect("inserted-text", self.nameInsertedText)
self.nameBuffer.connect("deleted-text", self._nameDeletedText)
self.nameBuffer.connect("inserted-text", self._nameInsertedText)
self.plotCharactersStore = builder.get_object("plot_characters_store")
self.plotCharactersStore.set_visible_func(self.filterPlotCharacters)
self.plotCharactersStore.set_visible_func(self._filterPlotCharacters)
self.plotCharactersStore.refilter()
self.descriptionBuffer.connect("changed", self.descriptionChanged)
self.resultBuffer.connect("changed", self.resultChanged)
self.stepSummaryBuffer.connect("changed", self.stepSummaryChanged)
self.descriptionBuffer.connect("changed", self._descriptionChanged)
self.resultBuffer.connect("changed", self._resultChanged)
self.stepSummaryBuffer.connect("changed", self._stepSummaryChanged)
self.unloadPlotData()
@ -186,7 +186,7 @@ class PlotView:
self.plotCharactersStore.refilter()
def plotSelectionChanged(self, selection: Gtk.TreeSelection):
def _plotSelectionChanged(self, selection: Gtk.TreeSelection):
model, tree_iter = selection.get_selected()
if tree_iter is None:
@ -204,7 +204,7 @@ class PlotView:
else:
self.loadPlotData(plotLine)
def addPlotClicked(self, button: Gtk.Button):
def _addPlotClicked(self, button: Gtk.Button):
name = invalidString(self.filterPlotsBuffer.get_text())
plotLine = self.plots.addLine(name)
@ -216,29 +216,29 @@ class PlotView:
self.refreshPlotsStore()
def removePlotClicked(self, button: Gtk.Button):
def _removePlotClicked(self, button: Gtk.Button):
if self.plotLine is None:
return
self.plots.removeLine(self.plotLine)
self.refreshPlotsStore()
def filterPlots(self, model, iter, userdata):
name = validString(model[iter][1])
def _filterPlots(self, model, iterator, userdata):
name = validString(model[iterator][1])
text = validString(self.filterPlotsBuffer.get_text())
return text.lower() in name.lower()
def filterPlotsChanged(self, buffer: Gtk.EntryBuffer):
def __filterPlotsChanged(self, buffer: Gtk.EntryBuffer):
self.filteredPlotsStore.refilter()
def filterPlotsDeletedText(self, buffer: Gtk.EntryBuffer, position: int, n_chars: int):
self.filterPlotsChanged(buffer)
def _filterPlotsDeletedText(self, buffer: Gtk.EntryBuffer, position: int, n_chars: int):
self.__filterPlotsChanged(buffer)
def filterPlotsInsertedText(self, buffer: Gtk.EntryBuffer, position: int, chars: str, n_chars: int):
self.filterPlotsChanged(buffer)
def _filterPlotsInsertedText(self, buffer: Gtk.EntryBuffer, position: int, chars: str, n_chars: int):
self.__filterPlotsChanged(buffer)
def importanceChanged(self, combo: Gtk.ComboBox):
def _importanceChanged(self, combo: Gtk.ComboBox):
if self.plotLine is None:
return
@ -277,7 +277,7 @@ class PlotView:
selection.select_iter(row.iter)
break
def resolutionStepsSelectionChanged(self, selection: Gtk.TreeSelection):
def _resolutionStepsSelectionChanged(self, selection: Gtk.TreeSelection):
model, tree_iter = selection.get_selected()
self.plotStep = None
@ -295,7 +295,7 @@ class PlotView:
self.plotStep = plotStep
def addResolutionStepClicked(self, button: Gtk.Button):
def _addResolutionStepClicked(self, button: Gtk.Button):
if self.plotLine is None:
return
@ -313,7 +313,7 @@ class PlotView:
self.resolutionStepsStore.set_value(tree_iter, 1, validString(step.name))
self.resolutionStepsStore.set_value(tree_iter, 2, validString(step.meta))
def removeResolutionStepClicked(self, button: Gtk.Button):
def _removeResolutionStepClicked(self, button: Gtk.Button):
if (self.plotLine is None) or (self.plotStep is None):
return
@ -326,7 +326,7 @@ class PlotView:
self.plotLine.removeStep(self.plotStep)
def resolutionStepsNameEdited(self, renderer: Gtk.CellRendererText, path: str, text: str):
def _resolutionStepsNameEdited(self, renderer: Gtk.CellRendererText, path: str, text: str):
if self.plotStep is None:
return
@ -339,7 +339,7 @@ class PlotView:
self.plotStep.name = invalidString(text)
def resolutionStepsMetaEdited(self, renderer: Gtk.CellRendererText, path: str, text: str):
def _resolutionStepsMetaEdited(self, renderer: Gtk.CellRendererText, path: str, text: str):
if self.plotStep is None:
return
@ -352,7 +352,7 @@ class PlotView:
self.plotStep.meta = invalidString(text)
def nameChanged(self, buffer: Gtk.EntryBuffer):
def __nameChanged(self, buffer: Gtk.EntryBuffer):
if self.plotLine is None:
return
@ -368,21 +368,21 @@ class PlotView:
row[1] = validString(name)
break
def nameDeletedText(self, buffer: Gtk.EntryBuffer, position: int, n_chars: int):
self.nameChanged(buffer)
def _nameDeletedText(self, buffer: Gtk.EntryBuffer, position: int, n_chars: int):
self.__nameChanged(buffer)
def nameInsertedText(self, buffer: Gtk.EntryBuffer, position: int, chars: str, n_chars: int):
self.nameChanged(buffer)
def _nameInsertedText(self, buffer: Gtk.EntryBuffer, position: int, chars: str, n_chars: int):
self.__nameChanged(buffer)
def filterPlotCharacters(self, model, iter, userdata):
ID = validInt(model[iter][0])
def _filterPlotCharacters(self, model, iterator, userdata):
ID = validInt(model[iterator][0])
if self.plotLine is None:
return False
return ID in self.plotLine.characters
def descriptionChanged(self, buffer: Gtk.TextBuffer):
def _descriptionChanged(self, buffer: Gtk.TextBuffer):
if self.plotLine is None:
return
@ -393,7 +393,7 @@ class PlotView:
self.plotLine.description = invalidString(text)
def resultChanged(self, buffer: Gtk.TextBuffer):
def _resultChanged(self, buffer: Gtk.TextBuffer):
if self.plotLine is None:
return
@ -404,7 +404,7 @@ class PlotView:
self.plotLine.result = invalidString(text)
def stepSummaryChanged(self, buffer: Gtk.TextBuffer):
def _stepSummaryChanged(self, buffer: Gtk.TextBuffer):
if self.plotStep is None:
return

View file

@ -22,7 +22,7 @@ class SummaryView:
self.stack = builder.get_object("stack")
self.stackCombo = builder.get_object("stack_combo")
self.stackCombo.connect("changed", self.summaryStackChanged)
self.stackCombo.connect("changed", self._summaryStackChanged)
self.situationBuffer = builder.get_object("situation")
self.situationBuffer.connect("deleted-text", self._situationDeletedText)
@ -31,31 +31,31 @@ class SummaryView:
self.oneSentenceLabel = builder.get_object("one_sentence_label")
self.oneSentenceBuffer = builder.get_object("summary_one_sentence")
self.oneSentenceBuffer.connect("changed", self.summaryOneSentenceChanged)
self.oneSentenceBuffer.connect("changed", self._summaryOneSentenceChanged)
self.oneSentenceBuffer.set_text(validString(self.summary.sentence), -1)
self.oneParagraphLabel = builder.get_object("one_paragraph_label")
self.oneParagraphBuffer = builder.get_object("summary_one_paragraph")
self.oneParagraphBuffer.connect("changed", self.summaryOneParagraphChanged)
self.oneParagraphBuffer.connect("changed", self._summaryOneParagraphChanged)
self.oneParagraphBuffer.set_text(validString(self.summary.paragraph), -1)
self.onePageLabel = builder.get_object("one_page_label")
self.onePageBuffer = builder.get_object("summary_one_page")
self.onePageBuffer.connect("changed", self.summaryOnePageChanged)
self.onePageBuffer.connect("changed", self._summaryOnePageChanged)
self.onePageBuffer.set_text(validString(self.summary.page), -1)
self.fullLabel = builder.get_object("full_label")
self.fullBuffer = builder.get_object("summary_full")
self.fullBuffer.connect("changed", self.summaryFullChanged)
self.fullBuffer.connect("changed", self._summaryFullChanged)
self.fullBuffer.set_text(validString(self.summary.full), -1)
self.nextButton = builder.get_object("next_button")
self.nextButton.connect("clicked", self.nextClicked)
self.nextButton.connect("clicked", self._nextClicked)
def show(self):
self.widget.show_all()
def summaryStackChanged(self, combo: Gtk.ComboBox):
def _summaryStackChanged(self, combo: Gtk.ComboBox):
tree_iter = combo.get_active_iter()
if tree_iter is None:
@ -67,16 +67,16 @@ class SummaryView:
self.nextButton.set_visible(not (model.iter_next(tree_iter) is None))
self.stack.set_visible_child_name(page)
def situationChanged(self, buffer: Gtk.EntryBuffer):
def __situationChanged(self, buffer: Gtk.EntryBuffer):
self.summary.situation = invalidString(buffer.get_text())
def _situationDeletedText(self, buffer: Gtk.EntryBuffer, position, count):
self.situationChanged(buffer)
self.__situationChanged(buffer)
def _situationInsertedText(self, buffer: Gtk.EntryBuffer, position, value, count):
self.situationChanged(buffer)
self.__situationChanged(buffer)
def summaryOneSentenceChanged(self, buffer: Gtk.TextBuffer):
def _summaryOneSentenceChanged(self, buffer: Gtk.TextBuffer):
start_iter = buffer.get_start_iter()
end_iter = buffer.get_end_iter()
@ -85,7 +85,7 @@ class SummaryView:
self.oneSentenceLabel.set_text("Words: {}".format(WordCounter.count(text)))
self.summary.sentence = invalidString(text)
def summaryOneParagraphChanged(self, buffer: Gtk.TextBuffer):
def _summaryOneParagraphChanged(self, buffer: Gtk.TextBuffer):
start_iter = buffer.get_start_iter()
end_iter = buffer.get_end_iter()
@ -94,7 +94,7 @@ class SummaryView:
self.oneParagraphLabel.set_text("Words: {}".format(WordCounter.count(text)))
self.summary.paragraph = invalidString(text)
def summaryOnePageChanged(self, buffer: Gtk.TextBuffer):
def _summaryOnePageChanged(self, buffer: Gtk.TextBuffer):
start_iter = buffer.get_start_iter()
end_iter = buffer.get_end_iter()
@ -103,7 +103,7 @@ class SummaryView:
self.onePageLabel.set_text("Words: {} (~{} pages)".format(WordCounter.count(text), PageCounter.count(text)))
self.summary.page = invalidString(text)
def summaryFullChanged(self, buffer: Gtk.TextBuffer):
def _summaryFullChanged(self, buffer: Gtk.TextBuffer):
start_iter = buffer.get_start_iter()
end_iter = buffer.get_end_iter()
@ -112,7 +112,7 @@ class SummaryView:
self.fullLabel.set_text("Words: {} (~{} pages)".format(WordCounter.count(text), PageCounter.count(text)))
self.summary.full = invalidString(text)
def nextClicked(self, button: Gtk.Button):
def _nextClicked(self, button: Gtk.Button):
tree_iter = self.stackCombo.get_active_iter()
if tree_iter is None:

View file

@ -30,33 +30,33 @@ class WorldView:
self.filteredWorldStore = builder.get_object("filtered_world_store")
self.filterWorldBuffer = builder.get_object("filter_world")
self.filterWorldBuffer.connect("deleted-text", self.filterWorldDeletedText)
self.filterWorldBuffer.connect("inserted-text", self.filterWorldInsertedText)
self.filterWorldBuffer.connect("deleted-text", self._filterWorldDeletedText)
self.filterWorldBuffer.connect("inserted-text", self._filterWorldInsertedText)
self.filteredWorldStore.set_visible_func(self.filterWorld)
self.filteredWorldStore.set_visible_func(self._filterWorld)
self.filteredWorldStore.refilter()
self.worldSelection = builder.get_object("world_selection")
self.worldSelection.connect("changed", self.worldSelectionChanged)
self.worldSelection.connect("changed", self._worldSelectionChanged)
self.addToWorldButton = builder.get_object("add_to_world")
self.removeFromWorldButton = builder.get_object("remove_from_world")
self.addToWorldButton.connect("clicked", self.addToWorldClicked)
self.removeFromWorldButton.connect("clicked", self.removeFromWorldClicked)
self.addToWorldButton.connect("clicked", self._addToWorldClicked)
self.removeFromWorldButton.connect("clicked", self._removeFromWorldClicked)
self.nameBuffer = builder.get_object("name")
self.descriptionBuffer = builder.get_object("description")
self.sourceOfPassionBuffer = builder.get_object("source_of_passion")
self.sourceOfConflictBuffer = builder.get_object("source_of_conflict")
self.nameBuffer.connect("deleted-text", self.nameDeletedText)
self.nameBuffer.connect("inserted-text", self.nameInsertedText)
self.nameBuffer.connect("deleted-text", self._nameDeletedText)
self.nameBuffer.connect("inserted-text", self._nameInsertedText)
self.descriptionBuffer.connect("changed", self.descriptionChanged)
self.sourceOfPassionBuffer.connect("changed", self.sourceOfPassionChanged)
self.sourceOfConflictBuffer.connect("changed", self.sourceOfConflictChanged)
self.descriptionBuffer.connect("changed", self._descriptionChanged)
self.sourceOfPassionBuffer.connect("changed", self._sourceOfPassionChanged)
self.sourceOfConflictBuffer.connect("changed", self._sourceOfConflictChanged)
self.unloadWorldData()
@ -100,7 +100,7 @@ class WorldView:
self.sourceOfPassionBuffer.set_text("", -1)
self.sourceOfConflictBuffer.set_text("", -1)
def worldSelectionChanged(self, selection: Gtk.TreeSelection):
def _worldSelectionChanged(self, selection: Gtk.TreeSelection):
model, tree_iter = selection.get_selected()
if tree_iter is None:
@ -114,7 +114,7 @@ class WorldView:
else:
self.loadWorldData(worldItem)
def addToWorldClicked(self, button: Gtk.Button):
def _addToWorldClicked(self, button: Gtk.Button):
name = invalidString(self.filterWorldBuffer.get_text())
worldItem = self.world.addItem(name, self.worldItem)
@ -123,7 +123,7 @@ class WorldView:
self.refreshWorldStore()
def removeFromWorldClicked(self, button: Gtk.Button):
def _removeFromWorldClicked(self, button: Gtk.Button):
if self.worldItem is None:
return
@ -138,8 +138,8 @@ class WorldView:
name = validString(worldItem.name)
return text in name.lower()
def filterWorld(self, model, iter, userdata):
worldItem = self.world.getItemByID(model[iter][0])
def _filterWorld(self, model, iterator, userdata):
worldItem = self.world.getItemByID(model[iterator][0])
if worldItem is None:
return False
@ -147,16 +147,16 @@ class WorldView:
text = validString(self.filterWorldBuffer.get_text())
return self.__matchWorldItemByText(worldItem, text.lower())
def filterWorldChanged(self, buffer: Gtk.EntryBuffer):
def __filterWorldChanged(self, buffer: Gtk.EntryBuffer):
self.filteredWorldStore.refilter()
def filterWorldDeletedText(self, buffer: Gtk.EntryBuffer, position: int, n_chars: int):
self.filterWorldChanged(buffer)
def _filterWorldDeletedText(self, buffer: Gtk.EntryBuffer, position: int, n_chars: int):
self.__filterWorldChanged(buffer)
def filterWorldInsertedText(self, buffer: Gtk.EntryBuffer, position: int, chars: str, n_chars: int):
self.filterWorldChanged(buffer)
def _filterWorldInsertedText(self, buffer: Gtk.EntryBuffer, position: int, chars: str, n_chars: int):
self.__filterWorldChanged(buffer)
def nameChanged(self, buffer: Gtk.EntryBuffer):
def __nameChanged(self, buffer: Gtk.EntryBuffer):
if self.worldItem is None:
return
@ -172,13 +172,13 @@ class WorldView:
row[1] = validString(name)
break
def nameDeletedText(self, buffer: Gtk.EntryBuffer, position: int, n_chars: int):
self.nameChanged(buffer)
def _nameDeletedText(self, buffer: Gtk.EntryBuffer, position: int, n_chars: int):
self.__nameChanged(buffer)
def nameInsertedText(self, buffer: Gtk.EntryBuffer, position: int, chars: str, n_chars: int):
self.nameChanged(buffer)
def _nameInsertedText(self, buffer: Gtk.EntryBuffer, position: int, chars: str, n_chars: int):
self.__nameChanged(buffer)
def descriptionChanged(self, buffer: Gtk.TextBuffer):
def _descriptionChanged(self, buffer: Gtk.TextBuffer):
if self.worldItem is None:
return
@ -189,7 +189,7 @@ class WorldView:
self.worldItem.description = invalidString(text)
def sourceOfPassionChanged(self, buffer: Gtk.TextBuffer):
def _sourceOfPassionChanged(self, buffer: Gtk.TextBuffer):
if self.worldItem is None:
return
@ -200,7 +200,7 @@ class WorldView:
self.worldItem.passion = invalidString(text)
def sourceOfConflictChanged(self, buffer: Gtk.TextBuffer):
def _sourceOfConflictChanged(self, buffer: Gtk.TextBuffer):
if self.worldItem is None:
return

View file

@ -2,6 +2,7 @@
# -*- coding: utf-8 -*-
import re
import time
from manuskript.util.counter import CounterKind, CharCounter, WordCounter, PageCounter
@ -62,6 +63,7 @@ def countText(text: str, kind: CounterKind = CounterKind.WORDS):
else:
return 0
def safeFraction(value, low, high) -> float:
if value < low:
return 0.0
@ -69,3 +71,11 @@ def safeFraction(value, low, high) -> float:
return 1.0
else:
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

@ -5,6 +5,12 @@ import re
from enum import Enum, unique
_char_pattern_with_spaces = re.compile(r"[\S ]")
_char_pattern_without_spaces = re.compile(r"\S")
_word_pattern = re.compile(r"\S+")
_whitespace = " \t\r\n"
@unique
class CounterKind(Enum):
@ -18,16 +24,16 @@ class CharCounter:
@classmethod
def count(cls, text: str, use_spaces: bool = False):
if use_spaces:
return len(re.findall(r"[\S ]", text))
return len(_char_pattern_with_spaces.findall(text))
else:
return len(re.findall(r"\S", text))
return len(_char_pattern_without_spaces.findall(text))
class WordCounter:
@classmethod
def count(cls, text: str):
return len(re.findall(r"\S+", text))
return len(_word_pattern.findall(text))
class PageCounter: