X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCockpit%2Fhud_labl.cxx;h=d19fed05696da5f33f462dcbf281898f00577699;hb=5f134cdec82692e4a414af302a8f30c3825ebe64;hp=ecb693e5750de24cc1bed199517be9c22336b8b4;hpb=471fecd72c1a7c3f1bf3a6fc08ee0a4250e55a20;p=flightgear.git diff --git a/src/Cockpit/hud_labl.cxx b/src/Cockpit/hud_labl.cxx index ecb693e57..d19fed056 100644 --- a/src/Cockpit/hud_labl.cxx +++ b/src/Cockpit/hud_labl.cxx @@ -1,6 +1,9 @@ -#include "hud.hxx" +#ifdef HAVE_CONFIG_H +# include +#endif +#include "hud.hxx" #ifdef USE_HUD_TextList #define textString(x, y, text, digit) TextString(text, x , y ,digit) @@ -8,97 +11,75 @@ #define textString(x, y, text, digit) puDrawString(guiFnt, text, x, y) #endif -//======================= Top of instr_label class ========================= -instr_label::instr_label( - int x, - int y, - UINT width, - UINT height, - FLTFNPTR data_source, - const char *label_format, - const char *pre_label_string, - const char *post_label_string, - float scale_data, - UINT options, - fgLabelJust justification, - int font_size, - int blinking, - bool latitude, - bool longitude, - bool label_box, - bool working, - int digit) : - instr_item( x, y, width, height, - data_source,scale_data,options, working, digit), - pformat ( label_format ), - pre_str ( pre_label_string ), - post_str ( post_label_string ), - justify ( justification ), - fontSize ( font_size ), - blink ( blinking ), - lat ( latitude ), - lon ( longitude ), - lbox ( label_box ) -{ - if (pre_str != NULL) { - if (post_str != NULL ) - sprintf( format_buffer, "%s%s%s", pre_str, pformat, post_str ); - else - sprintf( format_buffer, "%s%s", pre_str, pformat ); - - } else if (post_str != NULL) { - sprintf( format_buffer, "%s%s", pformat, post_str ); - } // else do nothing if both pre and post strings are nulls. Interesting. - -} - - -instr_label::~instr_label() -{ -} - - -// Copy constructor -instr_label::instr_label(const instr_label & image) : - instr_item((const instr_item &)image), - pformat ( image.pformat ), - pre_str ( image.pre_str ), - post_str ( image.post_str ), - blink ( image.blink ), - lat ( image.lat ), - lon ( image.lon ), - lbox ( image.lbox ) - +FLTFNPTR get_func(const char *name); // FIXME + +instr_label::instr_label(const SGPropertyNode *node) : + instr_item( + node->getIntValue("x"), + node->getIntValue("y"), + node->getIntValue("width"), + node->getIntValue("height"), + NULL /* node->getStringValue("data_source") */, // FIXME + node->getFloatValue("scale_data"), + node->getIntValue("options"), + node->getBoolValue("working", true), + node->getIntValue("digits")), + pformat(node->getStringValue("label_format")), + fontSize(fgGetInt("/sim/startup/xsize") > 1000 ? HUD_FONT_LARGE : HUD_FONT_SMALL), // FIXME + blink(node->getIntValue("blinking")), + lat(node->getBoolValue("latitude", false)), + lon(node->getBoolValue("longitude", false)), + lbox(node->getBoolValue("label_box", false)), + lon_node(fgGetNode("/position/longitude-string", true)), + lat_node(fgGetNode("/position/latitude-string", true)) { - if (pre_str != NULL) { - if (post_str != NULL) - sprintf( format_buffer, "%s%s%s", pre_str, pformat, post_str ); - else - sprintf( format_buffer, "%s%s", pre_str, pformat ); - - } else if (post_str != NULL) { - sprintf( format_buffer, "%s%s", pformat, post_str ); - } // else do nothing if both pre and post strings are nulls. Interesting. - + SG_LOG(SG_INPUT, SG_INFO, "Done reading instr_label instrument " + << node->getStringValue("name", "[unnamed]")); + + set_data_source(get_func(node->getStringValue("data_source"))); + + int just = node->getIntValue("justification"); + if (just == 0) + justify = LEFT_JUST; + else if (just == 1) + justify = CENTER_JUST; + else if (just == 2) + justify = RIGHT_JUST; + + string pre_str(node->getStringValue("pre_label_string")); + if (pre_str== "NULL") + pre_str.clear(); + else if (pre_str == "blank") + pre_str = " "; + + const char *units = strcmp(fgGetString("/sim/startup/units"), "feet") ? " m" : " ft"; // FIXME + + string post_str(node->getStringValue("post_label_string")); + if (post_str== "NULL") + post_str.clear(); + else if (post_str == "blank") + post_str = " "; + else if (post_str == "units") + post_str = units; + + format_buffer = pre_str + pformat; + format_buffer += post_str; } -// -// draw Draws a label anywhere in the HUD -// -// -void instr_label::draw( void ) +void instr_label::draw(void) { char label_buffer[80]; int posincr; int lenstr; - RECT scrn_rect = get_location(); + RECT scrn_rect = get_location(); + memset( label_buffer, 0, sizeof( label_buffer)); if (data_available()) { if (lat) - sprintf( label_buffer, format_buffer, coord_format_lat(get_value()) ); + snprintf(label_buffer, sizeof( label_buffer)-1, format_buffer.c_str(), lat_node->getStringValue()); else if (lon) - sprintf( label_buffer, format_buffer, coord_format_lon(get_value()) ); + snprintf(label_buffer, sizeof( label_buffer)-1, format_buffer.c_str(), lon_node->getStringValue()); else { if (lbox) {// Box for label float x = scrn_rect.left; @@ -110,59 +91,55 @@ void instr_label::draw( void ) glLoadIdentity(); glBegin(GL_LINES); - glVertex2f( x - 2.0, y - 2.0); - glVertex2f( x + w + 2.0, y - 2.0); - glVertex2f( x + w + 2.0, y + h + 2.0); - glVertex2f( x - 2.0, y + h + 2.0); + glVertex2f(x - 2.0, y - 2.0); + glVertex2f(x + w + 2.0, y - 2.0); + glVertex2f(x + w + 2.0, y + h + 2.0); + glVertex2f(x - 2.0, y + h + 2.0); glEnd(); glEnable(GL_LINE_STIPPLE); - glLineStipple( 1, 0xAAAA ); + glLineStipple(1, 0xAAAA); glBegin(GL_LINES); - glVertex2f( x + w + 2.0, y - 2.0); - glVertex2f( x + w + 2.0, y + h + 2.0); - glVertex2f( x - 2.0, y + h + 2.0); - glVertex2f( x - 2.0, y - 2.0); + glVertex2f(x + w + 2.0, y - 2.0); + glVertex2f(x + w + 2.0, y + h + 2.0); + glVertex2f(x - 2.0, y + h + 2.0); + glVertex2f(x - 2.0, y - 2.0); glEnd(); glDisable(GL_LINE_STIPPLE); glPopMatrix(); } - sprintf( label_buffer, format_buffer, get_value()*data_scaling() ); + snprintf(label_buffer, sizeof(label_buffer)-1, format_buffer.c_str(), get_value() * data_scaling()); } } else { -// sprintf( label_buffer, format_buffer ); + snprintf(label_buffer, sizeof( label_buffer) -1, format_buffer.c_str()); } - lenstr = getStringWidth( label_buffer ); - + lenstr = getStringWidth(label_buffer); #ifdef DEBUGHUD - fgPrintf( SG_COCKPIT, SG_DEBUG, format_buffer ); - fgPrintf( SG_COCKPIT, SG_DEBUG, "\n" ); - fgPrintf( SG_COCKPIT, SG_DEBUG, label_buffer ); - fgPrintf( SG_COCKPIT, SG_DEBUG, "\n" ); + fgPrintf( SG_COCKPIT, SG_DEBUG, format_buffer); + fgPrintf( SG_COCKPIT, SG_DEBUG, "\n"); + fgPrintf( SG_COCKPIT, SG_DEBUG, label_buffer); + fgPrintf( SG_COCKPIT, SG_DEBUG, "\n"); #endif - lenstr = strlen( label_buffer ); + lenstr = strlen(label_buffer); - if (justify == RIGHT_JUST) { + if (justify == RIGHT_JUST) posincr = scrn_rect.right - lenstr; - } else if (justify == CENTER_JUST) { - posincr = get_span() - (lenstr/2); // -lenstr*4; - } else { - // justify == LEFT_JUST - posincr = 0; // 0; - } + else if (justify == CENTER_JUST) + posincr = get_span() - (lenstr / 2); // -lenstr*4; + else // justify == LEFT_JUST + posincr = 0; if (fontSize == HUD_FONT_SMALL) { - textString( scrn_rect.left + posincr, scrn_rect.top, - label_buffer, get_digits()); + textString(scrn_rect.left + posincr, scrn_rect.top, + label_buffer, get_digits()); } else if (fontSize == HUD_FONT_LARGE) { - textString( scrn_rect.left + posincr, scrn_rect.top, - label_buffer, get_digits()); + textString(scrn_rect.left + posincr, scrn_rect.top, + label_buffer, get_digits()); } } -