Added support for storing event data.

Initial support for storing event-data so the EditDialog can
tell which properties has changed.
Changed time entries for GcalTimeEntry objects.
Set ::activates-default property of summary_entry to handle change title
with one keystroke.
This commit is contained in:
Erick Pérez Castellanos
2012-10-10 15:55:18 -04:00
parent b6a34f7666
commit 24cfaab837
+151 -73
View File
@@ -18,37 +18,61 @@
*/ */
#include "gcal-edit-dialog.h" #include "gcal-edit-dialog.h"
#include "gcal-time-entry.h"
#include "gcal-utils.h" #include "gcal-utils.h"
#include <libecal/libecal.h> #include <libecal/libecal.h>
#include <glib/gi18n.h> #include <glib/gi18n.h>
typedef struct _SimpleTime SimpleTime;
typedef struct _SimpleEventStore SimpleEventStore;
struct _SimpleTime
{
guint hour;
guint minute;
};
struct _SimpleEventStore
{
gchar *summary;
gboolean all_day;
SimpleTime *start_time;
SimpleTime *end_time;
gchar *location;
gchar *description;
};
struct _GcalEditDialogPrivate struct _GcalEditDialogPrivate
{ {
gchar *source_uid; gchar *source_uid;
gchar *event_uid; gchar *event_uid;
gboolean writable; gboolean writable;
GcalManager *manager; GcalManager *manager;
GtkTreeIter *active_iter; GtkTreeIter *active_iter;
GtkWidget *edit_grid; GtkWidget *edit_grid;
GtkWidget *readonly_box; GtkWidget *readonly_box;
GtkWidget *delete_button; GtkWidget *delete_button;
GtkWidget *summary_entry; GtkWidget *summary_entry;
GtkWidget *calendar_button; GtkWidget *calendar_button;
GtkWidget *calendars_menu; GtkWidget *calendars_menu;
GtkWidget *start_date_entry; GtkWidget *start_date_entry;
GtkWidget *end_date_entry; GtkWidget *end_date_entry;
GtkWidget *all_day_check; GtkWidget *all_day_check;
GtkWidget *start_time_entry; GtkWidget *start_time_entry;
GtkWidget *end_time_entry; GtkWidget *end_time_entry;
GtkWidget *location_entry; GtkWidget *location_entry;
GtkWidget *notes_text; GtkWidget *notes_text;
SimpleEventStore *ev_store;
}; };
static void gcal_edit_dialog_constructed (GObject *object); static void gcal_edit_dialog_constructed (GObject *object);
@@ -69,6 +93,9 @@ static void gcal_edit_dialog_action_button_clicked (GtkWidget *wi
static void gcal_edit_dialog_button_toggled (GtkToggleButton *button, static void gcal_edit_dialog_button_toggled (GtkToggleButton *button,
gpointer user_data); gpointer user_data);
static void gcal_edit_dialog_all_day_changed (GtkWidget *widget,
gpointer user_data);
G_DEFINE_TYPE(GcalEditDialog, gcal_edit_dialog, GTK_TYPE_DIALOG) G_DEFINE_TYPE(GcalEditDialog, gcal_edit_dialog, GTK_TYPE_DIALOG)
static void static void
@@ -108,6 +135,7 @@ gcal_edit_dialog_constructed (GObject* object)
GcalEditDialogPrivate *priv; GcalEditDialogPrivate *priv;
GtkWidget *content_area; GtkWidget *content_area;
GtkWidget *child; GtkWidget *child;
GtkWidget *frame;
GtkSizeGroup *size_group; GtkSizeGroup *size_group;
GtkWidget *action_area; GtkWidget *action_area;
@@ -138,6 +166,7 @@ gcal_edit_dialog_constructed (GObject* object)
gtk_grid_attach (GTK_GRID (priv->edit_grid), child, 0, 0, 1, 1); gtk_grid_attach (GTK_GRID (priv->edit_grid), child, 0, 0, 1, 1);
priv->summary_entry = gtk_entry_new (); priv->summary_entry = gtk_entry_new ();
gtk_entry_set_activates_default (GTK_ENTRY (priv->summary_entry), TRUE);
gtk_widget_set_hexpand (priv->summary_entry, TRUE); gtk_widget_set_hexpand (priv->summary_entry, TRUE);
gtk_grid_attach (GTK_GRID (priv->edit_grid), gtk_grid_attach (GTK_GRID (priv->edit_grid),
priv->summary_entry, priv->summary_entry,
@@ -176,11 +205,7 @@ gcal_edit_dialog_constructed (GObject* object)
"x-office-calendar-symbolic"); "x-office-calendar-symbolic");
gtk_container_add (GTK_CONTAINER (child), priv->start_date_entry); gtk_container_add (GTK_CONTAINER (child), priv->start_date_entry);
priv->start_time_entry = gtk_entry_new (); priv->start_time_entry = gcal_time_entry_new ();
gtk_entry_set_width_chars (GTK_ENTRY (priv->start_time_entry), 8);
gtk_entry_set_icon_from_icon_name (GTK_ENTRY (priv->start_time_entry),
GTK_ENTRY_ICON_SECONDARY,
"preferences-system-time-symbolic");
gtk_container_add (GTK_CONTAINER (child), priv->start_time_entry); gtk_container_add (GTK_CONTAINER (child), priv->start_time_entry);
priv->all_day_check = gtk_check_button_new_with_label (_("All day")); priv->all_day_check = gtk_check_button_new_with_label (_("All day"));
@@ -204,11 +229,7 @@ gcal_edit_dialog_constructed (GObject* object)
"x-office-calendar-symbolic"); "x-office-calendar-symbolic");
gtk_container_add (GTK_CONTAINER (child), priv->end_date_entry); gtk_container_add (GTK_CONTAINER (child), priv->end_date_entry);
priv->end_time_entry = gtk_entry_new (); priv->end_time_entry = gcal_time_entry_new ();
gtk_entry_set_width_chars (GTK_ENTRY (priv->end_time_entry), 8);
gtk_entry_set_icon_from_icon_name (GTK_ENTRY (priv->end_time_entry),
GTK_ENTRY_ICON_SECONDARY,
"preferences-system-time-symbolic");
gtk_container_add (GTK_CONTAINER (child), priv->end_time_entry); gtk_container_add (GTK_CONTAINER (child), priv->end_time_entry);
gtk_grid_attach (GTK_GRID (priv->edit_grid), child, 1, 3, 2, 1); gtk_grid_attach (GTK_GRID (priv->edit_grid), child, 1, 3, 2, 1);
@@ -233,14 +254,16 @@ gcal_edit_dialog_constructed (GObject* object)
gtk_widget_set_margin_top (child, 4); gtk_widget_set_margin_top (child, 4);
gtk_grid_attach (GTK_GRID (priv->edit_grid), child, 0, 5, 1, 1); gtk_grid_attach (GTK_GRID (priv->edit_grid), child, 0, 5, 1, 1);
child = gtk_frame_new (NULL); frame = gtk_frame_new (NULL);
child = gtk_scrolled_window_new (NULL, NULL);
gtk_container_add (GTK_CONTAINER (frame), child);
priv->notes_text = gtk_text_view_new (); priv->notes_text = gtk_text_view_new ();
gtk_container_add (GTK_CONTAINER (child), priv->notes_text); gtk_container_add (GTK_CONTAINER (child), priv->notes_text);
gtk_widget_set_hexpand (child, TRUE); gtk_widget_set_hexpand (child, TRUE);
gtk_widget_set_size_request ( gtk_widget_set_size_request (
gtk_bin_get_child (GTK_BIN (child)), gtk_bin_get_child (GTK_BIN (frame)),
-1, 80); -1, 80);
gtk_grid_attach (GTK_GRID (priv->edit_grid), child, 1, 5, 2, 1); gtk_grid_attach (GTK_GRID (priv->edit_grid), frame, 1, 5, 2, 1);
gtk_container_add (GTK_CONTAINER (content_area), priv->edit_grid); gtk_container_add (GTK_CONTAINER (content_area), priv->edit_grid);
gtk_widget_show_all (content_area); gtk_widget_show_all (content_area);
@@ -252,7 +275,6 @@ gcal_edit_dialog_constructed (GObject* object)
button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); button = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
gtk_size_group_add_widget (size_group, button); gtk_size_group_add_widget (size_group, button);
gtk_widget_set_can_default (button, TRUE);
g_object_set_data (G_OBJECT (button), g_object_set_data (G_OBJECT (button),
"response", "response",
GINT_TO_POINTER (GTK_RESPONSE_CANCEL)); GINT_TO_POINTER (GTK_RESPONSE_CANCEL));
@@ -271,7 +293,6 @@ gcal_edit_dialog_constructed (GObject* object)
GTK_CONTAINER (priv->delete_button), GTK_CONTAINER (priv->delete_button),
gtk_image_new_from_icon_name ("user-trash-symbolic", gtk_image_new_from_icon_name ("user-trash-symbolic",
GTK_ICON_SIZE_MENU)); GTK_ICON_SIZE_MENU));
gtk_widget_set_can_default (priv->delete_button, TRUE);
g_object_set_data (G_OBJECT (priv->delete_button), g_object_set_data (G_OBJECT (priv->delete_button),
"response", "response",
GINT_TO_POINTER (GCAL_RESPONSE_DELETE_EVENT)); GINT_TO_POINTER (GCAL_RESPONSE_DELETE_EVENT));
@@ -300,6 +321,8 @@ gcal_edit_dialog_constructed (GObject* object)
"suggested-action"); "suggested-action");
gtk_box_pack_end (GTK_BOX (action_area), button, TRUE, TRUE, 0); gtk_box_pack_end (GTK_BOX (action_area), button, TRUE, TRUE, 0);
gtk_widget_grab_default (button);
g_object_unref (size_group); g_object_unref (size_group);
g_debug ("Added size_group"); g_debug ("Added size_group");
@@ -312,9 +335,11 @@ gcal_edit_dialog_constructed (GObject* object)
"toggled", "toggled",
G_CALLBACK (gcal_edit_dialog_button_toggled), G_CALLBACK (gcal_edit_dialog_button_toggled),
object); object);
/* event data related signals */
g_signal_connect (priv->all_day_check, g_signal_connect (priv->all_day_check,
"toggled", "toggled",
G_CALLBACK (gcal_edit_dialog_button_toggled), G_CALLBACK (gcal_edit_dialog_all_day_changed),
object); object);
} }
@@ -528,9 +553,9 @@ gcal_edit_dialog_clear_data (GcalEditDialog *dialog)
/* date and time */ /* date and time */
gtk_entry_set_text (GTK_ENTRY (priv->start_date_entry), ""); gtk_entry_set_text (GTK_ENTRY (priv->start_date_entry), "");
gtk_entry_set_text (GTK_ENTRY (priv->start_time_entry), ""); gcal_time_entry_set_time (GCAL_TIME_ENTRY (priv->start_time_entry), 0, 0);
gtk_entry_set_text (GTK_ENTRY (priv->end_date_entry), ""); gtk_entry_set_text (GTK_ENTRY (priv->end_date_entry), "");
gtk_entry_set_text (GTK_ENTRY (priv->end_time_entry), ""); gcal_time_entry_set_time (GCAL_TIME_ENTRY (priv->end_time_entry), 0, 0);
/* location */ /* location */
gtk_entry_set_text (GTK_ENTRY (priv->location_entry), ""); gtk_entry_set_text (GTK_ENTRY (priv->location_entry), "");
@@ -580,6 +605,21 @@ gcal_edit_dialog_button_toggled (GtkToggleButton *button,
g_signal_stop_emission_by_name (button, "toggled"); g_signal_stop_emission_by_name (button, "toggled");
} }
static void
gcal_edit_dialog_all_day_changed (GtkWidget *widget,
gpointer user_data)
{
GcalEditDialogPrivate *priv;
priv = GCAL_EDIT_DIALOG (user_data)->priv;
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->all_day_check)))
{
gcal_time_entry_set_time (GCAL_TIME_ENTRY (priv->start_time_entry), 0, 0);
gcal_time_entry_set_time (GCAL_TIME_ENTRY (priv->end_time_entry), 0, 0);
}
}
/* Public API */ /* Public API */
GtkWidget* GtkWidget*
gcal_edit_dialog_new (void) gcal_edit_dialog_new (void)
@@ -601,7 +641,6 @@ gcal_edit_dialog_set_event (GcalEditDialog *dialog,
{ {
GcalEditDialogPrivate *priv; GcalEditDialogPrivate *priv;
gchar *text;
const gchar *const_text; const gchar *const_text;
gboolean all_day; gboolean all_day;
@@ -623,19 +662,29 @@ gcal_edit_dialog_set_event (GcalEditDialog *dialog,
/* Clear event data */ /* Clear event data */
gcal_edit_dialog_clear_data (dialog); gcal_edit_dialog_clear_data (dialog);
if (priv->ev_store == NULL)
{
priv->ev_store = g_new0 (SimpleEventStore, 1);
priv->ev_store->start_time = g_new0 (SimpleTime, 1);
priv->ev_store->end_time = g_new0 (SimpleTime, 1);
}
/* Load new event data */ /* Load new event data */
/* summary */ /* summary */
text = gcal_manager_get_event_summary (priv->manager, priv->ev_store->summary = gcal_manager_get_event_summary (priv->manager,
priv->source_uid, priv->source_uid,
priv->event_uid); priv->event_uid);
gtk_entry_set_text (GTK_ENTRY (priv->summary_entry), gtk_entry_set_text (GTK_ENTRY (priv->summary_entry),
text != NULL ? text : ""); priv->ev_store->summary != NULL ?
g_free (text); priv->ev_store->summary : "");
/* calendar button */ /* calendar button */
/* FIXME: Add calendar to ev_store and edit-capabilities */
gcal_edit_dialog_set_calendar_selected (dialog); gcal_edit_dialog_set_calendar_selected (dialog);
/* start date */ /* start date */
/* FIXME: Add dates (start/end) to ev_store and edit-capabilities */
date = gcal_manager_get_event_start_date (priv->manager, date = gcal_manager_get_event_start_date (priv->manager,
priv->source_uid, priv->source_uid,
priv->event_uid); priv->event_uid);
@@ -644,26 +693,28 @@ gcal_edit_dialog_set_event (GcalEditDialog *dialog,
gtk_entry_set_text (GTK_ENTRY (priv->start_date_entry), gtk_entry_set_text (GTK_ENTRY (priv->start_date_entry),
buffer); buffer);
g_free (date);
/* all_day */ /* all_day */
all_day = gcal_manager_get_event_all_day (priv->manager, priv->ev_store->all_day = gcal_manager_get_event_all_day (priv->manager,
priv->source_uid, priv->source_uid,
priv->event_uid); priv->event_uid);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->all_day_check), gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->all_day_check),
all_day); priv->ev_store->all_day);
/* start time */ /* start time */
if (all_day) if (all_day)
{ {
gtk_entry_set_text (GTK_ENTRY (priv->start_time_entry), priv->ev_store->start_time->hour = 0;
"00:00"); priv->ev_store->start_time->minute = 0;
} }
else else
{ {
e_utf8_strftime_fix_am_pm (buffer, 64, "%R", &tm_date); priv->ev_store->start_time->hour = date->hour;
gtk_entry_set_text (GTK_ENTRY (priv->start_time_entry), priv->ev_store->start_time->minute = date->minute;
buffer);
} }
gcal_time_entry_set_time (GCAL_TIME_ENTRY (priv->start_time_entry),
priv->ev_store->start_time->hour,
priv->ev_store->start_time->minute);
g_free (date);
/* end date */ /* end date */
date = gcal_manager_get_event_end_date (priv->manager, date = gcal_manager_get_event_end_date (priv->manager,
@@ -674,37 +725,42 @@ gcal_edit_dialog_set_event (GcalEditDialog *dialog,
gtk_entry_set_text (GTK_ENTRY (priv->end_date_entry), gtk_entry_set_text (GTK_ENTRY (priv->end_date_entry),
buffer); buffer);
g_free (date);
/* end time */ /* end time */
if (all_day) if (all_day)
{ {
gtk_entry_set_text (GTK_ENTRY (priv->end_time_entry), priv->ev_store->end_time->hour = 0;
"00:00"); priv->ev_store->end_time->minute = 0;
} }
else else
{ {
e_utf8_strftime_fix_am_pm (buffer, 64, "%R", &tm_date); priv->ev_store->end_time->hour = date->hour;
gtk_entry_set_text (GTK_ENTRY (priv->end_time_entry), priv->ev_store->end_time->minute = date->minute;
buffer);
} }
gcal_time_entry_set_time (GCAL_TIME_ENTRY (priv->end_time_entry),
priv->ev_store->end_time->hour,
priv->ev_store->end_time->minute);
g_free (date);
/* location */ /* location */
const_text = gcal_manager_get_event_location (priv->manager, const_text = gcal_manager_get_event_location (priv->manager,
priv->source_uid, priv->source_uid,
priv->event_uid); priv->event_uid);
gtk_entry_set_text (GTK_ENTRY (priv->location_entry), gtk_entry_set_text (GTK_ENTRY (priv->location_entry),
const_text != NULL ? const_text : ""); const_text != NULL ? const_text : "");
priv->ev_store->location = g_strdup (const_text);
/* notes */ /* notes */
text = gcal_manager_get_event_description (priv->manager, priv->ev_store->description =
priv->source_uid, gcal_manager_get_event_description (priv->manager,
priv->event_uid); priv->source_uid,
priv->event_uid);
if (priv->ev_store->description == NULL)
priv->ev_store->description = "";
gtk_text_buffer_set_text ( gtk_text_buffer_set_text (
gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->notes_text)), gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->notes_text)),
text != NULL ? text : "", priv->ev_store->description,
-1); -1);
g_free (text);
gcal_edit_dialog_set_writable ( gcal_edit_dialog_set_writable (
dialog, dialog,
@@ -837,16 +893,38 @@ gcal_edit_dialog_get_event_uuid (GcalEditDialog *dialog)
GList* GList*
gcal_edit_dialog_get_modified_properties (GcalEditDialog *dialog) gcal_edit_dialog_get_modified_properties (GcalEditDialog *dialog)
{ {
/* FIXME: Implement some kind of backend/model here */ GcalEditDialogPrivate *priv;
gchar *desc;
GList *res; GList *res;
/* FIXME: Instead of always add SUMMARY check if was modified priv = dialog->priv;
by checking against some kind of model */
if (! priv->writable)
return NULL;
res = NULL; res = NULL;
res = g_list_append (res, GINT_TO_POINTER (EVENT_SUMMARY));
/* res = g_list_append (res, GINT_TO_POINTER (EVENT_START_DATE)); */ if (g_strcmp0 (priv->ev_store->summary,
res = g_list_append (res, GINT_TO_POINTER (EVENT_LOCATION)); gtk_entry_get_text (GTK_ENTRY (priv->summary_entry))) != 0)
res = g_list_append (res, GINT_TO_POINTER (EVENT_DESCRIPTION)); {
res = g_list_append (res, GINT_TO_POINTER (EVENT_SUMMARY));
}
/* FIXME: add calendar and dates and times and all_day */
if (g_strcmp0 (priv->ev_store->location,
gtk_entry_get_text (GTK_ENTRY (priv->location_entry))) != 0)
{
res = g_list_append (res, GINT_TO_POINTER (EVENT_LOCATION));
}
/* getting desc */
desc = gcal_edit_dialog_get_event_description (dialog);
if (g_strcmp0 (priv->ev_store->description, desc) != 0)
{
res = g_list_append (res, GINT_TO_POINTER (EVENT_DESCRIPTION));
}
g_free (desc);
return res; return res;
} }