1 // HUD_label.cxx -- HUD Label
3 // Written by Michele America, started September 1997.
5 // Copyright (C) 1997 Michele F. America [micheleamerica#geocities:com]
6 // Copyright (C) 2006 Melchior FRANZ [mfranz#aon:at]
8 // This program is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU General Public License as
10 // published by the Free Software Foundation; either version 2 of the
11 // License, or (at your option) any later version.
13 // This program is distributed in the hope that it will be useful, but
14 // WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 // General Public License for more details.
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
27 #include "HUD_private.hxx"
29 #include <Main/globals.hxx>
31 HUD::Label::Label(HUD *hud, const SGPropertyNode *n, float x, float y) :
33 _input(n->getNode("input", false)),
34 _box(n->getBoolValue("box", false)),
35 _pointer_width(n->getFloatValue("pointer-width", 7.0)),
36 _pointer_length(n->getFloatValue("pointer-length", 5.0)),
38 _blink_interval(n->getFloatValue("blinking/interval", -1.0f)),
42 const SGPropertyNode *node = n->getNode("blinking/condition");
44 _blink_condition = sgReadCondition(globals->get_props(), node);
46 const char *halign = n->getStringValue("halign", "center");
47 if (!strcmp(halign, "left"))
49 else if (!strcmp(halign, "right"))
56 const char *pre = n->getStringValue("prefix", 0);
57 const char *post = n->getStringValue("postfix", 0);
58 const char *fmt = n->getStringValue("format", 0);
71 _mode = check_format(_format.c_str());
72 if (_mode == INVALID) {
73 SG_LOG(SG_INPUT, SG_ALERT, "HUD: invalid format '" << _format.c_str()
74 << "' in <label> '" << _name << '\'');
83 void HUD::Label::draw(void)
85 if (!((_mode == NONE || _input.isValid()) && blink()))
90 float pw = _pointer_width / 2.0;
94 bool draw_parallel = fabs(_pointer_width - _w) > 2.0; // draw lines left and right of arrow?
96 if (option_bottom()) {
98 draw_line(_x, _y, l, _y);
99 draw_line(r, _y, _x + _w, _y);
101 p = _y - _pointer_length;
102 draw_line(l, _y, _center_x, p);
103 draw_line(_center_x, p, r, _y);
105 draw_line(_x, _y, _x + _w, _y);
109 draw_line(_x, _y + _h, l, _y + _h);
110 draw_line(r, _y + _h, _x + _w, _y + _h);
112 p = _y + _h + _pointer_length;
113 draw_line(l, _y + _h, _center_x, p);
114 draw_line(_center_x, p, r, _y + _h);
116 draw_line(_x + _w, _y + _h, _x, _y + _h);
120 draw_parallel = fabs(_pointer_width - _h) > 2.0;
124 draw_line(_x, _y, _x, l);
125 draw_line(_x, r, _x, _y + _h);
127 p = _x - _pointer_length;
128 draw_line(_x, l, p, _center_y);
129 draw_line(p, _center_y, _x, r);
131 draw_line(_x, _y + _h, _x, _y);
133 if (option_right()) {
135 draw_line(_x + _w, _y, _x + _w, l);
136 draw_line(_x + _w, r, _x + _w, _y + _h);
138 p = _x + _w + _pointer_length;
139 draw_line(_x + _w, l, p, _center_y);
140 draw_line(p, _center_y, _x + _w, r);
142 draw_line(_x + _w, _y, _x + _w, _y + _h);
145 const int BUFSIZE = 256;
147 buf[ BUFSIZE] = '\0'; // Be sure to terminate properly
149 snprintf(buf, BUFSIZE, _format.c_str(), 0);
150 else if (_mode == STRING)
151 snprintf(buf, BUFSIZE, _format.c_str(), _input.getStringValue());
152 else if (_mode == INT)
153 snprintf(buf, BUFSIZE, _format.c_str(), int(_input.getFloatValue()));
154 else if (_mode == LONG)
155 snprintf(buf, BUFSIZE, _format.c_str(), long(_input.getFloatValue()));
156 else if (_mode == FLOAT)
157 snprintf(buf, BUFSIZE, _format.c_str(), float(_input.getFloatValue()));
158 else if (_mode == DOUBLE) // not really supported yet
159 snprintf(buf, BUFSIZE, _format.c_str(), double(_input.getFloatValue()));
161 if (_halign & HCENTER)
162 draw_text(_center_x, _center_y, buf, _halign, get_digits());
163 else if (_halign & LEFT)
164 draw_text(_x, _center_y, buf, _halign, get_digits());
165 else // if (_halign & RIGHT)
166 draw_text(_x + _w, _center_y, buf, _halign, get_digits());
170 bool HUD::Label::blink()
172 if (_blink_interval < 0.0f)
175 if (_blink_condition && !_blink_condition->test())
178 if (_hud->timer() < _blink_target)
181 _blink_target = _hud->timer() + _blink_interval;
182 return _blink_state = !_blink_state;