Skip to main content

Mountain/Environment/TreeViewProvider/
StatePersistence.rs

1//! # Tree View State Persistence Helpers
2//!
3//! Internal helper functions for saving and restoring tree view state.
4
5use CommonLibrary::Error::CommonError::CommonError;
6use serde_json::json;
7use tauri::Emitter;
8
9use crate::{Environment::Utility, dev_log};
10
11/// Persists the current state of a tree view.
12/// Saves the expansion, selection, and other state for later restoration.
13pub(super) async fn persist_tree_view_state(
14	env:&crate::Environment::MountainEnvironment::MountainEnvironment,
15	view_identifier:String,
16) -> Result<serde_json::Value, CommonError> {
17	dev_log!(
18		"extensions",
19		"[TreeViewProvider] Persisting state for view '{}'",
20		view_identifier
21	);
22
23	let tree_views = env
24		.ApplicationState
25		.Feature
26		.TreeViews
27		.ActiveTreeViews
28		.lock()
29		.map_err(Utility::MapApplicationStateLockErrorToCommonError)?;
30
31	let state = tree_views.get(&view_identifier).map(|view| {
32		json!({
33			"ViewIdentifier": view_identifier,
34			"Title": view.Title,
35			"Description": view.Description,
36			"CanSelectMany": view.CanSelectMany,
37			"Message": view.Message,
38			"HasHandleDrag": view.HasHandleDrag,
39			"HasHandleDrop": view.HasHandleDrop,
40		})
41	});
42
43	state.ok_or(CommonError::TreeViewProviderNotFound { ViewIdentifier:view_identifier })
44}
45
46/// Restores a previously persisted tree view state.
47/// Restores expansion, selection, and other state from a JSON representation.
48pub(super) async fn restore_tree_view_state(
49	env:&crate::Environment::MountainEnvironment::MountainEnvironment,
50	view_identifier:String,
51	state_value:serde_json::Value,
52) -> Result<(), CommonError> {
53	dev_log!(
54		"extensions",
55		"[TreeViewProvider] Restoring state for view '{}'",
56		view_identifier
57	);
58
59	let mut tree_views = env
60		.ApplicationState
61		.Feature
62		.TreeViews
63		.ActiveTreeViews
64		.lock()
65		.map_err(Utility::MapApplicationStateLockErrorToCommonError)?;
66
67	if let Some(view_state) = tree_views.get_mut(&view_identifier) {
68		if let Some(title) = state_value.get("Title").and_then(|v| v.as_str()) {
69			view_state.Title = Some(title.to_string());
70		}
71		if let Some(description) = state_value.get("Description").and_then(|v| v.as_str()) {
72			view_state.Description = Some(description.to_string());
73		}
74		// Restore additional UI state properties from the persisted StateValue:
75		// - expansion state (which nodes are open)
76		// - scroll position (viewport position)
77		// - column widths (for detail views)
78		// - sorting order
79		// - provider-specific state extensions
80
81		// Emit to frontend
82		env.ApplicationHandle
83			.emit(
84				"sky://tree-view/restore-state",
85				json!({
86					"ViewIdentifier": view_identifier,
87					"State": state_value
88				}),
89			)
90			.map_err(|Error| {
91				CommonError::UserInterfaceInteraction {
92					Reason:format!("Failed to emit restore state event: {}", Error),
93				}
94			})?;
95
96		Ok(())
97	} else {
98		Err(CommonError::TreeViewProviderNotFound { ViewIdentifier:view_identifier })
99	}
100}