From f5b578d0c7c0c7d252a4128bd80c70e0835ba4cb Mon Sep 17 00:00:00 2001 From: Johannes Kirschbauer Date: Sat, 30 Dec 2023 10:41:33 +0100 Subject: [PATCH 1/2] error handling. add: dialog --- .../clan_vm_manager/errors/__init__.py | 0 .../clan_vm_manager/errors/show_error.py | 18 +++++++ .../clan_vm_manager/ui/clan_select_list.py | 1 - .../clan_vm_manager/windows/join.py | 52 ++++++++----------- 4 files changed, 40 insertions(+), 31 deletions(-) create mode 100644 pkgs/clan-vm-manager/clan_vm_manager/errors/__init__.py create mode 100644 pkgs/clan-vm-manager/clan_vm_manager/errors/show_error.py diff --git a/pkgs/clan-vm-manager/clan_vm_manager/errors/__init__.py b/pkgs/clan-vm-manager/clan_vm_manager/errors/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pkgs/clan-vm-manager/clan_vm_manager/errors/show_error.py b/pkgs/clan-vm-manager/clan_vm_manager/errors/show_error.py new file mode 100644 index 000000000..325eaa035 --- /dev/null +++ b/pkgs/clan-vm-manager/clan_vm_manager/errors/show_error.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python3 + +from typing import Literal, Optional, Union +import gi + +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk +from clan_cli.errors import ClanError + +Severity = Union[Literal["Error"], Literal["Warning"], Literal["Info"], str] + +def show_error_dialog(error: ClanError, severity: Optional[Severity] = "Error") -> None: + message = str(error) + dialog = Gtk.MessageDialog(None, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE, severity) + print("error:", message) + dialog.format_secondary_text(message) + dialog.run() + dialog.destroy() diff --git a/pkgs/clan-vm-manager/clan_vm_manager/ui/clan_select_list.py b/pkgs/clan-vm-manager/clan_vm_manager/ui/clan_select_list.py index f605c48b0..0c35075de 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/ui/clan_select_list.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/ui/clan_select_list.py @@ -5,7 +5,6 @@ from gi.repository import GdkPixbuf, Gtk from ..interfaces import Callbacks from ..models import VMBase - class ClanEditForm(Gtk.ListBox): def __init__(self, *, selected: VMBase | None) -> None: super().__init__() diff --git a/pkgs/clan-vm-manager/clan_vm_manager/windows/join.py b/pkgs/clan-vm-manager/clan_vm_manager/windows/join.py index ecac330b2..6b50522f8 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/windows/join.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/windows/join.py @@ -1,11 +1,13 @@ from collections.abc import Callable from typing import Any +from clan_cli.errors import ClanError import gi from clan_cli.clan_uri import ClanURI from clan_cli.history.add import add_history, list_history from clan_vm_manager import assets +from clan_vm_manager.errors.show_error import show_error_dialog from ..interfaces import Callbacks, InitialJoinValues @@ -73,20 +75,25 @@ class Trust(Gtk.Box): self.set_center_widget(layout) def on_trust(self, widget: Gtk.Widget) -> None: - uri = self.url or ClanURI(self.entry.get_text()) - print(f"trusted: {uri}") - add_history(uri) - history = list_history() - found = filter(lambda item: item.flake.flake_url == uri.get_internal(), history) - if found: - [item] = found - self.stack.add_titled( - Details(url=uri.get_internal(), description=item.flake.description), - "details", - "Details", - ) - self.show_next() - self.stack.set_visible_child_name("details") + try: + uri = self.url or ClanURI(self.entry.get_text()) + print(f"trusted: {uri}") + add_history(uri) + history = list_history() + found = filter(lambda item: item.flake.flake_url == uri.get_internal(), history) + if found: + [item] = found + self.stack.add_titled( + Details(url=uri.get_internal(), description=item.flake.description), + "details", + "Details", + ) + self.show_next() + self.stack.set_visible_child_name("details") + + except ClanError as e: + show_error_dialog(e) + class Details(Gtk.Box): @@ -152,7 +159,7 @@ class Details(Gtk.Box): def on_join(self, widget: Gtk.Widget) -> None: # TODO: @Qubasa - raise Exception("Not ready yet.") + show_error_dialog(ClanError("Feature not ready yet."), "Info") class JoinWindow(Gtk.ApplicationWindow): @@ -177,27 +184,12 @@ class JoinWindow(Gtk.ApplicationWindow): self.stack = Gtk.Stack() - # If the initial url is not set, the user must provide one - # if initial_values.url is None: - # self.stack.add_titled( - # UrlInput( - # initial_values, stack=self.stack - # ), - # "URL", - # "url", - # ) - print("initial_values", initial_values) self.stack.add_titled( Trust(initial_values, show_next=self.show_details, stack=self.stack), "trust", "Trust", ) - # self.stack.add_titled( - # self.details, - # "details", - # "Details", - # ) vbox.add(self.stack) From d39d3a9a4580cac954a01f17747d8cb0b24aa2de Mon Sep 17 00:00:00 2001 From: Johannes Kirschbauer Date: Sat, 30 Dec 2023 10:43:03 +0100 Subject: [PATCH 2/2] error handling. add: dialog --- .../clan_vm_manager/errors/show_error.py | 14 +++++++++----- .../clan_vm_manager/ui/clan_select_list.py | 1 + .../clan_vm_manager/windows/join.py | 7 ++++--- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/pkgs/clan-vm-manager/clan_vm_manager/errors/show_error.py b/pkgs/clan-vm-manager/clan_vm_manager/errors/show_error.py index 325eaa035..2cc15cb60 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/errors/show_error.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/errors/show_error.py @@ -1,17 +1,21 @@ #!/usr/bin/env python3 -from typing import Literal, Optional, Union +from typing import Literal + import gi gi.require_version("Gtk", "3.0") -from gi.repository import Gtk from clan_cli.errors import ClanError +from gi.repository import Gtk -Severity = Union[Literal["Error"], Literal["Warning"], Literal["Info"], str] +Severity = Literal["Error"] | Literal["Warning"] | Literal["Info"] | str -def show_error_dialog(error: ClanError, severity: Optional[Severity] = "Error") -> None: + +def show_error_dialog(error: ClanError, severity: Severity | None = "Error") -> None: message = str(error) - dialog = Gtk.MessageDialog(None, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE, severity) + dialog = Gtk.MessageDialog( + None, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE, severity + ) print("error:", message) dialog.format_secondary_text(message) dialog.run() diff --git a/pkgs/clan-vm-manager/clan_vm_manager/ui/clan_select_list.py b/pkgs/clan-vm-manager/clan_vm_manager/ui/clan_select_list.py index 0c35075de..f605c48b0 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/ui/clan_select_list.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/ui/clan_select_list.py @@ -5,6 +5,7 @@ from gi.repository import GdkPixbuf, Gtk from ..interfaces import Callbacks from ..models import VMBase + class ClanEditForm(Gtk.ListBox): def __init__(self, *, selected: VMBase | None) -> None: super().__init__() diff --git a/pkgs/clan-vm-manager/clan_vm_manager/windows/join.py b/pkgs/clan-vm-manager/clan_vm_manager/windows/join.py index 6b50522f8..123481e0d 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/windows/join.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/windows/join.py @@ -1,9 +1,9 @@ from collections.abc import Callable from typing import Any -from clan_cli.errors import ClanError import gi from clan_cli.clan_uri import ClanURI +from clan_cli.errors import ClanError from clan_cli.history.add import add_history, list_history from clan_vm_manager import assets @@ -80,7 +80,9 @@ class Trust(Gtk.Box): print(f"trusted: {uri}") add_history(uri) history = list_history() - found = filter(lambda item: item.flake.flake_url == uri.get_internal(), history) + found = filter( + lambda item: item.flake.flake_url == uri.get_internal(), history + ) if found: [item] = found self.stack.add_titled( @@ -95,7 +97,6 @@ class Trust(Gtk.Box): show_error_dialog(e) - class Details(Gtk.Box): def __init__(self, url: str, description: str | None) -> None: super().__init__()