]> git.mxchange.org Git - flightgear.git/blobdiff - src/Cockpit/hud_labl.cxx
Merge commit 'refs/merge-requests/1552' of git@gitorious.org:fg/flightgear into next
[flightgear.git] / src / Cockpit / hud_labl.cxx
index 5380848b58c1a556dea7aeea014d9d81e1c3f6d6..8927b113e60e6f3f60b7285e455565b0de73c308 100644 (file)
+
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
 #endif
 
-#ifdef HAVE_WINDOWS_H
-#  include <windows.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <simgear/constants.h>
-#include <simgear/fg_random.h>
-#include <simgear/mat3.h>
-#include <simgear/polar3d.hxx>
-
-#include <Aircraft/aircraft.hxx>
-#include <GUI/gui.h>
-#include <Scenery/scenery.hxx>
-#include <Time/fg_timer.hxx>
-
 #include "hud.hxx"
 
-
 #ifdef USE_HUD_TextList
-#define textString( x , y, text, font )  TextString( text, x , y )
+#define textString(x, y, text, digit)  TextString(text, x , y ,digit)
 #else
-#define textString( x , y, text, font )  puDrawString ( guiFnt, text, x, y );
+#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          working ):
-                           instr_item( x, y, width, height,
-                                       data_source, scale_data,options, working ),
-                           pformat  ( label_format      ),
-                           pre_str  ( pre_label_string  ),
-                           post_str ( post_label_string ),
-                           justify  ( justification     ),
-                           fontSize ( font_size         ),
-                           blink    ( blinking          )
+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_BULK, "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;
 }
 
-// I put this in to make it easy to construct a class member using the current
-// C code.
 
-
-instr_label :: ~instr_label()
+void instr_label::draw(void)
 {
-}
-
-// 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    )
-{
-  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(), 0);
     }
-  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 ::operator = (const instr_label & rhs )
-{
-  if( !(this == &rhs)) {
-    instr_item::operator = (rhs);
-    pformat      = rhs.pformat;
-    fontSize   = rhs.fontSize;
-    blink      = rhs.blink;
-    justify    = rhs.justify;
-    pre_str    = rhs.pre_str;
-    post_str   = rhs.post_str;
-    strcpy(format_buffer,rhs.format_buffer);   
-    }
-  return *this;
-}
+    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() ) {
-    sprintf( label_buffer, format_buffer, get_value() );
-    }
-  else {
-    sprintf( label_buffer, format_buffer );
-    }
-  
-  lenstr = getStringWidth( label_buffer );
-                                               
-    
 #ifdef DEBUGHUD
-  fgPrintf( FG_COCKPIT, FG_DEBUG,  format_buffer );
-  fgPrintf( FG_COCKPIT, FG_DEBUG,  "\n" );
-  fgPrintf( FG_COCKPIT, FG_DEBUG, label_buffer );
-  fgPrintf( FG_COCKPIT, FG_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 == SMALL ) {
-    textString( scrn_rect.left + posincr, scrn_rect.top,
-                label_buffer, GLUT_BITMAP_8_BY_13);
-    }
-  else  {
-    if( fontSize == LARGE ) {
-      textString( scrn_rect.left + posincr, scrn_rect.top,
-                  label_buffer, GLUT_BITMAP_9_BY_15);
-      }
+    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());
     }
 }
-