1
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
4
* Copyright (C) Kevin DeKorte 2009 <kdekorte@gmail.com>
6
* gmtk_media_tracker.c is free software.
8
* You may redistribute it and/or modify it under the terms of the
9
* GNU General Public License, as published by the Free Software
10
* Foundation; either version 2 of the License, or (at your option)
13
* gmtk_media_tracker.c is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16
* See the GNU General Public License for more details.
18
* You should have received a copy of the GNU General Public License
19
* along with playlist.c. If not, write to:
20
* The Free Software Foundation, Inc.,
21
* 51 Franklin Street, Fifth Floor
22
* Boston, MA 02110-1301, USA.
25
#include "gmtk_media_tracker.h"
26
#include "../../pixmaps/media-playback-start.xpm"
28
G_DEFINE_TYPE(GmtkMediaTracker, gmtk_media_tracker, GTK_TYPE_DRAWING_AREA);
30
static gboolean gmtk_media_tracker_expose(GtkWidget * meter, GdkEventExpose * event);
31
static gboolean gmtk_media_tracker_button_press(GtkWidget * tracker, GdkEventButton * event);
32
static gboolean gmtk_media_tracker_button_release(GtkWidget * tracker, GdkEventButton * event);
33
static gboolean gmtk_media_tracker_motion_notify(GtkWidget * tracker, GdkEventMotion * event);
34
static void gmtk_media_tracker_dispose(GObject * object);
36
static void gmtk_media_tracker_class_init(GmtkMediaTrackerClass * class)
38
GtkWidgetClass *widget_class;
40
widget_class = GTK_WIDGET_CLASS(class);
42
widget_class->expose_event = gmtk_media_tracker_expose;
43
widget_class->button_press_event = gmtk_media_tracker_button_press;
44
widget_class->button_release_event = gmtk_media_tracker_button_release;
45
widget_class->motion_notify_event = gmtk_media_tracker_motion_notify;
46
G_OBJECT_CLASS(class)->dispose = gmtk_media_tracker_dispose;
49
static void gmtk_media_tracker_init(GmtkMediaTracker * tracker)
52
GtkIconTheme *icon_theme;
56
gtk_widget_add_events(GTK_WIDGET(tracker),
57
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
58
GDK_POINTER_MOTION_MASK);
62
tracker->media_percent = 0.0;
63
tracker->cache_percent = 0.0;
65
p = gtk_widget_create_pango_layout(GTK_WIDGET(tracker), "/^q");
66
pango_layout_get_size(p, &pwidth, &pheight);
67
pwidth = pwidth / PANGO_SCALE;
68
pheight = pheight / PANGO_SCALE;
69
GTK_WIDGET(tracker)->requisition.height = pheight + 16;
70
GTK_WIDGET(tracker)->requisition.width = 128;
73
icon_theme = gtk_icon_theme_get_default();
74
if (gtk_icon_theme_has_icon(icon_theme, "media-playback-start")) {
75
temp = gtk_icon_theme_load_icon(icon_theme, "media-playback-start", 16, 0, NULL);
76
} else if (gtk_icon_theme_has_icon(icon_theme, "stock_media-play")) {
77
temp = gtk_icon_theme_load_icon(icon_theme, "stock_media-play", 16, 0, NULL);
79
temp = gdk_pixbuf_new_from_xpm_data((const char **) media_playback_start_xpm);
81
tracker->thumb_lower = gdk_pixbuf_rotate_simple(temp, GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE);
82
tracker->thumb_upper = gdk_pixbuf_flip(tracker->thumb_lower, FALSE);
83
gdk_pixbuf_unref(temp);
85
tracker->position = THUMB_ON_BOTTOM;
86
tracker->allow_expand = TRUE;
89
static void gmtk_media_tracker_dispose(GObject * object)
92
GmtkMediaTracker *tracker;
94
tracker = GMTK_MEDIA_TRACKER(object);
96
g_free(tracker->text);
100
if (GDK_IS_PIXBUF(tracker->thumb_upper)) {
101
gdk_pixbuf_unref(tracker->thumb_upper);
102
gdk_pixbuf_unref(tracker->thumb_lower);
107
void draw(GtkWidget * tracker)
110
gint cache_width = 0;
111
gint handle_left = 0;
113
gint pwidth, pheight;
116
gint half_thumb_size;
119
half_thumb_size = gdk_pixbuf_get_width(GMTK_MEDIA_TRACKER(tracker)->thumb_lower) / 2;
121
tracker->allocation.width - gdk_pixbuf_get_width(GMTK_MEDIA_TRACKER(tracker)->thumb_lower);
123
// don't bother if there is nothing to draw
124
if (bar_width < half_thumb_size * 2)
127
// draw the cache bar first, everything is over it
128
if (GMTK_MEDIA_TRACKER(tracker)->cache_percent > 0.0) {
129
cache_width = bar_width * GMTK_MEDIA_TRACKER(tracker)->cache_percent;
131
gdk_draw_rectangle(tracker->window,
132
tracker->style->mid_gc[3],
133
TRUE, half_thumb_size, 6, cache_width, tracker->allocation.height - 11);
137
// draw the progress bar next
138
if (GMTK_MEDIA_TRACKER(tracker)->media_percent > 0.0) {
139
cache_width = bar_width * GMTK_MEDIA_TRACKER(tracker)->media_percent;
141
gdk_draw_rectangle(tracker->window,
142
tracker->style->light_gc[3],
143
TRUE, half_thumb_size, 6, cache_width, tracker->allocation.height - 11);
147
// draw the box and tick marks
148
gdk_draw_rectangle(tracker->window,
149
tracker->style->dark_gc[0],
150
FALSE, half_thumb_size, 5, bar_width, tracker->allocation.height - 10);
152
// if the thumb is hidden we can't seek so tickmarks are useless
153
if (GMTK_MEDIA_TRACKER(tracker)->position == THUMB_HIDDEN && GMTK_MEDIA_TRACKER(tracker)->cache_percent == 0.0) {
156
for (x = half_thumb_size; x < bar_width; x = x + (bar_width / 10)) {
157
gdk_draw_line(tracker->window, tracker->style->dark_gc[0], x, 5, x, 8);
158
gdk_draw_line(tracker->window,
159
tracker->style->dark_gc[0], x, tracker->allocation.height - 5, x,
160
tracker->allocation.height - 8);
164
// text over the background
165
if (GMTK_MEDIA_TRACKER(tracker)->text) {
166
p = gtk_widget_create_pango_layout(tracker, GMTK_MEDIA_TRACKER(tracker)->text);
167
pango_layout_get_size(p, &pwidth, &pheight);
168
pwidth = pwidth / PANGO_SCALE;
169
pheight = pheight / PANGO_SCALE;
170
if (pwidth > bar_width) {
171
if (GMTK_MEDIA_TRACKER(tracker)->allow_expand) {
172
gtk_widget_set_size_request(tracker,(pwidth + 2 * half_thumb_size),-1);
174
pango_layout_set_width(p, bar_width);
175
pango_layout_set_ellipsize(p, PANGO_ELLIPSIZE_START);
180
ptop = (tracker->allocation.height - pheight) / 2;
181
pleft = (tracker->allocation.width - pwidth) / 2;
182
gdk_draw_layout(tracker->window, tracker->style->text_gc[0], pleft, ptop + 1, p);
185
// draw handle, draw it last so it sits on top
186
handle_left = bar_width * GMTK_MEDIA_TRACKER(tracker)->media_percent;
189
if (handle_left > bar_width + half_thumb_size)
190
handle_left = bar_width + half_thumb_size;
192
if ((handle_left) > cache_width)
193
handle_left = cache_width;
195
if (GMTK_MEDIA_TRACKER(tracker)->position == THUMB_ON_TOP ||
196
GMTK_MEDIA_TRACKER(tracker)->position == THUMB_ON_TOP_AND_BOTTOM) {
198
gdk_draw_pixbuf(tracker->window, NULL,
199
GMTK_MEDIA_TRACKER(tracker)->thumb_upper, 0, 0, handle_left,
200
0, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);
203
if (GMTK_MEDIA_TRACKER(tracker)->position == THUMB_ON_BOTTOM ||
204
GMTK_MEDIA_TRACKER(tracker)->position == THUMB_ON_TOP_AND_BOTTOM) {
206
gdk_draw_pixbuf(tracker->window, NULL,
207
GMTK_MEDIA_TRACKER(tracker)->thumb_lower, 0, 0, handle_left,
208
tracker->allocation.height -
209
gdk_pixbuf_get_height(GMTK_MEDIA_TRACKER(tracker)->thumb_lower) + 1, -1, -1,
210
GDK_RGB_DITHER_NONE, 0, 0);
215
static gboolean gmtk_media_tracker_expose(GtkWidget * tracker, GdkEventExpose * event)
221
static gboolean gmtk_media_tracker_button_press(GtkWidget * tracker, GdkEventButton * event)
223
GMTK_MEDIA_TRACKER(tracker)->mouse_down = TRUE;
227
static gboolean gmtk_media_tracker_button_release(GtkWidget * tracker, GdkEventButton * event)
229
gint half_thumb_size;
232
half_thumb_size = gdk_pixbuf_get_width(GMTK_MEDIA_TRACKER(tracker)->thumb_lower) / 2;
234
tracker->allocation.width - gdk_pixbuf_get_width(GMTK_MEDIA_TRACKER(tracker)->thumb_lower);
236
if (GMTK_MEDIA_TRACKER(tracker)->position == THUMB_HIDDEN)
239
GMTK_MEDIA_TRACKER(tracker)->media_percent = (event->x - half_thumb_size) / bar_width;
241
if (GMTK_MEDIA_TRACKER(tracker)->media_percent > 1.0)
242
GMTK_MEDIA_TRACKER(tracker)->media_percent = 1.0;
244
if (GMTK_MEDIA_TRACKER(tracker)->cache_percent > 0.0)
245
if (GMTK_MEDIA_TRACKER(tracker)->media_percent > GMTK_MEDIA_TRACKER(tracker)->cache_percent)
246
GMTK_MEDIA_TRACKER(tracker)->media_percent = GMTK_MEDIA_TRACKER(tracker)->cache_percent;
248
if (GTK_WIDGET(tracker)->window)
249
gdk_window_invalidate_rect(GTK_WIDGET(tracker)->window, NULL, FALSE);
251
GMTK_MEDIA_TRACKER(tracker)->mouse_down = FALSE;
255
static gboolean gmtk_media_tracker_motion_notify(GtkWidget * tracker, GdkEventMotion * event)
257
gint half_thumb_size;
260
half_thumb_size = gdk_pixbuf_get_width(GMTK_MEDIA_TRACKER(tracker)->thumb_lower) / 2;
262
tracker->allocation.width - gdk_pixbuf_get_width(GMTK_MEDIA_TRACKER(tracker)->thumb_lower);
264
if (GMTK_MEDIA_TRACKER(tracker)->position == THUMB_HIDDEN)
268
if (GMTK_MEDIA_TRACKER(tracker)->mouse_down) {
269
GMTK_MEDIA_TRACKER(tracker)->media_percent = (event->x - half_thumb_size) / bar_width;
271
if (GMTK_MEDIA_TRACKER(tracker)->media_percent > 1.0)
272
GMTK_MEDIA_TRACKER(tracker)->media_percent = 1.0;
274
if (GMTK_MEDIA_TRACKER(tracker)->cache_percent > 0.0)
275
if (GMTK_MEDIA_TRACKER(tracker)->media_percent >
276
GMTK_MEDIA_TRACKER(tracker)->cache_percent)
277
GMTK_MEDIA_TRACKER(tracker)->media_percent =
278
GMTK_MEDIA_TRACKER(tracker)->cache_percent;
280
if (GTK_WIDGET(tracker)->window)
281
gdk_window_invalidate_rect(GTK_WIDGET(tracker)->window, NULL, FALSE);
286
GtkWidget *gmtk_media_tracker_new()
288
return g_object_new(GMTK_TYPE_MEDIA_TRACKER, NULL);
292
void gmtk_media_tracker_set_percentage(GmtkMediaTracker * tracker, gdouble percentage)
294
tracker->media_percent = percentage;
295
if (tracker->media_percent > 1.0)
296
tracker->media_percent = 1.0;
297
if (tracker->media_percent < 0.0)
298
tracker->media_percent = 0.0;
300
if (GTK_WIDGET(tracker)->window)
301
gdk_window_invalidate_rect(GTK_WIDGET(tracker)->window, NULL, FALSE);
304
gdouble gmtk_media_tracker_get_percentage(GmtkMediaTracker * tracker)
306
return tracker->media_percent;
309
void gmtk_media_tracker_set_text(GmtkMediaTracker * tracker, const gchar * text)
312
g_free(tracker->text);
313
tracker->text = NULL;
317
tracker->text = g_strdup(text);
319
if (GTK_WIDGET(tracker)->window)
320
gdk_window_invalidate_rect(GTK_WIDGET(tracker)->window, NULL, FALSE);
323
void gmtk_media_tracker_set_cache_percentage(GmtkMediaTracker * tracker, gdouble percentage)
325
tracker->cache_percent = percentage;
327
if (tracker->cache_percent > 1.0)
328
tracker->cache_percent = 1.0;
329
if (tracker->cache_percent < 0.0)
330
tracker->cache_percent = 0.0;
332
if (GTK_WIDGET(tracker)->window)
333
gdk_window_invalidate_rect(GTK_WIDGET(tracker)->window, NULL, FALSE);
336
gdouble gmtk_media_tracker_get_cache_percentage(GmtkMediaTracker * tracker)
338
return tracker->cache_percent;
341
void gmtk_media_tracker_set_thumb_position(GmtkMediaTracker * tracker, GmtkThumbPosition position)
343
tracker->position = position;
346
void gmtk_media_tracker_set_allow_expand(GmtkMediaTracker * tracker, gboolean allow_expand)
348
tracker->allow_expand = allow_expand;
b'\\ No newline at end of file'