diff --git a/manuskript/ui/__init__.py b/manuskript/ui/__init__.py
index 0e8dd25e..5e63f4e5 100644
--- a/manuskript/ui/__init__.py
+++ b/manuskript/ui/__init__.py
@@ -3,4 +3,6 @@
from manuskript.ui.util import pixbufFromColor
+from manuskript.ui.aboutDialog import AboutDialog
from manuskript.ui.mainWindow import MainWindow
+from manuskript.ui.settingsWindow import SettingsWindow
diff --git a/manuskript/ui/aboutDialog.py b/manuskript/ui/aboutDialog.py
new file mode 100644
index 00000000..0cc789bd
--- /dev/null
+++ b/manuskript/ui/aboutDialog.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from manuskript.ui.abstractDialog import AbstractDialog
+
+
+class AboutDialog(AbstractDialog):
+
+ def __init__(self, mainWindow):
+ AbstractDialog.__init__(self, mainWindow, "ui/about.glade", "about_dialog")
diff --git a/manuskript/ui/abstractDialog.py b/manuskript/ui/abstractDialog.py
new file mode 100644
index 00000000..56b05921
--- /dev/null
+++ b/manuskript/ui/abstractDialog.py
@@ -0,0 +1,50 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+import gi
+
+gi.require_version("Gtk", "3.0")
+gi.require_version("Handy", "1")
+
+from gi.repository import Gtk, Handy
+
+Handy.init()
+
+
+class AbstractDialog:
+
+ def __init__(self, mainWindow, uiTemplatePath, uiDialogId):
+ self.mainWindow = mainWindow
+ self.window = None
+
+ self.builderTemplatePath = uiTemplatePath
+ self.builderObjectId = uiDialogId
+
+ def initWindow(self, builder, window):
+ pass
+
+ def __initWindow(self):
+ builder = Gtk.Builder()
+ builder.add_from_file(self.builderTemplatePath)
+
+ self.window = builder.get_object(self.builderObjectId)
+ self.window.connect("destroy", self.__destroyWindow)
+ self.window.set_transient_for(self.mainWindow.window)
+ self.window.set_modal(True)
+
+ self.initWindow(builder, self.window)
+
+ def __destroyWindow(self, window: Gtk.Widget):
+ self.window = None
+
+ def show(self):
+ if self.window is None:
+ self.__initWindow()
+
+ self.window.show_all()
+
+ def hide(self):
+ if self.window is None:
+ return
+
+ self.window.hide()
diff --git a/manuskript/ui/mainWindow.py b/manuskript/ui/mainWindow.py
index 0eba05ca..c82c9dc3 100644
--- a/manuskript/ui/mainWindow.py
+++ b/manuskript/ui/mainWindow.py
@@ -13,6 +13,9 @@ Handy.init()
from manuskript.data import Project
from manuskript.ui.views import *
+from manuskript.ui.aboutDialog import AboutDialog
+from manuskript.ui.settingsWindow import SettingsWindow
+
class MainWindow:
@@ -37,6 +40,15 @@ class MainWindow:
slot.pack_start(view.widget, True, True, 0)
return view
+ @classmethod
+ def bindMenuItem(cls, builder, id, action):
+ menuItem = builder.get_object(id)
+
+ if menuItem is None:
+ return
+
+ menuItem.connect("activate", action)
+
def __init__(self, path):
self.project = Project(path)
self.project.load()
@@ -55,9 +67,24 @@ class MainWindow:
self.outlineView = MainWindow.packViewIntoSlot(builder, "outline_slot", OutlineView)
self.editorView = MainWindow.packViewIntoSlot(builder, "editor_slot", EditorView)
+ self.aboutDialog = AboutDialog(self)
+ self.settingsWindow = SettingsWindow(self)
+
+ MainWindow.bindMenuItem(builder, "settings_menu_item", self.openSettings)
+ MainWindow.bindMenuItem(builder, "about_menu_item", self.openAbout)
+
+ def openSettings(self, menuItem: Gtk.MenuItem):
+ self.settingsWindow.show()
+
+ def openAbout(self, menuItem: Gtk.MenuItem):
+ self.aboutDialog.show()
+
def show(self):
self.window.show_all()
+ def hide(self):
+ self.window.hide()
+
def run(self):
self.show()
Gtk.main()
diff --git a/manuskript/ui/settingsWindow.py b/manuskript/ui/settingsWindow.py
new file mode 100644
index 00000000..6ef93052
--- /dev/null
+++ b/manuskript/ui/settingsWindow.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from manuskript.ui.abstractDialog import AbstractDialog
+
+
+class SettingsWindow(AbstractDialog):
+
+ def __init__(self, mainWindow):
+ AbstractDialog.__init__(self, mainWindow, "ui/settings.glade", "settings_window")
diff --git a/ui/about.glade b/ui/about.glade
index 086216c8..ec36e328 100644
--- a/ui/about.glade
+++ b/ui/about.glade
@@ -26,8 +26,9 @@ along with Manuskript. If not, see .
-