aboutsummaryrefslogtreecommitdiff
path: root/src/idoappointmentmenuitem.c
diff options
context:
space:
mode:
authorCharles Kerr <charles.kerr@canonical.com>2013-07-30 22:17:45 +0000
committerTarmac <Unknown>2013-07-30 22:17:45 +0000
commit86b63cfd16696227a2b36ca3b1942061703393c1 (patch)
tree31e991dd8fa547ab34732d7ef6842c7dc8a28ffd /src/idoappointmentmenuitem.c
parentf3e64f722774ccbac28b8628bcc75d072a190143 (diff)
parentad7dd27530f6d35706f6cd0ed5f5e9ce6ee53600 (diff)
downloadayatana-ido-86b63cfd16696227a2b36ca3b1942061703393c1.tar.gz
ayatana-ido-86b63cfd16696227a2b36ca3b1942061703393c1.tar.bz2
ayatana-ido-86b63cfd16696227a2b36ca3b1942061703393c1.zip
Support x-canonical-type: "com.canonical.indicator.progress" and "com.canonical.indicator.alarm".
Approved by Ted Gould, PS Jenkins bot.
Diffstat (limited to 'src/idoappointmentmenuitem.c')
-rw-r--r--src/idoappointmentmenuitem.c364
1 files changed, 20 insertions, 344 deletions
diff --git a/src/idoappointmentmenuitem.c b/src/idoappointmentmenuitem.c
index 734b038..cfc0bf8 100644
--- a/src/idoappointmentmenuitem.c
+++ b/src/idoappointmentmenuitem.c
@@ -22,221 +22,12 @@
#include "config.h"
#endif
-#include <string.h> /* strstr() */
-
#include <gtk/gtk.h>
#include "idoactionhelper.h"
-#include "idoappointmentmenuitem.h"
-
-enum
-{
- PROP_0,
- PROP_COLOR,
- PROP_SUMMARY,
- PROP_TIME,
- PROP_FORMAT,
- PROP_LAST
-};
-
-static GParamSpec *properties[PROP_LAST];
-
-struct _IdoAppointmentMenuItemPrivate
-{
- char * summary;
- char * format;
- char * color_string;
- GDateTime * date_time;
-
- GtkWidget * color_image;
- GtkWidget * summary_label;
- GtkWidget * timestamp_label;
-};
-
-typedef IdoAppointmentMenuItemPrivate priv_t;
-
-G_DEFINE_TYPE (IdoAppointmentMenuItem,
- ido_appointment_menu_item,
- GTK_TYPE_MENU_ITEM);
-
-/***
-**** GObject Virtual Functions
-***/
-
-static void
-my_get_property (GObject * o,
- guint property_id,
- GValue * v,
- GParamSpec * pspec)
-{
- IdoAppointmentMenuItem * self = IDO_APPOINTMENT_MENU_ITEM (o);
- priv_t * p = self->priv;
-
- switch (property_id)
- {
- case PROP_COLOR:
- g_value_set_string (v, p->color_string);
- break;
-
- case PROP_SUMMARY:
- g_value_set_string (v, p->summary);
- break;
-
- case PROP_FORMAT:
- g_value_set_string (v, p->format);
- break;
-
- case PROP_TIME:
- g_value_set_uint64 (v, g_date_time_to_unix (p->date_time));
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (o, property_id, pspec);
- break;
- }
-}
-
-static void
-my_set_property (GObject * o,
- guint property_id,
- const GValue * v,
- GParamSpec * pspec)
-{
- IdoAppointmentMenuItem * self = IDO_APPOINTMENT_MENU_ITEM (o);
-
- switch (property_id)
- {
- case PROP_COLOR:
- ido_appointment_menu_item_set_color (self, g_value_get_string (v));
- break;
-
- case PROP_SUMMARY:
- ido_appointment_menu_item_set_summary (self, g_value_get_string (v));
- break;
-
- case PROP_FORMAT:
- ido_appointment_menu_item_set_format (self, g_value_get_string (v));
- break;
-
- case PROP_TIME:
- ido_appointment_menu_item_set_time (self, g_value_get_int64 (v));
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (o, property_id, pspec);
- break;
- }
-}
-
-static void
-my_dispose (GObject * object)
-{
- IdoAppointmentMenuItem * self = IDO_APPOINTMENT_MENU_ITEM (object);
- priv_t * p = self->priv;
-
- g_clear_pointer (&p->date_time, g_date_time_unref);
-
- G_OBJECT_CLASS (ido_appointment_menu_item_parent_class)->dispose (object);
-}
-
-static void
-my_finalize (GObject * object)
-{
- IdoAppointmentMenuItem * self = IDO_APPOINTMENT_MENU_ITEM (object);
- priv_t * p = self->priv;
-
- g_free (p->color_string);
- g_free (p->summary);
- g_free (p->format);
-
- G_OBJECT_CLASS (ido_appointment_menu_item_parent_class)->finalize (object);
-}
-
-/***
-**** Instantiation
-***/
-
-static void
-ido_appointment_menu_item_class_init (IdoAppointmentMenuItemClass *klass)
-{
- GParamFlags prop_flags;
- GObjectClass * gobject_class = G_OBJECT_CLASS (klass);
-
- g_type_class_add_private (klass, sizeof (IdoAppointmentMenuItemPrivate));
-
- gobject_class->get_property = my_get_property;
- gobject_class->set_property = my_set_property;
- gobject_class->dispose = my_dispose;
- gobject_class->finalize = my_finalize;
-
- prop_flags = G_PARAM_CONSTRUCT
- | G_PARAM_READWRITE
- | G_PARAM_STATIC_STRINGS;
-
- properties[PROP_COLOR] = g_param_spec_string (
- "color",
- "Color",
- "Color coding for the appointment's type",
- "White",
- prop_flags);
-
- properties[PROP_SUMMARY] = g_param_spec_string (
- "summary",
- "Summary",
- "Brief description of the appointment",
- "",
- prop_flags);
-
- properties[PROP_TIME] = g_param_spec_int64 (
- "time",
- "Time",
- "unix time_t specifying when the appointment begins",
- 0, G_MAXINT64, 0,
- prop_flags);
-
- properties[PROP_FORMAT] = g_param_spec_string (
- "format",
- "strftime format",
- "strftime-style format string for the timestamp",
- "%F %T",
- prop_flags);
-
- g_object_class_install_properties (gobject_class, PROP_LAST, properties);
-}
-
-static void
-ido_appointment_menu_item_init (IdoAppointmentMenuItem *self)
-{
- priv_t * p;
- GtkBox * box;
- GtkWidget * w;
+#include "idotimestampmenuitem.h"
- self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
- IDO_APPOINTMENT_MENU_ITEM_TYPE,
- IdoAppointmentMenuItemPrivate);
-
- p = self->priv;
-
- p->color_image = gtk_image_new ();
- p->summary_label = gtk_label_new (NULL);
- p->timestamp_label = gtk_label_new (NULL);
- w = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
-
- gtk_misc_set_alignment (GTK_MISC(p->timestamp_label), 1.0, 0.5);
- box = GTK_BOX (w);
- gtk_box_pack_start (box, p->color_image, FALSE, FALSE, 2);
- gtk_box_pack_start (box, p->summary_label, FALSE, FALSE, 2);
- gtk_box_pack_end (box, p->timestamp_label, FALSE, FALSE, 5);
-
- gtk_widget_show_all (w);
- gtk_container_add (GTK_CONTAINER (self), w);
-}
-
-/***
-****
-***/
-
-/* creates a menu-sized pixbuf filled with specified color */
+/* create a menu-sized pixbuf filled with specified color */
static GdkPixbuf *
create_color_icon_pixbuf (const char * color_spec)
{
@@ -278,129 +69,13 @@ create_color_icon_pixbuf (const char * color_spec)
return pixbuf;
}
-static void
-update_timestamp_label (IdoAppointmentMenuItem * self)
-{
- char * str;
- priv_t * p = self->priv;
-
- if (p->date_time && p->format)
- str = g_date_time_format (p->date_time, p->format);
- else
- str = NULL;
-
- gtk_label_set_text (GTK_LABEL(p->timestamp_label), str);
- g_free (str);
-}
-
-/***
-**** Public API
-***/
-
-/* create a new IdoAppointmentMenuItem */
-GtkWidget *
-ido_appointment_menu_item_new (void)
-{
- return GTK_WIDGET (g_object_new (IDO_APPOINTMENT_MENU_ITEM_TYPE, NULL));
-}
-
-/**
- * ido_appointment_menu_item_set_color:
- * @color: parseable color string
- *
- * When this is set, the menuitem will include an icon with this color.
- *
- * These colors can be set in the end user's calendar app as a quick visual cue
- * to show what kind of appointment this is.
- */
-void
-ido_appointment_menu_item_set_color (IdoAppointmentMenuItem * self,
- const char * color_string)
-{
- priv_t * p;
- GdkPixbuf * pixbuf;
-
- g_return_if_fail (IDO_IS_APPOINTMENT_MENU_ITEM (self));
- p = self->priv;
-
- g_free (p->color_string);
- p->color_string = g_strdup (color_string);
- pixbuf = create_color_icon_pixbuf (p->color_string);
- gtk_image_set_from_pixbuf (GTK_IMAGE(p->color_image), pixbuf);
- g_object_unref (G_OBJECT(pixbuf));
-}
-
-/**
- * ido_appointment_menu_item_set_summary:
- * @summary: short string describing the appointment.
- *
- * Set the menuitem's primary label with a short description of the appointment
- */
-void
-ido_appointment_menu_item_set_summary (IdoAppointmentMenuItem * self,
- const char * summary)
-{
- priv_t * p;
-
- g_return_if_fail (IDO_IS_APPOINTMENT_MENU_ITEM (self));
- p = self->priv;
-
- g_free (p->summary);
- p->summary = g_strdup (summary);
- gtk_label_set_text (GTK_LABEL(p->summary_label), p->summary);
-}
-
-/**
- * ido_appointment_menu_item_set_time:
- * @time: the time to be rendered in the appointment's timestamp label.
- *
- * Set the time that will be displayed in the menuitem's
- * right-justified timestamp label
- */
-void
-ido_appointment_menu_item_set_time (IdoAppointmentMenuItem * self,
- time_t time)
-{
- priv_t * p;
-
- g_return_if_fail (IDO_IS_APPOINTMENT_MENU_ITEM (self));
- p = self->priv;
-
- g_clear_pointer (&p->date_time, g_date_time_unref);
- p->date_time = g_date_time_new_from_unix_local (time);
- update_timestamp_label (self);
-}
-
-/**
- * ido_appointment_menu_item_set_format:
- * @format: the format string used when showing the appointment's time
- *
- * Set the format string for rendering the appointment's time
- * in its right-justified secondary label.
- *
- * See strfrtime(3) for more information on the format string.
- */
-void
-ido_appointment_menu_item_set_format (IdoAppointmentMenuItem * self,
- const char * strftime_fmt)
-{
- priv_t * p;
-
- g_return_if_fail (IDO_IS_APPOINTMENT_MENU_ITEM (self));
- p = self->priv;
-
- g_free (p->format);
- p->format = g_strdup (strftime_fmt);
- update_timestamp_label (self);
-}
-
/**
* ido_appointment_menu_item_new_from_model:
* @menu_item: the corresponding menuitem
* @actions: action group to tell when this GtkMenuItem is activated
*
- * Creates a new IdoAppointmentMenuItem with properties initialized from
- * the menuitem's attributes.
+ * Creates a new IdoTimeStampMenuItem with properties initialized
+ * appropriately for a com.canonical.indicator.alarm
*
* If the menuitem's 'action' attribute is set, trigger that action
* in @actions when this IdoAppointmentMenuItem is activated.
@@ -413,16 +88,16 @@ ido_appointment_menu_item_new_from_model (GMenuItem * menu_item,
guint n;
gint64 i64;
gchar * str;
- IdoAppointmentMenuItem * ido_appointment;
+ IdoBasicMenuItem * ido_menu_item;
GParameter parameters[8];
- /* create the ido_appointment */
+ /* create the ido_menu_item */
n = 0;
- if (g_menu_item_get_attribute (menu_item, "label", "s", &str))
+ if (g_menu_item_get_attribute (menu_item, G_MENU_ATTRIBUTE_LABEL, "s", &str))
{
- GParameter p = { "summary", G_VALUE_INIT };
+ GParameter p = { "text", G_VALUE_INIT };
g_value_init (&p.value, G_TYPE_STRING);
g_value_take_string (&p.value, str);
parameters[n++] = p;
@@ -430,10 +105,11 @@ ido_appointment_menu_item_new_from_model (GMenuItem * menu_item,
if (g_menu_item_get_attribute (menu_item, "x-canonical-color", "s", &str))
{
- GParameter p = { "color", G_VALUE_INIT };
- g_value_init (&p.value, G_TYPE_STRING);
- g_value_take_string (&p.value, str);
+ GParameter p = { "icon", G_VALUE_INIT };
+ g_value_init (&p.value, G_TYPE_OBJECT);
+ g_value_take_object (&p.value, create_color_icon_pixbuf (str));
parameters[n++] = p;
+ g_free (str);
}
if (g_menu_item_get_attribute (menu_item, "x-canonical-time-format", "s", &str))
@@ -446,14 +122,14 @@ ido_appointment_menu_item_new_from_model (GMenuItem * menu_item,
if (g_menu_item_get_attribute (menu_item, "x-canonical-time", "x", &i64))
{
- GParameter p = { "time", G_VALUE_INIT };
- g_value_init (&p.value, G_TYPE_INT64);
- g_value_set_int64 (&p.value, i64);
+ GParameter p = { "date-time", G_VALUE_INIT };
+ g_value_init (&p.value, G_TYPE_DATE_TIME);
+ g_value_take_boxed (&p.value, g_date_time_new_from_unix_local (i64));
parameters[n++] = p;
}
g_assert (n <= G_N_ELEMENTS (parameters));
- ido_appointment = g_object_newv (IDO_APPOINTMENT_MENU_ITEM_TYPE, n, parameters);
+ ido_menu_item = g_object_newv (IDO_TYPE_TIME_STAMP_MENU_ITEM, n, parameters);
for (i=0; i<n; i++)
g_value_unset (&parameters[i].value);
@@ -468,16 +144,16 @@ ido_appointment_menu_item_new_from_model (GMenuItem * menu_item,
target = g_menu_item_get_attribute_value (menu_item, "target",
G_VARIANT_TYPE_ANY);
- helper = ido_action_helper_new (GTK_WIDGET(ido_appointment), actions,
+ helper = ido_action_helper_new (GTK_WIDGET(ido_menu_item), actions,
str, target);
- g_signal_connect_swapped (ido_appointment, "activate",
+ g_signal_connect_swapped (ido_menu_item, "activate",
G_CALLBACK (ido_action_helper_activate), helper);
- g_signal_connect_swapped (ido_appointment, "destroy",
+ g_signal_connect_swapped (ido_menu_item, "destroy",
G_CALLBACK (g_object_unref), helper);
g_clear_pointer (&target, g_variant_unref);
g_free (str);
}
- return GTK_MENU_ITEM (ido_appointment);
+ return GTK_MENU_ITEM (ido_menu_item);
}