Skip to content

Commit 5d34dce

Browse files
committed
Add Fonts application with multi-select for emoji and CJK packages
1 parent b2f4131 commit 5d34dce

6 files changed

Lines changed: 122 additions & 0 deletions

File tree

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: 48 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('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("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,35 @@ 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+
descriptions = {
240+
FontPackage.EMOJI: tr('color emoji for browsers and apps'),
241+
FontPackage.CJK: tr('Chinese, Japanese, Korean characters'),
242+
}
243+
items = [MenuItem(f'{f.value} ({descriptions[f]})', value=f) for f in FontPackage]
244+
group = MenuItemGroup(items)
245+
246+
if preset:
247+
for f in preset.fonts:
248+
group.set_selected_by_value(f)
249+
250+
result = await Selection[FontPackage](
251+
group,
252+
header=tr('Select font packages to install'),
253+
allow_skip=True,
254+
allow_reset=True,
255+
multi=True,
256+
).show()
257+
258+
match result.type_:
259+
case ResultType.Skip:
260+
return preset
261+
case ResultType.Selection:
262+
selected = result.get_values()
263+
if selected:
264+
return FontsConfiguration(fonts=selected)
265+
return None
266+
case ResultType.Reset:
267+
return None

archinstall/lib/models/application.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ class FirewallConfigSerialization(TypedDict):
3939
firewall: str
4040

4141

42+
class FontPackage(StrEnum):
43+
EMOJI = 'noto-fonts-emoji'
44+
CJK = 'noto-fonts-cjk'
45+
46+
47+
class FontsConfigSerialization(TypedDict):
48+
fonts: list[str]
49+
50+
4251
class ZramAlgorithm(StrEnum):
4352
ZSTD = 'zstd'
4453
LZO_RLE = 'lzo-rle'
@@ -53,6 +62,7 @@ class ApplicationSerialization(TypedDict):
5362
power_management_config: NotRequired[PowerManagementConfigSerialization]
5463
print_service_config: NotRequired[PrintServiceConfigSerialization]
5564
firewall_config: NotRequired[FirewallConfigSerialization]
65+
fonts_config: NotRequired[FontsConfigSerialization]
5666

5767

5868
@dataclass
@@ -127,6 +137,18 @@ def parse_arg(cls, arg: dict[str, Any]) -> Self:
127137
)
128138

129139

140+
@dataclass
141+
class FontsConfiguration:
142+
fonts: list[FontPackage]
143+
144+
def json(self) -> FontsConfigSerialization:
145+
return {'fonts': [f.value for f in self.fonts]}
146+
147+
@classmethod
148+
def parse_arg(cls, arg: FontsConfigSerialization) -> Self:
149+
return cls(fonts=[FontPackage(f) for f in arg['fonts']])
150+
151+
130152
@dataclass(frozen=True)
131153
class ZramConfiguration:
132154
enabled: bool
@@ -149,6 +171,7 @@ class ApplicationConfiguration:
149171
power_management_config: PowerManagementConfiguration | None = None
150172
print_service_config: PrintServiceConfiguration | None = None
151173
firewall_config: FirewallConfiguration | None = None
174+
fonts_config: FontsConfiguration | None = None
152175

153176
@classmethod
154177
def parse_arg(
@@ -177,6 +200,9 @@ def parse_arg(
177200
if args and (firewall_config := args.get('firewall_config')) is not None:
178201
app_config.firewall_config = FirewallConfiguration.parse_arg(firewall_config)
179202

203+
if args and (fonts_config := args.get('fonts_config')) is not None:
204+
app_config.fonts_config = FontsConfiguration.parse_arg(fonts_config)
205+
180206
return app_config
181207

182208
def json(self) -> ApplicationSerialization:
@@ -197,4 +223,7 @@ def json(self) -> ApplicationSerialization:
197223
if self.firewall_config:
198224
config['firewall_config'] = self.firewall_config.json()
199225

226+
if self.fonts_config:
227+
config['fonts_config'] = self.fonts_config.json()
228+
200229
return config

archinstall/locales/base.pot

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1940,6 +1940,18 @@ msgstr ""
19401940
msgid "Firewall"
19411941
msgstr ""
19421942

1943+
msgid "Fonts"
1944+
msgstr ""
1945+
1946+
msgid "Select font packages to install"
1947+
msgstr ""
1948+
1949+
msgid "color emoji for browsers and apps"
1950+
msgstr ""
1951+
1952+
msgid "Chinese, Japanese, Korean characters"
1953+
msgstr ""
1954+
19431955
msgid "Select audio configuration"
19441956
msgstr ""
19451957

archinstall/locales/uk/LC_MESSAGES/base.po

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1881,6 +1881,18 @@ msgstr "Використовувати NetworkManager (з iwd)"
18811881
msgid "Firewall"
18821882
msgstr "Брандмауер"
18831883

1884+
msgid "Fonts"
1885+
msgstr "Шрифти"
1886+
1887+
msgid "Select font packages to install"
1888+
msgstr "Оберіть пакети шрифтів для встановлення"
1889+
1890+
msgid "color emoji for browsers and apps"
1891+
msgstr "кольорові емодзі для браузерів та програм"
1892+
1893+
msgid "Chinese, Japanese, Korean characters"
1894+
msgstr "китайські, японські, корейські символи"
1895+
18841896
msgid "Select audio configuration"
18851897
msgstr "Оберіть конфігурацію аудіо"
18861898

0 commit comments

Comments
 (0)