Merge pull request #1181 from TheShadowOfHassen/test

Pull request with too many things (again, again)
This commit is contained in:
Tobias Frisch 2023-08-03 23:44:29 +02:00 committed by GitHub
commit 2ffa70b5dd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 398 additions and 25 deletions

1
.gitignore vendored
View file

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

View file

@ -0,0 +1,31 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
import os
#from io.jsonFile import* # I need to figure out how to import this. io is also a package in python
from collections import OrderedDict
# 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 CharacterDetailTemplates:
# Basic Template
templates = {'Basic Human':
{'Age':'','Birthdate':'',
'Eye Color':'','Hair Color':'',
'Handed':''},
}
# TODO: saving
def save(self):
pass
def load(self):
pass

View file

@ -1,10 +1,14 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
# Imports
# Python bundled modules
import os
from zipfile import BadZipFile
# Manuskript modules
from manuskript.data.abstractData import AbstractData
from manuskript.data.version import Version, CURRENT_MSK_VERSION
from manuskript.data.info import Info
@ -17,6 +21,9 @@ from manuskript.data.plots import Plots
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_templates import CharacterDetailTemplates
from manuskript.io.mskFile import MskFile
from manuskript.util import profileTime
@ -38,6 +45,8 @@ class Project(AbstractData):
self.world = World(self.file.directoryPath)
self.outline = Outline(self.file.directoryPath, self.plots, self.labels, self.statuses)
self.revisions = Revisions(self.file.directoryPath)
self.character_templates = CharacterDetailTemplates() # TODO: RENAME PROPERALLY
def __del__(self):
del self.file

View file

@ -86,6 +86,7 @@ class MainWindow:
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)
self.hide()
@ -107,7 +108,7 @@ class MainWindow:
self.generalView = packViewIntoSlot(self.generalSlot, GeneralView, self.project.info)
self.summaryView = packViewIntoSlot(self.summarySlot, SummaryView, self.project.summary)
self.charactersView = packViewIntoSlot(self.charactersSlot, CharactersView, self.project.characters)
self.charactersView = packViewIntoSlot(self.charactersSlot, CharactersView, self.project)
self.plotView = packViewIntoSlot(self.plotSlot, PlotView, self.project.plots)
self.worldView = packViewIntoSlot(self.worldSlot, WorldView, self.project.world)
self.outlineView = packViewIntoSlot(self.outlineSlot, OutlineView, self.project.outline)
@ -181,6 +182,9 @@ class MainWindow:
def _frequencyAction(self, menuItem: Gtk.MenuItem):
self.frequencyWindow.show()
def _characterDetailsTemplateEditorAction(self, menuItem: Gtk.MenuItem):
self.characterTemplateWindow.show()
def _aboutAction(self, menuItem: Gtk.MenuItem):
self.aboutDialog.show()

View file

@ -1,4 +1,4 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from manuskript.ui.tools.frequencyWindow import FrequencyWindow
from manuskript.ui.tools.frequencyWindow import FrequencyWindow

View file

@ -8,13 +8,14 @@ from gi.repository import Gtk
from manuskript.data import Characters, Character, Importance, Color
from manuskript.ui.util import rgbaFromColor, pixbufFromColor
from manuskript.util import validString, invalidString, validInt, invalidInt
from manuskript.util import validString, invalidString, validInt, invalidInt, unique_name_checker
class CharactersView:
def __init__(self, characters: Characters):
self.characters = characters
def __init__(self, project):
self.characterTemplates = project.character_templates # The template for detailed info
self.characters = project.characters
self.character = None
builder = Gtk.Builder()
@ -77,11 +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.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.charecterDetailsMenuButton.connect("clicked", self._onCharecterDetailsMenuClicked)
self.newTemplateButton.connect("clicked", self._onNewTemplateButtonClicked)
self.detailsNameRenderer.connect("edited", self._detailsNameEdited)
self.detailsValueRenderer.connect("edited", self._detailsValueEdited)
@ -108,6 +117,7 @@ class CharactersView:
self.notesBuffer.connect("changed", self._notesChanged)
self.unloadCharacterData()
def refreshCharacterStore(self):
self.charactersStore.clear()
@ -300,7 +310,7 @@ class CharactersView:
if tree_iter is None:
return
name = "Description"
name = unique_name_checker.get_unique_name_for_dictionary(self.character.details, "Description")
value = "Value"
self.detailsStore.set_value(tree_iter, 0, name)
@ -321,6 +331,68 @@ 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
box = Gtk.Box()
label = Gtk.Label(label=x)
overwrite_button = Gtk.Button()
overwrite_button.add(Gtk.Image(icon_name='system-restart-symbolic'))
overwrite_button.connect("clicked", self._updateTemplateClicked, x)
overwrite_button.set_tooltip_markup ('Overwrite template with text of current file') # TODO: This might be an issue when it comes to translating
delete_button = Gtk.Button()
delete_button.add(Gtk.Image(icon_name='app-remove-symbolic'))
delete_button.set_tooltip_markup ('Delete') # TODO: This might be an issue when it comes to translating
delete_button.connect("clicked", self._deleteTemplateClicked, x)
box.pack_start(overwrite_button, False, False, 0)
box.pack_start(delete_button, False, False, 0)
box.pack_start(label, False, False, 0)
self.charecterDetailsMenuTemplateBox.add(box)
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 _deleteTemplateClicked(self, button: Gtk.ModelButton, template):
del self.characterTemplates.templates[template]
self._updateCharecterDetailsMenu()
def _appendTemplateClicked(self, button: Gtk.ModelButton, template):
if self.character is None:
return
self.character.details.update(self.characterTemplates.templates[template])
# 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:
@ -330,11 +402,12 @@ class CharactersView:
if (model is None) or (tree_iter is None):
return
text_to_set = unique_name_checker.get_unique_name_for_dictionary(self.character.details, text)
name = model.get_value(tree_iter, 0)
model.set_value(tree_iter, 0, text)
model.set_value(tree_iter, 0, text_to_set)
self.character.details[text] = self.character.details.pop(name)
self.character.details[text_to_set] = self.character.details.pop(name)
def _detailsValueEdited(self, renderer: Gtk.CellRendererText, path: str, text: str):
if self.character is None:
@ -462,3 +535,4 @@ class CharactersView:
def show(self):
self.widget.show_all()

View file

@ -0,0 +1,16 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# So this thing changes a name until it works with a dictionary
# Ie. if you have a dictioary {'Item':1,'Item2':1,'Item3':1} and if you add an item it'll be Item4
# It works only on strings
def get_unique_name_for_dictionary(dictionary, name):
count = 1
test_name = name
while test_name in dictionary:
count += 1
test_name = str(name) +(str(count))
return test_name

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2
<!-- Generated with glade 3.40.0
Copyright (C) 2015-2021 Olivier Keshavjee et al.
@ -31,9 +31,11 @@ along with Manuskript. If not, see <http://www.gnu.org/licenses/>.
<property name="window-position">center-on-parent</property>
<property name="type-hint">dialog</property>
<property name="program-name">Manuskript</property>
<property name="version">0.12.0</property>
<property name="version">Gtk Working Version (Last Version 0.15.0)</property>
<property name="copyright" translatable="yes">Copyright © 2015-2021 Olivier Keshavjee et al.</property>
<property name="comments" translatable="yes">This is a Gtk Version Still In Development</property>
<property name="website">https://www.theologeek.ch/manuskript/</property>
<property name="website-label" translatable="yes">https://www.theologeek.ch/manuskript/</property>
<property name="authors">Olivier Keshavjee
Curtis Gedak
Youness Alaoui
@ -118,7 +120,7 @@ nicxxx
obw
peter88213
ssantos </property>
<property name="logo">../icons/Manuskript/logo-400x104.png</property>
<property name="logo">../icons/Manuskript/logo-400x104.png</property>
<property name="license-type">gpl-3-0</property>
<child internal-child="vbox">
<object class="GtkBox">

View file

@ -85,6 +85,201 @@ 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="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">1</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">Mange Templates</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>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="submenu">main</property>
<property name="position">2</property>
</packing>
</child>
<child>
<placeholder/>
</child>
<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">4</property>
</packing>
</child>
</object>
<object class="GtkTextBuffer" id="notes"/>
<object class="GtkTextBuffer" id="one_paragraph_summary"/>
<object class="GtkTextBuffer" id="one_sentence_summary"/>
@ -795,10 +990,7 @@ summary</property>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-start">8</property>
<property name="margin-end">8</property>
<property name="margin-top">8</property>
<property name="margin-bottom">8</property>
<property name="border-width">8</property>
<property name="orientation">vertical</property>
<property name="spacing">8</property>
<child>
@ -923,6 +1115,41 @@ summary</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">Next</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<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>
<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>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>

View file

@ -127,10 +127,7 @@ along with Manuskript. If not, see <http://www.gnu.org/licenses/>.
<property name="width-request">300</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-start">8</property>
<property name="margin-end">8</property>
<property name="margin-top">8</property>
<property name="margin-bottom">8</property>
<property name="border-width">8</property>
<property name="orientation">vertical</property>
<property name="spacing">8</property>
<child>
@ -353,11 +350,8 @@ along with Manuskript. If not, see <http://www.gnu.org/licenses/>.
<property name="width-request">250</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="margin-start">8</property>
<property name="margin-end">8</property>
<property name="margin-top">8</property>
<property name="margin-bottom">8</property>
<property name="hexpand">True</property>
<property name="border-width">8</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkViewport">

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2
<!-- Generated with glade 3.40.0
Copyright (C) 2015-2021 Olivier Keshavjee et al.
@ -429,6 +429,21 @@ along with Manuskript. If not, see <http://www.gnu.org/licenses/>.
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox" id="tip_of_the_day_grid">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>