settings-file.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:15k
源码类别:

OpenGL

开发平台:

Visual C++

  1. /*
  2.  *  Celestia GTK+ Front-End
  3.  *  Copyright (C) 2005 Pat Suwalski <pat@suwalski.net>
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  $Id: settings-file.cpp,v 1.5 2008-01-18 04:36:11 suwalski Exp $
  11.  */
  12. #include <gtk/gtk.h>
  13. #include <celengine/body.h>
  14. #include <celengine/galaxy.h>
  15. #include <celengine/render.h>
  16. #include "settings-file.h"
  17. #include "common.h"
  18. /* Definitions: Helpers */
  19. static void getFlag(GKeyFile* file, int *flags, int setting, const gchar* section, const gchar* key, int* errors);
  20. /* ENTRY: Initializes and reads into memory the preferences */
  21. void initSettingsFile(AppData* app)
  22. {
  23. GError *error = NULL;
  24. app->settingsFile = g_key_file_new();
  25. char* fn = g_build_filename(g_get_home_dir(), CELESTIARC, NULL);
  26. g_key_file_load_from_file(app->settingsFile, fn, G_KEY_FILE_NONE, &error);
  27. /* Should check G_KEY_FILE_ERROR_NOT_FOUND, but bug in glib returns wrong
  28.  * error code. */
  29. if (error != NULL && g_file_test(fn, G_FILE_TEST_EXISTS))
  30. {
  31. g_print("Error reading '%s': %s.n", fn, error->message);
  32. exit(1);
  33. }
  34. g_free(fn);
  35. }
  36. /* ENTRY: Applies preferences needed before initializing the core */
  37. void applySettingsFilePre(AppData* app, GKeyFile* file)
  38. {
  39. int sizeX, sizeY, positionX, positionY;
  40. GError* e;
  41. /* Numbers require special treatment because if they are not found they
  42.  * are not set to NULL like strings. So, if that is the case, we set them
  43.  * to values that will cause setSane*() to set defaults. */
  44. e= NULL;
  45. sizeX = g_key_file_get_integer(file, "Window", "width", &e);
  46. if (e != NULL) sizeX = -1;
  47. e= NULL;
  48. sizeY = g_key_file_get_integer(file, "Window", "height", &e);
  49. if (e != NULL) sizeY = -1;
  50. e= NULL;
  51. positionX = g_key_file_get_integer(file, "Window", "x", &e);
  52. if (e != NULL) positionX = -1;
  53. e= NULL;
  54. positionY = g_key_file_get_integer(file, "Window", "y", &e);
  55. if (e != NULL) positionY = -1;
  56. /* These next two cannot be checked for sanity, default set here */
  57. e= NULL;
  58. app->fullScreen = g_key_file_get_boolean(file, "Window", "fullScreen", &e);
  59. if (e != NULL) app->fullScreen = FALSE;
  60. /* Nothing is set here. The prefs structure is used to set things at the
  61.  * corrent times. */
  62. setSaneWinSize(app, sizeX, sizeY);
  63. setSaneWinPosition(app, positionX, positionY);
  64. }
  65. /* ENTRY: Applies preferences after the core is initialized */
  66. void applySettingsFileMain(AppData* app, GKeyFile* file)
  67. {
  68. GError* e;
  69. float ambientLight, visualMagnitude, galaxyLightGain;
  70. int errors, verbosity, starStyle, textureResolution, distanceLimit, rf, om, lm;
  71. /* See comment in applySettingsFilePrefs() */
  72. e = NULL;
  73. ambientLight = (float)g_key_file_get_integer(file, "Main", "ambientLight", &e) / 1000.0;
  74. if (e != NULL) ambientLight = -1.0;
  75. e = NULL;
  76. visualMagnitude = (float)g_key_file_get_integer(file, "Main", "visualMagnitude", &e) / 1000.0;
  77. if (e != NULL) visualMagnitude = -1.0;
  78. e = NULL;
  79. galaxyLightGain = (float)g_key_file_get_integer(file, "Main", "galaxyLightGain", &e) / 1000.0;
  80. if (e != NULL) galaxyLightGain = -1.0;
  81. e = NULL;
  82. distanceLimit = g_key_file_get_integer(file, "Main", "distanceLimit", &e);
  83. if (e != NULL) distanceLimit = -1;
  84. e = NULL;
  85. verbosity = g_key_file_get_integer(file, "Main", "verbosity", &e);
  86. if (e != NULL) verbosity = -1;
  87. e = NULL;
  88. starStyle = g_key_file_get_integer(file, "Main", "starStyle", &e);
  89. if (e != NULL) starStyle = -1;
  90. e = NULL;
  91. textureResolution = g_key_file_get_integer(file, "Main", "textureResolution", &e);
  92. if (e != NULL) textureResolution = -1;
  93. e = NULL;
  94. app->showLocalTime = g_key_file_get_boolean(file, "Main", "localTime", &e);
  95. if (e != NULL) app->showLocalTime = FALSE;
  96. e = NULL;
  97. app->renderer->setVideoSync(g_key_file_get_integer(file, "Main", "starStyle", &e));
  98. if (e != NULL) app->renderer->setVideoSync(TRUE);
  99. /* All settings that need sanity checks get them */
  100. setSaneAmbientLight(app, ambientLight);
  101. setSaneVisualMagnitude(app, visualMagnitude);
  102. setSaneGalaxyLightGain(galaxyLightGain);
  103. setSaneDistanceLimit(app, distanceLimit);
  104. setSaneVerbosity(app, verbosity);
  105. setSaneStarStyle(app, (Renderer::StarStyle)starStyle);
  106. setSaneTextureResolution(app, textureResolution);
  107. setSaneAltSurface(app, g_key_file_get_string(file, "Main", "altSurfaceName", NULL));
  108. /* Render Flags */
  109. errors = 0;
  110. rf = Renderer::ShowNothing;
  111. getFlag(file, &rf, Renderer::ShowStars, "RenderFlags", "stars", &errors);
  112. getFlag(file, &rf, Renderer::ShowPlanets, "RenderFlags", "planets", &errors);
  113. getFlag(file, &rf, Renderer::ShowGalaxies, "RenderFlags", "galaxies", &errors);
  114. getFlag(file, &rf, Renderer::ShowDiagrams, "RenderFlags", "diagrams", &errors);
  115. getFlag(file, &rf, Renderer::ShowCloudMaps, "RenderFlags", "cloudMaps", &errors);
  116. getFlag(file, &rf, Renderer::ShowOrbits, "RenderFlags", "orbits", &errors);
  117. getFlag(file, &rf, Renderer::ShowCelestialSphere, "RenderFlags", "celestialSphere", &errors);
  118. getFlag(file, &rf, Renderer::ShowNightMaps, "RenderFlags", "nightMaps", &errors);
  119. getFlag(file, &rf, Renderer::ShowAtmospheres, "RenderFlags", "atmospheres", &errors);
  120. getFlag(file, &rf, Renderer::ShowSmoothLines, "RenderFlags", "smoothLines", &errors);
  121. getFlag(file, &rf, Renderer::ShowEclipseShadows, "RenderFlags", "eclipseShadows", &errors);
  122. getFlag(file, &rf, Renderer::ShowRingShadows, "RenderFlags", "ringShadows", &errors);
  123. getFlag(file, &rf, Renderer::ShowBoundaries, "RenderFlags", "boundaries", &errors);
  124. getFlag(file, &rf, Renderer::ShowAutoMag, "RenderFlags", "autoMag", &errors);
  125. getFlag(file, &rf, Renderer::ShowCometTails, "RenderFlags", "cometTails", &errors);
  126. getFlag(file, &rf, Renderer::ShowMarkers, "RenderFlags", "markers", &errors);
  127. getFlag(file, &rf, Renderer::ShowPartialTrajectories, "RenderFlags", "partialTrajectories", &errors);
  128. getFlag(file, &rf, Renderer::ShowNebulae, "RenderFlags", "nebulae", &errors);
  129. getFlag(file, &rf, Renderer::ShowOpenClusters, "RenderFlags", "openClusters", &errors);
  130. getFlag(file, &rf, Renderer::ShowGlobulars, "RenderFlags", "globulars", &errors);
  131. getFlag(file, &rf, Renderer::ShowGalacticGrid, "RenderFlags", "gridGalactic", &errors);
  132. getFlag(file, &rf, Renderer::ShowEclipticGrid, "RenderFlags", "gridEcliptic", &errors);
  133. getFlag(file, &rf, Renderer::ShowHorizonGrid, "RenderFlags", "gridHorizontal", &errors);
  134. /* If any flag is missing, use defaults for all. */
  135. if (errors > 0)
  136. setDefaultRenderFlags(app);
  137. else
  138. app->renderer->setRenderFlags(rf);
  139. /* Orbit Mask */
  140. errors = 0;
  141. om = 0;
  142. getFlag(file, &om, Body::Planet, "OrbitMask", "planet", &errors);
  143. getFlag(file, &om, Body::Moon, "OrbitMask", "moon", &errors);
  144. getFlag(file, &om, Body::Asteroid, "OrbitMask", "asteroid", &errors);
  145. getFlag(file, &om, Body::Comet, "OrbitMask", "comet", &errors);
  146. getFlag(file, &om, Body::Spacecraft, "OrbitMask", "spacecraft", &errors);
  147. getFlag(file, &om, Body::Invisible, "OrbitMask", "invisible", &errors);
  148. getFlag(file, &om, Body::Unknown, "OrbitMask", "unknown", &errors);
  149. /* If any orbit is missing, use core defaults for all (do nothing). */
  150. if (errors == 0)
  151. app->renderer->setOrbitMask(om);
  152. /* Label Mode */
  153. errors = 0;
  154. lm = Renderer::NoLabels;
  155. getFlag(file, &lm, Renderer::StarLabels, "LabelMode", "star", &errors);
  156. getFlag(file, &lm, Renderer::PlanetLabels, "LabelMode", "planet", &errors);
  157. getFlag(file, &lm, Renderer::MoonLabels, "LabelMode", "moon", &errors);
  158. getFlag(file, &lm, Renderer::ConstellationLabels, "LabelMode", "constellation", &errors);
  159. getFlag(file, &lm, Renderer::GalaxyLabels, "LabelMode", "galaxy", &errors);
  160. getFlag(file, &lm, Renderer::AsteroidLabels, "LabelMode", "asteroid", &errors);
  161. getFlag(file, &lm, Renderer::SpacecraftLabels, "LabelMode", "spacecraft", &errors);
  162. getFlag(file, &lm, Renderer::LocationLabels, "LabelMode", "location", &errors);
  163. getFlag(file, &lm, Renderer::CometLabels, "LabelMode", "comet", &errors);
  164. getFlag(file, &lm, Renderer::NebulaLabels, "LabelMode", "nebula", &errors);
  165. getFlag(file, &lm, Renderer::OpenClusterLabels, "LabelMode", "opencluster", &errors);
  166. getFlag(file, &lm, Renderer::I18nConstellationLabels, "LabelMode", "i18n", &errors);
  167. getFlag(file, &lm, Renderer::GlobularLabels, "LabelMode", "globular", &errors);
  168. /* If any label is missing, use core defaults for all (do nothing). */
  169. if (errors == 0)
  170. app->renderer->setLabelMode(lm);
  171. }
  172. /* ENTRY: Saves settings to file */
  173. void saveSettingsFile(AppData* app)
  174. {
  175. int rf, om, lm;
  176. GKeyFile* file = app->settingsFile;
  177. char* fn = g_build_filename(g_get_home_dir(), CELESTIARC, NULL);
  178. FILE* outfile;
  179. g_key_file_set_integer(file, "Main", "ambientLight", (int)(1000 * app->renderer->getAmbientLightLevel()));
  180. g_key_file_set_comment(file, "Main", "ambientLight", "ambientLight = (int)(1000 * AmbientLightLevel)", NULL);
  181. g_key_file_set_integer(file, "Main", "visualMagnitude", (int)(1000 * app->simulation->getFaintestVisible()));
  182. g_key_file_set_comment(file, "Main", "visualMagnitude", "visualMagnitude = (int)(1000 * FaintestVisible)", NULL);
  183. g_key_file_set_integer(file, "Main", "galaxyLightGain", (int)(1000 * Galaxy::getLightGain()));
  184. g_key_file_set_comment(file, "Main", "galaxyLightGain", "galaxyLightGain = (int)(1000 * GalaxyLightGain)", NULL);
  185. g_key_file_set_integer(file, "Main", "distanceLimit", (int)app->renderer->getDistanceLimit());
  186. g_key_file_set_comment(file, "Main", "distanceLimit", "Rendering limit in light-years", NULL);
  187. g_key_file_set_boolean(file, "Main", "localTime", app->showLocalTime);
  188. g_key_file_set_comment(file, "Main", "localTime", "Display time in terms of local time zone", NULL);
  189. g_key_file_set_integer(file, "Main", "verbosity", app->core->getHudDetail());
  190. g_key_file_set_comment(file, "Main", "verbosity", "Level of Detail in the heads-up-display. 0=None, 1=Terse, 2=Verbose", NULL);
  191. g_key_file_set_integer(file, "Main", "starStyle", app->renderer->getStarStyle());
  192. g_key_file_set_comment(file, "Main", "starStyle", "Style of star rendering. 0=Fuzzy Points, 1=Points, 2=Scaled Discs", NULL);
  193. g_key_file_set_integer(file, "Main", "textureResolution", app->renderer->getResolution());
  194. g_key_file_set_comment(file, "Main", "textureResolution", "Resolution of textures. 0=Low, 1=Medium, 2=High", NULL);
  195. g_key_file_set_string(file, "Main", "altSurfaceName", app->simulation->getActiveObserver()->getDisplayedSurface().c_str());
  196. g_key_file_set_boolean(file, "Main", "videoSync", app->renderer->getVideoSync());
  197. g_key_file_set_comment(file, "Main", "videoSync", "Sync Framerate to Video Refresh", NULL);
  198. g_key_file_set_integer(file, "Window", "width", getWinWidth(app));
  199. g_key_file_set_integer(file, "Window", "height", getWinHeight(app));
  200. g_key_file_set_integer(file, "Window", "x", getWinX(app));
  201. g_key_file_set_integer(file, "Window", "y", getWinY(app));
  202. g_key_file_set_boolean(file, "Window", "fullScreen", app->fullScreen);
  203. rf = app->renderer->getRenderFlags();
  204. g_key_file_set_boolean(file, "RenderFlags", "stars", rf & Renderer::ShowStars);
  205. g_key_file_set_boolean(file, "RenderFlags", "planets", rf & Renderer::ShowPlanets);
  206. g_key_file_set_boolean(file, "RenderFlags", "galaxies", rf & Renderer::ShowGalaxies);
  207. g_key_file_set_boolean(file, "RenderFlags", "diagrams", rf & Renderer::ShowDiagrams);
  208. g_key_file_set_boolean(file, "RenderFlags", "cloudMaps", rf & Renderer::ShowCloudMaps);
  209. g_key_file_set_boolean(file, "RenderFlags", "orbits", rf & Renderer::ShowOrbits);
  210. g_key_file_set_boolean(file, "RenderFlags", "celestialSphere", rf & Renderer::ShowCelestialSphere);
  211. g_key_file_set_boolean(file, "RenderFlags", "nightMaps", rf & Renderer::ShowNightMaps);
  212. g_key_file_set_boolean(file, "RenderFlags", "atmospheres", rf & Renderer::ShowAtmospheres);
  213. g_key_file_set_boolean(file, "RenderFlags", "smoothLines", rf & Renderer::ShowSmoothLines);
  214. g_key_file_set_boolean(file, "RenderFlags", "eclipseShadows", rf & Renderer::ShowEclipseShadows);
  215. g_key_file_set_boolean(file, "RenderFlags", "ringShadows", rf & Renderer::ShowRingShadows);
  216. g_key_file_set_boolean(file, "RenderFlags", "boundaries", rf & Renderer::ShowBoundaries);
  217. g_key_file_set_boolean(file, "RenderFlags", "autoMag", rf & Renderer::ShowAutoMag);
  218. g_key_file_set_boolean(file, "RenderFlags", "cometTails", rf & Renderer::ShowCometTails);
  219. g_key_file_set_boolean(file, "RenderFlags", "markers", rf & Renderer::ShowMarkers);
  220. g_key_file_set_boolean(file, "RenderFlags", "partialTrajectories", rf & Renderer::ShowPartialTrajectories);
  221. g_key_file_set_boolean(file, "RenderFlags", "nebulae", rf & Renderer::ShowNebulae);
  222. g_key_file_set_boolean(file, "RenderFlags", "openClusters", rf & Renderer::ShowOpenClusters);
  223. g_key_file_set_boolean(file, "RenderFlags", "globulars", rf & Renderer::ShowGlobulars);
  224. g_key_file_set_boolean(file, "RenderFlags", "gridGalactic", rf & Renderer::ShowGalacticGrid);
  225. g_key_file_set_boolean(file, "RenderFlags", "gridEcliptic", rf & Renderer::ShowEclipticGrid);
  226. g_key_file_set_boolean(file, "RenderFlags", "gridHorizontal", rf & Renderer::ShowHorizonGrid);
  227. om = app->renderer->getOrbitMask();
  228. g_key_file_set_boolean(file, "OrbitMask", "planet", om & Body::Planet);
  229. g_key_file_set_boolean(file, "OrbitMask", "moon", om & Body::Moon);
  230. g_key_file_set_boolean(file, "OrbitMask", "asteroid", om & Body::Asteroid);
  231. g_key_file_set_boolean(file, "OrbitMask", "comet", om & Body::Comet);
  232. g_key_file_set_boolean(file, "OrbitMask", "spacecraft", om & Body::Spacecraft);
  233. g_key_file_set_boolean(file, "OrbitMask", "invisible", om & Body::Invisible);
  234. g_key_file_set_boolean(file, "OrbitMask", "unknown", om & Body::Unknown);
  235. lm = app->renderer->getLabelMode();
  236. g_key_file_set_boolean(file, "LabelMode", "star", lm & Renderer::StarLabels);
  237. g_key_file_set_boolean(file, "LabelMode", "planet", lm & Renderer::PlanetLabels);
  238. g_key_file_set_boolean(file, "LabelMode", "moon", lm & Renderer::MoonLabels);
  239. g_key_file_set_boolean(file, "LabelMode", "constellation", lm & Renderer::ConstellationLabels);
  240. g_key_file_set_boolean(file, "LabelMode", "galaxy", lm & Renderer::GalaxyLabels);
  241. g_key_file_set_boolean(file, "LabelMode", "asteroid", lm & Renderer::AsteroidLabels);
  242. g_key_file_set_boolean(file, "LabelMode", "spacecraft", lm & Renderer::SpacecraftLabels);
  243. g_key_file_set_boolean(file, "LabelMode", "location", lm & Renderer::LocationLabels);
  244. g_key_file_set_boolean(file, "LabelMode", "comet", lm & Renderer::CometLabels);
  245. g_key_file_set_boolean(file, "LabelMode", "nebula", lm & Renderer::NebulaLabels);
  246. g_key_file_set_boolean(file, "LabelMode", "opencluster", lm & Renderer::OpenClusterLabels);
  247. g_key_file_set_boolean(file, "LabelMode", "i18n", lm & Renderer::I18nConstellationLabels);
  248. g_key_file_set_boolean(file, "LabelMode", "globular", lm & Renderer::GlobularLabels);
  249. g_key_file_set_comment(file, "RenderFlags", NULL, "All Render Flag values must be true or false", NULL);
  250. g_key_file_set_comment(file, "OrbitMask", NULL, "All Orbit Mask values must be true or false", NULL);
  251. g_key_file_set_comment(file, "LabelMode", NULL, "All Label Mode values must be true or false", NULL);
  252. /* Write the settings to a file */
  253. outfile = fopen(fn, "w");
  254. if (outfile == NULL)
  255. g_print("Error writing '%s'.n", fn);
  256. fputs(g_key_file_to_data(file, NULL, NULL), outfile);
  257. g_free(fn);
  258. }
  259. /* HELPER: gets an or-group flag and handles error checking */
  260. static void getFlag(GKeyFile* file, int *flags, int setting, const gchar* section, const gchar* key, int* errors)
  261. {
  262. GError* e = NULL;
  263. *flags |= setting * g_key_file_get_boolean(file, section, key, &e);
  264. if (e != NULL)
  265. *errors += 1;
  266. }