add combo box to imgui
This commit is contained in:
@@ -323,8 +323,6 @@ function translate_draw_commands(commands) {
|
|||||||
tempMap.tiles[arrayX][arrayY] = img
|
tempMap.tiles[arrayX][arrayY] = img
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Generate geometry for this texture group
|
// Generate geometry for this texture group
|
||||||
var geom = geometry.tilemap_to_data(tempMap)
|
var geom = geometry.tilemap_to_data(tempMap)
|
||||||
geom.texture_id = parseInt(texId)
|
geom.texture_id = parseInt(texId)
|
||||||
|
|||||||
@@ -160,6 +160,82 @@ JSC_SSCALL(imgui_textbox,
|
|||||||
ret = JS_DupValue(js,argv[1]);
|
ret = JS_DupValue(js,argv[1]);
|
||||||
)
|
)
|
||||||
|
|
||||||
|
JSC_SCALL(imgui_combo,
|
||||||
|
// argv[0] = label (str)
|
||||||
|
// argv[1] = current selection index or string
|
||||||
|
// argv[2] = array of options or single string with \0 separators
|
||||||
|
|
||||||
|
int current_item = 0;
|
||||||
|
const char *preview_str = NULL;
|
||||||
|
|
||||||
|
if (JS_IsNumber(argv[1])) {
|
||||||
|
current_item = js2number(js, argv[1]);
|
||||||
|
} else if (JS_IsString(argv[1])) {
|
||||||
|
preview_str = JS_ToCString(js, argv[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (JS_IsArray(js, argv[2])) {
|
||||||
|
// Handle array of strings
|
||||||
|
int item_count = JS_ArrayLength(js, argv[2]);
|
||||||
|
const char **items = (const char**)malloc(sizeof(char*) * item_count);
|
||||||
|
|
||||||
|
for (int i = 0; i < item_count; i++) {
|
||||||
|
JSValue item = JS_GetPropertyUint32(js, argv[2], i);
|
||||||
|
items[i] = JS_ToCString(js, item);
|
||||||
|
JS_FreeValue(js, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If preview_str is set, find its index
|
||||||
|
if (preview_str) {
|
||||||
|
for (int i = 0; i < item_count; i++) {
|
||||||
|
if (strcmp(items[i], preview_str) == 0) {
|
||||||
|
current_item = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::Combo(str, ¤t_item, items, item_count)) {
|
||||||
|
ret = JS_NewString(js, items[current_item]);
|
||||||
|
} else {
|
||||||
|
if (preview_str) {
|
||||||
|
ret = JS_DupValue(js, argv[1]);
|
||||||
|
} else {
|
||||||
|
ret = JS_NewString(js, items[current_item]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Free the strings
|
||||||
|
for (int i = 0; i < item_count; i++) {
|
||||||
|
JS_FreeCString(js, items[i]);
|
||||||
|
}
|
||||||
|
free(items);
|
||||||
|
|
||||||
|
} else if (JS_IsString(argv[2])) {
|
||||||
|
// Handle single string with \0 separators
|
||||||
|
const char *items_str = JS_ToCString(js, argv[2]);
|
||||||
|
|
||||||
|
if (ImGui::Combo(str, ¤t_item, items_str)) {
|
||||||
|
// Find the selected item string
|
||||||
|
const char *p = items_str;
|
||||||
|
for (int i = 0; i < current_item; i++) {
|
||||||
|
p += strlen(p) + 1;
|
||||||
|
}
|
||||||
|
ret = JS_NewString(js, p);
|
||||||
|
} else {
|
||||||
|
ret = JS_DupValue(js, argv[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
JS_FreeCString(js, items_str);
|
||||||
|
} else {
|
||||||
|
ret = JS_DupValue(js, argv[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (preview_str) {
|
||||||
|
JS_FreeCString(js, preview_str);
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
JSC_SCALL(imgui_text, ImGui::Text("%s", str) )
|
JSC_SCALL(imgui_text, ImGui::Text("%s", str) )
|
||||||
|
|
||||||
JSC_SCALL(imgui_button,
|
JSC_SCALL(imgui_button,
|
||||||
@@ -837,6 +913,7 @@ const JSCFunctionListEntry js_imgui_funcs[] = {
|
|||||||
MIST_FUNC_DEF(imgui, slider, 4),
|
MIST_FUNC_DEF(imgui, slider, 4),
|
||||||
MIST_FUNC_DEF(imgui, intslider, 4),
|
MIST_FUNC_DEF(imgui, intslider, 4),
|
||||||
MIST_FUNC_DEF(imgui, checkbox, 2),
|
MIST_FUNC_DEF(imgui, checkbox, 2),
|
||||||
|
MIST_FUNC_DEF(imgui, combo, 3),
|
||||||
|
|
||||||
// Basic widgets
|
// Basic widgets
|
||||||
MIST_FUNC_DEF(imgui, text, 1),
|
MIST_FUNC_DEF(imgui, text, 1),
|
||||||
|
|||||||
Reference in New Issue
Block a user