Fix End key to go to EOL and added Ctrl+Home/End to go to BOF/EOF

This commit is contained in:
David Capello 2025-10-06 12:37:31 -03:00
parent 7e4b310a42
commit d1f010cc47
2 changed files with 32 additions and 6 deletions

View File

@ -1,5 +1,5 @@
// Aseprite // Aseprite
// Copyright (C) 2024 Igara Studio S.A. // Copyright (C) 2024-2025 Igara Studio S.A.
// Copyright (C) 2001-2018 David Capello // Copyright (C) 2001-2018 David Capello
// //
// This program is distributed under the terms of // This program is distributed under the terms of
@ -228,10 +228,28 @@ bool TextEdit::onKeyDown(const KeyMessage* keyMessage)
const Caret prevCaret(m_caret); const Caret prevCaret(m_caret);
switch (scancode) { switch (scancode) {
case kKeyLeft: m_caret.left(byWord); break; case kKeyLeft: m_caret.left(byWord); break;
case kKeyRight: m_caret.right(byWord); break; case kKeyRight: m_caret.right(byWord); break;
case kKeyHome: m_caret.setPos(0); break; case kKeyHome:
case kKeyEnd: m_caret.set(m_lines.back().i, m_lines.back().glyphCount); break; // Beginning of text
if (keyMessage->ctrlPressed()) {
m_caret.set(0, 0);
}
// Beginning of line
else {
m_caret.setPos(0);
}
break;
case kKeyEnd:
// End of text
if (keyMessage->ctrlPressed()) {
m_caret.set(m_lines.back().i, m_lines.back().glyphCount);
}
// End of line
else {
m_caret.eol();
}
break;
case kKeyUp: m_caret.up(); break; case kKeyUp: m_caret.up(); break;
case kKeyDown: m_caret.down(); break; case kKeyDown: m_caret.down(); break;
case kKeyEnter: case kKeyEnter:
@ -956,6 +974,11 @@ void TextEdit::Caret::down()
m_pos = std::clamp(m_pos, size_t(0), lineObj().glyphCount); m_pos = std::clamp(m_pos, size_t(0), lineObj().glyphCount);
} }
void TextEdit::Caret::eol()
{
m_pos = lineObj().glyphCount;
}
size_t TextEdit::Caret::absolutePos() const size_t TextEdit::Caret::absolutePos() const
{ {
if (m_pos == 0 && m_line == 0) if (m_pos == 0 && m_line == 0)

View File

@ -1,5 +1,5 @@
// Aseprite // Aseprite
// Copyright (C) 2024 Igara Studio S.A. // Copyright (C) 2024-2025 Igara Studio S.A.
// Copyright (C) 2001-2018 David Capello // Copyright (C) 2001-2018 David Capello
// //
// This program is distributed under the terms of // This program is distributed under the terms of
@ -93,6 +93,9 @@ private:
bool isLastInLine() const { return m_pos == lineObj().glyphCount; } bool isLastInLine() const { return m_pos == lineObj().glyphCount; }
bool isLastLine() const { return m_line == m_lines->size() - 1; } bool isLastLine() const { return m_line == m_lines->size() - 1; }
// Go to the end of line.
void eol();
// Returns the absolute position of the caret, aka the position in the main string that has all // Returns the absolute position of the caret, aka the position in the main string that has all
// the newlines. // the newlines.
size_t absolutePos() const; size_t absolutePos() const;