| 56 | } |
| 57 | |
| 58 | LString *LStringInputText(VM &vm, const char *label, LString *str, ImGuiInputTextFlags flags = 0) { |
| 59 | struct InputTextCallbackData { |
| 60 | LString *str; |
| 61 | VM &vm; |
| 62 | static int InputTextCallback(ImGuiInputTextCallbackData *data) { |
| 63 | if (data->EventFlag != ImGuiInputTextFlags_CallbackResize) return 0; |
| 64 | auto cbd = (InputTextCallbackData *)data->UserData; |
| 65 | IM_ASSERT(data->Buf == cbd->str->data()); |
| 66 | auto str = cbd->vm.NewString(string_view { data->Buf, (size_t)data->BufTextLen }); |
| 67 | cbd->str->Dec(cbd->vm); |
| 68 | cbd->str = str; |
| 69 | data->Buf = (char *)str->data(); |
| 70 | return 0; |
| 71 | } |
| 72 | }; |
| 73 | flags |= ImGuiInputTextFlags_CallbackResize; |
| 74 | InputTextCallbackData cbd { str, vm }; |
| 75 | ImGui::InputText(label, (char *)str->data(), str->len + 1, flags, |
| 76 | InputTextCallbackData::InputTextCallback, &cbd); |
| 77 | return cbd.str; |
| 78 | } |
| 79 | |
| 80 | void ValToGUI(VM &vm, Value *v, const TypeInfo &ti, string_view label, bool expanded) { |
| 81 | auto l = null_terminated(label); |