diff options
author | Pete Beardmore <pete.beardmore@msn.com> | 2018-03-04 22:49:44 (GMT) |
---|---|---|
committer | Mathias Gumz <akira@fluxbox.org> | 2018-03-14 06:49:50 (GMT) |
commit | ca0995bdec7c96452291639c9736ed7212f96ca2 (patch) | |
tree | bce1bf8211e1b22a7df66c043a6014a69ddd5ace /src/FbTk | |
parent | f19bb5787f8ec9e2faf3c30e366709a3c6087b96 (diff) | |
download | fluxbox-ca0995bdec7c96452291639c9736ed7212f96ca2.zip fluxbox-ca0995bdec7c96452291639c9736ed7212f96ca2.tar.bz2 |
fbtk, textbox, overflow selection deselection
changes the selection's deselection mechanism for oversized (e.g
larger than window width) text
new behaviour ensures the maximum selection width remains whilst
the selection length is 'oversized'. only when the selection length
has a width less than the window width will the selection (i.e. the
highlight / inverted colours) reduce in size
this is in contrast to the existing approach which would immediately
decrease an oversized selection down to nothing visually, leaving
the remainder of the selection 'off screen'. this 'looks like nothing
is selected' when in fact it is, gives a poor UX
Diffstat (limited to 'src/FbTk')
-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) { |