11from dataclasses import dataclass
22from typing import override
33
4- from archinstall .lib .models .device_model import DiskLayoutConfiguration , DiskLayoutType , LvmConfiguration
4+ from archinstall .lib .models .device_model import (
5+ BtrfsOptions ,
6+ DiskLayoutConfiguration ,
7+ DiskLayoutType ,
8+ LvmConfiguration ,
9+ SnapshotConfig ,
10+ SnapshotType ,
11+ )
512from archinstall .lib .translationhandler import tr
13+ from archinstall .tui .curses_menu import SelectMenu
614from archinstall .tui .menu_item import MenuItem , MenuItemGroup
15+ from archinstall .tui .result import ResultType
16+ from archinstall .tui .types import Alignment , FrameProperties
717
818from ..interactions .disk_conf import select_disk_config , select_lvm_config
919from ..menu .abstract_menu import AbstractSubMenu
1424class DiskMenuConfig :
1525 disk_config : DiskLayoutConfiguration | None
1626 lvm_config : LvmConfiguration | None
27+ btrfs_snapshot_config : SnapshotConfig | None
1728
1829
1930class DiskLayoutConfigurationMenu (AbstractSubMenu [DiskLayoutConfiguration ]):
2031 def __init__ (self , disk_layout_config : DiskLayoutConfiguration | None ):
2132 if not disk_layout_config :
22- self ._disk_menu_config = DiskMenuConfig (disk_config = None , lvm_config = None )
33+ self ._disk_menu_config = DiskMenuConfig (
34+ disk_config = None ,
35+ lvm_config = None ,
36+ btrfs_snapshot_config = None ,
37+ )
2338 else :
39+ snapshot_config = disk_layout_config .btrfs_options .snapshot_config if disk_layout_config .btrfs_options else None
40+
2441 self ._disk_menu_config = DiskMenuConfig (
2542 disk_config = disk_layout_config ,
2643 lvm_config = disk_layout_config .lvm_config ,
44+ btrfs_snapshot_config = snapshot_config ,
2745 )
2846
2947 menu_optioons = self ._define_menu_options ()
@@ -52,6 +70,14 @@ def _define_menu_options(self) -> list[MenuItem]:
5270 dependencies = [self ._check_dep_lvm ],
5371 key = 'lvm_config' ,
5472 ),
73+ MenuItem (
74+ text = 'Btrfs snapshots' ,
75+ action = self ._select_btrfs_snapshots ,
76+ value = self ._disk_menu_config .btrfs_snapshot_config ,
77+ preview_action = self ._prev_btrfs_snapshots ,
78+ dependencies = [self ._check_dep_btrfs ],
79+ key = 'btrfs_snapshot_config' ,
80+ ),
5581 ]
5682
5783 @override
@@ -60,6 +86,7 @@ def run(self) -> DiskLayoutConfiguration | None:
6086
6187 if self ._disk_menu_config .disk_config :
6288 self ._disk_menu_config .disk_config .lvm_config = self ._disk_menu_config .lvm_config
89+ self ._disk_menu_config .disk_config .btrfs_options = BtrfsOptions (snapshot_config = self ._disk_menu_config .btrfs_snapshot_config )
6390 return self ._disk_menu_config .disk_config
6491
6592 return None
@@ -72,10 +99,15 @@ def _check_dep_lvm(self) -> bool:
7299
73100 return False
74101
75- def _select_disk_layout_config (
76- self ,
77- preset : DiskLayoutConfiguration | None ,
78- ) -> DiskLayoutConfiguration | None :
102+ def _check_dep_btrfs (self ) -> bool :
103+ disk_layout_conf : DiskLayoutConfiguration | None = self ._menu_item_group .find_by_key ('disk_config' ).value
104+
105+ if disk_layout_conf :
106+ return disk_layout_conf .is_default_btrfs ()
107+
108+ return False
109+
110+ def _select_disk_layout_config (self , preset : DiskLayoutConfiguration | None ) -> DiskLayoutConfiguration | None :
79111 disk_config = select_disk_config (preset )
80112
81113 if disk_config != preset :
@@ -91,6 +123,38 @@ def _select_lvm_config(self, preset: LvmConfiguration | None) -> LvmConfiguratio
91123
92124 return preset
93125
126+ def _select_btrfs_snapshots (self , preset : SnapshotConfig | None ) -> SnapshotConfig | None :
127+ preset_type = preset .snapshot_type if preset else None
128+
129+ group = MenuItemGroup .from_enum (
130+ SnapshotType ,
131+ sort_items = True ,
132+ preset = preset_type ,
133+ )
134+
135+ result = SelectMenu [SnapshotType ](
136+ group ,
137+ allow_reset = True ,
138+ allow_skip = True ,
139+ frame = FrameProperties .min (tr ('Snapshot type' )),
140+ alignment = Alignment .CENTER ,
141+ ).run ()
142+
143+ snapshot_type : SnapshotType | None = None
144+
145+ match result .type_ :
146+ case ResultType .Skip :
147+ return preset
148+ case ResultType .Reset :
149+ return None
150+ case ResultType .Selection :
151+ snapshot_type = result .get_value ()
152+
153+ if not snapshot_type :
154+ return None
155+
156+ return SnapshotConfig (snapshot_type = snapshot_type )
157+
94158 def _prev_disk_layouts (self , item : MenuItem ) -> str | None :
95159 if not item .value :
96160 return None
@@ -146,3 +210,10 @@ def _prev_lvm_config(self, item: MenuItem) -> str | None:
146210 return output
147211
148212 return None
213+
214+ def _prev_btrfs_snapshots (self , item : MenuItem ) -> str | None :
215+ if not item .value :
216+ return None
217+
218+ snapshot_config : SnapshotConfig = item .value
219+ return tr ('Snapshot type: {}' ).format (snapshot_config .snapshot_type .value )
0 commit comments