common/date-chooser: Focus selected date in grid when tabbing into it

When tabbing into a grid or list of items that are selectable,
we want to focus the selected item when entering it. At the moment,
we only focus the first or last item in the date chooser grid,
rather than the selected item.

Co-authored-by: Niklas Wimmer <niklas@viric.eu>
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/869>
This commit is contained in:
Hari Rana
2026-10-26 08:25:25 -04:00
co-authored by Niklas Wimmer
parent 4f7403fd71
commit 4defb0019b
+44 -16
View File
@@ -46,6 +46,9 @@ struct _GcalDateChooser
GtkWidget *year_choice;
GtkWidget *combined_choice;
GtkWidget *selected_day_widget;
GtkWidget *selected_week_widget;
GcalGizmo *gizmo;
GtkWidget *grid;
@@ -448,22 +451,38 @@ calendar_update_selected_day_display (GcalDateChooser *self)
GDateTime *date;
gint row, col;
if (self->selected_day_widget)
{
gcal_date_chooser_day_set_selected (GCAL_DATE_CHOOSER_DAY (self->selected_day_widget), FALSE);
g_clear_weak_pointer (&self->selected_day_widget);
}
if (self->selected_week_widget)
{
gtk_widget_set_visible (self->selected_week_widget, FALSE);
g_clear_weak_pointer (&self->selected_week_widget);
}
for (row = 0; row < ROWS; row++)
{
gboolean row_selected = FALSE;
for (col = 0; col < GCAL_N_WEEKDAYS; col++)
{
gboolean day_selected;
{
d = GCAL_DATE_CHOOSER_DAY (self->days[row][col]);
date = gcal_date_chooser_day_get_date (d);
d = GCAL_DATE_CHOOSER_DAY (self->days[row][col]);
date = gcal_date_chooser_day_get_date (d);
day_selected = gcal_date_time_compare_date (date, self->date) == 0;
gcal_date_chooser_day_set_selected (d, day_selected);
row_selected |= day_selected;
}
if (gcal_date_time_compare_date (date, self->date) == 0)
{
gcal_date_chooser_day_set_selected (d, TRUE);
g_set_weak_pointer (&self->selected_day_widget, GTK_WIDGET (d));
break;
}
}
gtk_widget_set_visible (self->week[row], row_selected && self->show_selected_week);
if (self->selected_day_widget)
{
gtk_widget_set_visible (self->week[row], self->show_selected_week);
g_set_weak_pointer (&self->selected_week_widget, GTK_WIDGET (self->week[row]));
break;
}
}
}
@@ -693,15 +712,19 @@ gcal_gizmo_focus (GcalGizmo *gizmo,
GtkDirectionType direction,
gpointer user_data)
{
GcalDateChooser *self = GCAL_DATE_CHOOSER (user_data);
GtkWidget *focus_widget, *new_focus;
GTypeClass *gizmo_parent_class;
gboolean is_tab, is_rtl;
gboolean is_rtl;
GtkRoot *root;
is_tab = direction == GTK_DIR_TAB_FORWARD || direction == GTK_DIR_TAB_BACKWARD;
if (direction == GTK_DIR_TAB_FORWARD || direction == GTK_DIR_TAB_BACKWARD)
{
if (gtk_widget_get_focus_child (GTK_WIDGET (gizmo)))
return FALSE;
if (gtk_widget_get_focus_child (GTK_WIDGET (gizmo)) && is_tab)
return FALSE;
return gtk_widget_grab_focus (self->selected_day_widget);
}
if (direction == GTK_DIR_LEFT || direction == GTK_DIR_RIGHT)
{
@@ -963,6 +986,11 @@ gcal_date_chooser_finalize (GObject *object)
static void
gcal_date_chooser_dispose (GObject *object)
{
GcalDateChooser *self = GCAL_DATE_CHOOSER (object);
g_clear_weak_pointer (&self->selected_day_widget);
g_clear_weak_pointer (&self->selected_week_widget);
G_OBJECT_CLASS (gcal_date_chooser_parent_class)->dispose (object);
}
@@ -1116,7 +1144,7 @@ gcal_date_chooser_init (GcalDateChooser *self)
gtk_widget_init_template (GTK_WIDGET (self));
gcal_gizmo_set_focus_func (self->gizmo, gcal_gizmo_focus, NULL);
gcal_gizmo_set_focus_func (self->gizmo, gcal_gizmo_focus, self);
for (col = 0; col < GCAL_N_WEEKDAYS; col++)
{