commit 1a67eb53a015f59e1d5af04c31af5a44ce39871a
parent 01ad95be9b5fbc4223effa06b85fd176bb71eb24
Author: lash <dev@holbrook.no>
Date: Sun, 31 Aug 2025 06:51:38 +0100
Demo file picker and image display
Diffstat:
2 files changed, 76 insertions(+), 3 deletions(-)
diff --git a/gui/base.py b/gui/base.py
@@ -1,11 +1,12 @@
import sys
import logging
import gettext
+import markdown
import gi
gi.require_version('Gtk', '4.0')
gi.require_version('Adw', '1')
-from gi.repository import Gtk, Adw
+from gi.repository import Gtk, Adw, Gio
from ungana.ical import ICalManager
@@ -14,10 +15,29 @@ logg = logging.getLogger()
_ = gettext.gettext
+menu_src = """
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+<menu id="menubar">
+ <submenu>
+ <attribute name="label" translatable="yes">Edit</attribute>
+ <section>
+ <item>
+ <attribute name="action">win.settings</attribute>
+ <attribute name="target">Settings</attribute>
+ <attribute name="label" translatable="yes">Settings</attribute>
+ </item>
+ </section>
+ </submenu>
+</menu>
+</interface>
+"""
+
class MainWindow(Gtk.ApplicationWindow):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
+ self.props.show_menubar = True
self.cal = None
self.box_main = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self.set_child(self.box_main)
@@ -57,10 +77,44 @@ class MainWindow(Gtk.ApplicationWindow):
entry = Gtk.Entry(placeholder_text="")
self.box_main.append(entry)
+ title = Gtk.Label(label="Banner")
+ self.box_main.append(title)
+
+
+ fltr = Gtk.FileFilter()
+ fltr.set_name("Images")
+ fltr.add_mime_type("image/*")
+ fltrs = Gio.ListStore.new(Gtk.FileFilter)
+ fltrs.append(fltr)
+ self.filedialog = Gtk.FileDialog.new()
+ self.filedialog.set_filters(fltrs)
+ self.filedialog.set_default_filter(fltr)
+
+ img = Gtk.Image()
+ self.img = img
+ self.box_main.append(img)
+ self.img.set_size_request(0, 200)
+
+ entry = Gtk.Button(label="Open")
+ entry.connect('clicked', self.show_open_dialog)
+ self.box_main.append(entry)
+
self.status = Gtk.Statusbar()
self.box_main.append(self.status)
+ def show_open_dialog(self, button):
+ self.filedialog.open(self, None, self.open_dialog_callback)
+
+
+ def open_dialog_callback(self, dialog, result):
+ try:
+ f = dialog.open_finish(result)
+ if f is not None:
+ self.img.set_from_file(f.get_path())
+ except GLib.Error as e:
+ logg.error("error open: {}".format(e))
+
def load(self, fp):
self.cal = ICalManager()
self.cal.load_ical_file(fp)
@@ -80,11 +134,17 @@ class MainWindow(Gtk.ApplicationWindow):
class Ungana(Adw.Application):
def __init__(self, initial_calendar=None, *args, **kwargs):
- super().__init__(**kwargs)
+ super().__init__(flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE, **kwargs)
self.file = initial_calendar
self.win = None
self.connect('activate', self.on_activate)
+ def do_startup(self):
+ Adw.Application.do_startup(self)
+ builder = Gtk.Builder.new_from_string(menu_src, -1)
+ self.set_menubar(builder.get_object("menubar"))
+
+
def on_activate(self, app):
logg.debug("activate")
self.win = MainWindow(application=app)
@@ -92,8 +152,15 @@ class Ungana(Adw.Application):
self.win.present()
+ def do_command_line(self, cli):
+ o = cli.get_options_dict()
+ logg.debug(o)
+ self.activate()
+ return 0
+
+
#gettext.install(gettext.translation("ungana", localedir="locale", languages=['es']))
gettext.bindtextdomain("messages", "locales")
gettext.textdomain("messages")
app = Ungana(application_id="org.defalsify.ungana", initial_calendar=sys.argv[1])
-app.run(None)
+app.run(sys.argv)
diff --git a/pyproject.toml b/pyproject.toml
@@ -11,6 +11,12 @@ dependencies = [
"icalendar>=5.0.0",
]
+[project.optional-dependencies]
+gui = [
+"PyGObject~=3.52.3",
+"markdown~=3.8.2",
+]
+
[project.scripts]
ungana = "ungana.runnable.ungana_cal_cli:main"