aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPete Beardmore <pete.beardmore@msn.com>2018-03-04 22:49:44 (GMT)
committerMathias Gumz <akira@fluxbox.org>2018-03-14 06:49:50 (GMT)
commitca0995bdec7c96452291639c9736ed7212f96ca2 (patch)
treebce1bf8211e1b22a7df66c043a6014a69ddd5ace
parentf19bb5787f8ec9e2faf3c30e366709a3c6087b96 (diff)
downloadfluxbox-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
-rw-r--r--src/FbTk/TextBox.cc29
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() {
123void TextBox::cursorForward() { 123void 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
135void TextBox::cursorBackward() { 147void 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) {