2 * Copyright (C) 2004 John Ellis
3 * Copyright (C) 2008 - 2016 The Geeqie Team
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
32 #include "ui_spinner.h"
35 #include "ui_fileops.h"
38 #define SPINNER_FRAMES 19
42 *-----------------------------------------------------------------------------
44 *-----------------------------------------------------------------------------
47 typedef struct _SpinnerData SpinnerData;
50 GList *list; /* list of pixbufs */
52 guint timer_id; /* event source id */
55 static void spinner_set_frame(SpinnerData *sp, guint frame)
59 pb = g_list_nth_data(sp->list, frame);
60 if (pb) gtk_image_set_from_pixbuf(GTK_IMAGE(sp->image), pb);
65 static void spinner_increment_frame(SpinnerData *sp)
68 if (sp->frame >= g_list_length(sp->list)) sp->frame = 1;
69 spinner_set_frame(sp, sp->frame);
72 static gboolean spinner_loop_cb(gpointer data)
74 SpinnerData *sp = data;
76 if (sp->list) spinner_increment_frame(sp);
81 static void spinner_set_timeout(SpinnerData *sp, gint interval)
87 g_source_remove(sp->timer_id);
93 sp->timer_id = g_timeout_add(interval, spinner_loop_cb, sp);
95 else if (interval < 0)
97 spinner_set_frame(sp, 0);
100 gtk_widget_set_sensitive(sp->image, (interval >= 0));
103 static void spinner_destroy_cb(GtkWidget *widget, gpointer data)
105 SpinnerData *sp = data;
108 spinner_set_timeout(sp, 0);
113 GdkPixbuf *pb = work->data;
118 g_list_free(sp->list);
122 GtkWidget *spinner_new(const gchar *path, gint interval)
126 sp = g_new0(SpinnerData, 1);
135 pathl = path_from_utf8(path);
138 buf = g_strdup_printf("%s%02d.png", pathl, n);
139 while ((pb = gdk_pixbuf_new_from_file(buf, NULL)))
141 sp->list = g_list_append(sp->list, pb);
145 buf = g_strdup_printf("%s%02d.png", pathl, n);
158 pb = gdk_pixbuf_new_from_inline(-1, icon_spinner, FALSE, NULL);
159 w = gdk_pixbuf_get_width(pb);
160 h = gdk_pixbuf_get_height(pb) / SPINNER_FRAMES;
161 for (n = 0; n < SPINNER_FRAMES; n++)
163 sp->list = g_list_append(sp->list,
164 gdk_pixbuf_new_subpixbuf(pb, 0, n * h, w, h));
166 /* pb pixels is inline static, so the subpixbufs in sp->list will be ok */
175 sp->image = gtk_image_new_from_pixbuf(pb);
179 sp->image = gtk_image_new_from_stock(GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_DIALOG);
182 g_object_set_data(G_OBJECT(sp->image), "spinner", sp);
184 g_signal_connect(G_OBJECT(sp->image), "destroy",
185 G_CALLBACK(spinner_destroy_cb), sp);
187 spinner_set_timeout(sp, interval);
192 void spinner_set_interval(GtkWidget *spinner, gint interval)
196 sp = g_object_get_data(G_OBJECT(spinner), "spinner");
198 spinner_set_timeout(sp, interval);
201 void spinner_step(GtkWidget *spinner, gboolean reset)
205 sp = g_object_get_data(G_OBJECT(spinner), "spinner");
208 log_printf("spinner warning: attempt to step with timer set\n");
214 spinner_set_frame(sp, 0);
218 spinner_increment_frame(sp);
221 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */