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=72a97152ac340212269827771c0e0f5acc0c821e;hpb=aab1fa5bcd4045b0f2278c4c8b3d4598c6f4491e;p=evince.git diff --git a/shell/ev-presentation-timer.c b/shell/ev-presentation-timer.c index 72a97152..3b2a000d 100644 --- a/shell/ev-presentation-timer.c +++ b/shell/ev-presentation-timer.c @@ -33,8 +33,11 @@ struct _EvPresentationTimerPrivate { - guint page; - guint pages; + gint time; + gint remaining; + guint page; + guint pages; + guint running; }; #define EV_PRESENTATION_TIMER_GET_PRIVATE(object) \ @@ -42,37 +45,64 @@ 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; + 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)); + gtk_widget_queue_draw(GTK_WIDGET(ev_timer)); } static void @@ -81,19 +111,36 @@ 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->running = FALSE; } -void ev_presentation_timer_start (EvPresentationTimer *ev_timer) +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) +void +ev_presentation_timer_stop (EvPresentationTimer *ev_timer) { + ev_timer->priv->remaining = 0; } -void ev_presentation_timer_set_time (EvPresentationTimer *ev_timer, - gint time) +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 @@ -101,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;*/ }