Add Visualization tab to simulate.

Also:
- Increased label width in mjUI tight theme spacing.
- Added `mjITEM_EDITFLOAT` for editing float values.
- Move mjUI numpad key codes to header file.
PiperOrigin-RevId: 535839953
Change-Id: Ibdc0a9a20be514caa5b487211212ed6f5b8a6ba9
This commit is contained in:
Yuval Tassa
2023-05-27 05:07:38 -07:00
committed by Copybara-Service
parent ea6789b376
commit d40c395917
10 changed files with 164 additions and 31 deletions
+29 -16
View File
@@ -28,7 +28,7 @@
static const mjuiThemeSpacing themeSpacing0 = {
270, // int total;
15, // int scroll;
100, // int label;
120, // int label;
8, // int section;
4, // int itemside;
4, // int itemmid;
@@ -743,7 +743,9 @@ static int checkedit(const char* text, const mjuiItem* it) {
}
// check type
if (it->type!=mjITEM_EDITINT && it->type!=mjITEM_EDITNUM) {
if (it->type!=mjITEM_EDITINT &&
it->type!=mjITEM_EDITNUM &&
it->type!=mjITEM_EDITFLOAT) {
mju_error("Internal error: expected edit control");
}
@@ -791,7 +793,7 @@ static int text2array(const char* text, const mjuiItem* it) {
}
// check type
if (it->type!=mjITEM_EDITINT && it->type!=mjITEM_EDITNUM) {
if (it->type!=mjITEM_EDITINT && it->type!=mjITEM_EDITNUM && it->type!=mjITEM_EDITFLOAT) {
mju_error("Internal error: expected edit control");
}
@@ -829,9 +831,16 @@ static int text2array(const char* text, const mjuiItem* it) {
pdata[i] = (int)val[i];
}
} else {
mjtNum* pdata = (mjtNum*)it->pdata;
for (int i=0; i<n; i++) {
pdata[i] = (mjtNum)val[i];
if (it->type==mjITEM_EDITNUM) {
mjtNum* pdata = (mjtNum*)it->pdata;
for (int i=0; i<n; i++) {
pdata[i] = (mjtNum)val[i];
}
} else {
float* pdata = (float*)it->pdata;
for (int i=0; i<n; i++) {
pdata[i] = (float)val[i];
}
}
}
@@ -851,7 +860,7 @@ static void array2text(char* text, const mjuiItem* it) {
}
// check type
if (it->type!=mjITEM_EDITINT && it->type!=mjITEM_EDITNUM) {
if (it->type!=mjITEM_EDITINT && it->type!=mjITEM_EDITNUM && it->type!=mjITEM_EDITFLOAT) {
mju_error("Internal error: expected edit control");
}
@@ -862,8 +871,10 @@ static void array2text(char* text, const mjuiItem* it) {
for (int i=0; i<n; i++) {
if (it->type==mjITEM_EDITINT) {
mjSNPRINTF(buf, "%d", ((int*)it->pdata)[i]);
} else {
} else if (it->type==mjITEM_EDITNUM) {
mjSNPRINTF(buf, "%.4g", ((mjtNum*)it->pdata)[i]);
} else {
mjSNPRINTF(buf, "%.4g", ((float*)it->pdata)[i]);
}
strncat(text, buf, mjMAXUITEXT - strlen(text) - 1);
if (i<n-1) {
@@ -872,8 +883,6 @@ static void array2text(char* text, const mjuiItem* it) {
}
}
static const int mjNUMPAD_0 = 320; // integer value of '0' key on the number pad
static const int mjNUMPAD_9 = 329; // integer value of '9' key on the number pad
// return (remapped) key if valid, 0 if not valid
static int validkey(int key, int sz, int type, const mjuiState* state) {
@@ -919,11 +928,12 @@ static int validkey(int key, int sz, int type, const mjuiState* state) {
}
// numeric
else if (type==mjITEM_EDITINT || type==mjITEM_EDITNUM) {
else if (type==mjITEM_EDITINT || type==mjITEM_EDITNUM || type==mjITEM_EDITFLOAT) {
if (sz<(mjMAXUITEXT-1) &&
(key==' ' || key=='+' || key=='=' || key=='-' || (key>='0' && key<='9') ||
(key>=mjNUMPAD_0 && key<=mjNUMPAD_9) ||
((key=='e' || key=='E' || key=='.') && type==mjITEM_EDITNUM))) {
(key>=mjKEY_NUMPAD_0 && key<=mjKEY_NUMPAD_9) ||
((key=='e' || key=='E' || key=='.') &&
(type==mjITEM_EDITNUM || type==mjITEM_EDITFLOAT)))) {
// remap '=' to '+'
if (key=='=') {
@@ -936,8 +946,8 @@ static int validkey(int key, int sz, int type, const mjuiState* state) {
}
// remap numberpad to top row
if (key>=mjNUMPAD_0 && key<=mjNUMPAD_9) {
key = key - mjNUMPAD_0 + '0';
if (key>=mjKEY_NUMPAD_0 && key<=mjKEY_NUMPAD_9) {
key = key - mjKEY_NUMPAD_0 + '0';
}
return key;
@@ -1271,7 +1281,7 @@ void mjui_add(mjUI* ui, const mjuiDef* def) {
}
// parse edit numeric
else if (it->type==mjITEM_EDITINT || it->type==mjITEM_EDITNUM) {
else if (it->type==mjITEM_EDITINT || it->type==mjITEM_EDITNUM || it->type==mjITEM_EDITFLOAT) {
// check mjMAXUIEDIT
if (mjMAXUIEDIT>7) {
mju_error("internal error: mjMAXUIEDIT bigger than 7");
@@ -1989,6 +1999,7 @@ void mjui_update(int section, int item, const mjUI* ui,
case mjITEM_EDITINT:
case mjITEM_EDITNUM:
case mjITEM_EDITFLOAT:
case mjITEM_EDITTXT:
if (state) {
rgbdecor = ui->color.edit;
@@ -2165,6 +2176,7 @@ mjuiItem* mjui_event(mjUI* ui, mjuiState* state, const mjrContext* con) {
// move edit
else if (it_rec->type==mjITEM_EDITINT ||
it_rec->type==mjITEM_EDITNUM ||
it_rec->type==mjITEM_EDITFLOAT ||
it_rec->type==mjITEM_EDITTXT) {
setcursor(it_rec->rect, ui, state, con);
}
@@ -2326,6 +2338,7 @@ mjuiItem* mjui_event(mjUI* ui, mjuiState* state, const mjrContext* con) {
case mjITEM_EDITINT:
case mjITEM_EDITNUM:
case mjITEM_EDITFLOAT:
case mjITEM_EDITTXT:
// set edit text, clear scroll
array2text(ui->edittext, it_cur);