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