X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCockpit%2Fhud_labl.cxx;h=d19fed05696da5f33f462dcbf281898f00577699;hb=5f134cdec82692e4a414af302a8f30c3825ebe64;hp=a20f024459164af3462f439d7c2b0243acac70d1;hpb=e545c563d57e43d02b3f01655940c82d22a5408b;p=flightgear.git diff --git a/src/Cockpit/hud_labl.cxx b/src/Cockpit/hud_labl.cxx index a20f02445..d19fed056 100644 --- a/src/Cockpit/hud_labl.cxx +++ b/src/Cockpit/hud_labl.cxx @@ -1,182 +1,145 @@ -#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 ) //suma +#define textString(x, y, text, digit) TextString(text, x , y ,digit) #else -#define textString( x , y, text, digit ) puDrawString ( guiFnt, text, x, y ); //suma +#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,//hud - bool working, - int digit): //suma - instr_item( x, y, width, height, - data_source,scale_data,options, working, digit), //suma - 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 ) //hud - -{ - 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. - -} - -// I put this in to make it easy to construct a class member using the current -// C code. - - -instr_label :: ~instr_label() +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)) { + 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; } -// 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 ) //hud +void instr_label::draw(void) { - 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 ); - } + char label_buffer[80]; + int posincr; + int lenstr; + RECT scrn_rect = get_location(); + + memset( label_buffer, 0, sizeof( label_buffer)); + if (data_available()) { + if (lat) + snprintf(label_buffer, sizeof( label_buffer)-1, format_buffer.c_str(), lat_node->getStringValue()); + else if (lon) + 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; + float y = scrn_rect.top; + float w = scrn_rect.right; + float h = HUD_TextSize; + + glPushMatrix(); + 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); + glEnd(); + + glEnable(GL_LINE_STIPPLE); + 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); + glEnd(); + + glDisable(GL_LINE_STIPPLE); + glPopMatrix(); + } + snprintf(label_buffer, sizeof(label_buffer)-1, format_buffer.c_str(), get_value() * data_scaling()); + } + + } else { + snprintf(label_buffer, sizeof( label_buffer) -1, format_buffer.c_str()); } - 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. - -} + lenstr = getStringWidth(label_buffer); -// -// draw Draws a label anywhere in the HUD -// -// -void instr_label :: -draw( void ) // Required method in base class -{ -// char format_buffer[80]; - char label_buffer[80]; - int posincr; - int lenstr; - RECT scrn_rect = get_location(); - - if( data_available() ) { - if(lat) - sprintf( label_buffer, format_buffer, coord_format_lat(get_value()) ); - else - if(lon) - sprintf( label_buffer, format_buffer, coord_format_lon(get_value()) ); - else - { - if(lbox)//hud - {// Box for label - float x = scrn_rect.left; - float y = scrn_rect.top; - float w = scrn_rect.right; - float h = HUD_TextSize; - - glPushMatrix(); - 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); - glEnd(); - glEnable(GL_LINE_STIPPLE); - 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); - glEnd(); - glDisable(GL_LINE_STIPPLE); - glPopMatrix(); - }//hud - sprintf( label_buffer, format_buffer, get_value()*data_scaling() ); - } - } - else { -// sprintf( label_buffer, format_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 ); - - 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; - } - - if( fontSize == HUD_FONT_SMALL ) { - textString( scrn_rect.left + posincr, scrn_rect.top, - label_buffer, get_digits()); //suma - } - else { - if( fontSize == HUD_FONT_LARGE ) { - textString( scrn_rect.left + posincr, scrn_rect.top, - label_buffer, get_digits()); //suma - } + lenstr = strlen(label_buffer); + + 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; + + if (fontSize == HUD_FONT_SMALL) { + 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()); } } -