Melchior FRANZ:
Printing floats in dialogs with 8 digits after the comma is inappropriate for most cases. - implement a "format" property for "text" gui elements (a.k.a. pui label). Number formats are set by strtod/snprintf, while formats on non-numbers are replaced by "%s". Practical example in the upcoming material.nas update. Valid formats regex: '%[ -]?\d*(\.\d*)?l?f' (IOW: the format must begin with '%' and end with 'f'). # Nasal: number = dialog.addChild("text"); number.set("label", "3.1415926"); number.set("format", "%.3f");
This commit is contained in:
parent
a488ab4d31
commit
db989269b8
1 changed files with 70 additions and 0 deletions
|
@ -1,5 +1,7 @@
|
||||||
// dialog.cxx: implementation of an XML-configurable dialog box.
|
// dialog.cxx: implementation of an XML-configurable dialog box.
|
||||||
|
|
||||||
|
#include <stdlib.h> // atof()
|
||||||
|
|
||||||
#include <Input/input.hxx>
|
#include <Input/input.hxx>
|
||||||
|
|
||||||
#include "dialog.hxx"
|
#include "dialog.hxx"
|
||||||
|
@ -94,6 +96,71 @@ action_callback (puObject * object)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
format_callback(puObject *obj, int dx, int dy, void *n)
|
||||||
|
{
|
||||||
|
SGPropertyNode *node = (SGPropertyNode *)n;
|
||||||
|
const char *format = node->getStringValue("format"), *f = format;
|
||||||
|
bool number;
|
||||||
|
// make sure the format matches '[ -+#]?\d*(\.\d*)?l?[fs]'
|
||||||
|
for (; *f; f++) {
|
||||||
|
if (*f == '%') {
|
||||||
|
if (f[1] == '%')
|
||||||
|
f++;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (*f++ != '%')
|
||||||
|
return;
|
||||||
|
if (*f == ' ' || *f == '+' || *f == '-' || *f == '#')
|
||||||
|
f++;
|
||||||
|
while (*f && isdigit(*f))
|
||||||
|
f++;
|
||||||
|
if (*f == '.') {
|
||||||
|
f++;
|
||||||
|
while (*f && isdigit(*f))
|
||||||
|
f++;
|
||||||
|
}
|
||||||
|
if (*f == 'l')
|
||||||
|
f++;
|
||||||
|
|
||||||
|
if (*f == 'f')
|
||||||
|
number = true;
|
||||||
|
else if (*f == 's')
|
||||||
|
number = false;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (++f; *f; f++) {
|
||||||
|
if (*f == '%') {
|
||||||
|
if (f[1] == '%')
|
||||||
|
f++;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char buf[256], *end;
|
||||||
|
const char *src = obj->getLabel();
|
||||||
|
|
||||||
|
if (number) {
|
||||||
|
float value = atof(src);
|
||||||
|
if (end == src)
|
||||||
|
return; // not a number
|
||||||
|
snprintf(buf, 256, format, value);
|
||||||
|
} else {
|
||||||
|
snprintf(buf, 256, format, src);
|
||||||
|
}
|
||||||
|
|
||||||
|
buf[255] = '\0';
|
||||||
|
|
||||||
|
SGPropertyNode *result = node->getNode("formatted", true);
|
||||||
|
result->setStringValue(buf);
|
||||||
|
obj->setLabel(result->getStringValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
// Static helper functions.
|
// Static helper functions.
|
||||||
|
@ -354,6 +421,9 @@ FGDialog::makeObject (SGPropertyNode * props, int parentWidth, int parentHeight)
|
||||||
} else if (type == "text") {
|
} else if (type == "text") {
|
||||||
puText * text = new puText(x, y);
|
puText * text = new puText(x, y);
|
||||||
setupObject(text, props);
|
setupObject(text, props);
|
||||||
|
|
||||||
|
if (props->getNode("format"))
|
||||||
|
text->setRenderCallback(format_callback, props);
|
||||||
// Layed-out objects need their size set, and non-layout ones
|
// Layed-out objects need their size set, and non-layout ones
|
||||||
// get a different placement.
|
// get a different placement.
|
||||||
if(presetSize) text->setSize(width, height);
|
if(presetSize) text->setSize(width, height);
|
||||||
|
|
Loading…
Reference in a new issue