[text] Check text length in ::button-press-event
Bug 1529 - Selection bound out of sync with an empty Text actor When the user clicks on a Text actor the cursor position and the selection bound are set using bytes_to_offset(); if the Text is empty, this means placing them both to 0. Setting the selection bound to 0 means that when the user inserts a character by typing it into the Text, the selection will be [0,1]; this will select the first character, which will then be overwritten when typing a new character. The Text actor should, instead, check if there are no contents and set the cursor position and the selection bound to -1. The clutter_text_set_selection_bound() method should also validate the value passed, in case it's bigger than the text lenght, or smaller than -1.
This commit is contained in:
parent
0de0e869a9
commit
a1a8193179
@ -893,28 +893,45 @@ clutter_text_button_press (ClutterActor *actor,
|
||||
{
|
||||
ClutterText *self = CLUTTER_TEXT (actor);
|
||||
ClutterTextPrivate *priv = self->priv;
|
||||
gboolean res = FALSE;
|
||||
ClutterUnit x, y;
|
||||
gint index_;
|
||||
|
||||
/* we'll steal keyfocus if we do not have it */
|
||||
clutter_actor_grab_key_focus (actor);
|
||||
|
||||
/* if the actor is empty we just reset everything and not
|
||||
* set up the dragging of the selection since there's nothing
|
||||
* to select
|
||||
*/
|
||||
if (priv->text == NULL || priv->text[0] == '\0')
|
||||
{
|
||||
clutter_text_set_cursor_position (self, -1);
|
||||
clutter_text_set_selection_bound (self, -1);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
x = CLUTTER_UNITS_FROM_INT (event->x);
|
||||
y = CLUTTER_UNITS_FROM_INT (event->y);
|
||||
|
||||
clutter_actor_transform_stage_point (actor, x, y, &x, &y);
|
||||
res = clutter_actor_transform_stage_point (actor, x, y, &x, &y);
|
||||
if (res)
|
||||
{
|
||||
index_ = clutter_text_coords_to_position (self,
|
||||
CLUTTER_UNITS_TO_INT (x),
|
||||
CLUTTER_UNITS_TO_INT (y));
|
||||
|
||||
index_ = clutter_text_coords_to_position (self,
|
||||
CLUTTER_UNITS_TO_INT (x),
|
||||
CLUTTER_UNITS_TO_INT (y));
|
||||
|
||||
clutter_text_set_cursor_position (self, bytes_to_offset (priv->text, index_));
|
||||
clutter_text_set_selection_bound (self, bytes_to_offset (priv->text, index_));
|
||||
clutter_text_set_cursor_position (self,
|
||||
bytes_to_offset (priv->text, index_));
|
||||
clutter_text_set_selection_bound (self,
|
||||
bytes_to_offset (priv->text, index_));
|
||||
}
|
||||
|
||||
/* grab the pointer */
|
||||
priv->in_select_drag = TRUE;
|
||||
clutter_grab_pointer (actor);
|
||||
|
||||
/* we'll steal keyfocus if we do not have it */
|
||||
clutter_actor_grab_key_focus (actor);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -2636,7 +2653,12 @@ clutter_text_set_selection_bound (ClutterText *self,
|
||||
|
||||
if (priv->selection_bound != selection_bound)
|
||||
{
|
||||
priv->selection_bound = selection_bound;
|
||||
gint len = priv->n_chars;
|
||||
|
||||
if (selection_bound < 0 || selection_bound >= len)
|
||||
priv->selection_bound = -1;
|
||||
else
|
||||
priv->selection_bound = selection_bound;
|
||||
|
||||
if (CLUTTER_ACTOR_IS_VISIBLE (self))
|
||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (self));
|
||||
|
Loading…
x
Reference in New Issue
Block a user