X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fel-home-applet.c;h=7f2e9dcbf41f0d8cd689aece93877163bc0d120e;hb=b8a4765da62f286ec592adf09e7d7671a865c4a2;hp=78e849178d4929a6d2f9d71571d26766d3915e34;hpb=874be848efb904b552ae4b7e76552aaf4a9f2dbc;p=conv-inbox diff --git a/src/el-home-applet.c b/src/el-home-applet.c index 78e8491..7f2e9dc 100644 --- a/src/el-home-applet.c +++ b/src/el-home-applet.c @@ -46,8 +46,6 @@ #define BOX_RADIOUS 10 -#define DEBUG_LAYOUT - struct _ELHomeAppletPrivate { RTComEl *eventlogger; @@ -65,7 +63,12 @@ struct _ELHomeAppletPrivate guint unread_count; - const gchar *current_font; + struct { + float red; + float green; + float blue; + } active_color; + PangoFontDescription *font_desc; guint idle_id; @@ -136,6 +139,7 @@ rounded_rectangle (cairo_t *cr, static gboolean draw_text (cairo_t *cr, + PangoFontDescription *desc, const gchar *text, double x, double y, @@ -144,8 +148,8 @@ draw_text (cairo_t *cr, int offset) { PangoLayout *layout; - PangoFontDescription *desc; gboolean result; + PangoRectangle extent; cairo_save (cr); cairo_rectangle (cr, @@ -157,9 +161,7 @@ draw_text (cairo_t *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); if (!offset) @@ -177,7 +179,11 @@ draw_text (cairo_t *cr, cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 1.0); pango_cairo_show_layout (cr, layout); - result = !offset && pango_layout_is_ellipsized (layout); + pango_layout_get_pixel_extents (layout, NULL, &extent); + if (offset) + result = height < (extent.height - offset); + else + result = pango_layout_is_ellipsized (layout); g_object_unref (layout); cairo_restore (cr); @@ -185,20 +191,52 @@ draw_text (cairo_t *cr, return result; } +static void +stop_scroll_anim (ELHomeAppletPrivate *priv) +{ + if (priv->scroll_anim_id > 0) { + g_source_remove (priv->scroll_anim_id); + priv->scroll_anim_id = 0; + priv->scroll_on_click = FALSE; + } +} + +static void +style_set_cb (GtkWidget *widget, + GtkStyle *previous_style, + ELHomeApplet *self) +{ + ELHomeAppletPrivate *priv = self->priv; + GdkColor color; + GtkStyle *font_style; + + font_style = gtk_rc_get_style_by_paths (gtk_widget_get_settings (widget), + "SystemFont", + NULL, + G_TYPE_NONE); + if (font_style && font_style->font_desc){ + if (priv->font_desc) + pango_font_description_free (priv->font_desc); + priv->font_desc = pango_font_description_copy (font_style->font_desc); + } + + if (gtk_style_lookup_color (widget->style, + "ActiveTextColor", + &color)){ + priv->active_color.red = color.red/(float)G_MAXUINT16; + priv->active_color.green = color.green/(float)G_MAXUINT16; + priv->active_color.blue = color.blue/(float)G_MAXUINT16; + } +} + static gboolean expose_event (GtkWidget *self, GdkEventExpose *event) { ELHomeAppletPrivate *priv = EL_HOME_APPLET(self)->priv; - cairo_t *cr; - GdkColor color; - float red, green, blue; + int message_height; - /* find theme active color */ - gtk_style_lookup_color (self->style, "ActiveTextColor", &color); - red = color.red/(float)G_MAXUINT16; - green = color.green/(float)G_MAXUINT16; - blue = color.blue/(float)G_MAXUINT16; + message_height = C_HEIGHT - priv->received->allocation.height - HEADER_HEIGHT; cr = gdk_cairo_create (self->window); gdk_cairo_region (cr, event->region); @@ -236,7 +274,11 @@ expose_event (GtkWidget *self, GdkEventExpose *event) cairo_set_source_rgba (cr, 0.2f, 0.2f, 0.2f, 0.8f); cairo_fill_preserve (cr); - cairo_set_source_rgba (cr, red, green, blue, 1.0f); + cairo_set_source_rgba (cr, + priv->active_color.red, + priv->active_color.green, + priv->active_color.blue, + 1.0f); cairo_stroke (cr); /* draw body */ @@ -255,10 +297,18 @@ expose_event (GtkWidget *self, GdkEventExpose *event) 0, C_HEIGHT); if (priv->active){ - cairo_pattern_add_color_stop_rgba (grad, 0.5f, - red, green, blue, 0.8f); - cairo_pattern_add_color_stop_rgba (grad, 1.0f, - red/2, green/2, blue/2, 0.8f); + cairo_pattern_add_color_stop_rgba (grad, + 0.5f, + priv->active_color.red, + priv->active_color.green, + priv->active_color.blue, + 0.8f); + cairo_pattern_add_color_stop_rgba (grad, + 1.0f, + priv->active_color.red/2, + priv->active_color.green/2, + priv->active_color.blue/2, + 0.8f); } else { cairo_pattern_add_color_stop_rgba (grad, 0.5f, @@ -282,29 +332,23 @@ expose_event (GtkWidget *self, GdkEventExpose *event) /* draw message */ gboolean ellipsized; - ellipsized = draw_text (cr, priv->message, + ellipsized = draw_text (cr, + priv->font_desc, + priv->message, 2*C_X, HEADER_HEIGHT, MESSAGE_WIDTH, - MESSAGE_HEIGHT - 2*C_Y, + message_height, priv->scroll_offset); - if (!priv->scroll_offset && !priv->active) + if (!priv->scroll_anim_id && !priv->scroll_offset) priv->scroll_on_click = ellipsized; cairo_pattern_destroy (grad); cairo_destroy (cr); - return GTK_WIDGET_CLASS (el_home_applet_parent_class)->expose_event (self, event); -} + if (!priv->scroll_on_click && !ellipsized && priv->scroll_offset) + stop_scroll_anim (priv); -static void -stop_scroll_anim (ELHomeAppletPrivate *priv) -{ - priv->scroll_on_click = FALSE; - priv->scroll_offset = 0; - if (priv->scroll_anim_id > 0) { - g_source_remove (priv->scroll_anim_id); - priv->scroll_anim_id = 0; - } + return GTK_WIDGET_CLASS (el_home_applet_parent_class)->expose_event (self, event); } static void @@ -326,6 +370,10 @@ dispose (GObject *self) g_free (priv->message); priv->message = NULL; } + if (priv->font_desc){ + pango_font_description_free (priv->font_desc); + priv->font_desc = NULL; + } G_OBJECT_CLASS (el_home_applet_parent_class)->dispose (self); } @@ -421,6 +469,8 @@ show_event (ELHomeApplet *self, RTComElIter *it) g_free (remote); + stop_scroll_anim (self->priv); + priv->scroll_offset = 0; gtk_widget_queue_draw (GTK_WIDGET (self)); } @@ -579,7 +629,7 @@ scroll_anim_cb (ELHomeApplet *self) ELHomeAppletPrivate *priv = self->priv; priv->scroll_offset += 1; - gtk_widget_queue_draw (self); + gtk_widget_queue_draw (GTK_WIDGET (self)); return TRUE; } @@ -595,15 +645,7 @@ button_press_event_cb (GtkWidget *widget, priv->active = TRUE; gtk_widget_queue_draw (widget); } - priv->active = TRUE; - if (priv->scroll_on_click) { - stop_scroll_anim (priv); - priv->scroll_anim_id = g_timeout_add (100, - scroll_anim_cb, - self); - } - gtk_widget_queue_draw (widget); return TRUE; } @@ -616,9 +658,16 @@ button_release_event_cb (GtkWidget *widget, if (priv->active){ priv->active = FALSE; - /* stop_scroll_anim (priv); */ + stop_scroll_anim (priv); + if (priv->scroll_on_click) { + priv->scroll_on_click = FALSE; + priv->scroll_anim_id = g_timeout_add (100, + (GSourceFunc)scroll_anim_cb, + self); + } + else #ifndef DEBUG_LAYOUT - mark_as_read (self); + mark_as_read (self); #endif gtk_widget_queue_draw (widget); } @@ -681,12 +730,7 @@ 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_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"); + priv->message = g_strdup ("One two three four five six seven eight nine ten"); /* TODO: l10n */ priv->empty = gtk_label_new ("No new messages"); @@ -734,6 +778,8 @@ el_home_applet_init (ELHomeApplet *self) g_signal_connect (event_box, "leave-notify-event", G_CALLBACK (leave_notify_event_cb), self); + g_signal_connect (event_box, "style-set", G_CALLBACK (style_set_cb), self); + gtk_widget_show_all (GTK_WIDGET (event_box)); #ifndef DEBUG_LAYOUT