1//
2// Name:        Save and restore display state
3// Version:     0.19.1
4// License:     Public Domain
5// Authors:     Matthew Gates (matthewg42) (Original author)
6//              Alexander Wolf (alex-w)
7//              Georg Zotti (gzotti)
8//              Brian W. Mulligan (astrobit)
9// Description: Provide functions for saving and restoring state (view settings etc.)
10//              for use in other scripts via the include feature.  A state is
11//              associated with some string identifier.  This is arbitrary.  You can
12//              have as many states as you like subject to whatever memory
13//              restrictions there are...
14//              note - you can pass options to the restoreState function to get it to
15//              ignore some parts of the saved state.  See below for details.
16// Change Log:
17// 2009-05-09   Matthew Gates (matthewg42)
18//     * First version
19// 2010-04-14   Matthew Gates (matthewg42)
20//     * save language
21// 2012-02-19   Matthew Gates (matthewg42)
22//     * add galactic line states
23// 2012-02-20   Matthew Gates (matthewg42)
24//     * remove reference to StelSkyImageMgr.getFlagShow and StelSkyImageMgr.setFlagShow
25// 2012-07-27   Alexander Wolf (alex-w)
26//     * add ecliptic j2000 grid state
27// 2014-09-10   Georg Zotti (gzotti)
28//    * Update Galactic Plane to Galactic Equator
29// 2019-08-14   Brian W. Mulligan (astrobit)
30//    * Fix to work under stellarium 0.19
31//    * Add change log, version, and author list to header
32
33// declare a global variable to store saved state
34var savedStates = new Array();
35
36// call this function with some string ID
37function saveState(stateName)
38{
39	savedStates[stateName] = new Array();
40	savedStates[stateName]["SolarSystemFlagPlanets"] = SolarSystem.getFlagPlanets();
41	savedStates[stateName]["SolarSystemFlagHints"] = SolarSystem.getFlagHints();
42	savedStates[stateName]["SolarSystemFlagOrbits"] = SolarSystem.getFlagOrbits();
43	savedStates[stateName]["SolarSystemFlagMoonScale"] = SolarSystem.getFlagMoonScale();
44	savedStates[stateName]["SolarSystemFlagTrails"] = SolarSystem.getFlagTrails();
45	savedStates[stateName]["SolarSystemFlagLabels"] = SolarSystem.getFlagLabels();
46	savedStates[stateName]["SolarSystemLabelsAmount"] = SolarSystem.getLabelsAmount();
47	savedStates[stateName]["SolarSystemFlagLightTravelTime"] = SolarSystem.getFlagLightTravelTime();
48	savedStates[stateName]["SolarSystemFlagMoonScale"] = SolarSystem.getFlagMoonScale();
49	savedStates[stateName]["SolarSystemMoonScale"] = SolarSystem.getMoonScale();
50	savedStates[stateName]["MeteorMgrZHR"] = SporadicMeteorMgr.getZHR();
51	savedStates[stateName]["MeteorMgrFlagShow"] = SporadicMeteorMgr.getFlagShow();
52	savedStates[stateName]["GridLinesMgrFlagAzimuthalGrid"] = GridLinesMgr.getFlagAzimuthalGrid();
53	savedStates[stateName]["GridLinesMgrFlagEquatorGrid"] = GridLinesMgr.getFlagEquatorGrid();
54	savedStates[stateName]["GridLinesMgrFlagEquatorLine"] = GridLinesMgr.getFlagEquatorLine();
55	savedStates[stateName]["GridLinesMgrFlagEclipticLine"] = GridLinesMgr.getFlagEclipticLine();
56	savedStates[stateName]["GridLinesMgrFlagMeridianLine"] = GridLinesMgr.getFlagMeridianLine();
57	savedStates[stateName]["GridLinesMgrFlagEquatorJ2000Grid"] = GridLinesMgr.getFlagEquatorJ2000Grid();
58	savedStates[stateName]["GridLinesMgrFlagEclipticJ2000Grid"] = GridLinesMgr.getFlagEclipticJ2000Grid();
59	savedStates[stateName]["GridLinesMgrFlagGalacticGrid"] = GridLinesMgr.getFlagGalacticGrid();
60	savedStates[stateName]["GridLinesMgrFlagGalacticEquatorLine"] = GridLinesMgr.getFlagGalacticEquatorLine();
61	savedStates[stateName]["ConstellationMgrFlagLines"] = ConstellationMgr.getFlagLines();
62	savedStates[stateName]["ConstellationMgrFlagLabels"] = ConstellationMgr.getFlagLabels();
63	savedStates[stateName]["ConstellationMgrFlagBoundaries"] = ConstellationMgr.getFlagBoundaries();
64	savedStates[stateName]["ConstellationMgrFlagArt"] = ConstellationMgr.getFlagArt();
65	savedStates[stateName]["ConstellationMgrArtIntensity"] = ConstellationMgr.getArtIntensity();
66	savedStates[stateName]["ConstellationMgrFlagIsolateSelected"] = ConstellationMgr.getFlagIsolateSelected();
67	savedStates[stateName]["StarMgrFlagLabels"] = StarMgr.getFlagLabels();
68	savedStates[stateName]["StarMgrFlagStars"] = StarMgr.getFlagStars();
69	savedStates[stateName]["StarMgrLabelsAmount"] = StarMgr.getLabelsAmount();
70	savedStates[stateName]["StarMgrFlagSciNames"] = StarMgr.getFlagSciNames();
71	savedStates[stateName]["NebulaMgrFlagHints"] = NebulaMgr.getFlagHints();
72	savedStates[stateName]["NebulaMgrFlagShow"] = NebulaMgr.getFlagShow();
73//	savedStates[stateName]["NebulaMgrFlagDisplayNoTexture"] = NebulaMgr.getFlagDisplayNoTexture();
74	savedStates[stateName]["NebulaMgrLabelsAmount"] = NebulaMgr.getLabelsAmount();
75	savedStates[stateName]["NebulaMgrHintsAmount"] = NebulaMgr.getHintsAmount();
76	savedStates[stateName]["LandscapeMgrFlagCardinalsPoints"] = LandscapeMgr.getFlagCardinalsPoints();
77	savedStates[stateName]["LandscapeMgrFlagLandscape"] = LandscapeMgr.getFlagLandscape();
78	savedStates[stateName]["LandscapeMgrFlagAtmosphere"] = LandscapeMgr.getFlagAtmosphere();
79	savedStates[stateName]["LandscapeMgrFlagFog"] = LandscapeMgr.getFlagFog();
80	savedStates[stateName]["LandscapeMgrCurrentLandscapeID"] = LandscapeMgr.getCurrentLandscapeID();
81	//savedStates[stateName]["LandscapeMgrAtmosphereBortleLightPollution"] = LandscapeMgr.getAtmosphereBortleLightPollution();
82	savedStates[stateName]["StelSkyDrawerRelativeStarScale"] = StelSkyDrawer.getRelativeStarScale();
83	savedStates[stateName]["StelSkyDrawerAbsoluteStarScale"] = StelSkyDrawer.getAbsoluteStarScale();
84	savedStates[stateName]["StelSkyDrawerTwinkleAmount"] = StelSkyDrawer.getTwinkleAmount();
85	savedStates[stateName]["StelSkyDrawerFlagTwinkle"] = StelSkyDrawer.getFlagTwinkle();
86	//savedStates[stateName]["StelSkyDrawerFlagPointStar"] = StelSkyDrawer.getFlagPointStar();
87	//savedStates[stateName]["StelSkyDrawerBortleScale"] = StelSkyDrawer.getBortleScale();
88	savedStates[stateName]["StelSkyDrawerFlagLuminanceAdaptation"] = StelSkyDrawer.getFlagLuminanceAdaptation();
89	savedStates[stateName]["MountMode"] = core.getMountMode();
90	savedStates[stateName]["NightMode"] = core.getNightMode();
91	savedStates[stateName]["ProjectionMode"] = core.getProjectionMode();
92	savedStates[stateName]["SkyCulture"] = core.getSkyCulture();
93	savedStates[stateName]["FlagGravityLabels"] = core.getFlagGravityLabels();
94	savedStates[stateName]["DiskViewport"] = core.getDiskViewport();
95	savedStates[stateName]["ObserverLocation"] = core.getObserverLocation();
96
97	savedStates[stateName]["TimeIsNow"] = core.isRealTime();
98	savedStates[stateName]["StateTime"] = core.getJDay();
99	savedStates[stateName]["StateTimeRate"] = core.getTimeRate();
100	savedStates[stateName]["AzimuthAngle"] = core.getViewAzimuthAngle();
101	savedStates[stateName]["AltitudeAngle"] = core.getViewAltitudeAngle();
102	savedStates[stateName]["RaAngle"] = core.getViewRaAngle();
103	savedStates[stateName]["DecAngle"] = core.getViewDecAngle();
104
105	savedStates[stateName]["AppLanguage"] = core.getAppLanguage();
106	savedStates[stateName]["SkyLanguage"] = core.getSkyLanguage();
107
108	core.debug("saveState() - state saved with ID: " + stateName);
109}
110
111// The options parameter is a hash of option values. Supported options:
112// "time": "ignore"		do not restore the simulation time and time rate
113// "time": "force"		always restore the saved time and time rate
114// "time": "smart"		(default) if at saveState, the time was the same as the system
115//				time and normal time rate, set this when restore is called.
116//				However, if the time rate was not like this, restore
117//				the time and time rate as it was when the saveState was called
118//
119// "view": true 		(default) restore the viewing direction and FOV.  Note that this
120//				will be the alt/azi direction if the saved mount mode is azimuthal,
121//				else it will be the equarotial coordinates
122// "view": false		Do not restore the viewing direction and FOV.
123//
124// Examples:
125// restoreState("state1"); // use "smart" time behaviour
126// restoreState("state2", {"time":"ignore"}); // don't restore the time and time rate
127// restoreState("state2", {"time":"force"});  // always restore the time and time rate
128function restoreState(stateName, options)
129{
130	// prevent type error if there are no options...
131	if (!options)
132	{
133		options = {"a":1};
134	}
135
136	if (!savedStates[stateName])
137	{
138		core.debug("restoreState() - WARNING no such saved state named: " + stateName);
139		return;
140	}
141
142	SolarSystem.setFlagPlanets(savedStates[stateName]["SolarSystemFlagPlanets"]);
143	SolarSystem.setFlagHints(savedStates[stateName]["SolarSystemFlagHints"]);
144	SolarSystem.setFlagOrbits(savedStates[stateName]["SolarSystemFlagOrbits"]);
145	SolarSystem.setFlagMoonScale(savedStates[stateName]["SolarSystemFlagMoonScale"]);
146	SolarSystem.setFlagTrails(savedStates[stateName]["SolarSystemFlagTrails"]);
147	SolarSystem.setFlagLabels(savedStates[stateName]["SolarSystemFlagLabels"]);
148	SolarSystem.setLabelsAmount(savedStates[stateName]["SolarSystemLabelsAmount"]);
149	SolarSystem.setFlagLightTravelTime(savedStates[stateName]["SolarSystemFlagLightTravelTime"]);
150	SolarSystem.setFlagMoonScale(savedStates[stateName]["SolarSystemFlagMoonScale"]);
151	SolarSystem.setMoonScale(savedStates[stateName]["SolarSystemMoonScale"]);
152	SporadicMeteorMgr.setZHR(savedStates[stateName]["MeteorMgrZHR"]);
153	SporadicMeteorMgr.setFlagShow(savedStates[stateName]["MeteorMgrFlagShow"]);
154	GridLinesMgr.setFlagAzimuthalGrid(savedStates[stateName]["GridLinesMgrFlagAzimuthalGrid"]);
155	GridLinesMgr.setFlagEquatorGrid(savedStates[stateName]["GridLinesMgrFlagEquatorGrid"]);
156	GridLinesMgr.setFlagEquatorLine(savedStates[stateName]["GridLinesMgrFlagEquatorLine"]);
157	GridLinesMgr.setFlagEclipticLine(savedStates[stateName]["GridLinesMgrFlagEclipticLine"]);
158	GridLinesMgr.setFlagMeridianLine(savedStates[stateName]["GridLinesMgrFlagMeridianLine"]);
159	GridLinesMgr.setFlagEquatorJ2000Grid(savedStates[stateName]["GridLinesMgrFlagEquatorJ2000Grid"]);
160	GridLinesMgr.setFlagEclipticJ2000Grid(savedStates[stateName]["GridLinesMgrFlagEclipticJ2000Grid"]);
161	GridLinesMgr.setFlagGalacticGrid(savedStates[stateName]["GridLinesMgrFlagGalacticGrid"]);
162	GridLinesMgr.setFlagGalacticEquatorLine(savedStates[stateName]["GridLinesMgrFlagGalacticEquatorLine"]);
163	ConstellationMgr.setFlagLines(savedStates[stateName]["ConstellationMgrFlagLines"]);
164	ConstellationMgr.setFlagLabels(savedStates[stateName]["ConstellationMgrFlagLabels"]);
165	ConstellationMgr.setFlagBoundaries(savedStates[stateName]["ConstellationMgrFlagBoundaries"]);
166	ConstellationMgr.setFlagArt(savedStates[stateName]["ConstellationMgrFlagArt"]);
167	ConstellationMgr.setArtIntensity(savedStates[stateName]["ConstellationMgrArtIntensity"]);
168	ConstellationMgr.setFlagIsolateSelected(savedStates[stateName]["ConstellationMgrFlagIsolateSelected"]);
169	StarMgr.setFlagLabels(savedStates[stateName]["StarMgrFlagLabels"]);
170	StarMgr.setFlagStars(savedStates[stateName]["StarMgrFlagStars"]);
171	StarMgr.setLabelsAmount(savedStates[stateName]["StarMgrLabelsAmount"]);
172	StarMgr.setFlagSciNames(savedStates[stateName]["StarMgrFlagSciNames"]);
173	NebulaMgr.setFlagHints(savedStates[stateName]["NebulaMgrFlagHints"]);
174	NebulaMgr.setFlagShow(savedStates[stateName]["NebulaMgrFlagShow"]);
175//	NebulaMgr.setFlagDisplayNoTexture(savedStates[stateName]["NebulaMgrFlagDisplayNoTexture"]);
176	NebulaMgr.setLabelsAmount(savedStates[stateName]["NebulaMgrLabelsAmount"]);
177	NebulaMgr.setHintsAmount(savedStates[stateName]["NebulaMgrHintsAmount"]);
178	LandscapeMgr.setFlagCardinalsPoints(savedStates[stateName]["LandscapeMgrFlagCardinalsPoints"]);
179	LandscapeMgr.setFlagLandscape(savedStates[stateName]["LandscapeMgrFlagLandscape"]);
180	LandscapeMgr.setFlagAtmosphere(savedStates[stateName]["LandscapeMgrFlagAtmosphere"]);
181	LandscapeMgr.setFlagFog(savedStates[stateName]["LandscapeMgrFlagFog"]);
182	LandscapeMgr.setCurrentLandscapeID(savedStates[stateName]["LandscapeMgrCurrentLandscapeID"]);
183	//LandscapeMgr.setAtmosphereBortleLightPollution(savedStates[stateName]["LandscapeMgrAtmosphereBortleLightPollution"]);
184	StelSkyDrawer.setRelativeStarScale(savedStates[stateName]["StelSkyDrawerRelativeStarScale"]);
185	StelSkyDrawer.setAbsoluteStarScale(savedStates[stateName]["StelSkyDrawerAbsoluteStarScale"]);
186	StelSkyDrawer.setTwinkleAmount(savedStates[stateName]["StelSkyDrawerTwinkleAmount"]);
187	StelSkyDrawer.setFlagTwinkle(savedStates[stateName]["StelSkyDrawerFlagTwinkle"]);
188	//StelSkyDrawer.setFlagPointStar(savedStates[stateName]["StelSkyDrawerFlagPointStar"]);
189	//StelSkyDrawer.setBortleScale(savedStates[stateName]["StelSkyDrawerBortleScale"]);
190	StelSkyDrawer.setFlagLuminanceAdaptation(savedStates[stateName]["StelSkyDrawerFlagLuminanceAdaptation"]);
191	core.setMountMode(savedStates[stateName]["MountMode"]);
192	core.setNightMode(savedStates[stateName]["NightMode"]);
193	core.setProjectionMode(savedStates[stateName]["ProjectionMode"]);
194	core.setSkyCulture(savedStates[stateName]["SkyCulture"]);
195	core.setFlagGravityLabels(savedStates[stateName]["FlagGravityLabels"]);
196	core.setDiskViewport(savedStates[stateName]["DiskViewport"]);
197	core.setObserverLocation(savedStates[stateName]["ObserverLocation"]);
198	core.setAppLanguage(savedStates[stateName]["AppLanguage"]);
199	core.setSkyLanguage(savedStates[stateName]["SkyLanguage"]);
200
201	// optional restoration options...
202	if (!options["time"])
203	{
204		options["time"] = "smart";
205	}
206
207	if (options["time"] == "smart")
208	{
209		if (savedStates[stateName]["TimeIsNow"])
210		{
211			core.setRealTime();
212		}
213		else
214		{
215			core.setJDay(savedStates[stateName]["StateTime"]);
216			core.setTimeRate(savedStates[stateName]["StateTimeRate"]);
217		}
218	}
219	else if (options["time"] == "force")
220	{
221		core.setJDay(savedStates[stateName]["StateTime"]);
222		core.setTimeRate(savedStates[stateName]["StateTimeRate"]);
223	}
224
225	if (options["view"])
226	{
227		if (savedStates[stateName]["MountMode"] == "azimuthal")
228		{
229			core.moveToAltAzi(savedStates[stateName]["AltitudeAngle"], savedStates[stateName]["AzimuthAngle"] , 0);
230		}
231		else
232		{
233			core.moveToRaDec(savedStates[stateName]["RaAngle"], savedStates[stateName]["DecAngle"] , 0);
234		}
235	}
236
237	core.debug("restoreState() - state restored with ID: " + stateName);
238}
239
240