X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-presentation-timer.c;h=c17a52e9064a0fc04d28888c8f6e872a1ca82570;hb=dc2eb61c8dfcb2bf4165460b5bdd6b60447a2fee;hp=6c5b93097dffedb645341ed6a072e96255423338;hpb=f28e9ccf4400e87da3fa9960becc6feb2ed041cb;p=evince.git diff --git a/shell/ev-presentation-timer.c b/shell/ev-presentation-timer.c index 6c5b9309..c17a52e9 100644 --- a/shell/ev-presentation-timer.c +++ b/shell/ev-presentation-timer.c @@ -33,8 +33,12 @@ struct _EvPresentationTimerPrivate { - guint page; - guint pages; + gint time; + gint remaining; + guint page; + guint pages; + guint timeout; + gboolean running; }; #define EV_PRESENTATION_TIMER_GET_PRIVATE(object) \ @@ -42,37 +46,72 @@ struct _EvPresentationTimerPrivate G_DEFINE_TYPE (EvPresentationTimer, ev_presentation_timer, GTK_TYPE_DRAWING_AREA); +static gdouble +ev_presentation_timer_progress (gdouble time, gdouble remaining) +{ + return remaining/(time*60); +} static gboolean ev_presentation_timer_draw(GtkWidget *timer, cairo_t *cr) { - EvPresentationTimer *ev_timer = EV_PRESENTATION_TIMER(timer); - GtkAllocation allocation; - gtk_widget_get_allocation (timer, &allocation); - //cairo_translate(cr,allocation.x,allocation.y); - cairo_set_source_rgb (cr, 0, 0, 0); - cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL, - CAIRO_FONT_WEIGHT_NORMAL); - cairo_set_font_size (cr, 40); - guint pos = (allocation.width/ev_timer->priv->pages)*ev_timer->priv->page; - cairo_move_to (cr, pos, 40); - cairo_show_text (cr, "Disziplin ist Macht."); - - + EvPresentationTimer *ev_timer = EV_PRESENTATION_TIMER(timer); + GtkAllocation allocation; + gtk_widget_get_allocation (timer, &allocation); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_line_width (cr, 5); + guint pos = (allocation.width/ev_timer->priv->pages)*ev_timer->priv->page; + cairo_move_to (cr,pos,2); + cairo_line_to (cr,pos,allocation.height); + cairo_stroke (cr); + if(ev_timer->priv->running && ev_timer->priv->time > 0 && ev_timer->priv->remaining > 0) + { + gdouble progress = ev_presentation_timer_progress (ev_timer->priv->time, + ev_timer->priv->remaining)*(allocation.width); + cairo_rectangle (cr, allocation.width-progress, + 10, + (allocation.width-(allocation.width-progress))-10, + allocation.height-5); + cairo_stroke_preserve (cr); + cairo_fill(cr); + } return FALSE; } +static gboolean +timeout_cb (gpointer data) +{ + EvPresentationTimer *ev_timer = EV_PRESENTATION_TIMER(data); + ev_timer->priv->remaining--; + + if(time >= 0 && ev_timer->priv->remaining >= 0) + { + gtk_widget_queue_draw(GTK_WIDGET(ev_timer)); + } else + ev_timer->priv->running = FALSE; + return ev_timer->priv->running; +} + void ev_presentation_timer_set_pages (EvPresentationTimer *ev_timer, guint pages) { - ev_timer->priv->pages = pages; + if(!EV_IS_PRESENTATION_TIMER (ev_timer)) + return; + ev_timer->priv->pages = pages -1; } void ev_presentation_timer_set_page (EvPresentationTimer *ev_timer, guint page) { + if(!EV_IS_PRESENTATION_TIMER (ev_timer)) + return; + if (page >= ev_timer->priv->pages) + { + page = ev_timer->priv->pages; + ev_timer->priv->running=FALSE; + } ev_timer->priv->page = page; - gtk_widget_queue_draw(GTK_WIDGET(ev_timer)); + gtk_widget_queue_draw(GTK_WIDGET(ev_timer)); } static void @@ -81,6 +120,54 @@ ev_presentation_timer_init (EvPresentationTimer *ev_timer) ev_timer->priv = EV_PRESENTATION_TIMER_GET_PRIVATE (ev_timer); ev_timer->priv->page = 0; ev_timer->priv->pages = 0; + ev_timer->priv->remaining = 0; + ev_timer->priv->time = 0; + ev_timer->priv->timeout = 0; + ev_timer->priv->running = FALSE; +} + +void +ev_presentation_timer_start (EvPresentationTimer *ev_timer) +{ + if (!EV_IS_PRESENTATION_TIMER (ev_timer)) + return; + if (ev_timer->priv->running == FALSE) + { + ev_timer->priv->remaining = (ev_timer->priv->time)*60; + ev_timer->priv->running = TRUE; + ev_timer->priv->timeout = g_timeout_add_seconds (1, timeout_cb, ev_timer); + } +} + +void +ev_presentation_timer_stop (EvPresentationTimer *ev_timer) +{ + if (!EV_IS_PRESENTATION_TIMER (ev_timer)) + return; + if (ev_timer->priv->timeout > 0) + g_source_remove (ev_timer->priv->timeout); + ev_timer->priv->remaining = 0; +} + +void +ev_presentation_timer_set_time (EvPresentationTimer *ev_timer, + gint time) +{ + if (!EV_IS_PRESENTATION_TIMER (ev_timer)) + return; + if(ev_timer->priv->running) + ev_timer->priv->remaining = ((ev_timer->priv->remaining)/(ev_timer->priv->time)*time); + ev_timer->priv->time = (time < -1)? -1:time; +} + +static void +ev_presentation_timer_dispose (GObject *gobject) +{ + EvPresentationTimer *ev_timer = EV_PRESENTATION_TIMER (gobject); + EvPresentationTimerPrivate *priv = EV_PRESENTATION_TIMER (ev_timer)->priv; + if (priv->timeout > 0) + g_source_remove (priv->timeout); + G_OBJECT_CLASS (ev_presentation_timer_parent_class)->dispose (gobject); } static void @@ -88,11 +175,9 @@ ev_presentation_timer_class_init (EvPresentationTimerClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - //GtkDrawingAreaClass *drawing_area_class = GTK_DRAWING_AREA_CLASS (klass); g_type_class_add_private (object_class, sizeof (EvPresentationTimerPrivate)); widget_class->draw = ev_presentation_timer_draw; - - /*object_class->finalize = ev_presentation_timer_finalize;*/ + object_class->dispose = ev_presentation_timer_dispose; } GtkWidget *