[gnome-calendar] date-chooser: Add the show-selected-week property
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-calendar] date-chooser: Add the show-selected-week property
- Date: Thu, 16 Jun 2022 11:44:37 +0000 (UTC)
commit 99113867060ca043eb5083c20122eca70e32e3f1
Author: Adrien Plazas <kekun plazas laposte net>
Date: Tue Apr 5 15:48:09 2022 +0200
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 @@
<property name="margin-end">12</property>
<child>
<object class="GcalDateChooser" id="date_chooser">
+ <property name="show_selected_week">False</property>
<property name="show_week_numbers">True</property>
<signal name="day-selected" handler="calendar_day_selected" object="GcalDateSelector"
swapped="yes"/>
</object>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]