X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=hildon%2Fhildon-pannable-area.c;h=21c140221b3b77f471cf27ddd0cd5843c00a5008;hb=ab90c2aebca089438622f1b63faca01fc147edf2;hp=558e148850ff9bd6f767fea23fd46c5114c88952;hpb=894aeb233b68ab2c49c23a9956f64934500c0192;p=hildon diff --git a/hildon/hildon-pannable-area.c b/hildon/hildon-pannable-area.c index 558e148..21c1402 100644 --- a/hildon/hildon-pannable-area.c +++ b/hildon/hildon-pannable-area.c @@ -141,12 +141,15 @@ struct _HildonPannableAreaPrivate { GtkPolicyType hscrollbar_policy; GdkGC *scrollbars_gc; + GdkColor scroll_color; }; /*signals*/ enum { HORIZONTAL_MOVEMENT, VERTICAL_MOVEMENT, + PANNING_STARTED, + PANNING_FINISHED, LAST_SIGNAL }; @@ -629,6 +632,52 @@ hildon_pannable_area_class_init (HildonPannableAreaClass * klass) G_TYPE_DOUBLE, G_TYPE_DOUBLE); + /** + * HildonPannableArea::panning-started: + * @hildonpannable: the pannable area object that is going to start + * the panning + * + * This signal is emitted before the panning starts. Applications + * can return %TRUE to avoid the panning. The main difference with + * the vertical-movement and horizontal-movement signals is those + * gesture signals are launched no matter if the widget is going to + * move, this signal means the widget is going to start moving. It + * could even happen that the widget moves and there was no gesture + * (i.e. click meanwhile the pannable is overshooting). + * + * Returns: %TRUE to stop the panning launch. %FALSE to continue + * with it. + * + * Since: 2.2 + */ + pannable_area_signals[PANNING_STARTED] = + g_signal_new ("panning-started", + G_TYPE_FROM_CLASS (object_class), + 0, + 0, + NULL, NULL, + _hildon_marshal_BOOLEAN__VOID, + G_TYPE_BOOLEAN, 0); + + /** + * HildonPannableArea::panning-finished: + * @hildonpannable: the pannable area object that finished the + * panning + * + * This signal is emitted after the kinetic panning has + * finished. + * + * Since: 2.2 + */ + pannable_area_signals[PANNING_FINISHED] = + g_signal_new ("panning-finished", + G_TYPE_FROM_CLASS (object_class), + 0, + 0, + NULL, NULL, + _hildon_marshal_VOID__VOID, + G_TYPE_NONE, 0); + } static void @@ -670,6 +719,9 @@ hildon_pannable_area_init (HildonPannableArea * area) priv->x_offset = 0; priv->y_offset = 0; + gtk_style_lookup_color (GTK_WIDGET (area)->style, + "SecondaryTextColor", &priv->scroll_color); + priv->hadjust = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); priv->vadjust = @@ -907,6 +959,7 @@ hildon_pannable_area_dispose (GObject * object) GtkWidget *child = gtk_bin_get_child (GTK_BIN (object)); if (priv->idle_id) { + g_signal_emit (object, pannable_area_signals[PANNING_FINISHED], 0); g_source_remove (priv->idle_id); priv->idle_id = 0; } @@ -1192,6 +1245,7 @@ hildon_pannable_area_style_set (GtkWidget * widget, GTK_WIDGET_CLASS (hildon_pannable_area_parent_class)-> style_set (widget, previous_style); + gtk_style_lookup_color (widget->style, "SecondaryTextColor", &priv->scroll_color); gtk_widget_style_get (widget, "indicator-width", &priv->indicator_width, NULL); } @@ -1412,7 +1466,7 @@ hildon_pannable_draw_vscroll (GtkWidget *widget, HildonPannableAreaPrivate *priv = HILDON_PANNABLE_AREA (widget)->priv; gfloat y, height; GdkColor transp_color; - GdkGC *gc = widget->style->fg_gc[GTK_STATE_INSENSITIVE]; + GdkGC *gc = priv->scrollbars_gc; gdk_draw_rectangle (widget->window, widget->style->bg_gc[GTK_STATE_NORMAL], @@ -1436,14 +1490,13 @@ hildon_pannable_draw_vscroll (GtkWidget *widget, (priv->hscroll_visible ? priv->hscroll_rect.height : 0) - height); - if (priv->scroll_indicator_alpha < 1.0) { + if (priv->scroll_indicator_alpha == 1.0) { + transp_color = priv->scroll_color; + } else if (priv->scroll_indicator_alpha < 1.0) { tranparency_color (&transp_color, *back_color, *scroll_color, priv->scroll_indicator_alpha); - - gdk_gc_set_rgb_fg_color (priv->scrollbars_gc, &transp_color); - - gc = priv->scrollbars_gc; } + gdk_gc_set_rgb_fg_color (gc, &transp_color); gdk_draw_rectangle (widget->window, gc, TRUE, priv->vscroll_rect.x, y, @@ -1458,7 +1511,7 @@ hildon_pannable_draw_hscroll (GtkWidget *widget, HildonPannableAreaPrivate *priv = HILDON_PANNABLE_AREA (widget)->priv; gfloat x, width; GdkColor transp_color; - GdkGC *gc = widget->style->fg_gc[GTK_STATE_INSENSITIVE]; + GdkGC *gc = priv->scrollbars_gc; gdk_draw_rectangle (widget->window, widget->style->bg_gc[GTK_STATE_INSENSITIVE], @@ -1483,14 +1536,13 @@ hildon_pannable_draw_hscroll (GtkWidget *widget, (priv->vscroll_visible ? priv->vscroll_rect.width : 0) - width); - if (priv->scroll_indicator_alpha < 1.0) { + if (priv->scroll_indicator_alpha == 1.0) { + transp_color = priv->scroll_color; + } else if (priv->scroll_indicator_alpha < 1.0) { tranparency_color (&transp_color, *back_color, *scroll_color, priv->scroll_indicator_alpha); - - gdk_gc_set_rgb_fg_color (priv->scrollbars_gc, &transp_color); - - gc = priv->scrollbars_gc; } + gdk_gc_set_rgb_fg_color (gc, &transp_color); gdk_draw_rectangle (widget->window, gc, TRUE, x, priv->hscroll_rect.y, width, @@ -1646,7 +1698,7 @@ hildon_pannable_area_expose_event (GtkWidget * widget, GdkColor scroll_color = widget->style->base[GTK_STATE_SELECTED]; #else /* USE_CAIRO_SCROLLBARS */ GdkColor back_color = widget->style->bg[GTK_STATE_NORMAL]; - GdkColor scroll_color = widget->style->fg[GTK_STATE_INSENSITIVE]; + GdkColor scroll_color = priv->scroll_color; #endif if (G_UNLIKELY (priv->initial_effect)) { @@ -1842,7 +1894,8 @@ hildon_pannable_area_button_press_cb (GtkWidget * widget, GdkEventButton * event) { gint x, y; - HildonPannableAreaPrivate *priv = HILDON_PANNABLE_AREA (widget)->priv; + HildonPannableArea *area = HILDON_PANNABLE_AREA (widget); + HildonPannableAreaPrivate *priv = area->priv; if ((!priv->enabled) || (event->button != 1) || ((event->time == priv->last_time) && @@ -1851,7 +1904,7 @@ hildon_pannable_area_button_press_cb (GtkWidget * widget, priv->scroll_indicator_event_interrupt = 1; - hildon_pannable_area_launch_fade_timeout (HILDON_PANNABLE_AREA (widget), + hildon_pannable_area_launch_fade_timeout (area, priv->scroll_indicator_alpha); priv->last_time = event->time; @@ -1885,6 +1938,11 @@ hildon_pannable_area_button_press_cb (GtkWidget * widget, /* Stop scrolling on mouse-down (so you can flick, then hold to stop) */ priv->vel_x = 0; priv->vel_y = 0; + if (priv->idle_id) { + g_source_remove (priv->idle_id); + priv->idle_id = 0; + g_signal_emit (area, pannable_area_signals[PANNING_FINISHED], 0); + } if (priv->child) { @@ -2199,6 +2257,7 @@ hildon_pannable_area_timeout (HildonPannableArea * area) if ((!priv->enabled) || (priv->mode == HILDON_PANNABLE_AREA_MODE_PUSH)) { priv->idle_id = 0; + g_signal_emit (area, pannable_area_signals[PANNING_FINISHED], 0); return FALSE; } @@ -2235,6 +2294,8 @@ hildon_pannable_area_timeout (HildonPannableArea * area) priv->vel_y = 0; priv->idle_id = 0; + g_signal_emit (area, pannable_area_signals[PANNING_FINISHED], 0); + return FALSE; } } @@ -2391,6 +2452,16 @@ hildon_pannable_area_check_move (HildonPannableArea *area, synth_crossing (priv->child, pos_x, pos_y, event->x_root, event->y_root, event->time, FALSE); } + + if (priv->moved) { + gboolean result_val; + + g_signal_emit (area, + pannable_area_signals[PANNING_STARTED], + 0, &result_val); + + priv->moved = !result_val; + } } priv->first_drag = FALSE; @@ -2630,6 +2701,15 @@ hildon_pannable_area_button_release_cb (GtkWidget * widget, if ((ABS (priv->vel_y) >= priv->vmin) || (ABS (priv->vel_x) >= priv->vmin)) { + /* we have to move because we are in overshooting position*/ + if (!priv->moved) { + gboolean result_val; + + g_signal_emit (area, + pannable_area_signals[PANNING_STARTED], + 0, &result_val); + } + priv->scroll_indicator_alpha = 1.0; if (ABS (priv->vel_x) > MAX_SPEED_THRESHOLD) @@ -2642,6 +2722,9 @@ hildon_pannable_area_button_release_cb (GtkWidget * widget, priv->idle_id = gdk_threads_add_timeout ((gint) (1000.0 / (gdouble) priv->sps), (GSourceFunc) hildon_pannable_area_timeout, widget); + } else { + if (priv->moved) + g_signal_emit (widget, pannable_area_signals[PANNING_FINISHED], 0); } priv->scroll_indicator_event_interrupt = 0; @@ -2728,6 +2811,8 @@ hildon_pannable_area_scroll_cb (GtkWidget *widget, gtk_widget_queue_resize (GTK_WIDGET (widget)); } + g_signal_emit (widget, pannable_area_signals[PANNING_FINISHED], 0); + g_source_remove (priv->idle_id); priv->idle_id = 0; } @@ -3136,6 +3221,7 @@ hildon_pannable_area_jump_to (HildonPannableArea *area, gtk_widget_queue_resize (GTK_WIDGET (area)); } + g_signal_emit (area, pannable_area_signals[PANNING_FINISHED], 0); g_source_remove (priv->idle_id); priv->idle_id = 0; }