mirror of
https://github.com/olivierkes/manuskript.git
synced 2024-05-16 10:52:29 +12:00
Implemented template management in startup window
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
This commit is contained in:
parent
e4334c90f3
commit
0d2066d207
|
@ -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()
|
||||
|
|
|
@ -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):
|
||||
|
|
4
manuskript/ui/startup/__init__.py
Normal file
4
manuskript/ui/startup/__init__.py
Normal file
|
@ -0,0 +1,4 @@
|
|||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from manuskript.ui.startup.templateEntry import TemplateEntry
|
69
manuskript/ui/startup/templateEntry.py
Normal file
69
manuskript/ui/startup/templateEntry.py
Normal 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()
|
||||
|
|
@ -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)
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
127
ui/startup/template-entry.glade
Normal file
127
ui/startup/template-entry.glade
Normal 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>
|
Loading…
Reference in a new issue