Selection autoscroll of scrollbarless textareas (single line).

This commit is contained in:
Michael Drake 2013-02-11 17:55:36 +00:00
parent 99cab8389a
commit fe7b71edbf
1 changed files with 38 additions and 13 deletions

View File

@ -170,9 +170,11 @@ static void textarea_normalise_text(struct textarea *ta,
* \param ta Text area
* \param c_start First character (inclusive)
* \param c_end Last character (exclusive)
* \parm force_redraw Redraw whether selection changed or not
* \return true on success false otherwise
*/
static bool textarea_select(struct textarea *ta, int c_start, int c_end)
static bool textarea_select(struct textarea *ta, int c_start, int c_end,
bool force_redraw)
{
int swap;
struct textarea_msg msg;
@ -184,7 +186,8 @@ static bool textarea_select(struct textarea *ta, int c_start, int c_end)
c_end = swap;
}
if (ta->sel_start == c_start && ta->sel_end == c_end)
if (ta->sel_start == c_start && ta->sel_end == c_end &&
!force_redraw)
return true;
ta->sel_start = c_start;
@ -246,7 +249,7 @@ static bool textarea_select_fragment(struct textarea * ta)
}
if (sel_start < sel_end) {
textarea_select(ta, sel_start, sel_end);
textarea_select(ta, sel_start, sel_end, false);
return true;
}
@ -968,7 +971,7 @@ static bool textarea_drag_end(struct textarea *ta, browser_mouse_state mouse,
textarea_get_xy_offset(ta, x, y, &c_off);
c_end = c_off;
if (!textarea_select(ta, ta->drag_start_char, c_end))
if (!textarea_select(ta, ta->drag_start_char, c_end, false))
return false;
break;
@ -2225,12 +2228,13 @@ bool textarea_mouse_action(struct textarea *ta, browser_mouse_state mouse,
ta->callback(ta->data, &msg);
return textarea_select(ta, c_start, c_end);
return textarea_select(ta, c_start, c_end, false);
} else if (mouse & BROWSER_MOUSE_HOLDING_1 &&
ta->drag_info.type == TEXTAREA_DRAG_SELECTION) {
/* Selection track */
int scrx = 0;
int scry = 0;
bool need_redraw;
textarea_get_xy_offset(ta, x, y, &c_off);
c_start = ta->drag_start_char;
@ -2247,9 +2251,9 @@ bool textarea_mouse_action(struct textarea *ta, browser_mouse_state mouse,
else if (y > ta->vis_height)
scry = (y - ta->vis_height) / 4;
textarea_scroll(ta, scrx, scry);
need_redraw = textarea_scroll(ta, scrx, scry);
return textarea_select(ta, c_start, c_end);
return textarea_select(ta, c_start, c_end, need_redraw);
}
return true;
@ -2294,12 +2298,33 @@ bool textarea_scroll(struct textarea *ta, int scrx, int scry)
{
bool handled_scroll = false;
if (ta->bar_x != NULL && scrx != 0 &&
scrollbar_scroll(ta->bar_x, scrx))
handled_scroll = true;
if (ta->bar_y != NULL && scry != 0 &&
scrollbar_scroll(ta->bar_y, scry))
handled_scroll = true;
if (ta->flags & TEXTAREA_MULTILINE) {
/* Multi line textareas have scrollbars to handle this */
if (ta->bar_x != NULL && scrx != 0 &&
scrollbar_scroll(ta->bar_x, scrx))
handled_scroll = true;
if (ta->bar_y != NULL && scry != 0 &&
scrollbar_scroll(ta->bar_y, scry))
handled_scroll = true;
} else {
/* Single line. Can only scroll horizontally. */
int xs = ta->scroll_x;
/* Apply offset */
xs += scrx;
/* Clamp to limits */
if (xs < 0)
xs = 0;
else if (xs > ta->h_extent - ta->vis_width)
xs = ta->h_extent - ta->vis_width;
if (xs != ta->scroll_x) {
ta->scroll_x = xs;
handled_scroll = true;
}
}
return handled_scroll;
}