Skip to content

Commit 4fcef35

Browse files
authored
Add optional "Additional fonts" selection to Applications menu (#4420)
* Add Fonts application with multi-select for emoji and CJK packages * Rename to Additional fonts and add package descriptions * Add noto-fonts to font package selection * Move font descriptions into FontPackage enum method * ci: trigger tests * Add ttf-liberation and ttf-dejavu to font selection
1 parent 9fdd7eb commit 4fcef35

File tree

6 files changed

+142
-0
lines changed

6 files changed

+142
-0
lines changed

archinstall/applications/fonts.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from typing import TYPE_CHECKING
2+
3+
from archinstall.lib.models.application import FontsConfiguration
4+
from archinstall.lib.output import debug
5+
6+
if TYPE_CHECKING:
7+
from archinstall.lib.installer import Installer
8+
9+
10+
class FontsApp:
11+
def install(self, install_session: Installer, fonts_config: FontsConfiguration) -> None:
12+
packages = [f.value for f in fonts_config.fonts]
13+
debug(f'Installing fonts: {packages}')
14+
install_session.add_additional_packages(packages)

archinstall/lib/applications/application_handler.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from archinstall.applications.audio import AudioApp
44
from archinstall.applications.bluetooth import BluetoothApp
55
from archinstall.applications.firewall import FirewallApp
6+
from archinstall.applications.fonts import FontsApp
67
from archinstall.applications.power_management import PowerManagementApp
78
from archinstall.applications.print_service import PrintServiceApp
89
from archinstall.lib.models import Audio
@@ -42,3 +43,9 @@ def install_applications(self, install_session: Installer, app_config: Applicati
4243
install_session,
4344
app_config.firewall_config,
4445
)
46+
47+
if app_config.fonts_config:
48+
FontsApp().install(
49+
install_session,
50+
app_config.fonts_config,
51+
)

archinstall/lib/applications/application_menu.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
BluetoothConfiguration,
1111
Firewall,
1212
FirewallConfiguration,
13+
FontPackage,
14+
FontsConfiguration,
1315
PowerManagement,
1416
PowerManagementConfiguration,
1517
PrintServiceConfiguration,
@@ -77,6 +79,13 @@ def _define_menu_options(self) -> list[MenuItem]:
7779
preview_action=self._prev_firewall,
7880
key='firewall_config',
7981
),
82+
MenuItem(
83+
text=tr('Additional fonts'),
84+
action=select_fonts,
85+
value=self._app_config.fonts_config,
86+
preview_action=self._prev_fonts,
87+
key='fonts_config',
88+
),
8089
]
8190

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

127+
def _prev_fonts(self, item: MenuItem) -> str | None:
128+
if item.value is not None:
129+
config: FontsConfiguration = item.value
130+
packages = ', '.join(f.value for f in config.fonts)
131+
return f'{tr("Additional fonts")}: {packages}'
132+
return None
133+
118134

119135
async def select_power_management(preset: PowerManagementConfiguration | None = None) -> PowerManagementConfiguration | None:
120136
group = MenuItemGroup.from_enum(PowerManagement)
@@ -217,3 +233,31 @@ async def select_firewall(preset: FirewallConfiguration | None = None) -> Firewa
217233
return FirewallConfiguration(firewall=result.get_value())
218234
case ResultType.Reset:
219235
return None
236+
237+
238+
async def select_fonts(preset: FontsConfiguration | None = None) -> FontsConfiguration | None:
239+
items = [MenuItem(f'{f.value} ({f.description()})', value=f) for f in FontPackage]
240+
group = MenuItemGroup(items)
241+
242+
if preset:
243+
for f in preset.fonts:
244+
group.set_selected_by_value(f)
245+
246+
result = await Selection[FontPackage](
247+
group,
248+
header=tr('Select font packages to install'),
249+
allow_skip=True,
250+
allow_reset=True,
251+
multi=True,
252+
).show()
253+
254+
match result.type_:
255+
case ResultType.Skip:
256+
return preset
257+
case ResultType.Selection:
258+
selected = result.get_values()
259+
if selected:
260+
return FontsConfiguration(fonts=selected)
261+
return None
262+
case ResultType.Reset:
263+
return None

archinstall/lib/models/application.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
from enum import StrEnum, auto
33
from typing import Any, NotRequired, Self, TypedDict
44

5+
from archinstall.lib.translationhandler import tr
6+
57

68
class PowerManagement(StrEnum):
79
POWER_PROFILES_DAEMON = 'power-profiles-daemon'
@@ -39,6 +41,31 @@ class FirewallConfigSerialization(TypedDict):
3941
firewall: str
4042

4143

44+
class FontPackage(StrEnum):
45+
NOTO = 'noto-fonts'
46+
EMOJI = 'noto-fonts-emoji'
47+
CJK = 'noto-fonts-cjk'
48+
LIBERATION = 'ttf-liberation'
49+
DEJAVU = 'ttf-dejavu'
50+
51+
def description(self) -> str:
52+
match self:
53+
case FontPackage.NOTO:
54+
return tr('Unicode font coverage for most languages')
55+
case FontPackage.EMOJI:
56+
return tr('color emoji for browsers and apps')
57+
case FontPackage.CJK:
58+
return tr('Chinese, Japanese, Korean characters')
59+
case FontPackage.LIBERATION:
60+
return tr('Arial/Times/Courier replacement, Cyrillic support for Steam/games')
61+
case FontPackage.DEJAVU:
62+
return tr('wide Unicode coverage, good fallback font')
63+
64+
65+
class FontsConfigSerialization(TypedDict):
66+
fonts: list[str]
67+
68+
4269
class ZramAlgorithm(StrEnum):
4370
ZSTD = auto()
4471
LZO_RLE = 'lzo-rle'
@@ -53,6 +80,7 @@ class ApplicationSerialization(TypedDict):
5380
power_management_config: NotRequired[PowerManagementConfigSerialization]
5481
print_service_config: NotRequired[PrintServiceConfigSerialization]
5582
firewall_config: NotRequired[FirewallConfigSerialization]
83+
fonts_config: NotRequired[FontsConfigSerialization]
5684

5785

5886
@dataclass
@@ -127,6 +155,18 @@ def parse_arg(cls, arg: dict[str, Any]) -> Self:
127155
)
128156

129157

158+
@dataclass
159+
class FontsConfiguration:
160+
fonts: list[FontPackage]
161+
162+
def json(self) -> FontsConfigSerialization:
163+
return {'fonts': [f.value for f in self.fonts]}
164+
165+
@classmethod
166+
def parse_arg(cls, arg: FontsConfigSerialization) -> Self:
167+
return cls(fonts=[FontPackage(f) for f in arg['fonts']])
168+
169+
130170
@dataclass(frozen=True)
131171
class ZramConfiguration:
132172
enabled: bool
@@ -149,6 +189,7 @@ class ApplicationConfiguration:
149189
power_management_config: PowerManagementConfiguration | None = None
150190
print_service_config: PrintServiceConfiguration | None = None
151191
firewall_config: FirewallConfiguration | None = None
192+
fonts_config: FontsConfiguration | None = None
152193

153194
@classmethod
154195
def parse_arg(
@@ -177,6 +218,9 @@ def parse_arg(
177218
if args and (firewall_config := args.get('firewall_config')) is not None:
178219
app_config.firewall_config = FirewallConfiguration.parse_arg(firewall_config)
179220

221+
if args and (fonts_config := args.get('fonts_config')) is not None:
222+
app_config.fonts_config = FontsConfiguration.parse_arg(fonts_config)
223+
180224
return app_config
181225

182226
def json(self) -> ApplicationSerialization:
@@ -197,4 +241,7 @@ def json(self) -> ApplicationSerialization:
197241
if self.firewall_config:
198242
config['firewall_config'] = self.firewall_config.json()
199243

244+
if self.fonts_config:
245+
config['fonts_config'] = self.fonts_config.json()
246+
200247
return config

archinstall/locales/base.pot

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2070,6 +2070,21 @@ msgstr ""
20702070
msgid "Firewall"
20712071
msgstr ""
20722072

2073+
msgid "Additional fonts"
2074+
msgstr ""
2075+
2076+
msgid "Select font packages to install"
2077+
msgstr ""
2078+
2079+
msgid "Unicode font coverage for most languages"
2080+
msgstr ""
2081+
2082+
msgid "color emoji for browsers and apps"
2083+
msgstr ""
2084+
2085+
msgid "Chinese, Japanese, Korean characters"
2086+
msgstr ""
2087+
20732088
msgid "Select audio configuration"
20742089
msgstr ""
20752090

archinstall/locales/uk/LC_MESSAGES/base.po

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2011,6 +2011,21 @@ msgstr "Використовувати NetworkManager (з iwd)"
20112011
msgid "Firewall"
20122012
msgstr "Брандмауер"
20132013

2014+
msgid "Additional fonts"
2015+
msgstr "Додаткові шрифти"
2016+
2017+
msgid "Select font packages to install"
2018+
msgstr "Оберіть пакети шрифтів для встановлення"
2019+
2020+
msgid "Unicode font coverage for most languages"
2021+
msgstr "покриття шрифтами Unicode для більшості мов"
2022+
2023+
msgid "color emoji for browsers and apps"
2024+
msgstr "кольорові емодзі для браузерів та програм"
2025+
2026+
msgid "Chinese, Japanese, Korean characters"
2027+
msgstr "китайські, японські, корейські символи"
2028+
20142029
msgid "Select audio configuration"
20152030
msgstr "Оберіть конфігурацію аудіо"
20162031

0 commit comments

Comments
 (0)