diff --git a/.gitignore b/.gitignore index 75595ae8..d0e9cc37 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ manuskript.log snowflake* test-projects main.pyproject.user +*.glade# diff --git a/manuskript/data/characters_template.py b/manuskript/data/characters_templates.py similarity index 56% rename from manuskript/data/characters_template.py rename to manuskript/data/characters_templates.py index b613892c..d2deadf3 100644 --- a/manuskript/data/characters_template.py +++ b/manuskript/data/characters_templates.py @@ -7,21 +7,22 @@ import os from collections import OrderedDict -# So this is a template for charecter details -# It is edited by the Charecter Template Editor -# Most of the code is taken from charecters.py +# So this is a template for character details +# It is edited by the Character Template Editor +# Most of the code is taken from characters.py # I think this should have a custom save that's like a .json file in the main part of the manuskript save #Main Class -class CharacterDetailTemplate: - - details = {'Age':'','Birthdate':'', +class CharacterDetailTemplates: +# Basic Template + templates = {'Basic Human': + {'Age':'','Birthdate':'', 'Eye Color':'','Hair Color':'', - 'Handed':''} # We'll make a default template - + 'Handed':''}, + } - # TODO saving + # TODO: saving def save(self): pass diff --git a/manuskript/data/project.py b/manuskript/data/project.py index f1f6c351..4c9884ec 100644 --- a/manuskript/data/project.py +++ b/manuskript/data/project.py @@ -19,7 +19,7 @@ from manuskript.data.world import World from manuskript.data.outline import Outline from manuskript.data.revisions import Revisions # This is for the charecter template -from manuskript.data.characters_template import CharacterDetailTemplate +from manuskript.data.characters_templates import CharacterDetailTemplates from manuskript.io.mskFile import MskFile from manuskript.util import profileTime @@ -41,7 +41,7 @@ class Project: self.world = World(self.file.dir_path) self.outline = Outline(self.file.dir_path, self.plots, self.labels, self.statuses) self.revisions = Revisions(self.file.dir_path) - self.character_template = CharacterDetailTemplate() + self.character_templates = CharacterDetailTemplates() # TODO: RENAME PROPERALLY def __del__(self): del self.file diff --git a/manuskript/ui/mainWindow.py b/manuskript/ui/mainWindow.py index a063d7f7..ed9a2d38 100644 --- a/manuskript/ui/mainWindow.py +++ b/manuskript/ui/mainWindow.py @@ -75,14 +75,12 @@ class MainWindow: self.startupWindow = StartupWindow(self) self.aboutDialog = AboutDialog(self) self.frequencyWindow = FrequencyWindow(self) - self.characterTemplateWindow = CharacterTemplateWindow(self) self.settingsWindow = SettingsWindow(self) self.windows = [ self.startupWindow, self.aboutDialog, self.frequencyWindow, - self.characterTemplateWindow, self.settingsWindow ] diff --git a/manuskript/ui/tools/__init__.py b/manuskript/ui/tools/__init__.py index 674f8ba8..3efbdd35 100644 --- a/manuskript/ui/tools/__init__.py +++ b/manuskript/ui/tools/__init__.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -from manuskript.ui.tools.frequencyWindow import FrequencyWindow -from manuskript.ui.tools.characterTemplateWindow import CharacterTemplateWindow +from manuskript.ui.tools.frequencyWindow import FrequencyWindow \ No newline at end of file diff --git a/manuskript/ui/tools/characterTemplateWindow.py b/manuskript/ui/tools/characterTemplateWindow.py deleted file mode 100644 index 75c10148..00000000 --- a/manuskript/ui/tools/characterTemplateWindow.py +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - - -# Imports -# Gi -import gi - -gi.require_version("Gtk", "3.0") -from gi.repository import GObject, Gtk, Handy - -# Manuskript -from manuskript.ui.abstractDialog import AbstractDialog -from manuskript.util import unique_name_checker, invalidString, validString - - -# I lifted a lot of this code from frequencyWindow -# With a bit more stuff from charactersView - -class CharacterTemplateWindow(AbstractDialog): - - def __init__(self, mainWindow): - AbstractDialog.__init__(self, mainWindow, "ui/character_details_template_editor.glade", - "character_details_template_editor") - - self.headerBar = None - self.back = None - - self.detailsStore = None - self.detailsSelection = None - self.addDetailsButton = None - self.removeDetailsButton = None - self.appendDetailsTemplateButton = None - self.detailsNameRenderer = None - self.detailsValueRenderer = None - - def initWindow(self, builder, window): - self.headerBar = builder.get_object("header_bar") - self.back = builder.get_object("back") - - self.back.connect("clicked", self._backClicked) - - # Liking Stuff stole from charactersView - 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.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) - - self.detailsNameRenderer.connect("edited", self._detailsNameEdited) - self.detailsValueRenderer.connect("edited", self._detailsValueEdited) - - self.loadCharacterTemplate() - - def _backClicked(self, button: Gtk.Button): - self.hide() - - # So this adds any previously added parts to the template - def loadCharacterTemplate(self): - for name, value in self.mainWindow.project.character_template.details.items(): - tree_iter = self.detailsStore.append() - - if tree_iter is None: - return - - self.detailsStore.set_value(tree_iter, 0, name) - self.detailsStore.set_value(tree_iter, 1, value) - -# Functions stole From charactersView - def _addDetailsClicked(self, button: Gtk.Button): - tree_iter = self.detailsStore.append() - - if tree_iter is None: - return - - name = unique_name_checker.get_unique_name_for_dictionary(self.mainWindow.project.character_template.details, - "Description") - value = "Value" - - self.detailsStore.set_value(tree_iter, 0, name) - self.detailsStore.set_value(tree_iter, 1, value) - - self.mainWindow.project.character_template.details[name] = value - - def _removeDetailsClicked(self, button: Gtk.Button): - model, tree_iter = self.detailsSelection.get_selected() - - if (model is None) or (tree_iter is None): - return - - name = model.get_value(tree_iter, 0) - model.remove(tree_iter) - - self.mainWindow.project.character_template.details.pop(name) - - def _detailsNameEdited(self, renderer: Gtk.CellRendererText, path: str, text: str): - model, tree_iter = self.detailsSelection.get_selected() - - if (model is None) or (tree_iter is None): - return - text_to_set = unique_name_checker.get_unique_name_for_dictionary( - self.mainWindow.project.character_template.details, text) - name = model.get_value(tree_iter, 0) - model.set_value(tree_iter, 0, text_to_set) - # There was an error with this line but it didn't seem to do anything bad. - self.mainWindow.project.character_template.details[text_to_set] = \ - self.mainWindow.project.character_template.details.pop(name) - - def _detailsValueEdited(self, renderer: Gtk.CellRendererText, path: str, text: str): - model, tree_iter = self.detailsSelection.get_selected() - - if (model is None) or (tree_iter is None): - return - - name = model.get_value(tree_iter, 0) - model.set_value(tree_iter, 1, text) - - self.mainWindow.project.character_template.details[name] = text diff --git a/manuskript/ui/views/charactersView.py b/manuskript/ui/views/charactersView.py index a6ceac1e..0e92b8bf 100644 --- a/manuskript/ui/views/charactersView.py +++ b/manuskript/ui/views/charactersView.py @@ -14,7 +14,7 @@ from manuskript.util import validString, invalidString, validInt, invalidInt, un class CharactersView: def __init__(self, project): - self.characterTemplate = project.character_template # The template for detailed info + self.characterTemplates = project.character_templates # The template for detailed info self.characters = project.characters self.character = None @@ -78,13 +78,19 @@ class CharactersView: self.detailsSelection = builder.get_object("details_selection") self.addDetailsButton = builder.get_object("add_details") self.removeDetailsButton = builder.get_object("remove_details") - self.appendDetailsTemplateButton = builder.get_object("appened_details_template") + self.charecterDetailsMenuButton = builder.get_object("characters_details_menu_button") + self.newTemplateButton = builder.get_object("new_template_button") + self.newTemplateEntry = builder.get_object("new_template_entry") + self.newTemplateEntryBuffer = builder.get_object("new_template_entry_buffer") + self.charecterDetailsMenuAppendBox = builder.get_object("template_select_box") + self.charecterDetailsMenuTemplateBox = builder.get_object("template_select_box2") 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) - self.appendDetailsTemplateButton.connect("clicked", self._appendTemplateClicked) + self.charecterDetailsMenuButton.connect("clicked", self._onCharecterDetailsMenuClicked) + self.newTemplateButton.connect("clicked", self._onNewTemplateButtonClicked) self.detailsNameRenderer.connect("edited", self._detailsNameEdited) self.detailsValueRenderer.connect("edited", self._detailsValueEdited) @@ -325,17 +331,56 @@ class CharactersView: model.remove(tree_iter) self.character.details.pop(name) + + def _updateCharecterDetailsMenu(self): + def clear_container(container): + data = container.get_children() + for d in data: + container.remove(d) + clear_container( self.charecterDetailsMenuAppendBox) + clear_container(self.charecterDetailsMenuTemplateBox) + for x in self.characterTemplates.templates: + button = Gtk.Button(label=x,) # TODO: turn into ModelButton + button.connect("clicked", self._appendTemplateClicked, x) + self.charecterDetailsMenuAppendBox.add(button) + # Now we do the buttons for charecterDetailsMenuTemplateBox + button2 = Gtk.Button(label=x,) # TODO: turn into ModelButton + button2.connect("clicked", self._updateTemplateClicked, x) + self.charecterDetailsMenuTemplateBox.add(button2) - def _appendTemplateClicked(self, button: Gtk.Button): + self.charecterDetailsMenuAppendBox.show_all() + self.charecterDetailsMenuTemplateBox.show_all() + + def _onCharecterDetailsMenuClicked(self, button: Gtk.MenuButton): + self._updateCharecterDetailsMenu() + + def _updateTemplateClicked(self, button: Gtk.ModelButton, template): + if self.character is None: + return + self.characterTemplates.templates[template] = self.character.details # TODO: Add A warning? Or should there be undo/ redo when revisions are written. + + def _appendTemplateClicked(self, button: Gtk.ModelButton, template): if self.character is None: return # This following bit could be turned into a def - for (key, value) in self.characterTemplate.details.items(): + for (key, value) in self.characterTemplates.templates[template].items(): self.character.details[key]= value - #We have to reload the charecter + # We have to reload the character self.loadCharacterData(self.character) + def _onNewTemplateButtonClicked(self, button: Gtk.Button): + text = self.newTemplateEntryBuffer.get_text() + if text == "": + return + if text in self.characterTemplates.templates: + new_text = unique_name_checker.get_unique_name_for_dictionary(self.characterTemplates.templates, text) + self.newTemplateEntryBuffer.set_text(new_text, -1) # TODO: Add a warning + return + else: + self.characterTemplates.templates[text] = self.character.details + self._updateCharecterDetailsMenu() + def _detailsNameEdited(self, renderer: Gtk.CellRendererText, path: str, text: str): if self.character is None: return @@ -477,3 +522,4 @@ class CharactersView: def show(self): self.widget.show_all() + diff --git a/test_io.py b/test_io.py old mode 100644 new mode 100755 diff --git a/ui/character_details_template_editor.glade b/ui/character_details_template_editor.glade deleted file mode 100644 index 72d0e4b2..00000000 --- a/ui/character_details_template_editor.glade +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - False - - - True - False - vertical - - - True - False - - - True - False - Edit Charecter Details Template - - - True - True - True - 4 - 4 - - - True - False - go-previous-symbolic - - - - - - - - - False - True - 0 - - - - - True - False - 8 - vertical - 8 - - - 200 - True - False - True - True - 0 - 0 - - - True - True - in - - - True - False - - - True - True - details_store - True - 0 - both - - - - - - Name - - - True - - - 0 - - - - - - - Value - - - True - - - 1 - - - - - - - - - - - - - - - - True - True - 0 - - - - - True - False - 4 - - - True - True - True - - - True - False - list-add - - - - - False - True - 0 - - - - - True - True - True - - - True - False - list-remove - - - - - False - True - 1 - - - - - False - False - 1 - - - - - True - True - 1 - - - - - - - - - - - - - - diff --git a/ui/characters.glade b/ui/characters.glade index 78a0ba85..231faffd 100644 --- a/ui/characters.glade +++ b/ui/characters.glade @@ -85,6 +85,195 @@ along with Manuskript. If not, see . + + + 200 + False + + + True + False + vertical + + + True + True + True + Append Template + main + True + + + False + True + 0 + + + + + True + True + True + in + + + True + False + + + True + False + none + False + + + + + + + True + True + 1 + + + + + append_template + 1 + + + + + True + False + vertical + + + True + True + True + Set info to template + main + True + + + False + True + 0 + + + + + True + True + True + in + + + True + False + + + True + False + none + False + + + + + + + True + True + 1 + + + + + True + False + + + True + True + new_template_entry_buffer + Enter a unique name + GTK_INPUT_HINT_NO_EMOJI | GTK_INPUT_HINT_NONE + + + False + True + 0 + + + + + New template + True + True + True + Adds a new template with the content of the current charecter's details. + + + False + True + 2 + + + + + False + True + 2 + + + + + edit_template + 2 + + + + + True + False + vertical + + + True + True + True + Append Template + append_template + + + False + True + 0 + + + + + True + True + True + Set info to template + edit_template + + + False + True + 1 + + + + + main + 3 + + + @@ -934,12 +1123,20 @@ summary - - Append Detail Template + True True + False True - + up + charecter_options_popover + + + True + False + open-menu-symbolic + + False diff --git a/ui/main.glade b/ui/main.glade index c2289edf..32d9a619 100644 --- a/ui/main.glade +++ b/ui/main.glade @@ -619,14 +619,6 @@ along with Manuskript. If not, see . True - - - True - False - _Edit Character Details Template - True - -