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=3b2a000dda055f636942eccb1e335bf77fb9875e;hb=156da1afa7b81a00d6308bbf519db965db01fcf2;hp=abf5d6d8fceebc143db58a2d9ddef3120678c418;hpb=924ff63b3a76744b4b0f6c98fc4dd3382f219023;p=evince.git diff --git a/shell/ev-presentation-timer.c b/shell/ev-presentation-timer.c index abf5d6d8..3b2a000d 100644 --- a/shell/ev-presentation-timer.c +++ b/shell/ev-presentation-timer.c @@ -33,7 +33,11 @@ struct _EvPresentationTimerPrivate { - cairo_surface_t *surface; + gint time; + gint remaining; + guint page; + guint pages; + guint running; }; #define EV_PRESENTATION_TIMER_GET_PRIVATE(object) \ @@ -41,25 +45,102 @@ 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) { - 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.0); + 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--; - cairo_move_to(cr, 10.0, 50.0); - cairo_show_text(cr, "Disziplin ist Macht."); + 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; +} - return FALSE; +void +ev_presentation_timer_set_pages (EvPresentationTimer *ev_timer, guint pages) +{ + ev_timer->priv->pages = pages -1; +} + +void +ev_presentation_timer_set_page (EvPresentationTimer *ev_timer, guint page) +{ + 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)); } static void ev_presentation_timer_init (EvPresentationTimer *ev_timer) { -// ev_timer->priv = EV_DSCWINDOW_GET_PRIVATE (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->running = FALSE; +} + +void +ev_presentation_timer_start (EvPresentationTimer *ev_timer) +{ + if (ev_timer->priv->running == FALSE) + { + ev_timer->priv->remaining = (ev_timer->priv->time)*60; + ev_timer->priv->running = TRUE; + g_timeout_add_seconds (1, timeout_cb, ev_timer); + } +} + +void +ev_presentation_timer_stop (EvPresentationTimer *ev_timer) +{ + ev_timer->priv->remaining = 0; +} + +void +ev_presentation_timer_set_time (EvPresentationTimer *ev_timer, + gint time) +{ + 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 @@ -67,10 +148,8 @@ 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;*/ }