Various fixes.
Fixed tab size calculatio issue.
Fixed overwrite mode cursor width issue.
diff --git a/TextEditor.cpp b/TextEditor.cpp
index 2909ca6..1eb8435 100644
--- a/TextEditor.cpp
+++ b/TextEditor.cpp
@@ -346,7 +346,7 @@
auto fontScale = ImGui::GetFontSize() / ImGui::GetFont()->FontSize;
float spaceSize = ImGui::GetFont()->CalcTextSizeA(ImGui::GetFontSize(), FLT_MAX, -1.0f, " ").x;
float oldX = columnX;
- columnX = (1.0f * fontScale + std::floor((1.0f + columnX)) / (float(mTabSize) * spaceSize)) * (float(mTabSize) * spaceSize);
+ columnX = (1.0f * fontScale + std::floor((1.0f + columnX) / (float(mTabSize) * spaceSize))) * (float(mTabSize) * spaceSize);
columnWidth = columnX - oldX;
columnCoord++;
}
@@ -912,11 +912,11 @@
auto lineNoWidth = ImGui::GetFont()->CalcTextSizeA(ImGui::GetFontSize(), FLT_MAX, -1.0f, buf, nullptr, nullptr).x;
drawList->AddText(ImVec2(lineStartScreenPos.x + mTextStart - lineNoWidth, lineStartScreenPos.y), mPalette[(int)PaletteIndex::LineNumber], buf);
- // Highlight the current line (where the cursor is)
if (mState.mCursorPosition.mLine == lineNo)
{
auto focused = ImGui::IsWindowFocused();
+ // Highlight the current line (where the cursor is)
if (!HasSelection())
{
auto end = ImVec2(start.x + contentSize.x + scrollX, start.y + mCharAdvance.y);
@@ -924,8 +924,7 @@
drawList->AddRect(start, end, mPalette[(int)PaletteIndex::CurrentLineEdge], 1.0f);
}
- float cx = TextDistanceToLineStart(mState.mCursorPosition);
-
+ // Render the cursor
if (focused)
{
static auto timeStart = std::chrono::system_clock::now();
@@ -934,8 +933,28 @@
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(diff).count();
if (elapsed > 400)
{
+ float width = 1.0f;
+ auto cindex = GetCharacterIndex(mState.mCursorPosition);
+ float cx = TextDistanceToLineStart(mState.mCursorPosition);
+
+ if (mOverwrite && cindex < (int)line.size())
+ {
+ auto c = line[cindex].mChar;
+ if (c == '\t')
+ {
+ auto x = (1.0f * fontScale + std::floor((1.0f + cx) / (float(mTabSize) * spaceSize))) * (float(mTabSize) * spaceSize);
+ width = x - cx;
+ }
+ else
+ {
+ char buf[2];
+ buf[0] = line[cindex].mChar;
+ buf[1] = '\0';
+ width = ImGui::GetFont()->CalcTextSizeA(ImGui::GetFontSize(), FLT_MAX, -1.0f, buf).x;
+ }
+ }
ImVec2 cstart(textScreenPos.x + cx, lineStartScreenPos.y);
- ImVec2 cend(textScreenPos.x + cx + (mOverwrite ? mCharAdvance.x : 1.0f), lineStartScreenPos.y + mCharAdvance.y);
+ ImVec2 cend(textScreenPos.x + cx + width, lineStartScreenPos.y + mCharAdvance.y);
drawList->AddRectFilled(cstart, cend, mPalette[(int)PaletteIndex::Cursor]);
if (elapsed > 800)
timeStart = timeEnd;
@@ -2323,7 +2342,7 @@
{
if (line[it].mChar == '\t')
{
- distance = (1.0f * fontScale + std::floor((1.0f + distance)) / (float(mTabSize) * spaceSize)) * (float(mTabSize) * spaceSize);
+ distance = (1.0f * fontScale + std::floor((1.0f + distance) / (float(mTabSize) * spaceSize))) * (float(mTabSize) * spaceSize);
++it;
}
else