Skip to content

Commit 69ac1ec

Browse files
committed
Merged in contributed enhancements
1 parent 369e0ab commit 69ac1ec

2 files changed

Lines changed: 45 additions & 14 deletions

File tree

TextEditor.cpp

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ void TextEditor::render(const char* title, const ImVec2& size, bool border) {
170170
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0.0f, 0.0f));
171171
ImGui::PushStyleColor(ImGuiCol_ChildBg, ImGui::ColorConvertU32ToFloat4(palette.get(Color::background)));
172172
ImGui::BeginChild(title, size, border, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_HorizontalScrollbar | ImGuiWindowFlags_NoNavInputs);
173+
lastRenderOrigin = ImGui::GetCursorScreenPos();
173174

174175
// handle keyboard and mouse inputs
175176
handleKeyboardInputs();
@@ -1312,6 +1313,26 @@ std::string TextEditor::getCursorText(size_t cursor) const {
13121313
}
13131314

13141315

1316+
//
1317+
// TextEditor::GetWordAtScreenPos
1318+
//
1319+
1320+
std::string TextEditor::GetWordAtScreenPos(const ImVec2& screenPos) const {
1321+
// convert screen position to local coordinates using the origin saved during last Render()
1322+
auto local = screenPos - lastRenderOrigin;
1323+
1324+
// convert to text coordinates
1325+
Coordinate glyphCoordinate;
1326+
Coordinate cursorCoordinate;
1327+
document.normalizeCoordinate(local.y / glyphSize.y, (local.x - textOffset) / glyphSize.x, glyphCoordinate, cursorCoordinate);
1328+
1329+
// Find word boundaries and extract text
1330+
auto start = document.findWordStart(glyphCoordinate);
1331+
auto end = document.findWordEnd(glyphCoordinate);
1332+
return document.getSectionText(start, end);
1333+
}
1334+
1335+
13151336
//
13161337
// TextEditor::makeCursorVisible
13171338
//
@@ -2361,19 +2382,11 @@ TextEditor::Palette TextEditor::defaultPalette = TextEditor::GetDarkPalette();
23612382
//
23622383

23632384
TextEditor::Coordinate TextEditor::Cursor::adjustCoordinateForInsert(Coordinate coordinate, Coordinate insertStart, Coordinate insertEnd) {
2364-
if (insertStart.line == insertEnd.line) {
2365-
if (coordinate.line == insertEnd.line) {
2366-
coordinate.column += insertEnd.column - insertStart.column;
2367-
}
2368-
2369-
} else {
2370-
if (coordinate.line == insertStart.line) {
2371-
coordinate.column += insertEnd.column - insertStart.column;
2372-
}
2373-
2374-
coordinate.line += insertEnd.line - insertStart.line;
2385+
if (coordinate.line == insertStart.line) {
2386+
coordinate.column += insertEnd.column - insertStart.column;
23752387
}
23762388

2389+
coordinate.line += insertEnd.line - insertStart.line;
23772390
return coordinate;
23782391
}
23792392

@@ -6240,19 +6253,24 @@ bool TextEditor::CodePoint::isWhiteSpace(ImWchar codepoint) {
62406253

62416254
bool TextEditor::CodePoint::isWord(ImWchar codepoint) {
62426255
if (codepoint < 0x7f) {
6243-
return (static_cast<unsigned>((codepoint | 32) - 'a') < 26) || (static_cast<unsigned>(codepoint - '0') < 10);
6256+
return
6257+
(static_cast<unsigned>((codepoint | 32) - 'a') < 26) ||
6258+
(static_cast<unsigned>(codepoint - '0') < 10) ||
6259+
codepoint == '_';
62446260

62456261
#if defined(IMGUI_USE_WCHAR32)
62466262
} else if (codepoint >= 0x10000) {
62476263
return
62486264
rangeContains(letters32, static_cast<ImWchar32>(codepoint)) ||
6249-
rangeContains(numbers32, static_cast<ImWchar32>(codepoint));
6265+
rangeContains(numbers32, static_cast<ImWchar32>(codepoint)) ||
6266+
codepoint == '_';
62506267
#endif
62516268

62526269
} else {
62536270
return
62546271
rangeContains(letters16, static_cast<ImWchar16>(codepoint)) ||
6255-
rangeContains(numbers16, static_cast<ImWchar16>(codepoint));
6272+
rangeContains(numbers16, static_cast<ImWchar16>(codepoint)) ||
6273+
codepoint == '_';
62566274
}
62576275
}
62586276

TextEditor.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,18 @@ class TextEditor {
148148
inline void GetMainCursor(int& line, int& column) const { return getCursor(line, column, cursors.getMainIndex()); }
149149
inline void GetCurrentCursor(int& line, int& column) const { return getCursor(line, column, cursors.getCurrentIndex()); }
150150

151+
// alternative API for cursor and selection position using lightweight out struct (line and column are zero-based)
152+
struct CursorPosition { int line = 0; int column = 0; };
153+
struct CursorSelection { CursorPosition start; CursorPosition end; };
154+
inline CursorPosition GetMainCursorPosition() const { CursorPosition p; getCursor(p.line, p.column, cursors.getMainIndex()); return p; }
155+
inline CursorPosition GetCurrentCursorPosition() const { CursorPosition p; getCursor(p.line, p.column, cursors.getCurrentIndex()); return p; }
156+
inline CursorPosition GetCursorPosition(size_t cursor) const { CursorPosition p; getCursor(p.line, p.column, cursor); return p; }
157+
inline CursorSelection GetCursorSelection(size_t cursor) const { CursorSelection s; getCursor(s.start.line, s.start.column, s.end.line, s.end.column, cursor); return s; }
158+
inline CursorSelection GetMainCursorSelection() const { return GetCursorSelection(cursors.getMainIndex()); }
159+
160+
// get the word at a screen position
161+
std::string GetWordAtScreenPos(const ImVec2& screenPos) const;
162+
151163
// scrolling support
152164
enum class Scroll {
153165
alignTop,
@@ -1287,6 +1299,7 @@ class TextEditor {
12871299
ImFont* font;
12881300
float fontSize;
12891301
ImVec2 glyphSize;
1302+
ImVec2 lastRenderOrigin;
12901303
float lineNumberLeftOffset;
12911304
float lineNumberRightOffset;
12921305
float decorationOffset;

0 commit comments

Comments
 (0)