Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions archinstall/applications/fonts.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from typing import TYPE_CHECKING

from archinstall.lib.models.application import FontsConfiguration
from archinstall.lib.output import debug

if TYPE_CHECKING:
from archinstall.lib.installer import Installer


class FontsApp:
def install(self, install_session: Installer, fonts_config: FontsConfiguration) -> None:
packages = [f.value for f in fonts_config.fonts]
debug(f'Installing fonts: {packages}')
install_session.add_additional_packages(packages)
7 changes: 7 additions & 0 deletions archinstall/lib/applications/application_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from archinstall.applications.audio import AudioApp
from archinstall.applications.bluetooth import BluetoothApp
from archinstall.applications.firewall import FirewallApp
from archinstall.applications.fonts import FontsApp
from archinstall.applications.power_management import PowerManagementApp
from archinstall.applications.print_service import PrintServiceApp
from archinstall.lib.models import Audio
Expand Down Expand Up @@ -42,3 +43,9 @@ def install_applications(self, install_session: Installer, app_config: Applicati
install_session,
app_config.firewall_config,
)

if app_config.fonts_config:
FontsApp().install(
install_session,
app_config.fonts_config,
)
44 changes: 44 additions & 0 deletions archinstall/lib/applications/application_menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
BluetoothConfiguration,
Firewall,
FirewallConfiguration,
FontPackage,
FontsConfiguration,
PowerManagement,
PowerManagementConfiguration,
PrintServiceConfiguration,
Expand Down Expand Up @@ -77,6 +79,13 @@ def _define_menu_options(self) -> list[MenuItem]:
preview_action=self._prev_firewall,
key='firewall_config',
),
MenuItem(
text=tr('Additional fonts'),
action=select_fonts,
value=self._app_config.fonts_config,
preview_action=self._prev_fonts,
key='fonts_config',
),
]

def _prev_power_management(self, item: MenuItem) -> str | None:
Expand Down Expand Up @@ -115,6 +124,13 @@ def _prev_firewall(self, item: MenuItem) -> str | None:
return f'{tr("Firewall")}: {config.firewall.value}'
return None

def _prev_fonts(self, item: MenuItem) -> str | None:
if item.value is not None:
config: FontsConfiguration = item.value
packages = ', '.join(f.value for f in config.fonts)
return f'{tr("Additional fonts")}: {packages}'
return None


async def select_power_management(preset: PowerManagementConfiguration | None = None) -> PowerManagementConfiguration | None:
group = MenuItemGroup.from_enum(PowerManagement)
Expand Down Expand Up @@ -217,3 +233,31 @@ async def select_firewall(preset: FirewallConfiguration | None = None) -> Firewa
return FirewallConfiguration(firewall=result.get_value())
case ResultType.Reset:
return None


async def select_fonts(preset: FontsConfiguration | None = None) -> FontsConfiguration | None:
items = [MenuItem(f'{f.value} ({f.description()})', value=f) for f in FontPackage]
group = MenuItemGroup(items)

if preset:
for f in preset.fonts:
group.set_selected_by_value(f)

result = await Selection[FontPackage](
group,
header=tr('Select font packages to install'),
allow_skip=True,
allow_reset=True,
multi=True,
).show()

match result.type_:
case ResultType.Skip:
return preset
case ResultType.Selection:
selected = result.get_values()
if selected:
return FontsConfiguration(fonts=selected)
return None
case ResultType.Reset:
return None
41 changes: 41 additions & 0 deletions archinstall/lib/models/application.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
from enum import StrEnum, auto
from typing import Any, NotRequired, Self, TypedDict

from archinstall.lib.translationhandler import tr


class PowerManagement(StrEnum):
POWER_PROFILES_DAEMON = 'power-profiles-daemon'
Expand Down Expand Up @@ -39,6 +41,25 @@ class FirewallConfigSerialization(TypedDict):
firewall: str


class FontPackage(StrEnum):
NOTO = 'noto-fonts'
EMOJI = 'noto-fonts-emoji'
CJK = 'noto-fonts-cjk'

def description(self) -> str:
match self:
case FontPackage.NOTO:
return tr('Unicode font coverage for most languages')
case FontPackage.EMOJI:
return tr('color emoji for browsers and apps')
case FontPackage.CJK:
return tr('Chinese, Japanese, Korean characters')


class FontsConfigSerialization(TypedDict):
fonts: list[str]


class ZramAlgorithm(StrEnum):
ZSTD = 'zstd'
LZO_RLE = 'lzo-rle'
Expand All @@ -53,6 +74,7 @@ class ApplicationSerialization(TypedDict):
power_management_config: NotRequired[PowerManagementConfigSerialization]
print_service_config: NotRequired[PrintServiceConfigSerialization]
firewall_config: NotRequired[FirewallConfigSerialization]
fonts_config: NotRequired[FontsConfigSerialization]


@dataclass
Expand Down Expand Up @@ -127,6 +149,18 @@ def parse_arg(cls, arg: dict[str, Any]) -> Self:
)


@dataclass
class FontsConfiguration:
fonts: list[FontPackage]

def json(self) -> FontsConfigSerialization:
return {'fonts': [f.value for f in self.fonts]}

@classmethod
def parse_arg(cls, arg: FontsConfigSerialization) -> Self:
return cls(fonts=[FontPackage(f) for f in arg['fonts']])


@dataclass(frozen=True)
class ZramConfiguration:
enabled: bool
Expand All @@ -149,6 +183,7 @@ class ApplicationConfiguration:
power_management_config: PowerManagementConfiguration | None = None
print_service_config: PrintServiceConfiguration | None = None
firewall_config: FirewallConfiguration | None = None
fonts_config: FontsConfiguration | None = None

@classmethod
def parse_arg(
Expand Down Expand Up @@ -177,6 +212,9 @@ def parse_arg(
if args and (firewall_config := args.get('firewall_config')) is not None:
app_config.firewall_config = FirewallConfiguration.parse_arg(firewall_config)

if args and (fonts_config := args.get('fonts_config')) is not None:
app_config.fonts_config = FontsConfiguration.parse_arg(fonts_config)

return app_config

def json(self) -> ApplicationSerialization:
Expand All @@ -197,4 +235,7 @@ def json(self) -> ApplicationSerialization:
if self.firewall_config:
config['firewall_config'] = self.firewall_config.json()

if self.fonts_config:
config['fonts_config'] = self.fonts_config.json()

return config
15 changes: 15 additions & 0 deletions archinstall/locales/base.pot
Original file line number Diff line number Diff line change
Expand Up @@ -1940,6 +1940,21 @@ msgstr ""
msgid "Firewall"
msgstr ""

msgid "Additional fonts"
msgstr ""

msgid "Select font packages to install"
msgstr ""

msgid "Unicode font coverage for most languages"
msgstr ""

msgid "color emoji for browsers and apps"
msgstr ""

msgid "Chinese, Japanese, Korean characters"
msgstr ""

msgid "Select audio configuration"
msgstr ""

Expand Down
15 changes: 15 additions & 0 deletions archinstall/locales/uk/LC_MESSAGES/base.po
Original file line number Diff line number Diff line change
Expand Up @@ -1881,6 +1881,21 @@ msgstr "Використовувати NetworkManager (з iwd)"
msgid "Firewall"
msgstr "Брандмауер"

msgid "Additional fonts"
msgstr "Додаткові шрифти"

msgid "Select font packages to install"
msgstr "Оберіть пакети шрифтів для встановлення"

msgid "Unicode font coverage for most languages"
msgstr "покриття шрифтами Unicode для більшості мов"

msgid "color emoji for browsers and apps"
msgstr "кольорові емодзі для браузерів та програм"

msgid "Chinese, Japanese, Korean characters"
msgstr "китайські, японські, корейські символи"

msgid "Select audio configuration"
msgstr "Оберіть конфігурацію аудіо"

Expand Down
Loading