]> git.mxchange.org Git - flightgear.git/blobdiff - src/Cockpit/panel_io.cxx
new FSF address
[flightgear.git] / src / Cockpit / panel_io.cxx
index 64641b5f74c8f4db7aa569848e63216fe1644f74..6c624e2fce4fb48213f8f1a41e54c826f76a31f0 100644 (file)
 //  WITHOUT ANY WARRANTY; without even the implied warranty of
 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 //  General Public License for more details.
-// 
+//
 //  You should have received a copy of the GNU General Public License
 //  along with this program; if not, write to the Free Software
-//  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //
 //  $Id$
 
@@ -45,6 +45,7 @@
 
 // #include "panel.hxx"
 #include "panel_io.hxx"
+#include <Instrumentation/KLN89/kln89.hxx>
 
 //built-in layers
 #include "built_in/FGMagRibbon.hxx"
@@ -170,6 +171,19 @@ readConditions (SGConditional *component, const SGPropertyNode *node)
 static FGPanelAction *
 readAction (const SGPropertyNode * node, float w_scale, float h_scale)
 {
+  unsigned int i, j;
+  SGPropertyNode *binding;
+  vector<SGPropertyNode_ptr>bindings = node->getChildren("binding");
+
+  // button-less actions are fired initially
+  if (!node->hasValue("w") || !node->hasValue("h")) {
+    for (i = 0; i < bindings.size(); i++) {
+      FGBinding b(bindings[i]);
+      b.fire();
+    }
+    return 0;
+  }
+
   string name = node->getStringValue("name");
 
   int button = node->getIntValue("button");
@@ -181,20 +195,32 @@ readAction (const SGPropertyNode * node, float w_scale, float h_scale)
 
   FGPanelAction * action = new FGPanelAction(button, x, y, w, h, repeatable);
 
-  vector<SGPropertyNode_ptr>bindings = node->getChildren("binding");
+  SGPropertyNode * dest = fgGetNode("/sim/bindings/panel", true);
 
-  unsigned int i;
   for (i = 0; i < bindings.size(); i++) {
     SG_LOG(SG_INPUT, SG_INFO, "Reading binding "
-          << bindings[i]->getStringValue("command"));
-    action->addBinding(new FGBinding(bindings[i]), 0);
+      << bindings[i]->getStringValue("command"));
+
+    j = 0;
+    while (dest->getChild("binding", j))
+      j++;
+
+    binding = dest->getChild("binding", j, true);
+    copyProperties(bindings[i], binding);
+    action->addBinding(new FGBinding(binding), 0);
   }
 
   if (node->hasChild("mod-up")) {
-      bindings = node->getChild("mod-up")->getChildren("binding");
-      for (i = 0; i < bindings.size(); i++) {
-          action->addBinding(new FGBinding(bindings[i]), 1);
-      }
+    bindings = node->getChild("mod-up")->getChildren("binding");
+    for (i = 0; i < bindings.size(); i++) {
+      j = 0;
+      while (dest->getChild("binding", j))
+        j++;
+
+      binding = dest->getChild("binding", j, true);
+      copyProperties(bindings[i], binding);
+      action->addBinding(new FGBinding(binding), 1);
+    }
   }
 
   readConditions(action, node);
@@ -413,6 +439,7 @@ readLayer (const SGPropertyNode * node, float w_scale, float h_scale)
   string type = node->getStringValue("type");
   int w = node->getIntValue("w", -1);
   int h = node->getIntValue("h", -1);
+  bool emissive = node->getBoolValue("emissive", false);
   if (w != -1)
     w = int(w * w_scale);
   if (h != -1)
@@ -431,6 +458,11 @@ readLayer (const SGPropertyNode * node, float w_scale, float h_scale)
   if (type == "texture") {
     FGCroppedTexture texture = readTexture(node->getNode("texture"));
     layer = new FGTexturedLayer(texture, w, h);
+    if (emissive) {
+      FGTexturedLayer *tl=(FGTexturedLayer*)layer;
+      tl->setEmissive(true);
+    }
+
   }
 
                                // A group of sublayers.
@@ -734,12 +766,57 @@ readPanel (const SGPropertyNode * root)
     for (int i = 0; i < nInstruments; i++) {
       const SGPropertyNode * node = instrument_group->getChild(i);
       if (!strcmp(node->getName(), "instrument")) {
-       FGPanelInstrument * instrument = readInstrument(node);
-       if (instrument != 0)
-         panel->addInstrument(instrument);
+        FGPanelInstrument * instrument = readInstrument(node);
+        if (instrument != 0)
+          panel->addInstrument(instrument);
+      } else if(!strcmp(node->getName(), "special-instrument")) {
+        //cout << "Special instrument found in instruments section!\n";
+        const string name = node->getStringValue("name");
+        if(name == "KLN89 GPS") {
+          //cout << "Special instrument is KLN89\n";
+          
+          int x = node->getIntValue("x", -1);
+          int y = node->getIntValue("y", -1);
+          int real_w = node->getIntValue("w", -1);
+          int real_h = node->getIntValue("h", -1);
+          int w = node->getIntValue("w-base", -1);
+          int h = node->getIntValue("h-base", -1);
+          
+          if (x == -1 || y == -1) {
+            SG_LOG( SG_COCKPIT, SG_ALERT,
+            "x and y positions must be specified and > 0" );
+            return 0;
+          }
+          
+          float w_scale = 1.0;
+          float h_scale = 1.0;
+          if (real_w != -1) {
+            w_scale = float(real_w) / float(w);
+            w = real_w;
+          }
+          if (real_h != -1) {
+            h_scale = float(real_h) / float(h);
+            h = real_h;
+          }
+          
+          SG_LOG( SG_COCKPIT, SG_DEBUG, "Reading instrument " << name );
+          
+          // Warning - hardwired size!!!
+          RenderArea2D* instrument = new RenderArea2D(158, 40, 158, 40, x, y);
+          KLN89* gps = (KLN89*)globals->get_subsystem("kln89");
+                 if(gps == NULL) {
+                         gps = new KLN89(instrument);
+                         globals->add_subsystem("kln89", gps);
+                 }
+                 //gps->init();  // init seems to get called automagically.
+                 FGSpecialInstrument* gpsinst = new FGSpecialInstrument(gps);
+          panel->addInstrument(gpsinst);
+        } else {
+          SG_LOG( SG_COCKPIT, SG_WARN, "Unknown special instrument found" );
+        }
       } else {
-       SG_LOG( SG_COCKPIT, SG_INFO, "Skipping " << node->getName()
-                << " in instruments section" );
+        SG_LOG( SG_COCKPIT, SG_INFO, "Skipping " << node->getName()
+        << " in instruments section" );
       }
     }
   }