From d3e3e9cbe25634f41bd0fd0860bc65e537e42603 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 5 Dec 2016 20:39:13 +0100 Subject: [PATCH] SDK/TextAreaWidget: Expose cursor --- SDK/include/NDK/Widgets/TextAreaWidget.hpp | 4 +++ SDK/include/NDK/Widgets/TextAreaWidget.inl | 26 ++++++++++++++++++ SDK/src/NDK/Widgets/TextAreaWidget.cpp | 31 +++++----------------- 3 files changed, 37 insertions(+), 24 deletions(-) diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.hpp b/SDK/include/NDK/Widgets/TextAreaWidget.hpp index 6a93fe248..d5cf264ee 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/TextAreaWidget.hpp @@ -30,13 +30,17 @@ namespace Ndk //virtual TextAreaWidget* Clone() const = 0; + inline std::size_t GetCursorPosition() const; inline std::size_t GetLineCount() const; inline const Nz::String& GetText() const; std::size_t GetHoveredGlyph(float x, float y) const; + inline void MoveCursor(int offset); + void ResizeToContent() override; + inline void SetCursorPosition(std::size_t cursorPosition); void SetText(const Nz::String& text); void Write(const Nz::String& text); diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.inl b/SDK/include/NDK/Widgets/TextAreaWidget.inl index a09a71178..efe960994 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/TextAreaWidget.inl @@ -15,6 +15,11 @@ namespace Ndk RefreshCursor(); } + inline std::size_t TextAreaWidget::GetCursorPosition() const + { + return m_cursorPosition; + } + inline std::size_t TextAreaWidget::GetLineCount() const { return m_drawer.GetLineCount(); @@ -24,4 +29,25 @@ namespace Ndk { return m_drawer.GetText(); } + + inline void TextAreaWidget::MoveCursor(int offset) + { + if (offset >= 0) + SetCursorPosition(m_cursorPosition += static_cast(offset)); + else + { + std::size_t nOffset = static_cast(-offset); + if (nOffset >= m_cursorPosition) + SetCursorPosition(0); + else + SetCursorPosition(m_cursorPosition - nOffset); + } + } + + inline void TextAreaWidget::SetCursorPosition(std::size_t cursorPosition) + { + m_cursorPosition = std::min(cursorPosition, m_drawer.GetGlyphCount()); + + RefreshCursor(); + } } diff --git a/SDK/src/NDK/Widgets/TextAreaWidget.cpp b/SDK/src/NDK/Widgets/TextAreaWidget.cpp index 6b141ebed..53f196f7c 100644 --- a/SDK/src/NDK/Widgets/TextAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/TextAreaWidget.cpp @@ -87,7 +87,7 @@ namespace Ndk if (m_cursorPosition >= m_drawer.GetGlyphCount()) { AppendText(text); - m_cursorPosition = m_drawer.GetGlyphCount(); + SetCursorPosition(m_drawer.GetGlyphCount()); } else { @@ -95,10 +95,8 @@ namespace Ndk currentText.Insert(currentText.GetCharacterPosition(m_cursorPosition), text); SetText(currentText); - m_cursorPosition += text.GetLength(); + SetCursorPosition(m_cursorPosition + text.GetLength()); } - - RefreshCursor(); } void TextAreaWidget::RefreshCursor() @@ -151,21 +149,12 @@ namespace Ndk } case Nz::Keyboard::Left: - if (m_cursorPosition > 0) - m_cursorPosition--; - - RefreshCursor(); + MoveCursor(-1); break; case Nz::Keyboard::Right: - { - std::size_t glyphCount = m_drawer.GetGlyphCount(); - if (m_cursorPosition < glyphCount) - m_cursorPosition++; - - RefreshCursor(); + MoveCursor(1); break; - } } } @@ -184,8 +173,7 @@ namespace Ndk { GrabKeyboard(); - m_cursorPosition = GetHoveredGlyph(x, y); - RefreshCursor(); + SetCursorPosition(GetHoveredGlyph(x, y)); } } @@ -213,13 +201,8 @@ namespace Ndk if (m_cursorPosition < m_drawer.GetGlyphCount()) newText.Append(text.SubString(text.GetCharacterPosition(m_cursorPosition))); - m_drawer.SetText(newText); - m_textSprite->Update(m_drawer); - - if (m_cursorPosition > 0) - m_cursorPosition--; - - RefreshCursor(); + SetText(newText); + MoveCursor(-1); break; }