diff options
-rw-r--r-- | src/FbTk/TextBox.cc | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/FbTk/TextBox.cc b/src/FbTk/TextBox.cc index dcd51a7..a83347d 100644 --- a/src/FbTk/TextBox.cc +++ b/src/FbTk/TextBox.cc | |||
@@ -123,6 +123,18 @@ void TextBox::cursorEnd() { | |||
123 | void TextBox::cursorForward() { | 123 | void TextBox::cursorForward() { |
124 | StringRange r = charRange(m_start_pos + cursorPosition()); | 124 | StringRange r = charRange(m_start_pos + cursorPosition()); |
125 | const std::string::size_type s = r.end - r.begin + 1; | 125 | const std::string::size_type s = r.end - r.begin + 1; |
126 | |||
127 | if (hasSelection()) { | ||
128 | int start = std::max(m_start_pos, std::min(m_start_pos + m_cursor_pos, m_select_pos)); | ||
129 | int select_length = std::max(m_start_pos + m_cursor_pos, m_select_pos) - start; | ||
130 | if (select_length > static_cast<signed>(m_end_pos - m_start_pos)) { | ||
131 | // shift range | ||
132 | m_start_pos += s; | ||
133 | m_end_pos += s; | ||
134 | adjustPos(); | ||
135 | } | ||
136 | } | ||
137 | |||
126 | if (r.end < m_end_pos) | 138 | if (r.end < m_end_pos) |
127 | m_cursor_pos = r.end + 1 - m_start_pos; | 139 | m_cursor_pos = r.end + 1 - m_start_pos; |
128 | else if (m_end_pos < text().size()) { | 140 | else if (m_end_pos < text().size()) { |
@@ -133,9 +145,22 @@ void TextBox::cursorForward() { | |||
133 | } | 145 | } |
134 | 146 | ||
135 | void TextBox::cursorBackward() { | 147 | void TextBox::cursorBackward() { |
148 | |||
149 | StringRange r = charRange(m_start_pos + cursorPosition() - 1); | ||
150 | const std::string::size_type s = r.end - r.begin + 1; | ||
151 | |||
152 | if (hasSelection()) { | ||
153 | int end = std::max(m_end_pos, std::min(m_end_pos - m_cursor_pos, m_select_pos)); | ||
154 | int select_length = end - std::min(m_end_pos - m_cursor_pos, m_select_pos); | ||
155 | if (select_length > static_cast<signed>(m_end_pos - m_start_pos)) { | ||
156 | // shift range | ||
157 | m_start_pos -= s; | ||
158 | m_end_pos -= s; | ||
159 | adjustPos(); | ||
160 | } | ||
161 | } | ||
162 | |||
136 | if (m_start_pos || cursorPosition()) { | 163 | if (m_start_pos || cursorPosition()) { |
137 | StringRange r = charRange(m_start_pos + cursorPosition() - 1); | ||
138 | const std::string::size_type s = r.end - r.begin + 1; | ||
139 | if (cursorPosition()) | 164 | if (cursorPosition()) |
140 | m_cursor_pos = r.begin - m_start_pos; | 165 | m_cursor_pos = r.begin - m_start_pos; |
141 | else if (m_start_pos) { | 166 | else if (m_start_pos) { |