X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fel-home-applet.c;h=c5853908fe8c29381f60e18aba09920f11732e56;hb=4d28752276d910690f1e41116af7f1573aaae84b;hp=dbd13c2589399e38b25cc9bed5ed999a44b871f1;hpb=333df61bc2d2ef1b601a9ae6fe9fe9a5a4277ff9;p=conv-inbox diff --git a/src/el-home-applet.c b/src/el-home-applet.c index dbd13c2..c585390 100644 --- a/src/el-home-applet.c +++ b/src/el-home-applet.c @@ -68,6 +68,10 @@ struct _ELHomeAppletPrivate const gchar *current_font; guint idle_id; + + gboolean scroll_on_click; + gint scroll_offset; + guint scroll_anim_id; }; HD_DEFINE_PLUGIN_MODULE (ELHomeApplet, el_home_applet, HD_TYPE_HOME_PLUGIN_ITEM); @@ -130,16 +134,24 @@ rounded_rectangle (cairo_t *cr, x + r, y); } -static void +static gboolean draw_text (cairo_t *cr, const gchar *text, double x, double y, int width, - int height) + int height, + int offset) { PangoLayout *layout; PangoFontDescription *desc; + gboolean result; + PangoRectangle extent; + + cairo_save (cr); + cairo_rectangle (cr, + x, y, width, height); + cairo_clip (cr); /* Create a PangoLayout, set the font and text */ layout = pango_cairo_create_layout (cr); @@ -151,21 +163,42 @@ draw_text (cairo_t *cr, pango_font_description_free (desc); pango_layout_set_wrap (layout, PANGO_WRAP_WORD_CHAR); - pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END); + if (!offset) + 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_move_to (cr, x + 1, y + 1 - offset); 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_move_to (cr, x, y - offset); cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 1.0); pango_cairo_show_layout (cr, 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); + + return result; +} + +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; + } } static gboolean @@ -176,6 +209,9 @@ expose_event (GtkWidget *self, GdkEventExpose *event) cairo_t *cr; GdkColor color; float red, green, blue; + int message_height; + + message_height = C_HEIGHT - priv->received->allocation.height - HEADER_HEIGHT; /* find theme active color */ gtk_style_lookup_color (self->style, "ActiveTextColor", &color); @@ -264,14 +300,21 @@ expose_event (GtkWidget *self, GdkEventExpose *event) /* cairo_stroke (cr); */ /* draw message */ - draw_text (cr, priv->message, - 2*C_X, HEADER_HEIGHT, - MESSAGE_WIDTH, - MESSAGE_HEIGHT - 2*C_Y); + gboolean ellipsized; + ellipsized = draw_text (cr, priv->message, + 2*C_X, HEADER_HEIGHT, + MESSAGE_WIDTH, + message_height, + priv->scroll_offset); + if (!priv->scroll_offset && !priv->active) + priv->scroll_on_click = ellipsized; cairo_pattern_destroy (grad); cairo_destroy (cr); + if (!priv->scroll_on_click && !ellipsized && priv->scroll_offset) + stop_scroll_anim (priv); + return GTK_WIDGET_CLASS (el_home_applet_parent_class)->expose_event (self, event); } @@ -280,6 +323,7 @@ dispose (GObject *self) { ELHomeAppletPrivate *priv = EL_HOME_APPLET(self)->priv; + stop_scroll_anim (priv); if (priv->idle_id){ g_source_remove (priv->idle_id); priv->idle_id = 0; @@ -541,19 +585,12 @@ new_event_cb (RTComEl *backend, } static gboolean -button_release_event_cb (GtkWidget *widget, - GdkEventButton *event, - ELHomeApplet *self) +scroll_anim_cb (ELHomeApplet *self) { ELHomeAppletPrivate *priv = self->priv; - if (priv->active){ - priv->active = FALSE; - gtk_widget_queue_draw (widget); -#ifndef DEBUG_LAYOUT - mark_as_read (self); -#endif - } + priv->scroll_offset += 1; + gtk_widget_queue_draw (self); return TRUE; } @@ -569,6 +606,33 @@ 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; +} + +static gboolean +button_release_event_cb (GtkWidget *widget, + GdkEventButton *event, + ELHomeApplet *self) +{ + ELHomeAppletPrivate *priv = self->priv; + + if (priv->active){ + priv->active = FALSE; + /* stop_scroll_anim (priv); */ +#ifndef DEBUG_LAYOUT + mark_as_read (self); +#endif + gtk_widget_queue_draw (widget); + } return TRUE; } @@ -582,6 +646,7 @@ leave_notify_event_cb (GtkWidget *widget, if (priv->active){ priv->active = FALSE; + stop_scroll_anim (priv); gtk_widget_queue_draw (widget); }