Implemented template management in startup window

Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
This commit is contained in:
TheJackiMonster 2022-09-15 23:35:45 +02:00
parent e4334c90f3
commit 0d2066d207
No known key found for this signature in database
GPG key ID: D850A5F772E880F9
8 changed files with 301 additions and 15 deletions

View file

@ -22,7 +22,7 @@ class TemplateKind(Enum):
class TemplateLevel:
def __init__(self, size: int = 1, name: str = None):
def __init__(self, size: int = 10, name: str = None):
self.size = max(size, 1)
self.name = name
@ -47,6 +47,20 @@ class Template:
self.levelNames = levelNames
def addLevel(self):
index = min(len(self.levels), len(self.levelNames) - 1)
if index < 0:
return
self.levels.append(TemplateLevel(name=self.levelNames[index]))
def addGoal(self, value: int = 500):
if self.goal is not None:
return
self.goal = Goal(value)
@classmethod
def getDefaultTemplates(cls):
templates = list()

View file

@ -76,14 +76,21 @@ class MainWindow:
self.frequencyWindow = FrequencyWindow(self)
self.settingsWindow = SettingsWindow(self)
self.windows = [
self.startupWindow,
self.aboutDialog,
self.frequencyWindow,
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, "settings_menu_item", self.openSettings)
bindMenuItem(builder, "frequency_menu_item", self.openFrequency)
bindMenuItem(builder, "about_menu_item", self.openAbout)
bindMenuItem(builder, "settings_menu_item", self.settingsAction)
bindMenuItem(builder, "frequency_menu_item", self.frequencyAction)
bindMenuItem(builder, "about_menu_item", self.aboutAction)
def getProject(self):
return self.project
@ -99,18 +106,21 @@ class MainWindow:
self.startupWindow.show()
def quitAction(self, menuItem: Gtk.MenuItem):
for window in self.windows:
window.hide()
self.exit()
def getSettings(self):
return self.getProject().settings
def openSettings(self, menuItem: Gtk.MenuItem):
def settingsAction(self, menuItem: Gtk.MenuItem):
self.settingsWindow.show()
def openFrequency(self, menuItem: Gtk.MenuItem):
def frequencyAction(self, menuItem: Gtk.MenuItem):
self.frequencyWindow.show()
def openAbout(self, menuItem: Gtk.MenuItem):
def aboutAction(self, menuItem: Gtk.MenuItem):
self.aboutDialog.show()
def show(self):
@ -127,6 +137,11 @@ class MainWindow:
Gtk.main()
def exit(self):
for window in self.windows:
if window.isVisible():
self.hide()
return
self.window.destroy()
def _notifyProperty(self, window, property):

View file

@ -0,0 +1,4 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from manuskript.ui.startup.templateEntry import TemplateEntry

View file

@ -0,0 +1,69 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
from manuskript.data import Template, TemplateLevel
from manuskript.util import validInt, validString
class TemplateEntry:
def __init__(self, window):
self.template = None
self.level = None
builder = Gtk.Builder()
builder.add_from_file("ui/startup/template-entry.glade")
self.window = window
self.widget = builder.get_object("template_entry")
self.valueAdjustment = builder.get_object("value_adjustment")
self.nameBuffer = builder.get_object("name_buffer")
self.entryStack = builder.get_object("entry_stack")
self.deleteButton = builder.get_object("delete_button")
self.deleteButton.connect("clicked", self.deleteClicked)
def bindTemplate(self, template: Template, level: TemplateLevel = None):
self.template = template
if self.template is None:
self.level = None
return
self.level = level if level in self.template.levels else None
if self.level is None:
self.valueAdjustment.set_value(0 if self.template.goal is None else validInt(self.template.goal.value))
self.entryStack.set_visible_child_name("page_label")
else:
self.valueAdjustment.set_value(validInt(self.level.size))
self.nameBuffer.set_text(validString(self.level.name), -1)
self.entryStack.set_visible_child_name("page_entry")
def deleteClicked(self, button: Gtk.Button):
if self.template is None:
return
if self.level is None:
self.template.goal = None
else:
self.template.levels.remove(self.level)
self.window.loadTemplate(self.template)
self.window = None
self.template = None
self.level = None
def show(self):
self.widget.show_all()

View file

@ -10,6 +10,7 @@ from manuskript.data import Template, TemplateLevel, TemplateKind
from manuskript.util import validInt, validString
from manuskript.ui.abstractDialog import AbstractDialog
from manuskript.ui.startup import TemplateEntry
from manuskript.ui.util import bindMenuItem
@ -19,6 +20,7 @@ class StartupWindow(AbstractDialog):
AbstractDialog.__init__(self, mainWindow, "ui/startup.glade", "startup_window")
self.templates = Template.getDefaultTemplates()
self.template = None
self.headerBar = None
self.templatesLeaflet = None
@ -29,6 +31,10 @@ class StartupWindow(AbstractDialog):
self.demoTemplatesStore = None
self.templateSelections = list()
self.templateLevelsListbox = None
self.addLevelButton = None
self.addGoalButton = None
def initWindow(self, builder, window):
self.headerBar = builder.get_object("header_bar")
@ -41,6 +47,8 @@ class StartupWindow(AbstractDialog):
bindMenuItem(builder, "open_menu_item", self.mainWindow.openAction)
bindMenuItem(builder, "quit_menu_item", self.mainWindow.quitAction)
bindMenuItem(builder, "about_menu_item", self.mainWindow.aboutAction)
self.templatesStore = builder.get_object("templates_store")
for index in range(len(self.templates)):
@ -79,6 +87,38 @@ class StartupWindow(AbstractDialog):
for selection in self.templateSelections:
selection.connect("changed", self.templateSelectionChanged)
self.templateLevelsListbox = builder.get_object("template_levels_listbox")
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)
def loadTemplate(self, template: Template):
self.template = template
self.templateLevelsListbox.foreach(lambda child: self.templateLevelsListbox.remove(child))
self.addLevelButton.set_sensitive(self.template is not None)
self.addGoalButton.set_sensitive((self.template is not None) and (self.template.goal is None))
if self.template is None:
return
for level in self.template.levels:
entry = TemplateEntry(self)
entry.bindTemplate(template, level)
self.templateLevelsListbox.add(entry.widget)
entry.show()
if template.goal is not None:
entry = TemplateEntry(self)
entry.bindTemplate(template)
self.templateLevelsListbox.add(entry.widget)
entry.show()
def templateSelectionChanged(self, selection: Gtk.TreeSelection):
model, tree_iter = selection.get_selected()
@ -90,6 +130,19 @@ class StartupWindow(AbstractDialog):
other.unselect_all()
index = model[tree_iter][0]
template = self.templates[index]
print(template.name)
self.loadTemplate(self.templates[index] if (index >= 0) and (index < len(self.templates)) else None)
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):
if self.template is None:
return
self.template.addGoal()
self.loadTemplate(self.template)

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.
@ -360,9 +360,11 @@ along with Manuskript. If not, see <http://www.gnu.org/licenses/>.
<object class="GtkFlowBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="column-spacing">1</property>
<property name="column-spacing">4</property>
<property name="row-spacing">4</property>
<property name="max-children-per-line">4</property>
<property name="selection-mode">none</property>
<property name="activate-on-single-click">False</property>
<child>
<object class="GtkFlowBoxChild">
<property name="visible">True</property>

View file

@ -314,9 +314,11 @@
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkListBox">
<object class="GtkListBox" id="template_levels_listbox">
<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>
@ -348,7 +350,7 @@
</packing>
</child>
<child>
<object class="GtkButton">
<object class="GtkButton" id="add_level_button">
<property name="label" translatable="yes">Add level</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
@ -361,8 +363,8 @@
</packing>
</child>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">Add word count</property>
<object class="GtkButton" id="add_goal_button">
<property name="label" translatable="yes">Add goal</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>

View file

@ -0,0 +1,127 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 -->
<interface>
<requires lib="gtk+" version="3.24"/>
<object class="GtkEntryBuffer" id="name_buffer"/>
<object class="GtkAdjustment" id="value_adjustment">
<property name="upper">1000</property>
<property name="step-increment">1</property>
<property name="page-increment">10</property>
</object>
<object class="GtkBox" id="template_entry">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="border-width">4</property>
<property name="spacing">8</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">8</property>
<child>
<object class="GtkFlowBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="column-spacing">4</property>
<property name="row-spacing">4</property>
<property name="max-children-per-line">3</property>
<property name="selection-mode">none</property>
<property name="activate-on-single-click">False</property>
<child>
<object class="GtkFlowBoxChild">
<property name="visible">True</property>
<property name="can-focus">True</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">of</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkFlowBoxChild">
<property name="visible">True</property>
<property name="can-focus">True</property>
<child>
<object class="GtkSpinButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="adjustment">value_adjustment</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkFlowBoxChild">
<property name="visible">True</property>
<property name="can-focus">True</property>
<child>
<object class="GtkStack" id="entry_stack">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkEntry">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="buffer">name_buffer</property>
</object>
<packing>
<property name="name">page_entry</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">words each.</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="name">page_label</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="delete_button">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="halign">center</property>
<property name="valign">center</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">edit-delete-symbolic</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</interface>