From 6cd64043d821b83c61105e00c45c26e4d100b88f Mon Sep 17 00:00:00 2001 From: Arjan Molenaar Date: Wed, 15 Jan 2020 22:21:07 +0100 Subject: [PATCH] Keep active session in sync with active window --- gaphor/application.py | 8 ++-- gaphor/services/helpservice/__init__.py | 12 ++++-- gaphor/services/session.py | 15 +++++++ gaphor/ui/__init__.py | 53 ++++++++++++------------- gaphor/ui/filemanager.py | 2 +- pyproject.toml | 1 + 6 files changed, 56 insertions(+), 35 deletions(-) create mode 100644 gaphor/services/session.py diff --git a/gaphor/application.py b/gaphor/application.py index dea642862..f5d5ca79b 100644 --- a/gaphor/application.py +++ b/gaphor/application.py @@ -9,9 +9,11 @@ All important services are present in the application object: - action sets """ +from __future__ import annotations + import inspect import logging -from typing import Dict, Type +from typing import Dict, Optional, Set, Type import importlib_metadata @@ -41,8 +43,8 @@ class _Application: """ def __init__(self): - self.active_session = None - self.sessions = set() + self.active_session: Optional[Session] = None + self.sessions: Set[Session] = set() def init(self): uninitialized_services = load_services("gaphor.appservices") diff --git a/gaphor/services/helpservice/__init__.py b/gaphor/services/helpservice/__init__.py index 7152dc5bf..d4a671987 100644 --- a/gaphor/services/helpservice/__init__.py +++ b/gaphor/services/helpservice/__init__.py @@ -11,12 +11,16 @@ from gaphor.core import action class HelpService(Service, ActionProvider): - # def __init__(self, main_window): - # self.main_window = main_window + def __init__(self, session): + self.session = session def shutdown(self): pass + @property + def window(self): + return self.session.get_service("main_window").window + @action(name="app.about") def about(self): builder = Gtk.Builder() @@ -29,7 +33,7 @@ class HelpService(Service, ActionProvider): about.set_version(str(__version__)) - # about.set_transient_for(self.main_window.window) + about.set_transient_for(self.window) about.show_all() about.run() @@ -45,7 +49,7 @@ class HelpService(Service, ActionProvider): shortcuts = builder.get_object("shortcuts-gaphor") shortcuts.set_modal(True) - # shortcuts.set_transient_for(self.main_window.window) + shortcuts.set_transient_for(self.window) shortcuts.show_all() return shortcuts diff --git a/gaphor/services/session.py b/gaphor/services/session.py new file mode 100644 index 000000000..95e728935 --- /dev/null +++ b/gaphor/services/session.py @@ -0,0 +1,15 @@ +from gaphor.abc import Service +from gaphor.application import Application + + +class Session(Service): + """ + Application service. Get the active session. + """ + + def shutdown(self): + pass + + def get_service(self, name): + assert Application.active_session + return Application.active_session.get_service(name) diff --git a/gaphor/ui/__init__.py b/gaphor/ui/__init__.py index b5b8858d5..5c4376493 100644 --- a/gaphor/ui/__init__.py +++ b/gaphor/ui/__init__.py @@ -65,28 +65,29 @@ def main(argv=sys.argv): def run(args): + def on_active_window(window, prop, session): + Application.active_session = session + + def new_session(app): + session = Application.new_session() + + main_window = session.get_service("main_window") + main_window.open(app) + app.add_window(main_window.window) + main_window.window.connect("notify::is-active", on_active_window, session) + return session + def app_startup(app): - Application.init() - apply_application_actions(Application, app) + try: + Application.init() + apply_application_actions(Application, app) + except Exception: + app.quit() + raise def app_activate(app): - # Make sure gui is loaded ASAP. - # This prevents menu items from appearing at unwanted places. - # main_window = application.get_service("main_window") - # main_window.open(app) - # app.add_window(main_window.window) - if not Application.has_sessions(): - session = Application.new_session() - - # Only at application level (startup())? - # component_registry = session.get_service("component_registry") - # apply_application_actions(component_registry, app) - - main_window = session.get_service("main_window") - main_window.open(app) - app.add_window(main_window.window) - + session = new_session(app) file_manager = session.get_service("file_manager") file_manager.action_new() @@ -94,14 +95,7 @@ def run(args): print(f"Open files {files} with '{hint}'.") assert n_files == 1 for file in files: - session = Application.new_session() - # component_registry = session.get_service("component_registry") - # apply_application_actions(component_registry, app) - - main_window = session.get_service("main_window") - main_window.open(app) - app.add_window(main_window.window) - + session = new_session(app) file_manager = Application.get_service("file_manager") file_manager.load(file.get_path()) @@ -120,7 +114,12 @@ def run(args): def quit(): - Gtk.Application.get_default().quit() + session = Application.active_session + assert session + session.shutdown() + Application.sessions.discard(session) + if not Application.sessions: + Gtk.Application.get_default().quit() def add_main_options(gtk_app): diff --git a/gaphor/ui/filemanager.py b/gaphor/ui/filemanager.py index 0505097b3..f81d3db6a 100644 --- a/gaphor/ui/filemanager.py +++ b/gaphor/ui/filemanager.py @@ -337,7 +337,7 @@ class FileManager(Service, ActionProvider): return False - @action(name="app.quit", shortcut="q") + @action(name="quit", shortcut="q") def file_quit(self): """ Ask user to close window if the model has changed. diff --git a/pyproject.toml b/pyproject.toml index b9c356af0..7155f0b12 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,6 +62,7 @@ gaphor = 'gaphor.ui:main' gaphorconvert = 'gaphor.tools.gaphorconvert:main' [tool.poetry.plugins."gaphor.appservices"] +"session" = "gaphor.services.session:Session" "help" = "gaphor.services.helpservice:HelpService" [tool.poetry.plugins."gaphor.services"]