[gnome-calendar/wip/gbsneto/gcal-event: 9/12] date-selector: use GDateTime internally
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-calendar/wip/gbsneto/gcal-event: 9/12] date-selector: use GDateTime internally
- Date: Sun, 14 Feb 2016 02:06:54 +0000 (UTC)
commit 028bb7097e3929a5c7cecde230110575653d8e21
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Sat Feb 13 16:57:26 2016 -0200
date-selector: use GDateTime internally
Using a GDateTime improves consistency with the
other components (ideally, we'll move completely
to GDateTime) and simplifies the code.
This commit adds a new property GcalDateSelector::date
and adapts the API to use GDateTime.
data/ui/edit-dialog.ui | 4 +-
src/gcal-date-selector.c | 212 +++++++++++++++++++++++++++-------------------
src/gcal-date-selector.h | 11 +--
src/gcal-edit-dialog.c | 62 +++++--------
4 files changed, 152 insertions(+), 137 deletions(-)
---
diff --git a/data/ui/edit-dialog.ui b/data/ui/edit-dialog.ui
index d281189..8d539fd 100644
--- a/data/ui/edit-dialog.ui
+++ b/data/ui/edit-dialog.ui
@@ -229,7 +229,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="sensitive" bind-source="GcalEditDialog" bind-property="writable"
bind-flags="default" />
- <signal name="modified" handler="update_date" object="GcalEditDialog" swapped="no"/>
+ <signal name="notify::date" handler="update_date" object="GcalEditDialog" swapped="yes"/>
</object>
<packing>
<property name="position">1</property>
@@ -265,7 +265,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="sensitive" bind-source="GcalEditDialog" bind-property="writable"
bind-flags="default" />
- <signal name="modified" handler="update_date" object="GcalEditDialog" swapped="no"/>
+ <signal name="notify::date" handler="update_date" object="GcalEditDialog" swapped="yes"/>
</object>
<packing>
<property name="position">1</property>
diff --git a/src/gcal-date-selector.c b/src/gcal-date-selector.c
index 3b39616..96ef5c6 100644
--- a/src/gcal-date-selector.c
+++ b/src/gcal-date-selector.c
@@ -44,9 +44,7 @@ struct _GcalDateSelector
GtkWidget *entries[NUM_ENTRIES];
/* date */
- gint day;
- gint month;
- gint year;
+ GDateTime *date;
/* misc */
const gchar *mask;
@@ -59,12 +57,11 @@ struct _GcalDateSelector
enum
{
- MODIFIED,
- NUM_SIGNALS
+ PROP_0,
+ PROP_DATE,
+ LAST_PROP
};
-static guint signals[NUM_SIGNALS] = { 0, };
-
static void calendar_day_selected (GtkCalendar *calendar,
GcalDateSelector *selector);
@@ -91,19 +88,24 @@ static void
calendar_day_selected (GtkCalendar *calendar,
GcalDateSelector *selector)
{
+ GDateTime *new_date;
guint day, month, year;
gtk_calendar_get_date (calendar, &year, &month, &day);
+ new_date = g_date_time_new_local (year, month + 1, day, 0, 0, 0);
+
/**
* Block signal handler to avoid an infinite
* recursion, exploding the proccess stack.
*/
g_signal_handlers_block_by_func (selector->calendar, calendar_day_selected, selector);
- gcal_date_selector_set_date (selector, day, month + 1, year);
+ gcal_date_selector_set_date (selector, new_date);
g_signal_handlers_unblock_by_func (selector->calendar, calendar_day_selected, selector);
+
+ g_clear_pointer (&new_date, g_date_time_unref);
}
static gboolean
@@ -125,18 +127,23 @@ entry_activated (GtkEntry *entry,
static void
parse_entries (GcalDateSelector *selector)
{
+ GDateTime *new_date;
gint day, month, year;
day = atoi (gtk_entry_get_text (GTK_ENTRY (selector->entries[DAY])));
month = atoi (gtk_entry_get_text (GTK_ENTRY (selector->entries[MONTH])));
year = atoi (gtk_entry_get_text (GTK_ENTRY (selector->entries[YEAR])));
+ new_date = g_date_time_new_local (year, month, day, 0, 0, 0);
+
/* select the date */
g_signal_handlers_block_by_func (selector->calendar, calendar_day_selected, selector);
- gcal_date_selector_set_date (selector, day, month, year);
+ gcal_date_selector_set_date (selector, new_date);
g_signal_handlers_unblock_by_func (selector->calendar, calendar_day_selected, selector);
+
+ g_clear_pointer (&new_date, g_date_time_unref);
}
static void
@@ -188,19 +195,65 @@ text_inserted (GtkEditable *editable,
}
static void
+gcal_date_selector_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GcalDateSelector *self = (GcalDateSelector*) object;
+
+ switch (prop_id)
+ {
+ case PROP_DATE:
+ g_value_set_boxed (value, self->date);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+gcal_date_selector_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GcalDateSelector *self = (GcalDateSelector*) object;
+
+ switch (prop_id)
+ {
+ case PROP_DATE:
+ gcal_date_selector_set_date (self, g_value_get_boxed (value));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
gcal_date_selector_class_init (GcalDateSelectorClass *klass)
{
GObjectClass *object_class;
object_class = G_OBJECT_CLASS (klass);
object_class->constructed = gcal_date_selector_constructed;
+ object_class->get_property = gcal_date_selector_get_property;
+ object_class->set_property = gcal_date_selector_set_property;
- signals[MODIFIED] = g_signal_new ("modified",
- GCAL_TYPE_DATE_SELECTOR,
- G_SIGNAL_RUN_LAST,
- 0,
- NULL, NULL, NULL,
- G_TYPE_NONE, 0);
+ /**
+ * GcalDateSelector::date:
+ *
+ * The current date of the selector.
+ */
+ g_object_class_install_property (object_class,
+ PROP_DATE,
+ g_param_spec_boxed ("date",
+ "Date of the selector",
+ "The current date of the selector",
+ G_TYPE_DATE_TIME,
+ G_PARAM_READWRITE));
gtk_widget_class_set_template_from_resource (GTK_WIDGET_CLASS (klass),
"/org/gnome/calendar/date-selector.ui");
@@ -217,15 +270,18 @@ gcal_date_selector_class_init (GcalDateSelectorClass *klass)
static void
gcal_date_selector_init (GcalDateSelector *self)
{
+ GDateTime *now;
gint i, d_index, max;
gtk_widget_set_has_window (GTK_WIDGET (self), FALSE);
gtk_widget_init_template (GTK_WIDGET (self));
- self->day = 1;
- self->month = 1;
- self->year = 1970;
+ now = g_date_time_new_now_local ();
+ self->date = g_date_time_new_local (g_date_time_get_year (now),
+ g_date_time_get_month (now),
+ g_date_time_get_day_of_month (now),
+ 0, 0, 0);
/* This string represents day/month/year order for each of the different
* languages. It could possibly be default value, %m/%d/%y placing the month
@@ -281,9 +337,6 @@ gcal_date_selector_init (GcalDateSelector *self)
/* year */
case 'y':
- self->year_pos = d_index++;
- break;
-
case 'Y':
self->year_pos = d_index++;
break;
@@ -344,99 +397,80 @@ gcal_date_selector_new (void)
/**
* gcal_date_selector_set_date:
- * @selector:
- * @day: (nullable): The day number.
- * @month: (nullable): The month number starting with 1
- * @year: (nullable): The year number
+ * @selector: a #GcalDateSelector
+ * @date: a valid #GDateTime
*
- * Set the value of the date shown
- **/
+ * Set the value of the shown date.
+ */
void
gcal_date_selector_set_date (GcalDateSelector *selector,
- gint day,
- gint month,
- gint year)
+ GDateTime *date)
{
- GDateTime *dt;
- gchar *label;
-
g_return_if_fail (GCAL_IS_DATE_SELECTOR (selector));
- day = CLAMP (day, 1, 31);
- month = CLAMP (month, 1, 12);
- /* since we're dealing only with the date, the tz shouldn't be a problem */
- dt = g_date_time_new_local (year, month, day, 0, 0, 0);
- /**
- * When it fails to be instances, it's
- * because edit dialog is cleaning it's
- * data. Thus, we should stop here.
- */
- if (dt == NULL)
- return;
+ if (selector->date != date)
+ {
+ gchar *label;
- selector->day = day;
- selector->month = month;
- selector->year = year;
+ g_clear_pointer (&selector->date, g_date_time_unref);
+ selector->date = g_date_time_new_local (g_date_time_get_year (date),
+ g_date_time_get_month (date),
+ g_date_time_get_day_of_month (date),
+ 0, 0, 0);
- month = CLAMP (month - 1, 0, 11);
+ /* set calendar's date */
+ g_signal_handlers_block_by_func (selector->calendar, calendar_day_selected, selector);
- /* set calendar's date */
- g_signal_handlers_block_by_func (selector->calendar, calendar_day_selected, selector);
- g_object_set (selector->calendar, "day", day, "month", month, "year", year, NULL);
- g_signal_handlers_unblock_by_func (selector->calendar, calendar_day_selected, selector);
+ g_object_set (selector->calendar,
+ "day", g_date_time_get_day_of_month (date),
+ "month", g_date_time_get_month (date) - 1,
+ "year", g_date_time_get_year (date),
+ NULL);
- /* rebuild the date label */
- label = g_date_time_format (dt, selector->mask);
+ g_signal_handlers_unblock_by_func (selector->calendar, calendar_day_selected, selector);
- gtk_label_set_label (GTK_LABEL (selector->date_label), label);
- g_free (label);
+ /* rebuild the date label */
+ label = g_date_time_format (date, selector->mask);
- /* set date entries' text */
- /* day entry */
- label = g_strdup_printf ("%.2d", day);
+ gtk_label_set_label (GTK_LABEL (selector->date_label), label);
+ g_free (label);
- gtk_entry_set_text (GTK_ENTRY (selector->entries[DAY]), label);
- g_free (label);
+ /* set date entries' text */
+ /* day entry */
+ label = g_date_time_format (date, "%d");
- /* month entry */
- label = g_strdup_printf ("%.2d", selector->month);
+ gtk_entry_set_text (GTK_ENTRY (selector->entries[DAY]), label);
+ g_free (label);
- gtk_entry_set_text (GTK_ENTRY (selector->entries[MONTH]), label);
- g_free (label);
+ /* month entry */
+ label = g_date_time_format (date, "%m");
- /* year entry */
- label = g_strdup_printf ("%.4d", year);
+ gtk_entry_set_text (GTK_ENTRY (selector->entries[MONTH]), label);
+ g_free (label);
- gtk_entry_set_text (GTK_ENTRY (selector->entries[YEAR]), label);
+ /* year entry */
+ label = g_date_time_format (date, "%Y");
- /* emit the MODIFIED signal */
- g_signal_emit (selector, signals[MODIFIED], 0);
+ gtk_entry_set_text (GTK_ENTRY (selector->entries[YEAR]), label);
+ g_free (label);
- g_free (label);
- g_date_time_unref (dt);
+ /* emit the MODIFIED signal */
+ g_object_notify (G_OBJECT (selector), "date");
+ }
}
/**
* gcal_date_selector_get_date:
- * @selector:
- * @day: (nullable): An out argument to hold the day number
- * @month: (nullable): An out argument to hold the month number starting with 1
- * @year: (nullable): An out argument to hold the year number
+ * @selector: a #GcalDateSelector
*
* Get the value of the date shown
- **/
-void
-gcal_date_selector_get_date (GcalDateSelector *selector,
- gint *day,
- gint *month,
- gint *year)
+ *
+ * Returns: (transfer none): the date of the selector.
+ */
+GDateTime*
+gcal_date_selector_get_date (GcalDateSelector *selector)
{
- g_return_if_fail (GCAL_IS_DATE_SELECTOR (selector));
+ g_return_val_if_fail (GCAL_IS_DATE_SELECTOR (selector), NULL);
- if (day != NULL)
- *day = selector->day;
- if (month != NULL)
- *month = selector->month;
- if (year != NULL)
- *year = selector->year;
+ return selector->date;
}
diff --git a/src/gcal-date-selector.h b/src/gcal-date-selector.h
index ccfb1bb..326d2a5 100644
--- a/src/gcal-date-selector.h
+++ b/src/gcal-date-selector.h
@@ -30,15 +30,10 @@ G_DECLARE_FINAL_TYPE (GcalDateSelector, gcal_date_selector, GCAL, DATE_SELECTOR,
GtkWidget* gcal_date_selector_new (void);
+GDateTime* gcal_date_selector_get_date (GcalDateSelector *selector);
+
void gcal_date_selector_set_date (GcalDateSelector *selector,
- gint day,
- gint month,
- gint year);
-
-void gcal_date_selector_get_date (GcalDateSelector *selector,
- gint *day,
- gint *month,
- gint *year);
+ GDateTime *date);
G_END_DECLS
diff --git a/src/gcal-edit-dialog.c b/src/gcal-edit-dialog.c
index 0d2b7be..cc6c889 100644
--- a/src/gcal-edit-dialog.c
+++ b/src/gcal-edit-dialog.c
@@ -74,8 +74,7 @@ static void on_calendar_selected (GtkWidget *me
GVariant *value,
gpointer user_data);
-static void update_date (GtkEntry *entry,
- gpointer user_data);
+static void update_date (GcalEditDialog *dialog);
static void update_location (GtkEntry *entry,
GParamSpec *pspec,
@@ -217,20 +216,16 @@ on_calendar_selected (GtkWidget *menu_item,
}
static void
-update_date (GtkEntry *entry,
- gpointer user_data)
+update_date (GcalEditDialog *dialog)
{
- GcalEditDialog *dialog;
GDateTime *start_date;
GDateTime *end_date;
- dialog = GCAL_EDIT_DIALOG (user_data);
-
if (dialog->setting_event)
return;
- start_date = gcal_edit_dialog_get_date_start (GCAL_EDIT_DIALOG (user_data));
- end_date = gcal_edit_dialog_get_date_end (GCAL_EDIT_DIALOG (user_data));
+ start_date = gcal_edit_dialog_get_date_start (dialog);
+ end_date = gcal_edit_dialog_get_date_end (dialog);
/* update component */
gcal_event_set_date_start (dialog->event, start_date);
@@ -553,9 +548,7 @@ gcal_edit_dialog_clear_data (GcalEditDialog *dialog)
dialog);
/* date and time */
- gcal_date_selector_set_date (GCAL_DATE_SELECTOR (dialog->start_date_selector), 0, 0, 0);
gcal_time_selector_set_time (GCAL_TIME_SELECTOR (dialog->start_time_selector), 0, 0);
- gcal_date_selector_set_date (GCAL_DATE_SELECTOR (dialog->end_date_selector), 0, 0, 0);
gcal_time_selector_set_time (GCAL_TIME_SELECTOR (dialog->end_time_selector), 0, 0);
/* location */
@@ -707,18 +700,11 @@ gcal_edit_dialog_set_event (GcalEditDialog *dialog,
date_start = gcal_event_get_date_start (event);
date_end = gcal_event_get_date_end (event);
- /* start date */
- gcal_date_selector_set_date (GCAL_DATE_SELECTOR (dialog->start_date_selector),
- g_date_time_get_day_of_month (date_start),
- g_date_time_get_month (date_start),
- g_date_time_get_year (date_start));
-
- gcal_date_selector_set_date (GCAL_DATE_SELECTOR (dialog->end_date_selector),
- g_date_time_get_day_of_month (date_end),
- g_date_time_get_month (date_end),
- g_date_time_get_year (date_end));
+ /* date */
+ gcal_date_selector_set_date (GCAL_DATE_SELECTOR (dialog->start_date_selector), date_start);
+ gcal_date_selector_set_date (GCAL_DATE_SELECTOR (dialog->end_date_selector), date_end);
- /* start time */
+ /* time */
if (!gcal_event_get_all_day (event))
{
gcal_time_selector_set_time (GCAL_TIME_SELECTOR (dialog->start_time_selector),
@@ -764,20 +750,20 @@ gcal_edit_dialog_set_manager (GcalEditDialog *dialog,
GDateTime*
gcal_edit_dialog_get_date_start (GcalEditDialog *dialog)
{
- GDateTime *date;
- gint year, month, day;
+ GDateTime *date, *aux;
gint hour, minute;
- gcal_date_selector_get_date (GCAL_DATE_SELECTOR (dialog->start_date_selector),
- &day,
- &month,
- &year);
-
gcal_time_selector_get_time (GCAL_TIME_SELECTOR (dialog->start_time_selector),
&hour,
&minute);
- date = g_date_time_new_local (year, month, day, hour, minute, 0);
+ aux = gcal_date_selector_get_date (GCAL_DATE_SELECTOR (dialog->start_date_selector));
+
+ date = g_date_time_new (gcal_event_get_timezone (dialog->event),
+ g_date_time_get_year (aux),
+ g_date_time_get_month (aux),
+ g_date_time_get_day_of_month (aux),
+ hour, minute, 0);
return date;
}
@@ -785,20 +771,20 @@ gcal_edit_dialog_get_date_start (GcalEditDialog *dialog)
GDateTime*
gcal_edit_dialog_get_date_end (GcalEditDialog *dialog)
{
- GDateTime *date;
- gint year, month, day;
+ GDateTime *date, *aux;
gint hour, minute;
- gcal_date_selector_get_date (GCAL_DATE_SELECTOR (dialog->end_date_selector),
- &day,
- &month,
- &year);
-
gcal_time_selector_get_time (GCAL_TIME_SELECTOR (dialog->end_time_selector),
&hour,
&minute);
- date = g_date_time_new_local (year, month, day, hour, minute, 0);
+ aux = gcal_date_selector_get_date (GCAL_DATE_SELECTOR (dialog->end_date_selector));
+
+ date = g_date_time_new (gcal_event_get_timezone (dialog->event),
+ g_date_time_get_year (aux),
+ g_date_time_get_month (aux),
+ g_date_time_get_day_of_month (aux),
+ hour, minute, 0);
return date;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]