mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-14 20:51:07 +00:00
label: Move focus out of widget after last link
This allows the user to navigate via tab the links in a label and exits the widget after the last link, when moving forward, and first link, when moving backward. This also ensures that ellipsised links arn't focused. Fixes: https://gitlab.gnome.org/GNOME/gtk/-/issues/4681
This commit is contained in:
parent
659c1c41de
commit
f915c6bb5c
@ -1793,6 +1793,7 @@ gtk_label_focus (GtkWidget *widget,
|
||||
{
|
||||
info->selection_anchor = focus_link->start;
|
||||
info->selection_end = focus_link->start;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1856,7 +1857,6 @@ gtk_label_focus (GtkWidget *widget,
|
||||
{
|
||||
int focus_link_index;
|
||||
int new_index = -1;
|
||||
int i;
|
||||
|
||||
if (info->n_links == 0)
|
||||
goto out;
|
||||
@ -1870,29 +1870,39 @@ gtk_label_focus (GtkWidget *widget,
|
||||
{
|
||||
case GTK_DIR_TAB_FORWARD:
|
||||
if (focus_link)
|
||||
new_index = (focus_link_index + 1) % info->n_links;
|
||||
new_index = focus_link_index + 1;
|
||||
else
|
||||
new_index = 0;
|
||||
|
||||
for (i = new_index; i < info->n_links; i++)
|
||||
if (new_index >= info->n_links)
|
||||
goto out;
|
||||
|
||||
while (new_index < info->n_links)
|
||||
{
|
||||
const GtkLabelLink *link = &info->links[i];
|
||||
const GtkLabelLink *link = &info->links[new_index];
|
||||
if (!range_is_in_ellipsis (self, link->start, link->end))
|
||||
break;
|
||||
|
||||
new_index++;
|
||||
}
|
||||
break;
|
||||
|
||||
case GTK_DIR_TAB_BACKWARD:
|
||||
if (focus_link)
|
||||
new_index = focus_link_index == 0 ? info->n_links - 1 : focus_link_index - 1;
|
||||
new_index = focus_link_index - 1;
|
||||
else
|
||||
new_index = info->n_links - 1;
|
||||
|
||||
for (i = new_index; i >= 0; i--)
|
||||
if (new_index < 0)
|
||||
goto out;
|
||||
|
||||
while (new_index >= 0)
|
||||
{
|
||||
const GtkLabelLink *link = &info->links[i];
|
||||
const GtkLabelLink *link = &info->links[new_index];
|
||||
if (!range_is_in_ellipsis (self, link->start, link->end))
|
||||
break;
|
||||
|
||||
new_index--;
|
||||
}
|
||||
break;
|
||||
|
||||
@ -1904,7 +1914,7 @@ gtk_label_focus (GtkWidget *widget,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (new_index != -1)
|
||||
if (new_index != -1 && new_index < info->n_links)
|
||||
{
|
||||
focus_link = &info->links[new_index];
|
||||
info->selection_anchor = focus_link->start;
|
||||
|
Loading…
Reference in New Issue
Block a user