From 07e9b48344f9fce117f11e7f6a8c78c4932d9ee0 Mon Sep 17 00:00:00 2001
From: Thomas Geymayer <tomgey@gmail.com>
Date: Sat, 22 Jun 2013 17:06:34 +0200
Subject: [PATCH] Preserve current view on reset/reinit/reposition

---
 src/Main/fg_commands.cxx | 14 +++++++++++---
 src/Viewer/viewmgr.cxx   | 11 +++++++++--
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/src/Main/fg_commands.cxx b/src/Main/fg_commands.cxx
index 8326aa77a..5a22bcdeb 100644
--- a/src/Main/fg_commands.cxx
+++ b/src/Main/fg_commands.cxx
@@ -158,7 +158,7 @@ compare_values (SGPropertyNode * value1, SGPropertyNode * value2)
 }
 
 
-
+
 ////////////////////////////////////////////////////////////////////////
 // Command implementations.
 ////////////////////////////////////////////////////////////////////////
@@ -375,17 +375,25 @@ do_preferences_load (const SGPropertyNode * arg)
 }
 
 static void
-do_view_next( bool )
+do_view_next(bool do_it)
 {
+  // Only switch view if really requested to do so (and not for example while
+  // reset/reposition where /command/view/next is set to false)
+  if( do_it )
+  {
     globals->get_current_view()->setHeadingOffset_deg(0.0);
     globals->get_viewmgr()->next_view();
+  }
 }
 
 static void
-do_view_prev( bool )
+do_view_prev(bool do_it)
 {
+  if( do_it )
+  {
     globals->get_current_view()->setHeadingOffset_deg(0.0);
     globals->get_viewmgr()->prev_view();
+  }
 }
 
 /**
diff --git a/src/Viewer/viewmgr.cxx b/src/Viewer/viewmgr.cxx
index d2bd880ec..5af533126 100644
--- a/src/Viewer/viewmgr.cxx
+++ b/src/Viewer/viewmgr.cxx
@@ -144,6 +144,8 @@ FGViewMgr::init ()
 void
 FGViewMgr::reinit ()
 {
+  int current_view_index = current;
+
   // reset offsets and fov to configuration defaults
   for (unsigned int i = 0; i < config_list.size(); i++) {
     SGPropertyNode *n = config_list[i];
@@ -175,7 +177,7 @@ FGViewMgr::reinit ()
     fgSetDouble("/sim/current-view/target-z-offset-m",
         n->getDoubleValue("config/target-z-offset-m"));
   }
-  setView(0);
+  setView(current_view_index);
 }
 
 typedef double (FGViewMgr::*double_getter)() const;
@@ -219,7 +221,12 @@ FGViewMgr::do_bind()
 
   _tiedProperties.Tie("view-number", this,
                       &FGViewMgr::getView, &FGViewMgr::setView);
-  fgSetArchivable("/sim/current-view/view-number", false);
+  SGPropertyNode* view_number =
+    _tiedProperties.getRoot()->getNode("view-number");
+  view_number->setAttribute(SGPropertyNode::ARCHIVE, false);
+
+  // Keep view on reset/reinit
+  view_number->setAttribute(SGPropertyNode::PRESERVE, true);
 
   _tiedProperties.Tie("axes/long", this,
                       (double_getter)0, &FGViewMgr::setViewAxisLong);