From 3af59e2c1d3ac26ced1e3aee240a9622aa64ed59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Genov=C3=A9s?= Date: Mon, 4 Nov 2019 23:05:03 +0100 Subject: [PATCH] initial port to gresources --- data/meson.build | 28 ++++++++++++++++++++++++++++ data/uberwriter.gresource.xml | 14 ++++++++++++++ data/ui/{About.ui => About.ui.in} | 6 +++--- scripts/data_generator.sh | 28 ++++++++++++++++++++++++++++ uberwriter.in | 28 ++++++++++++++++------------ uberwriter/application.py | 13 ++++++------- uberwriter/export_dialog.py | 5 +++-- uberwriter/headerbars.py | 9 ++++++--- uberwriter/helpers.py | 16 ---------------- uberwriter/main_window.py | 5 +++-- uberwriter/preferences_dialog.py | 5 +++-- uberwriter/preview_converter.py | 1 + uberwriter/preview_handler.py | 7 ++++--- uberwriter/styled_window.py | 6 ++++-- 14 files changed, 119 insertions(+), 52 deletions(-) create mode 100644 data/uberwriter.gresource.xml rename data/ui/{About.ui => About.ui.in} (97%) create mode 100755 scripts/data_generator.sh diff --git a/data/meson.build b/data/meson.build index d414111..956c85e 100644 --- a/data/meson.build +++ b/data/meson.build @@ -14,6 +14,7 @@ desktop_file = i18n.merge_file( install: true, install_dir: get_option('datadir') / 'applications' ) + # Validate Desktop File desktop_file_validate = find_program('desktop-file-validate', required: false) if desktop_file_validate.found() @@ -57,6 +58,33 @@ install_data( rename: '@0@.gschema.xml'.format(application_id) ) +# Resources +ui_config = configuration_data() +ui_config.set('app-id', application_id) +ui_config.set('version', meson.project_version() + version_suffix) +ui_config.set('package_url', 'http://uberwriter.github.io/uberwriter/') +ui_preconfigured_files = files( + 'ui/About.ui.in' +) +ui_dependencies = [] +foreach ui_file: ui_preconfigured_files + ui_dependencies += configure_file( + input: ui_file, + output: '@BASENAME@', + configuration: ui_config + ) +endforeach + +resources = gnome.compile_resources( + meson.project_name(), + meson.project_name() + '.gresource.xml', + gresource_bundle: true, + install:true, + install_dir: join_paths(datadir, meson.project_name()), + dependencies: ui_dependencies +) +message('datadir') +message(datadir) subdir('icons') install_subdir( diff --git a/data/uberwriter.gresource.xml b/data/uberwriter.gresource.xml new file mode 100644 index 0000000..ea9446b --- /dev/null +++ b/data/uberwriter.gresource.xml @@ -0,0 +1,14 @@ + + + + media/css/gtk/base.css + ui/Export.ui + ui/Menu.ui + ui/Preferences.ui + ui/Preview.ui + ui/Recents.ui + ui/Shortcuts.ui + ui/Window.ui + About.ui + + diff --git a/data/ui/About.ui b/data/ui/About.ui.in similarity index 97% rename from data/ui/About.ui rename to data/ui/About.ui.in index c5b788c..ec23e6c 100644 --- a/data/ui/About.ui +++ b/data/ui/About.ui.in @@ -8,9 +8,9 @@ center dialog Uberwriter - 2.1.5 + @version@ Copyright (C) 2018, Wolf Vollprecht - http://uberwriter.github.io/uberwriter + @package_url@ Uberwriter website Wolf Vollprecht <w.vollprecht@gmail.com> Manuel Genovés <manuel.genoves@gmail.com> @@ -25,7 +25,7 @@ naxuroqa (German) Wolf Manuel (Spanish, Catalan) Tobias Bernard <hi@tobiasbernard.com> - image-missing + @app-id@ gpl-3-0 diff --git a/scripts/data_generator.sh b/scripts/data_generator.sh new file mode 100755 index 0000000..b9b8e05 --- /dev/null +++ b/scripts/data_generator.sh @@ -0,0 +1,28 @@ + #!/bin/bash + + # freely based on https://gitlab.gnome.org/World/lollypop/blob/master/generate_data.sh + +function generate_resource() +{ + # TODO: package css styles too + echo '' + echo '' + echo ' ' + for file in ../data/media/css/gtk/*.css + do + echo -n ' ' + echo -n ${file#*/*/} + echo '' + done + for file in ../data/ui/*.ui About.ui + do + echo -n ' ' + echo -n ${file#*/*/} + echo '' + done + echo ' ' + echo '' +} + +generate_resource > ../data/uberwriter.gresource.xml + diff --git a/uberwriter.in b/uberwriter.in index e9880af..b5431a7 100755 --- a/uberwriter.in +++ b/uberwriter.in @@ -25,35 +25,39 @@ import pkg_resources import gettext import locale +from gi.repository import Gio + # Add project root directory (enable symlink and trunk execution) PROJECT_ROOT_DIRECTORY = os.path.abspath( os.path.dirname(os.path.dirname(os.path.realpath(sys.argv[0])))) # Set the path if needed. This allows uberwriter to run without installing it :) python_path = [] -if os.path.abspath(__file__).startswith('/opt'): - gettext.bindtextdomain('uberwriter', '/opt/extras.ubuntu.com/uberwriter/share/locale') - syspath = sys.path[:] # copy to avoid infinite loop in pending objects - for path in syspath: - opt_path = path.replace('/usr', '/opt/extras.ubuntu.com/uberwriter') - python_path.insert(0, opt_path) - sys.path.insert(0, opt_path) - os.putenv("XDG_DATA_DIRS", "%s:%s" % ("/opt/extras.ubuntu.com/uberwriter/share/", os.getenv("XDG_DATA_DIRS", "/usr/local/share/:/usr/share/"))) + if (os.path.exists(os.path.join(PROJECT_ROOT_DIRECTORY, 'uberwriter')) and PROJECT_ROOT_DIRECTORY not in sys.path): python_path.insert(0, PROJECT_ROOT_DIRECTORY) sys.path.insert(0, PROJECT_ROOT_DIRECTORY) if python_path: os.putenv('PYTHONPATH', "%s:%s" % (os.getenv('PYTHONPATH', ''), ':'.join(python_path))) # for subprocesses - + import uberwriter -locale_dir = os.path.abspath(os.path.join(os.path.dirname(uberwriter.__file__),'../po/')) + +localedir = '@LOCALE_DIR@' +pkgdatadir = '@DATA_DIR@' + + +#locale_dir = os.path.abspath(os.path.join(os.path.dirname(uberwriter.__file__),'../po/')) # L10n locale.textdomain('uberwriter') -locale.bindtextdomain('uberwriter', locale_dir) +locale.bindtextdomain('uberwriter', localedir) gettext.textdomain('uberwriter') -gettext.bindtextdomain('uberwriter', locale_dir) +gettext.bindtextdomain('uberwriter', localedir) + +resource = Gio.resource_load(os.path.join(pkgdatadir, 'uberwriter/uberwriter.gresource')) +Gio.Resource._register(resource) + uberwriter.main() diff --git a/uberwriter/application.py b/uberwriter/application.py index c52c0cc..5fc8ebf 100644 --- a/uberwriter/application.py +++ b/uberwriter/application.py @@ -24,7 +24,7 @@ from uberwriter import main_window from uberwriter.settings import Settings from uberwriter.helpers import set_up_logging from uberwriter.preferences_dialog import PreferencesDialog -from uberwriter.helpers import get_builder, get_media_path +from uberwriter.helpers import get_media_path class Application(Gtk.Application): @@ -247,7 +247,9 @@ class Application(Gtk.Application): PreferencesDialog(self.settings).show(self.window) def on_shortcuts(self, _action, _param): - builder = get_builder('Shortcuts') + builder = Gtk.Builder() + builder.add_from_resource( + "/de/wolfvollprecht/UberWriter/ui/Shortcuts.ui") builder.get_object("shortcuts").set_transient_for(self.window) builder.get_object("shortcuts").show() @@ -255,14 +257,11 @@ class Application(Gtk.Application): self.window.open_uberwriter_markdown() def on_about(self, _action, _param): - builder = get_builder('About') + builder = Gtk.Builder() + builder.add_from_resource("/de/wolfvollprecht/UberWriter/About.ui") about_dialog = builder.get_object("AboutDialog") about_dialog.set_transient_for(self.window) - logo_file = get_media_path("de.wolfvollprecht.UberWriter.svg") - logo = GdkPixbuf.Pixbuf.new_from_file(logo_file) - - about_dialog.set_logo(logo) about_dialog.present() def on_quit(self, _action, _param): diff --git a/uberwriter/export_dialog.py b/uberwriter/export_dialog.py index 0f0effc..2c5b0c4 100644 --- a/uberwriter/export_dialog.py +++ b/uberwriter/export_dialog.py @@ -28,7 +28,6 @@ from gi.repository import Gtk from uberwriter import helpers from uberwriter.theme import Theme -from uberwriter.helpers import get_builder LOGGER = logging.getLogger('uberwriter') @@ -150,7 +149,9 @@ class Export: def __init__(self, filename): """Set up the about dialog""" - self.builder = get_builder('Export') + self.builder = Gtk.Builder() + self.builder.add_from_resource( + "/de/wolfvollprecht/UberWriter/ui/Export.ui") self.dialog = self.builder.get_object("Export") self.stack = self.builder.get_object("export_stack") self.stack_switcher = self.builder.get_object("format_switcher") diff --git a/uberwriter/headerbars.py b/uberwriter/headerbars.py index d0a788f..a70af47 100644 --- a/uberwriter/headerbars.py +++ b/uberwriter/headerbars.py @@ -23,7 +23,6 @@ import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk -from uberwriter.helpers import get_builder from uberwriter.helpers import get_descendant @@ -141,13 +140,17 @@ def main_buttons(app): Gtk.IconSize.BUTTON), Gtk.MenuButton().new()) - builder_window_menu = get_builder('Menu') + builder_window_menu = Gtk.Builder() + builder_window_menu.add_from_resource( + "/de/wolfvollprecht/UberWriter/ui/Menu.ui") model = builder_window_menu.get_object("Menu") open_button = Gtk.Button().new_with_label(_("Open")) open_button.set_action_name("app.open") - recents_builder = get_builder('Recents') + recents_builder = Gtk.Builder() + recents_builder.add_from_resource( + "/de/wolfvollprecht/UberWriter/ui/Recents.ui") recents = recents_builder.get_object("recent_md_popover") recents_treeview = get_descendant(recents, "recent_view", level=0) diff --git a/uberwriter/helpers.py b/uberwriter/helpers.py index 6700fbd..71df380 100644 --- a/uberwriter/helpers.py +++ b/uberwriter/helpers.py @@ -35,22 +35,6 @@ from uberwriter.config import get_data_file from uberwriter.builder import Builder -def get_builder(builder_file_name): - """Return a fully-instantiated Gtk.Builder instance from specified ui - file - - :param builder_file_name: The name of the builder file, without extension. - Assumed to be in the 'ui' directory under the data path. - """ - # Look for the ui file that describes the user interface. - ui_filename = get_data_file('ui', '%s.ui' % (builder_file_name,)) - if not os.path.exists(ui_filename): - ui_filename = None - - builder = Builder() - builder.set_translation_domain() - builder.add_from_file(ui_filename) - return builder @contextmanager diff --git a/uberwriter/main_window.py b/uberwriter/main_window.py index f3b8e52..47de14e 100644 --- a/uberwriter/main_window.py +++ b/uberwriter/main_window.py @@ -36,7 +36,6 @@ import cairo from uberwriter import helpers from uberwriter.theme import Theme -from uberwriter.helpers import get_builder from uberwriter.sidebar import Sidebar from uberwriter.search_and_replace import SearchAndReplace @@ -72,7 +71,9 @@ class MainWindow(StyledWindow): self.get_style_context().add_class('uberwriter-window') # Set UI - builder = get_builder('Window') + builder = Gtk.Builder() + builder.add_from_resource( + "/de/wolfvollprecht/UberWriter/ui/Window.ui") root = builder.get_object("FullscreenOverlay") self.connect("delete-event", self.on_delete_called) self.add(root) diff --git a/uberwriter/preferences_dialog.py b/uberwriter/preferences_dialog.py index 5c374e8..5158298 100644 --- a/uberwriter/preferences_dialog.py +++ b/uberwriter/preferences_dialog.py @@ -27,7 +27,6 @@ from gi.repository import Gtk, Pango, GLib # pylint: disable=E0611 import logging logger = logging.getLogger('uberwriter') -from uberwriter.helpers import get_builder class PreferencesDialog: @@ -64,7 +63,9 @@ class PreferencesDialog: def __init__(self, settings): self.settings = settings - self.builder = get_builder("Preferences") + self.builder = Gtk.Builder() + self.builder.add_from_resource( + "/de/wolfvollprecht/UberWriter/ui/Preferences.ui") self.dark_mode_auto_switch = self.builder.get_object("dark_mode_auto_switch") self.dark_mode_auto_switch.set_active(self.settings.get_value("dark-mode-auto")) diff --git a/uberwriter/preview_converter.py b/uberwriter/preview_converter.py index 07fba58..693b92e 100644 --- a/uberwriter/preview_converter.py +++ b/uberwriter/preview_converter.py @@ -1,5 +1,6 @@ from queue import Queue from threading import Thread +import os from gi.repository import GLib diff --git a/uberwriter/preview_handler.py b/uberwriter/preview_handler.py index 77b62de..4331957 100644 --- a/uberwriter/preview_handler.py +++ b/uberwriter/preview_handler.py @@ -4,12 +4,11 @@ from enum import auto, IntEnum import gi -from uberwriter.helpers import get_builder from uberwriter.preview_renderer import PreviewRenderer from uberwriter.settings import Settings gi.require_version('WebKit2', '4.0') -from gi.repository import WebKit2, GLib +from gi.repository import WebKit2, GLib, Gtk from uberwriter.preview_converter import PreviewConverter from uberwriter.preview_web_view import PreviewWebView @@ -33,7 +32,9 @@ class PreviewHandler: self.web_view = None self.web_view_pending_html = None - builder = get_builder("Preview") + builder = Gtk.Builder() + builder.add_from_resource( + "/de/wolfvollprecht/UberWriter/ui/Preview.ui") preview = builder.get_object("preview") mode_button = builder.get_object("preview_mode_button") self.mode_revealer = builder.get_object("preview_mode_revealer") diff --git a/uberwriter/styled_window.py b/uberwriter/styled_window.py index e88101e..b95ad03 100644 --- a/uberwriter/styled_window.py +++ b/uberwriter/styled_window.py @@ -4,7 +4,7 @@ from uberwriter import helpers from uberwriter.theme import Theme gi.require_version('Gtk', '3.0') -from gi.repository import Gtk, GLib +from gi.repository import Gtk, GLib, Gio class StyledWindow(Gtk.ApplicationWindow): @@ -27,8 +27,10 @@ class StyledWindow(Gtk.ApplicationWindow): GLib.Variant("b", theme.is_dark)) # Set theme css + css_provider_file = Gio.File.new_for_uri( + "resource:///de/wolfvollprecht/UberWriter/media/css/gtk/base.css") style_provider = Gtk.CssProvider() - style_provider.load_from_path(helpers.get_css_path("gtk/base.css")) + style_provider.load_from_file(css_provider_file) Gtk.StyleContext.add_provider_for_screen( self.get_screen(), style_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)