Skip to content

Commit 570b4e9

Browse files
committed
Add GetWordAtScreenPos() - get the word at a screen position (e.g. from ImGui::GetMousePos())
1 parent 112097c commit 570b4e9

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

TextEditor.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ void TextEditor::render(const char* title, const ImVec2& size, bool border) {
9191

9292
// get current position and total/visible editor size
9393
auto pos = ImGui::GetCursorScreenPos();
94+
lastRenderOrigin = pos;
9495
auto totalSize = ImVec2(textOffset + document.getMaxColumn() * glyphSize.x + cursorWidth, document.size() * glyphSize.y);
9596
auto region = ImGui::GetContentRegionAvail();
9697
auto visibleSize = ImGui::CalcItemSize(size, region.x, region.y); // messing with Dear ImGui internals
@@ -1306,6 +1307,30 @@ std::string TextEditor::getCursorText(size_t cursor) const {
13061307
}
13071308

13081309

1310+
//
1311+
// TextEditor::GetWordAtScreenPos
1312+
//
1313+
1314+
std::string TextEditor::GetWordAtScreenPos(const ImVec2& screenPos) const {
1315+
// Convert screen position to local coordinates using the origin saved during last Render()
1316+
auto local = screenPos - lastRenderOrigin;
1317+
1318+
// Convert to text coordinates using the same logic as handleMouseInteractions()
1319+
Coordinate glyphCoordinate;
1320+
Coordinate cursorCoordinate;
1321+
document.normalizeCoordinate(
1322+
local.y / glyphSize.y,
1323+
(local.x - textOffset) / glyphSize.x,
1324+
glyphCoordinate,
1325+
cursorCoordinate);
1326+
1327+
// Find word boundaries and extract text
1328+
auto start = document.findWordStart(glyphCoordinate);
1329+
auto end = document.findWordEnd(glyphCoordinate);
1330+
return document.getSectionText(start, end);
1331+
}
1332+
1333+
13091334
//
13101335
// TextEditor::makeCursorVisible
13111336
//

TextEditor.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,9 @@ 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+
// get the word at a screen position (e.g. from ImGui::GetMousePos()) - uses the origin saved during the last Render() call
152+
std::string GetWordAtScreenPos(const ImVec2& screenPos) const;
153+
151154
// scrolling support
152155
enum class Scroll {
153156
alignTop,
@@ -1281,6 +1284,7 @@ class TextEditor {
12811284
ImFont* font;
12821285
float fontSize;
12831286
ImVec2 glyphSize;
1287+
ImVec2 lastRenderOrigin;
12841288
float lineNumberLeftOffset;
12851289
float lineNumberRightOffset;
12861290
float decorationOffset;

0 commit comments

Comments
 (0)