[gnome-calendar] date-chooser-day: Add the has-dot and dot-visible properties
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-calendar] date-chooser-day: Add the has-dot and dot-visible properties
- Date: Thu, 16 Jun 2022 11:44:36 +0000 (UTC)
commit 7198ce41f9b8e833c4b47ea9d06c314085c37bb7
Author: Adrien Plazas <kekun plazas laposte net>
Date: Wed Apr 6 13:55:13 2022 +0200
date-chooser-day: Add the has-dot and dot-visible properties
This allows the days to display events.
src/gui/event-editor/gcal-date-chooser-day.c | 171 ++++++++++++++++++++++++++
src/gui/event-editor/gcal-date-chooser-day.h | 10 ++
src/gui/event-editor/gcal-date-chooser-day.ui | 40 ++++--
src/theme/Adwaita.css | 20 +++
4 files changed, 233 insertions(+), 8 deletions(-)
---
diff --git a/src/gui/event-editor/gcal-date-chooser-day.c b/src/gui/event-editor/gcal-date-chooser-day.c
index fd0b45f4..67695f2f 100644
--- a/src/gui/event-editor/gcal-date-chooser-day.c
+++ b/src/gui/event-editor/gcal-date-chooser-day.c
@@ -30,10 +30,20 @@ struct _GcalDateChooserDay
{
GtkButton parent;
+ GtkWidget *dot_revealer;
GtkWidget *label;
GDateTime *date;
};
+enum {
+ PROP_0,
+ PROP_HAS_DOT,
+ PROP_DOT_VISIBLE,
+ NUM_PROPS
+};
+
+static GParamSpec *properties[NUM_PROPS] = { NULL, };
+
G_DEFINE_TYPE (GcalDateChooserDay, gcal_date_chooser_day, GTK_TYPE_BUTTON)
static void
@@ -46,6 +56,52 @@ gcal_date_chooser_day_dispose (GObject *object)
G_OBJECT_CLASS (gcal_date_chooser_day_parent_class)->dispose (object);
}
+static void
+gcal_date_chooser_day_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GcalDateChooserDay *self = GCAL_DATE_CHOOSER_DAY (object);
+
+ switch (prop_id)
+ {
+ case PROP_HAS_DOT:
+ g_value_set_boolean (value, gcal_date_chooser_day_get_has_dot (self));
+ break;
+
+ case PROP_DOT_VISIBLE:
+ g_value_set_boolean (value, gcal_date_chooser_day_get_dot_visible (self));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+gcal_date_chooser_day_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GcalDateChooserDay *self = GCAL_DATE_CHOOSER_DAY (object);
+
+ switch (prop_id)
+ {
+ case PROP_HAS_DOT:
+ gcal_date_chooser_day_set_has_dot (self, g_value_get_boolean (value));
+ break;
+
+ case PROP_DOT_VISIBLE:
+ gcal_date_chooser_day_set_dot_visible (self, g_value_get_boolean (value));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
static void
gcal_date_chooser_day_class_init (GcalDateChooserDayClass *class)
{
@@ -53,9 +109,44 @@ gcal_date_chooser_day_class_init (GcalDateChooserDayClass *class)
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
object_class->dispose = gcal_date_chooser_day_dispose;
+ object_class->get_property = gcal_date_chooser_day_get_property;
+ object_class->set_property = gcal_date_chooser_day_set_property;
+
+ /**
+ * GcalDateChooserDay:has-dot:
+ *
+ * Whether the day has a dot or not.
+ *
+ * If the day has a dot, the label will be excentered to leave room for the
+ * dot, it will be centered otherwise.
+ */
+ properties[PROP_HAS_DOT] =
+ g_param_spec_boolean ("has-dot",
+ "Has dot",
+ "Whether the day has a dot or not",
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
+
+ /**
+ * GcalDateChooserDay:dot-visible:
+ *
+ * Whether the dot is visible or not.
+ *
+ * There will be no visible dot if [property@GcalDateChooserDay:has-dot] is
+ * #FALSE.
+ */
+ properties[PROP_DOT_VISIBLE] =
+ g_param_spec_boolean ("dot-visible",
+ "Dot visible",
+ "Whether the dot is visible or not",
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (object_class, NUM_PROPS, properties);
gtk_widget_class_set_template_from_resource (widget_class,
"/org/gnome/calendar/ui/event-editor/gcal-date-chooser-day.ui");
+ gtk_widget_class_bind_template_child (widget_class, GcalDateChooserDay, dot_revealer);
gtk_widget_class_bind_template_child (widget_class, GcalDateChooserDay, label);
}
@@ -101,6 +192,86 @@ gcal_date_chooser_day_set_other_month (GcalDateChooserDay *self,
gtk_widget_remove_css_class (GTK_WIDGET (self), "other-month");
}
+/**
+ * gcal_date_chooser_day_set_has_dot:
+ * @self: a #GcalDateChooserDay
+ * @has_dot: whether the day has a dot or not.
+ *
+ * Sets whether the day has a dot or not.
+ *
+ * If the day has a dot, the label will be excentered to leave room for the
+ * dot, it will be centered otherwise.
+ */
+void
+gcal_date_chooser_day_set_has_dot (GcalDateChooserDay *self,
+ gboolean has_dot)
+{
+ g_return_if_fail (GCAL_IS_DATE_CHOOSER_DAY (self));
+
+ has_dot = !!has_dot;
+
+ if (gtk_widget_get_visible (self->dot_revealer) == has_dot)
+ return;
+
+ gtk_widget_set_visible (self->dot_revealer, has_dot);
+
+ g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_HAS_DOT]);
+}
+
+/**
+ * gcal_date_chooser_day_get_has_dot:
+ * @self: a #GcalDateChooserDay
+ *
+ * Returns: whether the day has a dot or not.
+ */
+gboolean
+gcal_date_chooser_day_get_has_dot (GcalDateChooserDay *self)
+{
+ g_return_val_if_fail (GCAL_IS_DATE_CHOOSER_DAY (self), FALSE);
+
+ return gtk_widget_get_visible (self->dot_revealer);
+}
+
+/**
+ * gcal_date_chooser_day_set_dot_visible:
+ * @self: a #GcalDateChooserDay
+ * @dot_visible: whether the dot is visible or not.
+ *
+ * Sets whether the dot is visible or not.
+ *
+ * There will be no visible dot if [property@GcalDateChooserDay:has-dot] is
+ * #FALSE.
+ */
+void
+gcal_date_chooser_day_set_dot_visible (GcalDateChooserDay *self,
+ gboolean dot_visible)
+{
+ g_return_if_fail (GCAL_IS_DATE_CHOOSER_DAY (self));
+
+ dot_visible = !!dot_visible;
+
+ if (gtk_revealer_get_reveal_child (GTK_REVEALER (self->dot_revealer)) == dot_visible)
+ return;
+
+ gtk_revealer_set_reveal_child (GTK_REVEALER (self->dot_revealer), dot_visible);
+
+ g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_DOT_VISIBLE]);
+}
+
+/**
+ * gcal_date_chooser_day_get_dot_visible:
+ * @self: a #GcalDateChooserDay
+ *
+ * Returns: whether the dot is visible or not.
+ */
+gboolean
+gcal_date_chooser_day_get_dot_visible (GcalDateChooserDay *self)
+{
+ g_return_val_if_fail (GCAL_IS_DATE_CHOOSER_DAY (self), FALSE);
+
+ return gtk_revealer_get_reveal_child (GTK_REVEALER (self->dot_revealer));
+}
+
void
gcal_date_chooser_day_set_selected (GcalDateChooserDay *self,
gboolean selected)
diff --git a/src/gui/event-editor/gcal-date-chooser-day.h b/src/gui/event-editor/gcal-date-chooser-day.h
index e4c11bb1..8922efc9 100644
--- a/src/gui/event-editor/gcal-date-chooser-day.h
+++ b/src/gui/event-editor/gcal-date-chooser-day.h
@@ -32,6 +32,16 @@ GDateTime* gcal_date_chooser_day_get_date (GcalDateChoose
void gcal_date_chooser_day_set_date (GcalDateChooserDay *day,
GDateTime *date);
+gboolean gcal_date_chooser_day_get_has_dot (GcalDateChooserDay *day);
+
+void gcal_date_chooser_day_set_has_dot (GcalDateChooserDay *day,
+ gboolean has_dot);
+
+gboolean gcal_date_chooser_day_get_dot_visible (GcalDateChooserDay *day);
+
+void gcal_date_chooser_day_set_dot_visible (GcalDateChooserDay *day,
+ gboolean dot_visible);
+
void gcal_date_chooser_day_set_other_month (GcalDateChooserDay *day,
gboolean other_month);
diff --git a/src/gui/event-editor/gcal-date-chooser-day.ui b/src/gui/event-editor/gcal-date-chooser-day.ui
index b04c136b..1e861554 100644
--- a/src/gui/event-editor/gcal-date-chooser-day.ui
+++ b/src/gui/event-editor/gcal-date-chooser-day.ui
@@ -3,21 +3,45 @@
<template class="GcalDateChooserDay" parent="GtkButton">
<property name="halign">center</property>
<property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
<style>
<class name="circular"/>
<class name="day"/>
<class name="flat"/>
+ <class name="text-button"/>
</style>
<child>
- <object class="GtkLabel" id="label">
- <property name="halign">center</property>
- <property name="hexpand">True</property>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
<property name="valign">center</property>
- <property name="vexpand">True</property>
- <property name="width-chars">2</property>
- <style>
- <class name="numeric"/>
- </style>
+ <child>
+ <object class="GtkLabel" id="label">
+ <property name="halign">center</property>
+ <property name="label">0</property>
+ <property name="valign">center</property>
+ <property name="width-chars">2</property>
+ <style>
+ <class name="day"/>
+ <class name="numeric"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkRevealer" id="dot_revealer">
+ <property name="halign">center</property>
+ <property name="transition-type">crossfade</property>
+ <property name="valign">end</property>
+ <property name="visible">False</property>
+ <property name="child">
+ <object class="AdwBin" id="dot">
+ <property name="css-name">dot</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ </object>
+ </property>
+ </object>
+ </child>
</object>
</child>
</template>
diff --git a/src/theme/Adwaita.css b/src/theme/Adwaita.css
index 15df3433..59094207 100644
--- a/src/theme/Adwaita.css
+++ b/src/theme/Adwaita.css
@@ -191,21 +191,41 @@ datechooser button.day {
transition: none;
}
+datechooser button.day dot {
+ background-color: @theme_fg_color;
+ border-radius: 50%;
+ min-height: 3px;
+ min-width: 3px;
+}
+
datechooser button.day:selected {
background-color: @accent_bg_color;
color: @accent_fg_color;
font-weight: bold;
}
+datechooser button.day:selected dot {
+ background-color: @accent_fg_color;
+}
+
datechooser button.day.other-month:not(:hover),
datechooser button.day.other-month:backdrop {
color: alpha(currentColor, 0.1);
}
+datechooser button.day.other-month:not(:hover) dot,
+datechooser button.day.other-month:backdrop dot {
+ background-color: alpha(currentColor, 0.1);
+}
+
datechooser button.day.other-month:hover:not(:backdrop) {
color: @insensitive_fg_color;
}
+datechooser button.day.other-month:hover:not(:backdrop) dot {
+ background-color: @insensitive_fg_color;
+}
+
label.month-name {
font-size: 16pt;
font-weight: bold;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]