From 99113867060ca043eb5083c20122eca70e32e3f1 Mon Sep 17 00:00:00 2001 From: Adrien Plazas Date: Tue, 5 Apr 2022 15:48:09 +0200 Subject: [PATCH] date-chooser: Add the show-selected-week property If enabled, the selected week will be made visible. --- src/gui/event-editor/gcal-date-chooser.c | 122 ++++++++++++++++++++- src/gui/event-editor/gcal-date-chooser.h | 5 + src/gui/event-editor/gcal-date-selector.ui | 1 + 3 files changed, 127 insertions(+), 1 deletion(-) diff --git a/src/gui/event-editor/gcal-date-chooser.c b/src/gui/event-editor/gcal-date-chooser.c index ba6bd52a..0fea1721 100644 --- a/src/gui/event-editor/gcal-date-chooser.c +++ b/src/gui/event-editor/gcal-date-chooser.c @@ -44,6 +44,7 @@ struct _GcalDateChooser GtkWidget *cols[COLS]; GtkWidget *rows[ROWS]; GtkWidget *days[ROWS][COLS]; + GtkWidget *week[ROWS]; GDateTime *date; @@ -53,6 +54,7 @@ struct _GcalDateChooser gboolean show_heading; gboolean show_day_names; gboolean show_week_numbers; + gboolean show_selected_week; }; G_DEFINE_TYPE (GcalDateChooser, gcal_date_chooser, ADW_TYPE_BIN) @@ -70,6 +72,7 @@ enum PROP_SHOW_HEADING, PROP_SHOW_DAY_NAMES, PROP_SHOW_WEEK_NUMBERS, + PROP_SHOW_SELECTED_WEEK, NUM_PROPERTIES }; @@ -276,12 +279,20 @@ calendar_update_selected_day_display (GcalDateChooser *self) for (row = 0; row < ROWS; row++) { + gboolean row_selected = FALSE; + for (col = 0; col < COLS; col++) { + gboolean day_selected; + d = GCAL_DATE_CHOOSER_DAY (self->days[row][col]); date = gcal_date_chooser_day_get_date (d); - gcal_date_chooser_day_set_selected (d, gcal_date_time_compare_date (date, self->date) == 0); + day_selected = gcal_date_time_compare_date (date, self->date) == 0; + gcal_date_chooser_day_set_selected (d, day_selected); + row_selected |= day_selected; } + + gtk_widget_set_visible (self->week[row], row_selected && self->show_selected_week); } } @@ -341,6 +352,10 @@ calendar_set_property (GObject *obj, gcal_date_chooser_set_show_week_numbers (self, g_value_get_boolean (value)); break; + case PROP_SHOW_SELECTED_WEEK: + gcal_date_chooser_set_show_selected_week (self, g_value_get_boolean (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec); break; @@ -373,6 +388,10 @@ calendar_get_property (GObject *obj, g_value_set_boolean (value, self->show_week_numbers); break; + case PROP_SHOW_SELECTED_WEEK: + g_value_set_boolean (value, self->show_selected_week); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec); break; @@ -484,6 +503,17 @@ gcal_date_chooser_class_init (GcalDateChooserClass *class) TRUE, G_PARAM_READWRITE); + /** + * GcalDateChooser:show-selected-week: + * + * Whether the selected week is highlighted or not. + */ + properties[PROP_SHOW_SELECTED_WEEK] = g_param_spec_boolean ("show-selected-week", + "Show Selected Week", + "If TRUE, week numbers are displayed", + TRUE, + G_PARAM_READWRITE); + g_object_class_install_properties (object_class, NUM_PROPERTIES, properties); signals[DAY_SELECTED] = g_signal_new ("day-selected", @@ -504,6 +534,30 @@ gcal_date_chooser_class_init (GcalDateChooserClass *class) } +static gboolean +show_week_number_to_column_cb (GBinding *binding, + const GValue *from_value, + GValue *to_value, + gpointer user_data) +{ + g_value_set_int (to_value, g_value_get_boolean (from_value) ? -1 : 0); + + return TRUE; +} + + +static gboolean +show_week_number_to_column_span_cb (GBinding *binding, + const GValue *from_value, + GValue *to_value, + gpointer user_data) +{ + g_value_set_int (to_value, g_value_get_boolean (from_value) ? COLS + 1 : COLS); + + return TRUE; +} + + static void gcal_date_chooser_init (GcalDateChooser *self) { @@ -511,10 +565,12 @@ gcal_date_chooser_init (GcalDateChooser *self) GtkWidget *label; gint row, col; gint year, month; + GtkLayoutManager *layout_manager; self->show_heading = TRUE; self->show_day_names = TRUE; self->show_week_numbers = TRUE; + self->show_selected_week = TRUE; self->date = g_date_time_new_now_local (); g_date_time_get_ymd (self->date, &self->this_year, NULL, NULL); @@ -538,8 +594,12 @@ gcal_date_chooser_init (GcalDateChooser *self) gtk_grid_attach (GTK_GRID (self->grid), self->cols[col], col, -1, 1, 1); } + layout_manager = gtk_widget_get_layout_manager (self->grid); + for (row = 0; row < ROWS; row++) { + GtkLayoutChild *layout_child; + self->rows[row] = gtk_label_new (""); g_object_bind_property (self, @@ -550,6 +610,33 @@ gcal_date_chooser_init (GcalDateChooser *self) gtk_widget_add_css_class (self->rows[row], "weeknum"); gtk_grid_attach (GTK_GRID (self->grid), self->rows[row], -1, row, 1, 1); + + self->week[row] = adw_bin_new (); + gtk_widget_hide (self->week[row]); + gtk_widget_add_css_class (self->week[row], "current-week"); + gtk_grid_attach (GTK_GRID (self->grid), self->week[row], -1, row, 8, 1); + + layout_child = gtk_layout_manager_get_layout_child (layout_manager, self->week[row]); + + g_object_bind_property_full (self, + "show-week-numbers", + layout_child, + "column", + G_BINDING_SYNC_CREATE, + show_week_number_to_column_cb, + NULL, + NULL, + NULL); + + g_object_bind_property_full (self, + "show-week-numbers", + layout_child, + "column-span", + G_BINDING_SYNC_CREATE, + show_week_number_to_column_span_cb, + NULL, + NULL, + NULL); } /* We are using a stack here to keep the week number column from shrinking @@ -670,6 +757,39 @@ gcal_date_chooser_get_show_week_numbers (GcalDateChooser *self) return self->show_week_numbers; } +/** + * gcal_date_chooser_set_show_selected_week: + * @self: a #GcalDateChooser + * @setting: whether the selected week is highlighted or not. + * + * Sets the selected week is highlighted or not. + */ +void +gcal_date_chooser_set_show_selected_week (GcalDateChooser *self, + gboolean setting) +{ + if (self->show_selected_week == setting) + return; + + self->show_selected_week = setting; + + calendar_update_selected_day_display (self); + + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SHOW_SELECTED_WEEK]); +} + +/** + * gcal_date_chooser_get_show_selected_week: + * @self: a #GcalDateChooser + * + * Returns: whether the selected week is highlighted or not. + */ +gboolean +gcal_date_chooser_get_show_selected_week (GcalDateChooser *self) +{ + return self->show_selected_week; +} + void gcal_date_chooser_set_date (GcalDateChooser *self, GDateTime *date) diff --git a/src/gui/event-editor/gcal-date-chooser.h b/src/gui/event-editor/gcal-date-chooser.h index ce4d7761..a33e2576 100644 --- a/src/gui/event-editor/gcal-date-chooser.h +++ b/src/gui/event-editor/gcal-date-chooser.h @@ -48,6 +48,11 @@ gboolean gcal_date_chooser_get_show_week_numbers (GcalDateChoose void gcal_date_chooser_set_show_week_numbers (GcalDateChooser *self, gboolean setting); +gboolean gcal_date_chooser_get_show_selected_week (GcalDateChooser *self); + +void gcal_date_chooser_set_show_selected_week (GcalDateChooser *self, + gboolean setting); + G_END_DECLS #endif /* __GCAL_DATE_CHOOSER_H__ */ diff --git a/src/gui/event-editor/gcal-date-selector.ui b/src/gui/event-editor/gcal-date-selector.ui index 705b5cd6..864ed74a 100644 --- a/src/gui/event-editor/gcal-date-selector.ui +++ b/src/gui/event-editor/gcal-date-selector.ui @@ -22,6 +22,7 @@ 12 + False True