]> www.fi.muni.cz Git - evince.git/blob - shell/ev-presentation-timer.c
cleanup...
[evince.git] / shell / ev-presentation-timer.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */
2 /* this file is part of evince, a gnome document viewer
3  *
4  *
5  *  Author:
6  *    Lukas Bezdicka <255993@mail.muni.cz>
7  *
8  * Evince is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * Evince is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21  */
22
23 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
26
27 #include <cairo.h>
28 #include <glib/gi18n.h>
29 #include <gtk/gtk.h>
30 #include <math.h>
31
32 #include "ev-presentation-timer.h"
33
34 struct _EvPresentationTimerPrivate
35 {
36         gint       time;
37         gint       remaining;
38         guint      page;
39         guint      pages;
40         guint      timeout;
41         gboolean   running;
42 };
43
44 #define EV_PRESENTATION_TIMER_GET_PRIVATE(object) \
45         (G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_PRESENTATION_TIMER, EvPresentationTimerPrivate))
46
47 G_DEFINE_TYPE (EvPresentationTimer, ev_presentation_timer, GTK_TYPE_DRAWING_AREA);
48
49 static gdouble
50 ev_presentation_timer_progress (gdouble time, gdouble remaining)
51 {
52         return remaining/(time*60);
53 }
54
55 static gboolean
56 ev_presentation_timer_draw(GtkWidget *timer, cairo_t *cr)
57 {
58         EvPresentationTimer *ev_timer = EV_PRESENTATION_TIMER(timer);
59         GtkAllocation allocation;
60         gtk_widget_get_allocation (timer, &allocation);
61         cairo_set_source_rgb (cr, 0, 0, 0);
62         cairo_set_line_width (cr, 5);
63         guint pos = (allocation.width/ev_timer->priv->pages)*ev_timer->priv->page;
64         cairo_move_to (cr,pos,2);
65         cairo_line_to (cr,pos,allocation.height);
66         cairo_stroke (cr);
67         if(ev_timer->priv->running && ev_timer->priv->time > 0 && ev_timer->priv->remaining > 0)
68         {
69                 gdouble progress = ev_presentation_timer_progress (ev_timer->priv->time,
70                                                                    ev_timer->priv->remaining)*(allocation.width);
71                 cairo_rectangle (cr, allocation.width-progress,
72                                  10,
73                                  (allocation.width-(allocation.width-progress))-10,
74                                  allocation.height-5);
75                 cairo_stroke_preserve (cr);
76                 cairo_fill(cr);
77         }
78         return FALSE;
79 }
80
81 static gboolean
82 timeout_cb (gpointer data)
83 {
84         EvPresentationTimer *ev_timer = EV_PRESENTATION_TIMER(data);
85         ev_timer->priv->remaining--;
86
87         if(time >= 0 && ev_timer->priv->remaining >= 0)
88         {
89                 gtk_widget_queue_draw(GTK_WIDGET(ev_timer));
90         } else
91                 ev_timer->priv->running = FALSE;
92         return ev_timer->priv->running;
93 }
94
95 void
96 ev_presentation_timer_set_pages (EvPresentationTimer *ev_timer, guint pages)
97 {
98         if(!EV_IS_PRESENTATION_TIMER (ev_timer))
99                 return;
100         ev_timer->priv->pages = pages -1;
101 }
102
103 void
104 ev_presentation_timer_set_page (EvPresentationTimer *ev_timer, guint page)
105 {
106         if(!EV_IS_PRESENTATION_TIMER (ev_timer))
107                 return;
108         if (page >= ev_timer->priv->pages)
109         {
110                 page = ev_timer->priv->pages;
111                 ev_timer->priv->running=FALSE;
112         }
113         ev_timer->priv->page = page;
114         gtk_widget_queue_draw(GTK_WIDGET(ev_timer));
115 }
116
117 static void
118 ev_presentation_timer_init (EvPresentationTimer *ev_timer)
119 {
120         ev_timer->priv = EV_PRESENTATION_TIMER_GET_PRIVATE (ev_timer);
121         ev_timer->priv->page = 0;
122         ev_timer->priv->pages = 0;
123         ev_timer->priv->remaining = 0;
124         ev_timer->priv->time = 0;
125         ev_timer->priv->timeout = 0;
126         ev_timer->priv->running = FALSE;
127 }
128
129 void
130 ev_presentation_timer_start (EvPresentationTimer *ev_timer)
131 {
132         if (!EV_IS_PRESENTATION_TIMER (ev_timer))
133                 return;
134         if (ev_timer->priv->running == FALSE)
135         {
136                 ev_timer->priv->remaining = (ev_timer->priv->time)*60;
137                 ev_timer->priv->running = TRUE;
138                 ev_timer->priv->timeout = g_timeout_add_seconds (1, timeout_cb, ev_timer);
139         }
140 }
141
142 void
143 ev_presentation_timer_stop (EvPresentationTimer *ev_timer)
144 {
145         if (!EV_IS_PRESENTATION_TIMER (ev_timer))
146                 return;
147         if (ev_timer->priv->timeout > 0)
148                 g_source_remove (ev_timer->priv->timeout);
149         ev_timer->priv->remaining = 0;
150 }
151
152 void
153 ev_presentation_timer_set_time (EvPresentationTimer *ev_timer,
154                                 gint time)
155 {
156         if (!EV_IS_PRESENTATION_TIMER (ev_timer))
157                 return;
158         if(ev_timer->priv->running)
159                 ev_timer->priv->remaining = ((ev_timer->priv->remaining)/(ev_timer->priv->time)*time);
160         ev_timer->priv->time = (time < -1)? -1:time;
161 }
162
163 static void
164 ev_presentation_timer_dispose (GObject *gobject)
165 {
166         EvPresentationTimer *ev_timer = EV_PRESENTATION_TIMER (gobject);
167         EvPresentationTimerPrivate *priv = EV_PRESENTATION_TIMER (ev_timer)->priv;
168         if (priv->timeout > 0)
169                 g_source_remove (priv->timeout);
170         G_OBJECT_CLASS (ev_presentation_timer_parent_class)->dispose (gobject);
171 }
172
173 static void
174 ev_presentation_timer_class_init (EvPresentationTimerClass *klass)
175 {
176         GObjectClass    *object_class = G_OBJECT_CLASS (klass);
177         GtkWidgetClass  *widget_class = GTK_WIDGET_CLASS (klass);
178         g_type_class_add_private (object_class, sizeof (EvPresentationTimerPrivate));
179         widget_class->draw = ev_presentation_timer_draw;
180         object_class->dispose =  ev_presentation_timer_dispose;
181 }
182
183 GtkWidget *
184 ev_presentation_timer_new (void)
185 {
186         EvPresentationTimer     *ev_timer;
187
188         ev_timer = g_object_new (EV_TYPE_PRESENTATION_TIMER, NULL);
189         return GTK_WIDGET (ev_timer);
190 }