Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Edit InputTextMultiline while active (for Auto Complete e.g.) #968

Closed
kungfooman opened this issue Jan 6, 2017 · 2 comments
Closed

Edit InputTextMultiline while active (for Auto Complete e.g.) #968

kungfooman opened this issue Jan 6, 2017 · 2 comments

Comments

@kungfooman
Copy link

Hi, is there a way to edit a InputTextMultiline while being active? I tried all kinds of stuff, but I don't understand a lot from all the Unicode/Wchar/ASCII conversions.

I tried to copy the functions from the InputTextMultiline itself, but most times it either did nothing, crashes, or wrong results:

E.g. like

char *buf = str;
int buf_size = 4096;
ImGuiContext *g = ImGui::GetCurrentContext();
auto edit_state = g->InputTextState;
// Start edition
// Take a copy of the initial buffer value (both in original UTF-8 format and converted to wchar)
// From the moment we focused we are ignoring the content of 'buf' (unless we are in read-only mode)
const int prev_len_w = edit_state.CurLenW;
edit_state.Text.resize(buf_size+1);        // wchar count <= UTF-8 count. we use +1 to make sure that .Data isn't NULL so it doesn't crash.
edit_state.InitialText.resize(buf_size+1); // UTF-8. we use +1 to make sure that .Data isn't NULL so it doesn't crash.
ImStrncpy(edit_state.InitialText.Data, buf, edit_state.InitialText.Size);
const char* buf_end = NULL;
//edit_state.CurLenW = ImTextStrFromUtf8(edit_state.Text.Data, edit_state.Text.Size, buf, NULL, &buf_end);
//edit_state.CurLenA = (int)(buf_end - buf); // We can't get the result from ImFormatString() above because it is not UTF-8 aware. Here we'll cut off malformed UTF-8.
//edit_state.CursorAnimReset();	

I use it to edit JavaScript ingame and it would be nice to use Ctrl+Space to auto complete :)

@ocornut
Copy link
Owner

ocornut commented Jan 6, 2017 via email

@kungfooman
Copy link
Author

Thanks, that works like a charm :)

int repl_callback(ImGuiTextEditCallbackData *data) {
	if (autocomplete) {
		char returnbuffer[256] = {0};
		js_call("get_auto_completion", "siiii", replbuffer, data->CursorPos, data->SelectionStart, data->SelectionEnd, returnbuffer);
		//log("got returnbuffer: %s\n", returnbuffer);
		data->InsertChars(data->CursorPos, returnbuffer);
		autocomplete = 0;
	}
	//log("callback called\n");
	return 0;
}


ImGui::InputTextMultiline("", replbuffer, sizeof replbuffer, ImGui::GetWindowSize() + ImVec2(-15, -35), ImGuiInputTextFlags_CallbackAlways, repl_callback);

ocornut added a commit that referenced this issue Feb 7, 2024
Very highly requested feature (#6962, #5219, #3290, #4627, #5054, #3878, #2881, #1506, #1216, #968).
Also useful for interactive completion/selection popups (#2057, #718)
Based on @kudaba PR. Design for Inputtext V2 should make this obsolete.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants