diff --git a/archinstall/default_profiles/desktops/gnome.py b/archinstall/default_profiles/desktops/gnome.py index fe3ca486d1..9d7e8cf9c2 100644 --- a/archinstall/default_profiles/desktops/gnome.py +++ b/archinstall/default_profiles/desktops/gnome.py @@ -1,6 +1,64 @@ +from enum import StrEnum from typing import override -from archinstall.default_profiles.profile import DisplayServerType, GreeterType, Profile, ProfileType +from archinstall.default_profiles.profile import CustomSetting, DisplayServerType, GreeterType, Profile, ProfileType +from archinstall.lib.menu.helpers import Selection +from archinstall.lib.translationhandler import tr +from archinstall.tui.menu_item import MenuItem, MenuItemGroup +from archinstall.tui.result import ResultType + + +class GnomeFlavor(StrEnum): + Full = 'gnome' + Minimal = 'gnome-minimal' + + def show(self) -> str: + match self: + case GnomeFlavor.Full: + return f'gnome ({tr("Full")})' + case GnomeFlavor.Minimal: + return f'gnome-minimal ({tr("Recommended")})' + + def description(self) -> str: + match self: + case GnomeFlavor.Full: + return tr( + 'Installs the full gnome package group.\n' + 'Includes all GNOME apps such as Maps, Contacts,\n' + 'Characters, Calendar, Weather, and more.' + ) + case GnomeFlavor.Minimal: + return tr( + 'Installs a minimal GNOME environment.\n' + 'Includes only the essential components:\n' + ' - gnome-shell\n' + ' - gnome-session\n' + ' - gnome-terminal\n' + ' - gnome-control-center\n' + ' - gnome-settings-daemon\n' + ' - nautilus\n' + ' - xdg-desktop-portal-gnome\n' + ' - gnome-tweaks' + ) + + def packages(self) -> list[str]: + match self: + case GnomeFlavor.Full: + return [ + 'gnome', + 'gnome-tweaks', + ] + case GnomeFlavor.Minimal: + return [ + 'gnome-shell', + 'gnome-session', + 'gnome-terminal', + 'gnome-control-center', + 'gnome-settings-daemon', + 'nautilus', + 'xdg-desktop-portal-gnome', + 'gnome-tweaks', + ] class GnomeProfile(Profile): @@ -15,12 +73,45 @@ def __init__(self) -> None: @property @override def packages(self) -> list[str]: - return [ - 'gnome', - 'gnome-tweaks', - ] + flavor_str = self.custom_settings.get(CustomSetting.GnomeFlavor) + + if flavor_str is not None: + flavor = GnomeFlavor(flavor_str) + return flavor.packages() + else: + return GnomeFlavor.Minimal.packages() # minimal as the recommended default @property @override def default_greeter_type(self) -> GreeterType: return GreeterType.Gdm + + async def _select_flavor(self) -> None: + header = tr('Select a GNOME installation flavor') + '\n' + + items = [ + MenuItem( + s.show(), + value=s, + preview_action=lambda x: x.value.description() if x.value else None, + ) + for s in GnomeFlavor + ] + group = MenuItemGroup(items, sort_items=False) + + default = self.custom_settings.get(CustomSetting.GnomeFlavor, None) + group.set_default_by_value(default) + + result = await Selection[GnomeFlavor]( + group, + header=header, + allow_skip=False, + preview_location='right', + ).show() + + if result.type_ == ResultType.Selection: + self.custom_settings[CustomSetting.GnomeFlavor] = result.get_value().value + + @override + async def do_on_select(self) -> None: + await self._select_flavor() diff --git a/archinstall/default_profiles/profile.py b/archinstall/default_profiles/profile.py index 6c328a4636..1538cd4427 100644 --- a/archinstall/default_profiles/profile.py +++ b/archinstall/default_profiles/profile.py @@ -49,6 +49,7 @@ class SelectResult(Enum): class CustomSetting(StrEnum): SeatAccess = 'seat_access' PlasmaFlavor = 'plasma_flavor' + GnomeFlavor = 'gnome_flavor' class Profile: diff --git a/archinstall/default_profiles/servers/cockpit.py b/archinstall/default_profiles/servers/cockpit.py index 7283bad60b..1e010d445d 100644 --- a/archinstall/default_profiles/servers/cockpit.py +++ b/archinstall/default_profiles/servers/cockpit.py @@ -13,7 +13,7 @@ def __init__(self) -> None: @property @override def packages(self) -> list[str]: - return ['cockpit', 'udisks2', 'packagekit'] + return ['cockpit', 'cockpit-storaged', 'cockpit-packagekit'] @property @override