ImGui: add multiple fixes and improvements

Add some selection improvements from maintained version at https://github.com/santaclose/ImGuiColorTextEdit.

patch contains:
* advance cursor to end of selection
* add shift + mouse select
This commit is contained in:
Kawe Mazidjatari 2024-02-28 23:49:48 +01:00
parent dac0ab4d99
commit 56b73af57d

View File

@ -287,7 +287,6 @@ int CTextLogger::InsertTextAt(Coordinates& aWhere, const char* aValue, const ImU
} }
} }
// TODO[ AMOS ]: should we really pad it with a white space if buf empty?
if (!*aValue) if (!*aValue)
{ {
Line& line = m_Lines[aWhere.m_nLine]; Line& line = m_Lines[aWhere.m_nLine];
@ -669,9 +668,10 @@ void CTextLogger::HandleMouseInputs(bool bHoveredScrollbar, bool bActiveScrollba
if (!bHoveredScrollbar && !bActiveScrollbar && m_bWithinLoggingRect) if (!bHoveredScrollbar && !bActiveScrollbar && m_bWithinLoggingRect)
{ {
bool click = ImGui::IsMouseClicked(0);
if (!bShift && !bAlt) if (!bShift && !bAlt)
{ {
bool click = ImGui::IsMouseClicked(0);
bool doubleClick = ImGui::IsMouseDoubleClicked(0); bool doubleClick = ImGui::IsMouseDoubleClicked(0);
double t = ImGui::GetTime(); double t = ImGui::GetTime();
@ -703,6 +703,10 @@ void CTextLogger::HandleMouseInputs(bool bHoveredScrollbar, bool bActiveScrollba
{ {
m_State.m_CursorPosition = m_InteractiveStart = m_InteractiveEnd = ScreenPosToCoordinates(ImGui::GetMousePos()); m_State.m_CursorPosition = m_InteractiveStart = m_InteractiveEnd = ScreenPosToCoordinates(ImGui::GetMousePos());
// Advance cursor to the end of the selection
m_InteractiveStart = FindWordStart(m_State.m_CursorPosition);
m_State.m_CursorPosition = m_InteractiveEnd = FindWordEnd(m_State.m_CursorPosition);
if (m_SelectionMode == SelectionMode::Line) if (m_SelectionMode == SelectionMode::Line)
m_SelectionMode = SelectionMode::Normal; m_SelectionMode = SelectionMode::Normal;
else else
@ -765,6 +769,22 @@ void CTextLogger::HandleMouseInputs(bool bHoveredScrollbar, bool bActiveScrollba
m_InteractiveStart = newStart; m_InteractiveStart = newStart;
} }
} }
else if (bShift)
{
if (click) // Shift select range
{
Coordinates newSelection = ScreenPosToCoordinates(ImGui::GetMousePos());
if (newSelection > m_State.m_CursorPosition)
SetSelectionEnd(newSelection);
else
SetSelectionStart(newSelection);
m_InteractiveStart = m_State.m_SelectionStart;
m_InteractiveEnd = m_State.m_SelectionEnd;
m_State.m_CursorPosition = newSelection;
}
}
} }
} }
@ -1042,7 +1062,8 @@ void CTextLogger::SetSelection(const Coordinates & aStart, const Coordinates & a
const int lineNo = m_State.m_SelectionEnd.m_nLine; const int lineNo = m_State.m_SelectionEnd.m_nLine;
//const size_t lineSize = (size_t)lineNo < m_Lines.size() ? m_Lines[lineNo].size() : 0; //const size_t lineSize = (size_t)lineNo < m_Lines.size() ? m_Lines[lineNo].size() : 0;
m_State.m_SelectionStart = Coordinates(m_State.m_SelectionStart.m_nLine, 0); m_State.m_SelectionStart = Coordinates(m_State.m_SelectionStart.m_nLine, 0);
m_State.m_SelectionEnd = Coordinates(lineNo, GetLineMaxColumn(lineNo)); m_State.m_SelectionEnd = m_Lines.size() > lineNo + 1 ? Coordinates(lineNo + 1, 0) : Coordinates(lineNo, GetLineMaxColumn(lineNo));
m_State.m_CursorPosition = m_State.m_SelectionEnd;
break; break;
} }
default: default:
@ -1091,7 +1112,7 @@ void CTextLogger::MoveUp(int aAmount, bool aSelect)
else else
m_InteractiveStart = m_InteractiveEnd = m_State.m_CursorPosition; m_InteractiveStart = m_InteractiveEnd = m_State.m_CursorPosition;
SetSelection(m_InteractiveStart, m_InteractiveEnd); SetSelection(m_InteractiveStart, m_InteractiveEnd, SelectionMode::Normal);
EnsureCursorVisible(); EnsureCursorVisible();
} }
} }
@ -1120,7 +1141,7 @@ void CTextLogger::MoveDown(int aAmount, bool aSelect)
else else
m_InteractiveStart = m_InteractiveEnd = m_State.m_CursorPosition; m_InteractiveStart = m_InteractiveEnd = m_State.m_CursorPosition;
SetSelection(m_InteractiveStart, m_InteractiveEnd); SetSelection(m_InteractiveStart, m_InteractiveEnd, SelectionMode::Normal);
EnsureCursorVisible(); EnsureCursorVisible();
} }
} }
@ -1197,7 +1218,13 @@ void CTextLogger::MoveLeft(int aAmount, bool aSelect, bool aWordMode)
} }
} }
else else
{
if (HasSelection() && !aWordMode)
m_State.m_CursorPosition = m_InteractiveStart;
m_InteractiveStart = m_InteractiveEnd = m_State.m_CursorPosition; m_InteractiveStart = m_InteractiveEnd = m_State.m_CursorPosition;
}
SetSelection(m_InteractiveStart, m_InteractiveEnd, aSelect && aWordMode ? SelectionMode::Word : SelectionMode::Normal); SetSelection(m_InteractiveStart, m_InteractiveEnd, aSelect && aWordMode ? SelectionMode::Word : SelectionMode::Normal);
EnsureCursorVisible(); EnsureCursorVisible();
@ -1256,7 +1283,12 @@ void CTextLogger::MoveRight(int aAmount, bool aSelect, bool aWordMode)
} }
} }
else else
{
if (HasSelection() && !aWordMode)
m_State.m_CursorPosition = m_InteractiveEnd;
m_InteractiveStart = m_InteractiveEnd = m_State.m_CursorPosition; m_InteractiveStart = m_InteractiveEnd = m_State.m_CursorPosition;
}
SetSelection(m_InteractiveStart, m_InteractiveEnd, aSelect && aWordMode ? SelectionMode::Word : SelectionMode::Normal); SetSelection(m_InteractiveStart, m_InteractiveEnd, aSelect && aWordMode ? SelectionMode::Word : SelectionMode::Normal);
EnsureCursorVisible(); EnsureCursorVisible();