From 333df61bc2d2ef1b601a9ae6fe9fe9a5a4277ff9 Mon Sep 17 00:00:00 2001 From: Artem Garmash Date: Sun, 1 Nov 2009 22:43:21 +0200 Subject: [PATCH] Draw main message directly using cairo/pango --- src/el-home-applet.c | 106 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 75 insertions(+), 31 deletions(-) diff --git a/src/el-home-applet.c b/src/el-home-applet.c index f61840b..dbd13c2 100644 --- a/src/el-home-applet.c +++ b/src/el-home-applet.c @@ -33,7 +33,7 @@ EL_TYPE_HOME_APPLET, ELHomeAppletPrivate)) #define BOX_WIDTH 352 -#define BOX_HEIGHT 266 +#define BOX_HEIGHT 256 #define C_WIDTH (BOX_WIDTH - 2*HILDON_MARGIN_HALF) #define C_HEIGHT (BOX_HEIGHT - 2*HILDON_MARGIN_HALF) @@ -46,20 +46,22 @@ #define BOX_RADIOUS 10 +#define DEBUG_LAYOUT + struct _ELHomeAppletPrivate { RTComEl *eventlogger; GtkWidget *sender; - GtkWidget *message; GtkWidget *icon; GtkWidget *unread; GtkWidget *received; GtkWidget *empty; - gint event_id; + gchar *message; + gint event_id; - gboolean active; + gboolean active; guint unread_count; @@ -128,6 +130,44 @@ rounded_rectangle (cairo_t *cr, x + r, y); } +static void +draw_text (cairo_t *cr, + const gchar *text, + double x, + double y, + int width, + int height) +{ + PangoLayout *layout; + PangoFontDescription *desc; + + /* Create a PangoLayout, set the font and text */ + layout = pango_cairo_create_layout (cr); + pango_layout_set_text (layout, + text, + -1); + desc = pango_font_description_from_string ("Sans 17"); + pango_layout_set_font_description (layout, desc); + pango_font_description_free (desc); + + pango_layout_set_wrap (layout, PANGO_WRAP_WORD_CHAR); + pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END); + pango_layout_set_width (layout, PANGO_SCALE*width); + pango_layout_set_height (layout, PANGO_SCALE*height); + + /* draw shadow */ + cairo_move_to (cr, x + 1, y + 1); + cairo_set_source_rgba (cr, 0.2, 0.2, 0.2, 0.8); + pango_cairo_show_layout (cr, layout); + + /* draw fg */ + cairo_move_to (cr, x, y); + cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 1.0); + pango_cairo_show_layout (cr, layout); + + g_object_unref (layout); +} + static gboolean expose_event (GtkWidget *self, GdkEventExpose *event) { @@ -222,6 +262,13 @@ expose_event (GtkWidget *self, GdkEventExpose *event) /* BOX_RADIOUS); */ /* cairo_close_path(cr); */ /* cairo_stroke (cr); */ + + /* draw message */ + draw_text (cr, priv->message, + 2*C_X, HEADER_HEIGHT, + MESSAGE_WIDTH, + MESSAGE_HEIGHT - 2*C_Y); + cairo_pattern_destroy (grad); cairo_destroy (cr); @@ -242,6 +289,11 @@ dispose (GObject *self) priv->eventlogger = NULL; } + if (priv->message){ + g_free (priv->message); + priv->message = NULL; + } + G_OBJECT_CLASS (el_home_applet_parent_class)->dispose (self); } @@ -280,14 +332,18 @@ show_event (ELHomeApplet *self, RTComElIter *it) { ELHomeAppletPrivate *priv = self->priv; - gchar *message = NULL; gchar *remote = NULL; gchar *received = NULL; const gchar *icon_name = NULL; + if (priv->message) { + g_free (priv->message); + priv->message = NULL; + } + if (it && rtcom_el_iter_first (it)){ - rtcom_el_iter_dup_string (it, "free-text", &message); - if (message){ + rtcom_el_iter_dup_string (it, "free-text", &priv->message); + if (priv->message){ const gchar *service; time_t received_t; @@ -308,15 +364,10 @@ show_event (ELHomeApplet *self, RTComElIter *it) priv->event_id = -1; } - if (message){ - if (!GTK_WIDGET_VISIBLE (priv->message)) - gtk_widget_show (priv->message); - gtk_label_set_text (GTK_LABEL (priv->message), message); - } - else{ - gtk_widget_hide (priv->message); + if (priv->message) + gtk_widget_hide (priv->empty); + else gtk_widget_show (priv->empty); - } gtk_label_set_text (GTK_LABEL (priv->sender), remote); gtk_label_set_text (GTK_LABEL (priv->received), received); @@ -335,8 +386,9 @@ show_event (ELHomeApplet *self, RTComElIter *it) else gtk_widget_hide (priv->icon); - g_free (message); g_free (remote); + + gtk_widget_queue_draw (GTK_WIDGET (self)); } static RTComElIter* @@ -575,19 +627,12 @@ el_home_applet_init (ELHomeApplet *self) gtk_widget_set_name (priv->sender, "hildon-shadow-label"); hildon_helper_set_logical_font (priv->sender, "SystemFont"); - priv->message = g_object_new (GTK_TYPE_LABEL, - "label", "asdf asdf adsf asdf asdf asdf asdf asdf", - "wrap", TRUE, - "wrap-mode", PANGO_WRAP_WORD_CHAR, - NULL); - - gtk_misc_set_alignment (GTK_MISC (priv->message), - 0.0f, - 0.0f); - gtk_widget_set_size_request (priv->message, - MESSAGE_WIDTH, - MESSAGE_HEIGHT); - gtk_widget_set_name (priv->message, "hildon-shadow-label"); + priv->message = g_strdup ("One two three four five six seven eight nine ten" + "one two three four five six seven eight nine ten" + "one two three four five six seven eight nine ten" + "one two three four five six seven eight nine ten" + "one two three four five six seven eight nine ten" + "one two three four five six seven eight nine ten"); /* TODO: l10n */ priv->empty = gtk_label_new ("No new messages"); @@ -611,9 +656,8 @@ el_home_applet_init (ELHomeApplet *self) vbox = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox), priv->message, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (vbox), priv->empty, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), priv->received, FALSE, FALSE, 0); + gtk_box_pack_end (GTK_BOX (vbox), priv->received, FALSE, FALSE, 0); align = gtk_alignment_new (0.5f, 0.0f, 1.0f, 1.0f); gtk_alignment_set_padding (GTK_ALIGNMENT (align), -- 1.7.9.5