mirror of
https://github.com/olivierkes/manuskript.git
synced 2024-09-30 01:07:24 +13:00
Merge branch 'gtk' into gtk
This commit is contained in:
commit
3027e5a93a
18 changed files with 413 additions and 349 deletions
|
@ -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()
|
||||
|
|
|
@ -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,8 +193,7 @@ class OutlineFolder(OutlineItem):
|
|||
folder.items.append(item)
|
||||
|
||||
if recursive:
|
||||
for item in folder.items:
|
||||
if type(item) is OutlineFolder:
|
||||
for item in filter(lambda outlineItem: type(outlineItem) is OutlineFolder, folder.items):
|
||||
cls.loadItems(outline, item, recursive)
|
||||
|
||||
def textCount(self, counterKind: CounterKind = None) -> int:
|
||||
|
@ -193,24 +201,28 @@ class OutlineFolder(OutlineItem):
|
|||
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)
|
||||
|
||||
if optimized:
|
||||
self.state = OutlineState.OPTIMIZED
|
||||
else:
|
||||
for item in self.items:
|
||||
if item.state != OutlineState.COMPLETE:
|
||||
return
|
||||
|
||||
self.state = OutlineState.COMPLETE
|
||||
|
||||
@classmethod
|
||||
|
@ -219,8 +231,7 @@ class OutlineFolder(OutlineItem):
|
|||
item.save()
|
||||
|
||||
if recursive:
|
||||
for item in folder.items:
|
||||
if type(item) is OutlineFolder:
|
||||
for item in filter(lambda outlineItem: type(outlineItem) is OutlineFolder, folder.items):
|
||||
cls.saveItems(item, recursive)
|
||||
|
||||
def save(self):
|
||||
|
@ -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:
|
||||
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:
|
||||
for item in filter(lambda outlineItem: type(outlineItem) is OutlineFolder, self.items):
|
||||
OutlineFolder.saveItems(item, True)
|
||||
|
|
|
@ -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"))
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
@ -327,19 +326,17 @@ class CharactersView:
|
|||
|
||||
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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in a new issue