X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCockpit%2Fpanel_io.cxx;h=64641b5f74c8f4db7aa569848e63216fe1644f74;hb=c0b4531d04215f76f9cf65afbdaed6b7c0b32634;hp=f77ff2626bab464a784a82b4b43b8d766848812b;hpb=608668bd5f479368003ee26b35c1165bbe1e2d41;p=flightgear.git diff --git a/src/Cockpit/panel_io.cxx b/src/Cockpit/panel_io.cxx index f77ff2626..64641b5f7 100644 --- a/src/Cockpit/panel_io.cxx +++ b/src/Cockpit/panel_io.cxx @@ -26,12 +26,13 @@ # include #endif -#include -#include +#include // for strcmp() -#include +#include +#include #include -#include +#include +#include #include STL_IOSTREAM #include STL_FSTREAM @@ -42,80 +43,17 @@ #include -#include "panel.hxx" -#include "steam.hxx" +// #include "panel.hxx" #include "panel_io.hxx" -#if !defined (SG_HAVE_NATIVE_SGI_COMPILERS) +//built-in layers +#include "built_in/FGMagRibbon.hxx" + SG_USING_STD(istream); SG_USING_STD(ifstream); -#endif SG_USING_STD(string); - -//////////////////////////////////////////////////////////////////////// -// Built-in layer for the magnetic compass ribbon layer. -// -// TODO: move this out into a special directory for built-in -// layers of various sorts. -//////////////////////////////////////////////////////////////////////// - -class FGMagRibbon : public FGTexturedLayer -{ -public: - FGMagRibbon (int w, int h); - virtual ~FGMagRibbon () {} - - virtual void draw (); -}; - -FGMagRibbon::FGMagRibbon (int w, int h) - : FGTexturedLayer(w, h) -{ - FGCroppedTexture texture("Aircraft/Instruments/Textures/compass-ribbon.rgb"); - setTexture(texture); -} - -void -FGMagRibbon::draw () -{ - double heading = FGSteam::get_MH_deg(); - double xoffset, yoffset; - - while (heading >= 360.0) { - heading -= 360.0; - } - while (heading < 0.0) { - heading += 360.0; - } - - if (heading >= 60.0 && heading <= 180.0) { - xoffset = heading / 240.0; - yoffset = 0.75; - } else if (heading >= 150.0 && heading <= 270.0) { - xoffset = (heading - 90.0) / 240.0; - yoffset = 0.50; - } else if (heading >= 240.0 && heading <= 360.0) { - xoffset = (heading - 180.0) / 240.0; - yoffset = 0.25; - } else { - if (heading < 270.0) - heading += 360.0; - xoffset = (heading - 270.0) / 240.0; - yoffset = 0.0; - } - - xoffset = 1.0 - xoffset; - // Adjust to put the number in the centre - xoffset -= 0.25; - - FGCroppedTexture &t = getTexture(); - t.setCrop(xoffset, yoffset, xoffset + 0.5, yoffset + 0.25); - FGTexturedLayer::draw(); -} - - //////////////////////////////////////////////////////////////////////// // Read and construct a panel. @@ -193,12 +131,13 @@ readTexture (const SGPropertyNode * node) //////////////////////////////////////////////////////////////////////// static void -readConditions (FGConditional * component, const SGPropertyNode * node) +readConditions (SGConditional *component, const SGPropertyNode *node) { const SGPropertyNode * conditionNode = node->getChild("condition"); if (conditionNode != 0) // The top level is implicitly AND - component->setCondition(fgReadCondition(conditionNode)); + component->setCondition(sgReadCondition(globals->get_props(), + conditionNode) ); } @@ -238,14 +177,24 @@ readAction (const SGPropertyNode * node, float w_scale, float h_scale) int y = int(node->getIntValue("y") * h_scale); int w = int(node->getIntValue("w") * w_scale); int h = int(node->getIntValue("h") * h_scale); + bool repeatable = node->getBoolValue("repeatable", true); + + FGPanelAction * action = new FGPanelAction(button, x, y, w, h, repeatable); - FGPanelAction * action = new FGPanelAction(button, x, y, w, h); + vectorbindings = node->getChildren("binding"); - vectorbindings = node->getChildren("binding"); - for (unsigned int i = 0; i < bindings.size(); i++) { + 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])); // TODO: allow modifiers + action->addBinding(new FGBinding(bindings[i]), 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); + } } readConditions(action, node); @@ -288,20 +237,23 @@ readTransformation (const SGPropertyNode * node, float w_scale, float h_scale) string propName = node->getStringValue("property", ""); SGPropertyNode * target = 0; - if (type == "") { - SG_LOG( SG_COCKPIT, SG_ALERT, + if (type.empty()) { + SG_LOG( SG_COCKPIT, SG_INFO, "No type supplied for transformation " << name << " assuming \"rotation\"" ); type = "rotation"; } - if (propName != (string)"") { - target = fgGetNode(propName, true); + if (!propName.empty()) { + target = fgGetNode(propName.c_str(), true); } t->node = target; t->min = node->getFloatValue("min", -9999999); t->max = node->getFloatValue("max", 99999999); + t->has_mod = node->hasChild("modulator"); + if (t->has_mod) + t->mod = node->getFloatValue("modulator"); t->factor = node->getFloatValue("scale", 1.0); t->offset = node->getFloatValue("offset", 0.0); @@ -313,7 +265,7 @@ readTransformation (const SGPropertyNode * node, float w_scale, float h_scale) t->table = new SGInterpTable(); for(int i = 0; i < trans_table->nChildren(); i++) { const SGPropertyNode * node = trans_table->getChild(i); - if (node->getName() == "entry") { + if (!strcmp(node->getName(), "entry")) { double ind = node->getDoubleValue("ind", 0.0); double dep = node->getDoubleValue("dep", 0.0); SG_LOG( SG_COCKPIT, SG_INFO, "Adding interpolation entry " @@ -390,7 +342,7 @@ readTextChunk (const SGPropertyNode * node) string format = node->getStringValue("format"); // Default to literal text. - if (type == "") { + if (type.empty()) { SG_LOG( SG_COCKPIT, SG_INFO, "No type provided for text chunk " << name << " assuming \"literal\""); type = "literal"; @@ -413,9 +365,11 @@ readTextChunk (const SGPropertyNode * node) else if (type == "number-value") { string propName = node->getStringValue("property"); float scale = node->getFloatValue("scale", 1.0); - SGPropertyNode * target = fgGetNode(propName, true); + float offset = node->getFloatValue("offset", 0.0); + bool truncation = node->getBoolValue("truncate", false); + SGPropertyNode * target = fgGetNode(propName.c_str(), true); chunk = new FGTextLayer::Chunk(FGTextLayer::DOUBLE_VALUE, target, - format, scale); + format, scale, offset, truncation); } // Unknown type. @@ -465,8 +419,8 @@ readLayer (const SGPropertyNode * node, float w_scale, float h_scale) h = int(h * h_scale); - if (type == "") { - SG_LOG( SG_COCKPIT, SG_ALERT, + if (type.empty()) { + SG_LOG( SG_COCKPIT, SG_INFO, "No type supplied for layer " << name << " assuming \"texture\"" ); type = "texture"; @@ -484,11 +438,8 @@ readLayer (const SGPropertyNode * node, float w_scale, float h_scale) layer = new FGGroupLayer(); for (int i = 0; i < node->nChildren(); i++) { const SGPropertyNode * child = node->getChild(i); - cerr << "Trying child " << child->getName() << endl; - if (child->getName() == "layer") { - cerr << "succeeded!" << endl; + if (!strcmp(child->getName(), "layer")) ((FGGroupLayer *)layer)->addLayer(readLayer(child, w_scale, h_scale)); - } } } @@ -516,7 +467,7 @@ readLayer (const SGPropertyNode * node, float w_scale, float h_scale) int nChunks = chunk_group->nChildren(); for (int i = 0; i < nChunks; i++) { const SGPropertyNode * node = chunk_group->getChild(i); - if (node->getName() == "chunk") { + if (!strcmp(node->getName(), "chunk")) { FGTextLayer::Chunk * chunk = readTextChunk(node); if (chunk != 0) tlayer->addChunk(chunk); @@ -531,13 +482,12 @@ readLayer (const SGPropertyNode * node, float w_scale, float h_scale) // A switch instrument layer. else if (type == "switch") { - SGPropertyNode * target = - fgGetNode(node->getStringValue("property"), true); - FGInstrumentLayer * layer1 = - readLayer(node->getNode("layer[0]"), w_scale, h_scale); - FGInstrumentLayer * layer2 = - readLayer(node->getNode("layer[1]"), w_scale, h_scale); - layer = new FGSwitchLayer(w, h, target, layer1, layer2); + layer = new FGSwitchLayer(); + for (int i = 0; i < node->nChildren(); i++) { + const SGPropertyNode * child = node->getChild(i); + if (!strcmp(child->getName(), "layer")) + ((FGGroupLayer *)layer)->addLayer(readLayer(child, w_scale, h_scale)); + } } // A built-in instrument layer. @@ -548,7 +498,7 @@ readLayer (const SGPropertyNode * node, float w_scale, float h_scale) layer = new FGMagRibbon(w, h); } - else if (layerclass == "") { + else if (layerclass.empty()) { SG_LOG( SG_COCKPIT, SG_ALERT, "No class provided for built-in layer " << name ); return 0; @@ -576,7 +526,7 @@ readLayer (const SGPropertyNode * node, float w_scale, float h_scale) int nTransformations = trans_group->nChildren(); for (int i = 0; i < nTransformations; i++) { const SGPropertyNode * node = trans_group->getChild(i); - if (node->getName() == "transformation") { + if (!strcmp(node->getName(), "transformation")) { FGPanelTransformation * t = readTransformation(node, w_scale, h_scale); if (t != 0) layer->addTransformation(t); @@ -607,7 +557,7 @@ readLayer (const SGPropertyNode * node, float w_scale, float h_scale) static FGPanelInstrument * readInstrument (const SGPropertyNode * node) { - const string &name = node->getStringValue("name"); + const string name = node->getStringValue("name"); int x = node->getIntValue("x", -1); int y = node->getIntValue("y", -1); int real_w = node->getIntValue("w", -1); @@ -645,7 +595,7 @@ readInstrument (const SGPropertyNode * node) int nActions = action_group->nChildren(); for (int i = 0; i < nActions; i++) { const SGPropertyNode * node = action_group->getChild(i); - if (node->getName() == "action") { + if (!strcmp(node->getName(), "action")) { FGPanelAction * action = readAction(node, w_scale, h_scale); if (action != 0) instrument->addAction(action); @@ -664,7 +614,7 @@ readInstrument (const SGPropertyNode * node) int nLayers = layer_group->nChildren(); for (int i = 0; i < nLayers; i++) { const SGPropertyNode * node = layer_group->getChild(i); - if (node->getName() == "layer") { + if (!strcmp(node->getName(), "layer")) { FGInstrumentLayer * layer = readLayer(node, w_scale, h_scale); if (layer != 0) instrument->addLayer(layer); @@ -708,14 +658,14 @@ readPanel (const SGPropertyNode * root) // conditional removed by jim wilson to allow panel xml code // with y-offset defined to work... - // if (!fgHasNode("/sim/panel/y-offset")) + if (!fgHasNode("/sim/panel/y-offset")) fgSetInt("/sim/panel/y-offset", root->getIntValue("y-offset", 0)); // // Assign the background texture, if any, or a bogus chequerboard. // string bgTexture = root->getStringValue("background"); - if (bgTexture == "") + if (bgTexture.empty()) bgTexture = "FOO"; panel->setBackground(FGTextureManager::createTexture(bgTexture.c_str())); SG_LOG( SG_COCKPIT, SG_INFO, "Set background texture to " << bgTexture ); @@ -724,48 +674,48 @@ readPanel (const SGPropertyNode * root) // Get multibackground if any... // string mbgTexture = root->getStringValue("multibackground[0]"); - if (mbgTexture != "") { + if (!mbgTexture.empty()) { panel->setMultiBackground(FGTextureManager::createTexture(mbgTexture.c_str()), 0); SG_LOG( SG_COCKPIT, SG_INFO, "Set background texture to " << mbgTexture ); mbgTexture = root->getStringValue("multibackground[1]"); - if (mbgTexture == "") + if (mbgTexture.empty()) mbgTexture = "FOO"; panel->setMultiBackground(FGTextureManager::createTexture(mbgTexture.c_str()), 1); SG_LOG( SG_COCKPIT, SG_INFO, "Set background texture to " << mbgTexture ); mbgTexture = root->getStringValue("multibackground[2]"); - if (mbgTexture == "") + if (mbgTexture.empty()) mbgTexture = "FOO"; panel->setMultiBackground(FGTextureManager::createTexture(mbgTexture.c_str()), 2); SG_LOG( SG_COCKPIT, SG_INFO, "Set background texture to " << mbgTexture ); mbgTexture = root->getStringValue("multibackground[3]"); - if (mbgTexture == "") + if (mbgTexture.empty()) mbgTexture = "FOO"; panel->setMultiBackground(FGTextureManager::createTexture(mbgTexture.c_str()), 3); SG_LOG( SG_COCKPIT, SG_INFO, "Set background texture to " << mbgTexture ); mbgTexture = root->getStringValue("multibackground[4]"); - if (mbgTexture == "") + if (mbgTexture.empty()) mbgTexture = "FOO"; panel->setMultiBackground(FGTextureManager::createTexture(mbgTexture.c_str()), 4); SG_LOG( SG_COCKPIT, SG_INFO, "Set background texture to " << mbgTexture ); mbgTexture = root->getStringValue("multibackground[5]"); - if (mbgTexture == "") + if (mbgTexture.empty()) mbgTexture = "FOO"; panel->setMultiBackground(FGTextureManager::createTexture(mbgTexture.c_str()), 5); SG_LOG( SG_COCKPIT, SG_INFO, "Set background texture to " << mbgTexture ); mbgTexture = root->getStringValue("multibackground[6]"); - if (mbgTexture == "") + if (mbgTexture.empty()) mbgTexture = "FOO"; panel->setMultiBackground(FGTextureManager::createTexture(mbgTexture.c_str()), 6); SG_LOG( SG_COCKPIT, SG_INFO, "Set background texture to " << mbgTexture ); mbgTexture = root->getStringValue("multibackground[7]"); - if (mbgTexture == "") + if (mbgTexture.empty()) mbgTexture = "FOO"; panel->setMultiBackground(FGTextureManager::createTexture(mbgTexture.c_str()), 7); SG_LOG( SG_COCKPIT, SG_INFO, "Set background texture to " << mbgTexture ); @@ -783,7 +733,7 @@ readPanel (const SGPropertyNode * root) int nInstruments = instrument_group->nChildren(); for (int i = 0; i < nInstruments; i++) { const SGPropertyNode * node = instrument_group->getChild(i); - if (node->getName() == "instrument") { + if (!strcmp(node->getName(), "instrument")) { FGPanelInstrument * instrument = readInstrument(node); if (instrument != 0) panel->addInstrument(instrument);