Initial scrolling attempt
authorArtem Garmash <artemgarmash@gmail.com>
Sun, 1 Nov 2009 21:53:28 +0000 (23:53 +0200)
committerArtem Garmash <artem.garmash@nokia.com>
Sun, 27 Jun 2010 19:13:40 +0000 (22:13 +0300)
src/el-home-applet.c

index dbd13c2..78e8491 100644 (file)
@@ -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);
         }