mirror of
https://github.com/aclist/dztui.git
synced 2026-10-30 14:42:54 +01:00
Merge pull request #366 from aclist/fix/validate-offline-mods
fix: validate custom folders before launch
This commit is contained in:
3 files changed
+38
-1
No files matched your search
@@ -34,10 +34,18 @@ class OfflineManager:
|
|||||||
self.thread_man = ThreadingManager(controller)
|
self.thread_man = ThreadingManager(controller)
|
||||||
|
|
||||||
self.appid: int
|
self.appid: int
|
||||||
self.mission_folder: str
|
|
||||||
self.local_mods: list[str] | None
|
self.local_mods: list[str] | None
|
||||||
self.custom_mods: list[str] | None
|
self.custom_mods: list[str] | None
|
||||||
|
|
||||||
|
# TODO: more robust test
|
||||||
|
def is_custom_folder_valid(self, folder: str) -> bool:
|
||||||
|
return Path(folder).exists()
|
||||||
|
|
||||||
|
# TODO: set properties as members of offline manager on demand and check them here
|
||||||
|
# rather than passing strings again
|
||||||
|
def is_mission_valid(self, folder: str) -> bool:
|
||||||
|
return is_mission(Path(folder))
|
||||||
|
|
||||||
def get_mission(self) -> None:
|
def get_mission(self) -> None:
|
||||||
folder = self.open_folderpicker(dialogs.mission_dialog)
|
folder = self.open_folderpicker(dialogs.mission_dialog)
|
||||||
if folder is None:
|
if folder is None:
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ local_frame = "Installed mods"
|
|||||||
no_local_mods = "No local mods found"
|
no_local_mods = "No local mods found"
|
||||||
no_mods = "No valid mods found"
|
no_mods = "No valid mods found"
|
||||||
no_mission = "Not a valid mission"
|
no_mission = "Not a valid mission"
|
||||||
|
folder_changed = "Folder missing or changed on disk"
|
||||||
|
|
||||||
custom_eventbox = "Set the root folder. Mods must be in atomic folders and have a meta.cpp file at a minimum."
|
custom_eventbox = "Set the root folder. Mods must be in atomic folders and have a meta.cpp file at a minimum."
|
||||||
mission_eventbox = "Select a single mission folder containing an init.c file."
|
mission_eventbox = "Select a single mission folder containing an init.c file."
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ if TYPE_CHECKING:
|
|||||||
class FolderError(Enum):
|
class FolderError(Enum):
|
||||||
NO_VALID_MODS = 1
|
NO_VALID_MODS = 1
|
||||||
NO_VALID_MISSION = 2
|
NO_VALID_MISSION = 2
|
||||||
|
FOLDER_CHANGED = 3
|
||||||
|
|
||||||
|
|
||||||
class PageHeading(Gtk.Label):
|
class PageHeading(Gtk.Label):
|
||||||
@@ -65,6 +66,10 @@ class ErrorPopover(Gtk.Popover):
|
|||||||
prefix = offline.no_mods
|
prefix = offline.no_mods
|
||||||
case FolderError.NO_VALID_MISSION:
|
case FolderError.NO_VALID_MISSION:
|
||||||
prefix = offline.no_mission
|
prefix = offline.no_mission
|
||||||
|
case FolderError.FOLDER_CHANGED:
|
||||||
|
prefix = offline.folder_changed
|
||||||
|
self.label.set_label(prefix)
|
||||||
|
return
|
||||||
self.label.set_label(f"{prefix}: '{msg}'")
|
self.label.set_label(f"{prefix}: '{msg}'")
|
||||||
|
|
||||||
|
|
||||||
@@ -105,6 +110,11 @@ class FolderHBox(HBox):
|
|||||||
self.pop.set_relative_to(self.button)
|
self.pop.set_relative_to(self.button)
|
||||||
self.pop.connect("unmap", lambda _: self.grab_focus())
|
self.pop.connect("unmap", lambda _: self.grab_focus())
|
||||||
|
|
||||||
|
self.sidepop = ErrorPopover()
|
||||||
|
self.sidepop.set_position(Gtk.PositionType.BOTTOM)
|
||||||
|
self.sidepop.set_relative_to(self.scrolled_label)
|
||||||
|
self.sidepop.connect("unmap", lambda _: self.grab_focus())
|
||||||
|
|
||||||
self.connect("map", self._on_map)
|
self.connect("map", self._on_map)
|
||||||
self.connect("unmap", self._on_unmap)
|
self.connect("unmap", self._on_unmap)
|
||||||
|
|
||||||
@@ -150,6 +160,10 @@ class FolderHBox(HBox):
|
|||||||
self.unset_button.show()
|
self.unset_button.show()
|
||||||
|
|
||||||
def present_error(self, error: FolderError, msg: str) -> None:
|
def present_error(self, error: FolderError, msg: str) -> None:
|
||||||
|
if error == FolderError.FOLDER_CHANGED:
|
||||||
|
self.sidepop.set_label(error, msg)
|
||||||
|
self.sidepop.popup()
|
||||||
|
return
|
||||||
self.folder = ""
|
self.folder = ""
|
||||||
self.label.set_text("")
|
self.label.set_text("")
|
||||||
self.unset_button.hide()
|
self.unset_button.hide()
|
||||||
@@ -300,6 +314,9 @@ class CustomModFrame(ModFrame):
|
|||||||
self.tree_vbox.hide()
|
self.tree_vbox.hide()
|
||||||
self.no_mods.hide()
|
self.no_mods.hide()
|
||||||
|
|
||||||
|
def present_folder_changed(self, folder: str) -> None:
|
||||||
|
self.custom_hbox.present_error(FolderError.FOLDER_CHANGED, folder)
|
||||||
|
|
||||||
def present_error(self, folder: str) -> None:
|
def present_error(self, folder: str) -> None:
|
||||||
self.hide_tree()
|
self.hide_tree()
|
||||||
self.custom_hbox.present_error(FolderError.NO_VALID_MODS, folder)
|
self.custom_hbox.present_error(FolderError.NO_VALID_MODS, folder)
|
||||||
@@ -363,6 +380,9 @@ class MissionFrame(HeadingFrame):
|
|||||||
def get_mission(self) -> str:
|
def get_mission(self) -> str:
|
||||||
return self.mission_hbox.get_folder()
|
return self.mission_hbox.get_folder()
|
||||||
|
|
||||||
|
def present_folder_changed(self, folder: str) -> None:
|
||||||
|
self.mission_hbox.present_error(FolderError.FOLDER_CHANGED, folder)
|
||||||
|
|
||||||
|
|
||||||
class RadioFrame(HeadingFrame):
|
class RadioFrame(HeadingFrame):
|
||||||
def __init__(self, parent: OfflineLoader, controller: "Controller") -> None:
|
def __init__(self, parent: OfflineLoader, controller: "Controller") -> None:
|
||||||
@@ -482,4 +502,12 @@ class OfflineLoader(Gtk.Box):
|
|||||||
local_mods = self.local_frame.get_mods()
|
local_mods = self.local_frame.get_mods()
|
||||||
custom_folder = self.custom_frame.get_folder()
|
custom_folder = self.custom_frame.get_folder()
|
||||||
custom_mods = self.custom_frame.get_mods()
|
custom_mods = self.custom_frame.get_mods()
|
||||||
|
|
||||||
|
if custom_folder and not self.offline_man.is_custom_folder_valid(custom_folder):
|
||||||
|
self.custom_frame.present_folder_changed(mission)
|
||||||
|
return
|
||||||
|
|
||||||
|
if mission and not self.offline_man.is_mission_valid(mission):
|
||||||
|
self.mission_frame.present_folder_changed(mission)
|
||||||
|
return
|
||||||
self.offline_man.launch(appid, mission, local_mods, custom_folder, custom_mods)
|
self.offline_man.launch(appid, mission, local_mods, custom_folder, custom_mods)
|
||||||
Reference in new issue
Block a user