-#include "hud.hxx"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "hud.hxx"
#ifdef USE_HUD_TextList
#define textString(x, y, text, digit) TextString(text, x , y ,digit)
#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;
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());
}
}
-