X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCockpit%2Fpanel_io.cxx;h=dd1f1036155c0df275f02c9f1e1ed391a0ebe5e4;hb=b07ad149aebeb1d060bc9a0d505fdc1ca1081654;hp=f7721a98278629feec0aeb98de70827259433aad;hpb=1f8da4224ce1da02a5bfeffd4f974577a39e32ad;p=flightgear.git diff --git a/src/Cockpit/panel_io.cxx b/src/Cockpit/panel_io.cxx index f7721a982..dd1f10361 100644 --- a/src/Cockpit/panel_io.cxx +++ b/src/Cockpit/panel_io.cxx @@ -11,10 +11,10 @@ // 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$ @@ -22,22 +22,17 @@ # include #endif -#ifdef HAVE_WINDOWS_H -# include -#endif - #include // for strcmp() #include -#include - -#include +#include #include -#include +#include +#include -#include STL_IOSTREAM -#include STL_FSTREAM -#include STL_STRING +#include +#include +#include #include
#include
@@ -46,13 +41,14 @@ // #include "panel.hxx" #include "panel_io.hxx" +#include //built-in layers #include "built_in/FGMagRibbon.hxx" -SG_USING_STD(istream); -SG_USING_STD(ifstream); -SG_USING_STD(string); +using std::istream; +using std::ifstream; +using std::string; @@ -132,12 +128,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) ); } @@ -170,6 +167,19 @@ readConditions (FGConditional * component, const SGPropertyNode * node) static FGPanelAction * readAction (const SGPropertyNode * node, float w_scale, float h_scale) { + unsigned int i, j; + SGPropertyNode *binding; + vectorbindings = node->getChildren("binding"); + + // button-less actions are fired initially + if (!node->hasValue("w") || !node->hasValue("h")) { + for (i = 0; i < bindings.size(); i++) { + SGBinding b(bindings[i], globals->get_props()); + b.fire(); + } + return 0; + } + string name = node->getStringValue("name"); int button = node->getIntValue("button"); @@ -181,20 +191,32 @@ readAction (const SGPropertyNode * node, float w_scale, float h_scale) FGPanelAction * action = new FGPanelAction(button, x, y, w, h, repeatable); - vectorbindings = 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 SGBinding(binding, globals->get_props()), 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 SGBinding(binding, globals->get_props()), 1); + } } readConditions(action, node); @@ -261,21 +283,8 @@ readTransformation (const SGPropertyNode * node, float w_scale, float h_scale) const SGPropertyNode * trans_table = node->getNode("interpolation"); if (trans_table != 0) { SG_LOG( SG_COCKPIT, SG_INFO, "Found interpolation table with " - << trans_table->nChildren() << "children" ); - t->table = new SGInterpTable(); - for(int i = 0; i < trans_table->nChildren(); i++) { - const SGPropertyNode * node = trans_table->getChild(i); - 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 " - << ind << "==>" << dep ); - t->table->addEntry(ind, dep); - } else { - SG_LOG( SG_COCKPIT, SG_INFO, "Skipping " << node->getName() - << " in interpolation" ); - } - } + << trans_table->nChildren() << " children" ); + t->table = new SGInterpTable(trans_table); } else { t->table = 0; } @@ -365,9 +374,11 @@ readTextChunk (const SGPropertyNode * node) else if (type == "number-value") { string propName = node->getStringValue("property"); float scale = node->getFloatValue("scale", 1.0); + 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. @@ -411,6 +422,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) @@ -429,6 +441,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. @@ -457,7 +474,7 @@ readLayer (const SGPropertyNode * node, float w_scale, float h_scale) tlayer->setPointSize(pointSize); // Set the font. - string fontName = node->getStringValue("font", "default"); + string fontName = node->getStringValue("font", "Helvetica"); tlayer->setFontName(fontName); const SGPropertyNode * chunk_group = node->getNode("chunks"); @@ -659,6 +676,8 @@ readPanel (const SGPropertyNode * root) if (!fgHasNode("/sim/panel/y-offset")) fgSetInt("/sim/panel/y-offset", root->getIntValue("y-offset", 0)); + panel->setAutohide(root->getBoolValue("autohide", true)); + // // Assign the background texture, if any, or a bogus chequerboard. // @@ -732,12 +751,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" ); } } }