diff --git a/PortabilityLayer/PLEditboxWidget.cpp b/PortabilityLayer/PLEditboxWidget.cpp index 61aeeda..a69d75a 100644 --- a/PortabilityLayer/PLEditboxWidget.cpp +++ b/PortabilityLayer/PLEditboxWidget.cpp @@ -248,6 +248,16 @@ namespace PortabilityLayer HandleForwardDelete(keyEvent.m_repeatCount); return WidgetHandleStates::kDigested; } + else if (keyEvent.m_key.m_specialKey == GpKeySpecials::kHome) + { + HandleHome(isShiftHeld); + return WidgetHandleStates::kDigested; + } + else if (keyEvent.m_key.m_specialKey == GpKeySpecials::kEnd) + { + HandleEnd(isShiftHeld); + return WidgetHandleStates::kDigested; + } } } } @@ -546,6 +556,61 @@ namespace PortabilityLayer Redraw(); } + void EditboxWidget::HandleHome(bool shiftHeld) + { + const size_t originalCaratChar = ResolveCaratChar(); + size_t caratChar = originalCaratChar; + + while (caratChar > 0) + { + uint8_t prevChar = m_chars[caratChar - 1]; + if (prevChar == '\r') + break; + else + caratChar--; + } + + if (originalCaratChar != caratChar) + { + HandleKeyMoveCarat(caratChar, shiftHeld); + + m_caratScrollLocked = false; + + AdjustScrollToCarat(); + + m_caratTimer = 0; + Redraw(); + } + } + + void EditboxWidget::HandleEnd(bool shiftHeld) + { + const size_t originalCaratChar = ResolveCaratChar(); + size_t caratChar = originalCaratChar; + + while (caratChar < m_length) + { + uint8_t nextChar = m_chars[caratChar]; + if (nextChar == '\r') + break; + else + caratChar++; + } + + if (originalCaratChar != caratChar) + { + HandleKeyMoveCarat(caratChar, shiftHeld); + + m_caratScrollLocked = false; + + AdjustScrollToCarat(); + + m_caratTimer = 0; + Redraw(); + } + } + + void EditboxWidget::HandleRightArrow(const uint32_t numRepeatsRequested, bool shiftHeld) { size_t caratChar = ResolveCaratChar(); diff --git a/PortabilityLayer/PLEditboxWidget.h b/PortabilityLayer/PLEditboxWidget.h index c150955..aafc878 100644 --- a/PortabilityLayer/PLEditboxWidget.h +++ b/PortabilityLayer/PLEditboxWidget.h @@ -55,6 +55,9 @@ namespace PortabilityLayer void HandleLeftArrow(const uint32_t numRepeatsRequested, bool shiftHeld); void HandleRightArrow(const uint32_t numRepeatsRequested, bool shiftHeld); + void HandleHome(bool shiftHeld); + void HandleEnd(bool shiftHeld); + size_t FindVerticalMovementCaratPos(const Vec2i &desiredPos, bool &isOutOfRange) const; void HandleKeyMoveCarat(size_t newPos, bool shiftHeld);