manuskript/manuskript/ui/startupWindow.py
TheJackiMonster 7d01b7a403
Fix issue with saving outline item
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
2023-03-21 22:40:01 +01:00

215 lines
7.4 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import GObject, Gtk, Handy
from manuskript.data import Project, Template, TemplateKind
from manuskript.util import validInt, validString, parseFilenameFromURL
from manuskript.ui.abstractDialog import AbstractDialog
from manuskript.ui.chooser import openFileDialog, saveFileDialog, FileFilter
from manuskript.ui.startup import TemplateEntry
from manuskript.ui.util import bindMenuItem
class StartupWindow(AbstractDialog):
def __init__(self, mainWindow):
AbstractDialog.__init__(self, mainWindow, "ui/startup.glade", "startup_window")
self.templates = Template.getDefaultTemplates()
self.template = None
self.headerBar = None
self.templatesLeaflet = None
self.recentChooserMenu = None
self.recentChooserMenuBtn = None
self.templatesStore = None
self.fictionTemplatesStore = None
self.nonfictionTemplatesStore = None
self.demoTemplatesStore = None
self.templateSelections = list()
self.templateLevelsListbox = None
self.goalLabel = None
self.addLevelButton = None
self.addGoalButton = None
self.openButton = None
self.recentButton = None
self.createButton = None
def initWindow(self, builder, window):
self.headerBar = builder.get_object("header_bar")
self.templatesLeaflet = builder.get_object("templates_leaflet")
self.templatesLeaflet.bind_property("folded", self.headerBar, "show-close-button",
GObject.BindingFlags.SYNC_CREATE |
GObject.BindingFlags.INVERT_BOOLEAN)
self.recentChooserMenu = builder.get_object("recent_chooser_menu")
self.recentChooserMenuBtn = builder.get_object("recent_chooser_menu_btn")
self.recentChooserMenu.connect("item-activated", self._recentAction)
self.recentChooserMenuBtn.connect("item-activated", self._recentAction)
bindMenuItem(builder, "open_menu_item", self._openAction)
bindMenuItem(builder, "quit_menu_item", self._quitAction)
bindMenuItem(builder, "about_menu_item", self._aboutAction)
self.templatesStore = builder.get_object("templates_store")
for index in range(len(self.templates)):
tree_iter = self.templatesStore.append()
if tree_iter is None:
continue
template = self.templates[index]
self.templatesStore.set_value(tree_iter, 0, validInt(index))
self.templatesStore.set_value(tree_iter, 1, validString(template.name))
self.templatesStore.set_value(tree_iter, 2, TemplateKind.asValue(template.kind))
self.fictionTemplatesStore = builder.get_object("fiction_templates_store")
self.nonfictionTemplatesStore = builder.get_object("nonfiction_templates_store")
self.demoTemplatesStore = builder.get_object("demo_templates_store")
self.fictionTemplatesStore.set_visible_func(
lambda model, iterator, userdata: model[iterator][2] == TemplateKind.FICTION.value)
self.nonfictionTemplatesStore.set_visible_func(
lambda model, iterator, userdata: model[iterator][2] == TemplateKind.NONFICTION.value)
self.demoTemplatesStore.set_visible_func(
lambda model, iterator, userdata: model[iterator][2] == TemplateKind.DEMO.value)
self.fictionTemplatesStore.refilter()
self.nonfictionTemplatesStore.refilter()
self.demoTemplatesStore.refilter()
self.templateSelections = [
builder.get_object("fiction_template_selection"),
builder.get_object("nonfiction_template_selection"),
builder.get_object("demo_template_selection")
]
for selection in self.templateSelections:
selection.connect("changed", self._templateSelectionChanged)
self.templateLevelsListbox = builder.get_object("template_levels_listbox")
self.goalLabel = builder.get_object("goal_label")
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)
self.openButton = builder.get_object("open_button")
self.recentButton = builder.get_object("recent_button")
self.createButton = builder.get_object("create_button")
self.openButton.connect("clicked", self._openClicked)
self.createButton.connect("clicked", self._createClicked)
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(self.template, level)
self.templateLevelsListbox.add(entry.widget)
entry.show()
if self.template.goal is not None:
entry = TemplateEntry(self)
entry.bindTemplate(self.template)
self.templateLevelsListbox.add(entry.widget)
entry.show()
self.goalLabel.set_text(self.template.getGoalString())
def _templateSelectionChanged(self, selection: Gtk.TreeSelection):
model, tree_iter = selection.get_selected()
if tree_iter is None:
return
for other in self.templateSelections:
if other != selection:
other.unselect_all()
index = model[tree_iter][0]
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)
def openProject(self):
path = openFileDialog(self.window, FileFilter("Manuskript project", "msk"))
if path is None:
return
self.mainWindow.openProject(path)
def _openClicked(self, button: Gtk.Button):
self.openProject()
def _createClicked(self, button: Gtk.Button):
path = saveFileDialog(self.window, FileFilter("Manuskript project", "msk"), appendAllFilter=False)
if path is None:
return
project = Project(path)
# TODO: apply project template!
project.save()
self.mainWindow.openProject(path)
def _openAction(self, menuItem: Gtk.MenuItem):
self.openProject()
def _recentAction(self, recentChooser: Gtk.RecentChooser):
uri = recentChooser.get_current_uri()
if uri is None:
return
path = parseFilenameFromURL(uri)
if path is None:
return
self.mainWindow.openProject(path)
def _quitAction(self, menuItem: Gtk.MenuItem):
self.mainWindow.exit(True)
def _aboutAction(self, menuItem: Gtk.MenuItem):
self.mainWindow.aboutDialog.show()