Hi,

in an attempt to make fgfs a little more user friendly, I implemented persistence for changes to some options, namely the rendering dialog, sound volume and static-lod settings. They are saved to ~/.fgfs/preferences.xml on exit and loaded in on startup.

This patch is just for review and testing as it can and has to be improved. The path is static and as such not really platform independent, and maybe there are more options worth saving. And I don't like that all saved properties are now listed in fg_commands.cxx. There should be a more elegant way...

Thanks for review,
Nine
Index: src/Main/fg_commands.cxx
===================================================================
RCS file: /var/cvs/FlightGear-0.9/source/src/Main/fg_commands.cxx,v
retrieving revision 1.64
diff -u -3 -p -r1.64 fg_commands.cxx
--- src/Main/fg_commands.cxx	11 Nov 2005 07:17:26 -0000	1.64
+++ src/Main/fg_commands.cxx	13 Nov 2005 12:46:01 -0000
@@ -189,9 +189,48 @@ do_nasal (const SGPropertyNode * arg)
 static bool
 do_exit (const SGPropertyNode * arg)
 {
-  SG_LOG(SG_INPUT, SG_INFO, "Program exit requested.");
-  fgExit(arg->getIntValue("status", 0));
-  return true;
+    SG_LOG(SG_INPUT, SG_INFO, "Program exit requested.");
+
+    SGPath config( globals->get_fg_root() );
+    char* envp = ::getenv( "HOME" );
+    if ( envp != NULL ) {
+        config.set( envp );
+        config.append( ".fgfs" );
+        config.append( "preferences.xml" );
+        SG_LOG(SG_INPUT, SG_INFO, "Saving user preferences");
+        try {
+            SGPropertyNode preferences;
+            preferences.getNode("/sim/hud/draw-fps", true)->setIntValue(fgGetInt("/sim/hud/draw-fps"));
+            preferences.getNode("/sim/rendering/horizon-effect", true)->setBoolValue(fgGetBool("/sim/rendering/horizon-effect"));
+            preferences.getNode("/sim/rendering/enhanced-lighting", true)->setBoolValue(fgGetBool("/sim/rendering/enhanced-lighting"));
+            preferences.getNode("/sim/rendering/distance-attenuation", true)->setBoolValue(fgGetBool("/sim/rendering/distance-attenuation"));
+            preferences.getNode("/sim/rendering/specular-highlight", true)->setBoolValue(fgGetBool("/sim/rendering/specular-highlight"));
+            preferences.getNode("/sim/rendering/precipitation-enable", true)->setBoolValue(fgGetBool("/sim/rendering/precipitation-enable"));
+            preferences.getNode("/sim/rendering/lightning-enable", true)->setBoolValue(fgGetBool("/sim/rendering/lightning-enable"));
+            preferences.getNode("/sim/rendering/bump-mapping", true)->setBoolValue(fgGetBool("/sim/rendering/bump-mapping"));
+            preferences.getNode("/sim/rendering/clouds3d-enable", true)->setBoolValue(fgGetBool("/sim/rendering/clouds3d-enable"));
+            preferences.getNode("/sim/rendering/clouds3d-vis-range", true)->setFloatValue(fgGetFloat("/sim/rendering/clouds3d-vis-range"));
+            preferences.getNode("/sim/rendering/clouds3d-density", true)->setFloatValue(fgGetFloat("/sim/rendering/clouds3d-density"));
+            preferences.getNode("/sim/rendering/clouds3d-cache-size", true)->setIntValue(fgGetInt("/sim/rendering/clouds3d-cache-size"));
+            preferences.getNode("/sim/rendering/clouds3d-cache-resolution", true)->setIntValue(fgGetInt("/sim/rendering/clouds3d-cache-resolution"));
+            preferences.getNode("/sim/rendering/shadows-ac", true)->setBoolValue(fgGetBool("/sim/rendering/shadows-ac"));
+            preferences.getNode("/sim/rendering/shadows-ac-transp", true)->setBoolValue(fgGetBool("/sim/rendering/shadows-ac-transp"));
+            preferences.getNode("/sim/rendering/shadows-to", true)->setBoolValue(fgGetBool("/sim/rendering/shadows-to"));
+            preferences.getNode("/sim/rendering/shadows-ai", true)->setBoolValue(fgGetBool("/sim/rendering/shadows-ai"));
+            preferences.getNode("/sim/rendering/shadows-debug", true)->setBoolValue(fgGetBool("/sim/rendering/shadows-debug"));
+            preferences.getNode("/sim/rendering/static-lod/detailed", true)->setIntValue(fgGetInt("/sim/rendering/static-lod/detailed"));
+            preferences.getNode("/sim/rendering/static-lod/rough", true)->setIntValue(fgGetInt("/sim/rendering/static-lod/rough"));
+            preferences.getNode("/sim/rendering/static-lod/bare", true)->setIntValue(fgGetInt("/sim/rendering/static-lod/bare"));
+            preferences.getNode("/sim/sound/volume", true)->setFloatValue(fgGetFloat("/sim/sound/volume"));
+            writeProperties(config.str(), &preferences, true);
+        } catch (const sg_exception &e) {
+            guiErrorMessage("Error saving preferences: ", e);
+        }
+
+        SG_LOG(SG_INPUT, SG_INFO, "Finished Saving user preferences");
+    }
+    fgExit(arg->getIntValue("status", 0));
+    return true;
 }
 
 
Index: src/Main/fg_init.cxx
===================================================================
RCS file: /var/cvs/FlightGear-0.9/source/src/Main/fg_init.cxx,v
retrieving revision 1.138
diff -u -3 -p -r1.138 fg_init.cxx
--- src/Main/fg_init.cxx	11 Nov 2005 15:08:18 -0000	1.138
+++ src/Main/fg_init.cxx	13 Nov 2005 12:46:02 -0000
@@ -607,6 +607,18 @@ bool fgInitConfig ( int argc, char **arg
         SG_LOG( SG_INPUT, SG_ALERT, "No default aircraft specified" );
     }
 
+    SGPath config( globals->get_fg_root() );
+
+    char* envp = ::getenv( "HOME" );
+    if ( envp != NULL ) {
+        config.set( envp );
+        config.append( ".fgfs" );
+        config.append( "preferences.xml" );
+        SG_LOG(SG_INPUT, SG_INFO, "Reading user preferences");
+        fgLoadProps(config.str().c_str(), globals->get_props(), false);
+        SG_LOG(SG_INPUT, SG_INFO, "Finished Reading user preferences");
+    }
+
     // parse options after loading aircraft to ensure any user
     // overrides of defaults are honored.
     do_options(argc, argv);
_______________________________________________
Flightgear-devel mailing list
Flightgear-devel@flightgear.org
http://mail.flightgear.org/mailman/listinfo/flightgear-devel
2f585eeea02e2c79d7b1d8c4963bae2d

Reply via email to