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