Changed Template Manager

I also added glade back up files to gitignore. It wasn't.
This commit is contained in:
TheShadowOfHassen 2023-02-04 13:11:28 -05:00
parent 4ccd78bc7d
commit 45889d6279
11 changed files with 266 additions and 348 deletions

1
.gitignore vendored
View file

@ -25,3 +25,4 @@ manuskript.log
snowflake*
test-projects
main.pyproject.user
*.glade#

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

0
test_io.py Normal file → Executable file
View file

View file

@ -1,193 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 -->
<interface>
<requires lib="gtk+" version="3.24"/>
<requires lib="libhandy" version="0.0"/>
<object class="HdyWindow" id="character_details_template_editor">
<property name="can-focus">False</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="HdyTitleBar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="HdyHeaderBar" id="header_bar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="title" translatable="yes">Edit Charecter Details Template</property>
<child>
<object class="GtkButton" id="back">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="margin-start">4</property>
<property name="margin-end">4</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">go-previous-symbolic</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="border-width">8</property>
<property name="orientation">vertical</property>
<property name="spacing">8</property>
<child>
<object class="GtkFrame">
<property name="height-request">200</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="label-xalign">0</property>
<property name="label-yalign">0</property>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkViewport">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkTreeView">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="model">details_store</property>
<property name="reorderable">True</property>
<property name="search-column">0</property>
<property name="enable-grid-lines">both</property>
<child internal-child="selection">
<object class="GtkTreeSelection" id="details_selection"/>
</child>
<child>
<object class="GtkTreeViewColumn">
<property name="title" translatable="yes">Name</property>
<child>
<object class="GtkCellRendererText" id="details_name">
<property name="editable">True</property>
</object>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn">
<property name="title" translatable="yes">Value</property>
<child>
<object class="GtkCellRendererText" id="details_value">
<property name="editable">True</property>
</object>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<child type="label_item">
<placeholder/>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">4</property>
<child>
<object class="GtkButton" id="add_details">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">list-add</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="remove_details">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">list-remove</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkListStore" id="details_store">
<columns>
<!-- column-name Name -->
<column type="gchararray"/>
<!-- column-name Value -->
<column type="gchararray"/>
</columns>
</object>
</interface>

View file

@ -85,6 +85,195 @@ along with Manuskript. If not, see <http://www.gnu.org/licenses/>.
</object>
<object class="GtkTextBuffer" id="motivation"/>
<object class="GtkEntryBuffer" id="name"/>
<object class="GtkEntryBuffer" id="new_template_entry_buffer"/>
<object class="GtkPopoverMenu" id="charecter_options_popover">
<property name="height-request">200</property>
<property name="can-focus">False</property>
<child>
<object class="GtkBox" id="append_template_box">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkModelButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="text" translatable="yes">Append Template</property>
<property name="menu-name">main</property>
<property name="inverted">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="vexpand">True</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkViewport">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkListBox" id="template_select_box">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="selection-mode">none</property>
<property name="activate-on-single-click">False</property>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="submenu">append_template</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox" id="edit_template_box">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkModelButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="text" translatable="yes">Set info to template</property>
<property name="menu-name">main</property>
<property name="inverted">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="vexpand">True</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkViewport">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkListBox" id="template_select_box2">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="selection-mode">none</property>
<property name="activate-on-single-click">False</property>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkEntry" id="new_template_entry">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="buffer">new_template_entry_buffer</property>
<property name="placeholder-text" translatable="yes">Enter a unique name</property>
<property name="input-hints">GTK_INPUT_HINT_NO_EMOJI | GTK_INPUT_HINT_NONE</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="new_template_button">
<property name="label" translatable="yes">New template</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="tooltip-text" translatable="yes">Adds a new template with the content of the current charecter's details.</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="submenu">edit_template</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkBox" id="main_menu_box">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkModelButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="text" translatable="yes">Append Template</property>
<property name="menu-name">append_template</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkModelButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="text" translatable="yes">Set info to template</property>
<property name="menu-name">edit_template</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="submenu">main</property>
<property name="position">3</property>
</packing>
</child>
</object>
<object class="GtkTextBuffer" id="notes"/>
<object class="GtkTextBuffer" id="one_paragraph_summary"/>
<object class="GtkTextBuffer" id="one_sentence_summary"/>
@ -934,12 +1123,20 @@ summary</property>
</packing>
</child>
<child>
<object class="GtkButton" id="appened_details_template">
<property name="label" translatable="yes">Append Detail Template</property>
<object class="GtkMenuButton" id="characters_details_menu_button">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="focus-on-click">False</property>
<property name="receives-default">True</property>
<signal name="clicked" handler="on_appened_details_template_clicked" swapped="no"/>
<property name="direction">up</property>
<property name="popover">charecter_options_popover</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">open-menu-symbolic</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>

View file

@ -619,14 +619,6 @@ along with Manuskript. If not, see <http://www.gnu.org/licenses/>.
<property name="use-underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="character_details_template_editor">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">_Edit Character Details Template</property>
<property name="use-underline">True</property>
</object>
</child>
</object>
</child>
</object>