Mercurial > geeqie.yaz
comparison src/image-overlay.c @ 9:d907d608745f
Sync to GQview 1.5.9 release.
########
DO NOT BASE ENHANCEMENTS OR TRANSLATION UPDATES ON CODE IN THIS CVS!
This CVS is never up to date with current development and is provided
solely for reference purposes, please use the latest official release
package when making any changes or translation updates.
########
author | gqview |
---|---|
date | Sat, 26 Feb 2005 00:13:35 +0000 |
parents | |
children | 17acca639a86 |
comparison
equal
deleted
inserted
replaced
8:e0d0593d519e | 9:d907d608745f |
---|---|
1 /* | |
2 * GQview | |
3 * (C) 2004 John Ellis | |
4 * | |
5 * Author: John Ellis | |
6 * | |
7 * This software is released under the GNU General Public License (GNU GPL). | |
8 * Please read the included file COPYING for more information. | |
9 * This software comes with no warranty of any kind, use at your own risk! | |
10 */ | |
11 | |
12 #include "gqview.h" | |
13 #include "image-overlay.h" | |
14 | |
15 #include "collect.h" | |
16 #include "filelist.h" | |
17 #include "image.h" | |
18 #include "img-view.h" | |
19 #include "layout.h" | |
20 #include "pixbuf_util.h" | |
21 | |
22 | |
23 /* | |
24 *---------------------------------------------------------------------------- | |
25 * image overlay | |
26 *---------------------------------------------------------------------------- | |
27 */ | |
28 | |
29 typedef struct _OverlayUpdate OverlayUpdate; | |
30 struct _OverlayUpdate { | |
31 ImageWindow *imd; | |
32 gint id; | |
33 gint idle_id; | |
34 gulong destroy_id; | |
35 }; | |
36 | |
37 #define IMAGE_OVERLAY_UPDATE_KEY "image-overlay-update" | |
38 | |
39 #define IMAGE_OVERLAY_X 10 | |
40 #define IMAGE_OVERLAY_Y -10 | |
41 | |
42 | |
43 static GdkPixbuf *image_overlay_info_render(ImageWindow *imd) | |
44 { | |
45 GdkPixbuf *pixbuf; | |
46 gint width, height; | |
47 PangoLayout *layout; | |
48 const gchar *name; | |
49 gchar *name_escaped; | |
50 gchar *text; | |
51 gchar *size; | |
52 gint n, t; | |
53 CollectionData *cd; | |
54 CollectInfo *info; | |
55 gchar *ct; | |
56 | |
57 name = image_get_name(imd); | |
58 if (name) | |
59 { | |
60 name_escaped = g_markup_escape_text(name, -1); | |
61 } | |
62 else | |
63 { | |
64 name_escaped = NULL; | |
65 } | |
66 | |
67 cd = image_get_collection(imd, &info); | |
68 if (cd) | |
69 { | |
70 gchar *buf; | |
71 | |
72 t = g_list_length(cd->list); | |
73 n = g_list_index(cd->list, info) + 1; | |
74 buf = g_markup_escape_text((cd->name) ? cd->name : _("Untitled"), -1); | |
75 ct = g_strdup_printf("<i>%s</i>\n", buf); | |
76 g_free(buf); | |
77 } | |
78 else | |
79 { | |
80 LayoutWindow *lw; | |
81 | |
82 lw = layout_find_by_image(imd); | |
83 if (lw) | |
84 { | |
85 if (lw->slideshow) | |
86 { | |
87 n = g_list_length(lw->slideshow->list_done); | |
88 t = n + g_list_length(lw->slideshow->list); | |
89 } | |
90 else | |
91 { | |
92 t = layout_list_count(lw, NULL); | |
93 n = layout_list_get_index(lw, image_get_path(lw->image)) + 1; | |
94 } | |
95 } | |
96 else if (view_window_find_image(imd, &n, &t)) | |
97 { | |
98 n++; | |
99 } | |
100 else | |
101 { | |
102 t = 1; | |
103 n = 1; | |
104 } | |
105 | |
106 if (n < 1) n = 1; | |
107 if (t < 1) t = 1; | |
108 | |
109 ct = g_strdup(""); | |
110 } | |
111 | |
112 size = text_from_size_abrev(imd->size); | |
113 if (!name_escaped) | |
114 { | |
115 text = g_strdup_printf(_("Untitled")); | |
116 } | |
117 else if (imd->unknown) | |
118 { | |
119 text = g_strdup_printf("%s(%d/%d) <b>%s</b>\n%s - %s", ct, | |
120 n, t, name_escaped, | |
121 text_from_time(imd->mtime), size); | |
122 } | |
123 else | |
124 { | |
125 gint w, h; | |
126 | |
127 if (imd->delay_flip && | |
128 imd->il && imd->il->pixbuf && | |
129 imd->pixbuf != imd->il->pixbuf) | |
130 { | |
131 w = gdk_pixbuf_get_width(imd->il->pixbuf); | |
132 h = gdk_pixbuf_get_height(imd->il->pixbuf); | |
133 } | |
134 else | |
135 { | |
136 w = imd->image_width; | |
137 h = imd->image_height; | |
138 } | |
139 | |
140 text = g_strdup_printf("%s(%d/%d) <b>%s</b>\n%d x %d - %s - %s", ct, | |
141 n, t, name_escaped, | |
142 w, h, | |
143 text_from_time(imd->mtime), size); | |
144 } | |
145 g_free(size); | |
146 g_free(ct); | |
147 g_free(name_escaped); | |
148 | |
149 layout = gtk_widget_create_pango_layout(imd->image, NULL); | |
150 pango_layout_set_markup(layout, text, -1); | |
151 g_free(text); | |
152 | |
153 pango_layout_get_pixel_size(layout, &width, &height); | |
154 | |
155 width += 10; | |
156 height += 10; | |
157 | |
158 pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, width, height); | |
159 pixbuf_set_rect_fill(pixbuf, 3, 3, width-6, height-6, 240, 240, 240, 210); | |
160 pixbuf_set_rect(pixbuf, 0, 0, width, height, 240, 240, 240, 80, 1, 1, 1, 1); | |
161 pixbuf_set_rect(pixbuf, 1, 1, width-2, height-2, 240, 240, 240, 130, 1, 1, 1, 1); | |
162 pixbuf_set_rect(pixbuf, 2, 2, width-4, height-4, 240, 240, 240, 180, 1, 1, 1, 1); | |
163 pixbuf_pixel_set(pixbuf, 0, 0, 0, 0, 0, 0); | |
164 pixbuf_pixel_set(pixbuf, width - 1, 0, 0, 0, 0, 0); | |
165 pixbuf_pixel_set(pixbuf, 0, height - 1, 0, 0, 0, 0); | |
166 pixbuf_pixel_set(pixbuf, width - 1, height - 1, 0, 0, 0, 0); | |
167 | |
168 pixbuf_draw_layout(pixbuf, layout, imd->image, 5, 5, 0, 0, 0, 255); | |
169 | |
170 g_object_unref(G_OBJECT(layout)); | |
171 | |
172 return pixbuf; | |
173 } | |
174 | |
175 static void image_overlay_update_destroy_cb(GtkWidget *widget, gpointer data) | |
176 { | |
177 OverlayUpdate *ou = data; | |
178 | |
179 g_source_remove(ou->idle_id); | |
180 g_free(ou); | |
181 } | |
182 | |
183 static gint image_overlay_update_cb(gpointer data) | |
184 { | |
185 OverlayUpdate *ou = data; | |
186 GdkPixbuf *pixbuf; | |
187 | |
188 pixbuf = image_overlay_info_render(ou->imd); | |
189 image_overlay_set(ou->imd, ou->id, pixbuf, IMAGE_OVERLAY_X, IMAGE_OVERLAY_Y); | |
190 g_object_unref(pixbuf); | |
191 | |
192 g_object_set_data(G_OBJECT(ou->imd->image), IMAGE_OVERLAY_UPDATE_KEY, NULL); | |
193 g_signal_handler_disconnect(ou->imd->image, ou->destroy_id); | |
194 g_free(ou); | |
195 | |
196 return FALSE; | |
197 } | |
198 | |
199 static void image_overlay_update_schedule(ImageWindow *imd, gint id) | |
200 { | |
201 OverlayUpdate *ou; | |
202 | |
203 ou = g_object_get_data(G_OBJECT(imd->image), IMAGE_OVERLAY_UPDATE_KEY); | |
204 if (ou) return; | |
205 | |
206 ou = g_new0(OverlayUpdate, 1); | |
207 ou->imd = imd; | |
208 ou->id = id; | |
209 ou->idle_id = g_idle_add_full(G_PRIORITY_HIGH, image_overlay_update_cb, ou, NULL); | |
210 ou->destroy_id = g_signal_connect(G_OBJECT(imd->image), "destroy", | |
211 G_CALLBACK(image_overlay_update_destroy_cb), ou); | |
212 g_object_set_data(G_OBJECT(imd->image), IMAGE_OVERLAY_UPDATE_KEY, ou); | |
213 } | |
214 | |
215 void image_overlay_update(ImageWindow *imd, gint id) | |
216 { | |
217 if (id < 0) return; | |
218 image_overlay_update_schedule(imd, id); | |
219 } | |
220 | |
221 static void image_overlay_upate_cb(ImageWindow *imd, gpointer data) | |
222 { | |
223 gint id; | |
224 | |
225 id = GPOINTER_TO_INT(data); | |
226 image_overlay_update_schedule(imd, id); | |
227 } | |
228 | |
229 gint image_overlay_info_enable(ImageWindow *imd) | |
230 { | |
231 gint id; | |
232 GdkPixbuf *pixbuf; | |
233 | |
234 pixbuf = image_overlay_info_render(imd); | |
235 id = image_overlay_add(imd, pixbuf, IMAGE_OVERLAY_X, IMAGE_OVERLAY_Y, TRUE, FALSE); | |
236 g_object_unref(pixbuf); | |
237 | |
238 image_set_new_func(imd, image_overlay_upate_cb, GINT_TO_POINTER(id)); | |
239 | |
240 return id; | |
241 } | |
242 | |
243 void image_overlay_info_disable(ImageWindow *imd, gint id) | |
244 { | |
245 image_set_new_func(imd, NULL, NULL); | |
246 image_overlay_remove(imd, id); | |
247 } | |
248 |