Fixed cursor positioning on left mouse click.
diff --git a/TextEditor.cpp b/TextEditor.cpp index a2b4138..8d16d61 100644 --- a/TextEditor.cpp +++ b/TextEditor.cpp
@@ -322,10 +322,11 @@ ++mUndoIndex; } -TextEditor::Coordinates TextEditor::ScreenPosToCoordinates(const ImVec2& aPosition) const +TextEditor::Coordinates TextEditor::ScreenPosToCoordinates(const ImVec2& aPosition, bool aInsertionMode) const { ImVec2 origin = ImGui::GetCursorScreenPos(); - ImVec2 local(aPosition.x - origin.x, aPosition.y - origin.y); + ImVec2 local(aPosition.x - origin.x + 3.0f, aPosition.y - origin.y); + float spaceSize = ImGui::GetFont()->CalcTextSizeA(ImGui::GetFontSize(), FLT_MAX, -1.0f, " ").x; int lineNo = std::max(0, (int)floor(local.y / mCharAdvance.y)); @@ -339,17 +340,18 @@ std::string cumulatedString = ""; float columnWidth = 0.0f; float columnX = 0.0f; + int delta = 0; // First we find the hovered column coord. - while (mTextStart + columnX < local.x && (size_t)columnIndex < line.size()) + while (mTextStart + columnX - (aInsertionMode ? 0.5f : 0.0f) * columnWidth < local.x && (size_t)columnIndex < line.size()) { + columnCoord += delta; if (line[columnIndex].mChar == '\t') { - float spaceSize = ImGui::GetFont()->CalcTextSizeA(ImGui::GetFontSize(), FLT_MAX, -1.0f, " ").x; float oldX = columnX; columnX = (1.0f + std::floor((1.0f + columnX) / (float(mTabSize) * spaceSize))) * (float(mTabSize) * spaceSize); columnWidth = columnX - oldX; - columnCoord++; + delta = columnCoord - (columnCoord / mTabSize) * mTabSize + mTabSize; } else { @@ -357,17 +359,18 @@ auto d = UTF8CharLength(line[columnIndex].mChar); int i = 0; while (i < 6 && d-- > 0) - buf[i++] = line[columnIndex++].mChar; + buf[i++] = line[columnIndex].mChar; buf[i] = '\0'; columnWidth = ImGui::GetFont()->CalcTextSizeA(ImGui::GetFontSize(), FLT_MAX, -1.0f, buf).x; columnX += columnWidth; - columnCoord++; + delta = 1; } + ++columnIndex; } // Then we reduce by 1 column coord if cursor is on the left side of the hovered column. - if (mTextStart + columnX - columnWidth / 2.0f > local.x) - columnIndex = std::max(0, columnIndex - 1); + //if (aInsertionMode && mTextStart + columnX - columnWidth * 2.0f < local.x) + // columnIndex = std::min((int)line.size() - 1, columnIndex + 1); } return SanitizeCoordinates(Coordinates(lineNo, columnCoord)); @@ -419,7 +422,7 @@ if (cindex >= (int)line.size()) return at; - bool prevspace = (bool)isspace(line[cindex].mChar); + bool prevspace = (bool)!!isspace(line[cindex].mChar); auto cstart = (PaletteIndex)line[cindex].mColorIndex; while (cindex < (int)line.size()) { @@ -453,7 +456,7 @@ if (cindex < (int)mLines[at.mLine].size()) { auto& line = mLines[at.mLine]; - isword = isalnum(line[cindex].mChar); + isword = !!isalnum(line[cindex].mChar); skip = isword; } @@ -841,7 +844,7 @@ */ else if (click) { - mState.mCursorPosition = mInteractiveStart = mInteractiveEnd = SanitizeCoordinates(ScreenPosToCoordinates(ImGui::GetMousePos())); + mState.mCursorPosition = mInteractiveStart = mInteractiveEnd = SanitizeCoordinates(ScreenPosToCoordinates(ImGui::GetMousePos(), !mOverwrite)); if (ctrl) mSelectionMode = SelectionMode::Word; else @@ -854,7 +857,7 @@ else if (ImGui::IsMouseDragging(0) && ImGui::IsMouseDown(0)) { io.WantCaptureMouse = true; - mState.mCursorPosition = mInteractiveEnd = SanitizeCoordinates(ScreenPosToCoordinates(ImGui::GetMousePos())); + mState.mCursorPosition = mInteractiveEnd = SanitizeCoordinates(ScreenPosToCoordinates(ImGui::GetMousePos(), !mOverwrite)); SetSelection(mInteractiveStart, mInteractiveEnd, mSelectionMode); } } @@ -1004,10 +1007,10 @@ } else { - char buf[2]; - buf[0] = line[cindex].mChar; - buf[1] = '\0'; - width = ImGui::GetFont()->CalcTextSizeA(ImGui::GetFontSize(), FLT_MAX, -1.0f, buf).x; + char buf2[2]; + buf2[0] = line[cindex].mChar; + buf2[1] = '\0'; + width = ImGui::GetFont()->CalcTextSizeA(ImGui::GetFontSize(), FLT_MAX, -1.0f, buf2).x; } } ImVec2 cstart(textScreenPos.x + cx, lineStartScreenPos.y); @@ -1112,25 +1115,34 @@ // Draw a tooltip on known identifiers/preprocessor symbols if (ImGui::IsMousePosValid()) { - auto id = GetWordAt(ScreenPosToCoordinates(ImGui::GetMousePos())); - if (!id.empty()) + auto mpos = ImGui::GetMousePos(); + ImVec2 origin = ImGui::GetCursorScreenPos(); + ImVec2 local(mpos.x - origin.x, mpos.y - origin.y); + //printf("Mouse: pos(%g, %g), origin(%g, %g), local(%g, %g)\n", mpos.x, mpos.y, origin.x, origin.y, local.x, local.y); + if (local.x >= mTextStart) { - auto it = mLanguageDefinition.mIdentifiers.find(id); - if (it != mLanguageDefinition.mIdentifiers.end()) + auto pos = ScreenPosToCoordinates(mpos); + printf("Coord(%d, %d)\n", pos.mLine, pos.mColumn); + auto id = GetWordAt(pos); + if (!id.empty()) { - ImGui::BeginTooltip(); - ImGui::TextUnformatted(it->second.mDeclaration.c_str()); - ImGui::EndTooltip(); - } - else - { - auto pi = mLanguageDefinition.mPreprocIdentifiers.find(id); - if (pi != mLanguageDefinition.mPreprocIdentifiers.end()) + auto it = mLanguageDefinition.mIdentifiers.find(id); + if (it != mLanguageDefinition.mIdentifiers.end()) { ImGui::BeginTooltip(); - ImGui::TextUnformatted(pi->second.mDeclaration.c_str()); + ImGui::TextUnformatted(it->second.mDeclaration.c_str()); ImGui::EndTooltip(); } + else + { + auto pi = mLanguageDefinition.mPreprocIdentifiers.find(id); + if (pi != mLanguageDefinition.mPreprocIdentifiers.end()) + { + ImGui::BeginTooltip(); + ImGui::TextUnformatted(pi->second.mDeclaration.c_str()); + ImGui::EndTooltip(); + } + } } } }
diff --git a/TextEditor.h b/TextEditor.h index f7fe714..f4d5dc2 100644 --- a/TextEditor.h +++ b/TextEditor.h
@@ -328,7 +328,7 @@ void DeleteRange(const Coordinates& aStart, const Coordinates& aEnd); int InsertTextAt(Coordinates& aWhere, const char* aValue); void AddUndo(UndoRecord& aValue); - Coordinates ScreenPosToCoordinates(const ImVec2& aPosition) const; + Coordinates ScreenPosToCoordinates(const ImVec2& aPosition, bool aInsertionMode = false) const; Coordinates FindWordStart(const Coordinates& aFrom) const; Coordinates FindWordEnd(const Coordinates& aFrom) const; Coordinates FindNextWord(const Coordinates& aFrom) const;