35{
37 if (!ctx || !ctx->buf)
38 return 0;
39
40
41 if (data->EventFlag == ImGuiInputTextFlags_CallbackResize)
42 {
43 ctx->
buf->resize(
static_cast<size_t>(data->BufTextLen));
44 data->Buf = ctx->buf->data();
45 return 0;
46 }
47
48 if (data->EventFlag == ImGuiInputTextFlags_CallbackEdit)
49 {
50
51 const int len = data->BufTextLen;
52 int cur = data->CursorPos;
53 int start = cur;
54 while (start > 0 && data->Buf[start - 1] != '\n')
55 start--;
56 int end = cur;
57 while (end < len && data->Buf[end] != '\n')
58 end++;
59
60 const char* line_start = data->Buf + start;
61 const char* line_end = data->Buf + end;
62
63
64 ImVec2 sz = ImGui::CalcTextSize(line_start, line_end, false, FLT_MAX);
65 if (sz.x <= ctx->max_px || ctx->max_px <= 0.0f)
66 return 0;
67
68
69 int break_pos = -1;
70 for (int i = cur - 1; i >= start; --i)
71 {
72 char c = data->Buf[i];
73 if (c == ' ' || c == '\t' || c == '-' || c == '/')
74 {
75
76 ImVec2 sz2 = ImGui::CalcTextSize(line_start, data->Buf + i, false, FLT_MAX);
77 if (sz2.x <= ctx->max_px)
78 {
79 break_pos = i;
80 break;
81 }
82 }
83 }
84
85 if (break_pos >= start)
86 {
87
88 data->DeleteChars(break_pos, 1);
89 data->InsertChars(break_pos, "\n");
90
91 return 0;
92 }
93 else
94 {
95
96 data->InsertChars(cur, "\n");
97 data->CursorPos = cur + 1;
98 return 0;
99 }
100 }
101 return 0;
102}