From 874be848efb904b552ae4b7e76552aaf4a9f2dbc Mon Sep 17 00:00:00 2001 From: Artem Garmash Date: Sun, 1 Nov 2009 23:53:28 +0200 Subject: [PATCH] Initial scrolling attempt --- src/el-home-applet.c | 92 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 73 insertions(+), 19 deletions(-) diff --git a/src/el-home-applet.c b/src/el-home-applet.c index dbd13c2..78e8491 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,23 @@ 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; + + 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 +162,27 @@ 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); + result = !offset && pango_layout_is_ellipsized (layout); + g_object_unref (layout); + cairo_restore (cr); + + return result; } static gboolean @@ -264,10 +281,14 @@ 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 - 2*C_Y, + priv->scroll_offset); + if (!priv->scroll_offset && !priv->active) + priv->scroll_on_click = ellipsized; cairo_pattern_destroy (grad); cairo_destroy (cr); @@ -276,10 +297,22 @@ expose_event (GtkWidget *self, GdkEventExpose *event) } 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 void 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 +574,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 +595,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 +635,7 @@ leave_notify_event_cb (GtkWidget *widget, if (priv->active){ priv->active = FALSE; + stop_scroll_anim (priv); gtk_widget_queue_draw (widget); } -- 1.7.9.5