comparison src/audacious/ui_fileinfo.c @ 4009:ba6258a39662

icon, codec and quality info added to file info box. Added new tuple field FIELD_MIMETYPE used for icon resolving
author Eugene Zagidullin <e.asphyx@gmail.com>
date Sun, 25 Nov 2007 02:07:20 +0300
parents ce1ce0a6cc74
children ce791ae274aa
comparison
equal deleted inserted replaced
3995:3496674a54b5 4009:ba6258a39662
27 #include <glib/gi18n.h> 27 #include <glib/gi18n.h>
28 #include <gtk/gtk.h> 28 #include <gtk/gtk.h>
29 #include <string.h> 29 #include <string.h>
30 #include <stddef.h> 30 #include <stddef.h>
31 #include <stdio.h> 31 #include <stdio.h>
32 #include <stdarg.h>
32 #include <sys/types.h> 33 #include <sys/types.h>
33 #include <dirent.h> 34 #include <dirent.h>
34 #include <unistd.h> 35 #include <unistd.h>
35 #include <errno.h> 36 #include <errno.h>
36 #include <sys/types.h> 37 #include <sys/types.h>
69 GtkWidget *entry_track; 70 GtkWidget *entry_track;
70 GtkWidget *entry_genre; 71 GtkWidget *entry_genre;
71 72
72 GtkWidget *image_artwork; 73 GtkWidget *image_artwork;
73 74
75 GtkWidget *image_fileicon;
76 GtkWidget *label_codec_name;
77 GtkWidget *label_quality;
78
74 static void 79 static void
75 fileinfo_entry_set_text(GtkWidget *widget, const char *text) 80 fileinfo_entry_set_text(GtkWidget *widget, const char *text)
76 { 81 {
77 if (widget == NULL) 82 if (widget == NULL)
78 return; 83 return;
79 84
80 gtk_entry_set_text(GTK_ENTRY(widget), text); 85 gtk_entry_set_text(GTK_ENTRY(widget), text);
86 }
87
88 static void
89 fileinfo_label_set_text(GtkWidget *widget, const char *text)
90 {
91 gchar *tmp;
92
93 if (widget == NULL)
94 return;
95
96 if (text) {
97 tmp = g_strdup_printf("<span size=\"small\">%s</span>", text);
98 gtk_label_set_text(GTK_LABEL(widget), tmp);
99 gtk_label_set_use_markup(GTK_LABEL(widget), TRUE);
100 g_free(tmp);
101 } else {
102 gtk_label_set_text(GTK_LABEL(widget), _("<span size=\"small\">n/a</span>"));
103 gtk_label_set_use_markup(GTK_LABEL(widget), TRUE);
104 }
81 } 105 }
82 106
83 static void 107 static void
84 fileinfo_entry_set_text_free(GtkWidget *widget, char *text) 108 fileinfo_entry_set_text_free(GtkWidget *widget, char *text)
85 { 109 {
146 fileinfo_entry_set_text(entry_location, ""); 170 fileinfo_entry_set_text(entry_location, "");
147 171
148 fileinfo_entry_set_image(image_artwork, DATA_DIR "/images/audio.png"); 172 fileinfo_entry_set_image(image_artwork, DATA_DIR "/images/audio.png");
149 } 173 }
150 174
175 GdkPixbuf *
176 themed_icon_lookup(gint size, const gchar *name, ...) /* NULL-terminated list of icon names */
177 {
178 GtkIconTheme *icon_theme;
179 GdkPixbuf *pixbuf;
180 GError *error = NULL;
181 gchar *n;
182 va_list par;
183
184 icon_theme = gtk_icon_theme_get_default ();
185 //fprintf(stderr, "looking for %s\n", name);
186 pixbuf = gtk_icon_theme_load_icon (icon_theme, name, size, 0, &error);
187 if(pixbuf) return pixbuf;
188
189 if(error != NULL) g_error_free(error);
190
191 /* fallback */
192 va_start(par, name);
193 while((n = (gchar*)va_arg(par, gchar *)) != NULL) {
194 //fprintf(stderr, "looking for %s\n", n);
195 error = NULL;
196 pixbuf = gtk_icon_theme_load_icon (icon_theme, n, size, 0, &error);
197 if(pixbuf) {
198 //fprintf(stderr, "%s is ok\n", n);
199 va_end(par);
200 return pixbuf;
201 }
202 if(error != NULL) g_error_free(error);
203 }
204
205 return NULL;
206 }
207
208 GdkPixbuf *
209 mime_icon_lookup(gint size, const gchar *mime_type) /* smart icon resolving routine :) */
210 {
211 gchar *mime_as_is; /* audio-x-mp3 */
212 gchar *mime_gnome; /* gnome-mime-audio-x-mp3 */
213 gchar *mime_generic; /* audio-x-generic */
214 gchar *mime_gnome_generic; /* gnome-mime-audio */
215
216 GdkPixbuf *icon = NULL;
217
218 gchar **s = g_strsplit(mime_type, "/", 2);
219 if(s[1] != NULL) {
220 mime_as_is = g_strdup_printf("%s-%s", s[0], s[1]);
221 mime_gnome = g_strdup_printf("gnome-mime-%s-%s", s[0], s[1]);
222 mime_generic = g_strdup_printf("%s-x-generic", s[0]);
223 mime_gnome_generic = g_strdup_printf("gnome-mime-%s", s[0]);
224 //fprintf(stderr, "will look for %s, %s, %s, %s, %s\n", mime_as_is, mime_gnome, mime_generic, mime_gnome_generic, s[0]);
225 icon = themed_icon_lookup(size, mime_as_is, mime_gnome, mime_generic, mime_gnome_generic, s[0], NULL); /* s[0] is category */
226 g_free(mime_gnome_generic);
227 g_free(mime_generic);
228 g_free(mime_gnome);
229 g_free(mime_as_is);
230 }
231 g_strfreev(s);
232
233 return icon;
234 }
235
151 void 236 void
152 create_fileinfo_window(void) 237 create_fileinfo_window(void)
153 { 238 {
154 GtkWidget *hbox; 239 GtkWidget *hbox;
155 GtkWidget *vbox1; 240 GtkWidget *vbox1;
160 GtkWidget *label_comment; 245 GtkWidget *label_comment;
161 GtkWidget *label_genre; 246 GtkWidget *label_genre;
162 GtkWidget *label_year; 247 GtkWidget *label_year;
163 GtkWidget *label_track; 248 GtkWidget *label_track;
164 GtkWidget *label_location; 249 GtkWidget *label_location;
250 GtkWidget *label_codec;
251 GtkWidget *label_codec_label;
252 GtkWidget *label_quality_label;
253 GtkWidget *codec_hbox;
254 GtkWidget *codec_table;
165 GtkWidget *table1; 255 GtkWidget *table1;
166 GtkWidget *bbox_close; 256 GtkWidget *bbox_close;
167 GtkWidget *btn_close; 257 GtkWidget *btn_close;
168 GtkWidget *alignment; 258 GtkWidget *alignment;
169 259
286 gtk_box_pack_start (GTK_BOX (vbox2), alignment, FALSE, FALSE, 0); 376 gtk_box_pack_start (GTK_BOX (vbox2), alignment, FALSE, FALSE, 0);
287 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 0, 6, 0, 0); 377 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 0, 6, 0, 0);
288 378
289 entry_location = gtk_entry_new(); 379 entry_location = gtk_entry_new();
290 gtk_container_add(GTK_CONTAINER(alignment), entry_location); 380 gtk_container_add(GTK_CONTAINER(alignment), entry_location);
381
382 label_codec = gtk_label_new(_("<span size=\"small\">Codec</span>"));
383 gtk_box_pack_start (GTK_BOX (vbox2), label_codec, FALSE, FALSE, 0);
384 gtk_label_set_use_markup(GTK_LABEL(label_codec), TRUE);
385 gtk_misc_set_alignment(GTK_MISC(label_codec), 0, 0.5);
386
387 alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
388 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 6, 0, 0);
389 gtk_box_pack_start (GTK_BOX (vbox2), alignment, FALSE, FALSE, 0);
390
391 codec_hbox = gtk_hbox_new(FALSE, 6);
392 gtk_container_add (GTK_CONTAINER(alignment), codec_hbox);
393
394 image_fileicon = gtk_image_new_from_stock (GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_DIALOG);
395 gtk_box_pack_start (GTK_BOX (codec_hbox), image_fileicon, FALSE, FALSE, 0);
396
397 codec_table = gtk_table_new(2, 2, FALSE);
398 gtk_table_set_row_spacings (GTK_TABLE(codec_table), 6);
399 gtk_table_set_col_spacings (GTK_TABLE(codec_table), 12);
400 gtk_box_pack_start (GTK_BOX (codec_hbox), codec_table, FALSE, FALSE, 0);
401
402 label_codec_label = gtk_label_new(_("<span size=\"small\">Codec name:</span>"));
403 gtk_label_set_use_markup(GTK_LABEL(label_codec_label), TRUE);
404 gtk_misc_set_alignment(GTK_MISC(label_codec_label), 0, 0.5);
405 label_quality_label = gtk_label_new(_("<span size=\"small\">Quality:</span>"));
406 gtk_label_set_use_markup(GTK_LABEL(label_quality_label), TRUE);
407 gtk_misc_set_alignment(GTK_MISC(label_quality_label), 0, 0.5);
408
409 label_codec_name = gtk_label_new(_("<span size=\"small\">n/a</span>"));
410 gtk_label_set_use_markup(GTK_LABEL(label_codec_name), TRUE);
411 gtk_misc_set_alignment(GTK_MISC(label_codec_name), 0, 0.5);
412 label_quality = gtk_label_new(_("<span size=\"small\">n/a</span>"));
413 gtk_label_set_use_markup(GTK_LABEL(label_quality), TRUE);
414 gtk_misc_set_alignment(GTK_MISC(label_quality), 0, 0.5);
415
416 gtk_table_attach(GTK_TABLE(codec_table), label_codec_label, 0, 1, 0, 1,
417 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
418 (GtkAttachOptions) (0), 0, 0);
419 gtk_table_attach(GTK_TABLE(codec_table), label_codec_name, 1, 2, 0, 1,
420 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
421 (GtkAttachOptions) (0), 0, 0);
422 gtk_table_attach(GTK_TABLE(codec_table), label_quality_label, 0, 1, 1, 2,
423 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
424 (GtkAttachOptions) (0), 0, 0);
425 gtk_table_attach(GTK_TABLE(codec_table), label_quality, 1, 2, 1, 2,
426 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
427 (GtkAttachOptions) (0), 0, 0);
291 428
292 bbox_close = gtk_hbutton_box_new(); 429 bbox_close = gtk_hbutton_box_new();
293 gtk_box_pack_start(GTK_BOX(vbox1), bbox_close, FALSE, FALSE, 0); 430 gtk_box_pack_start(GTK_BOX(vbox1), bbox_close, FALSE, FALSE, 0);
294 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox_close), GTK_BUTTONBOX_END); 431 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox_close), GTK_BUTTONBOX_END);
295 432
303 440
304 void 441 void
305 fileinfo_show_for_tuple(Tuple *tuple) 442 fileinfo_show_for_tuple(Tuple *tuple)
306 { 443 {
307 gchar *tmp = NULL; 444 gchar *tmp = NULL;
445 GdkPixbuf *icon = NULL;
308 446
309 if (tuple == NULL) 447 if (tuple == NULL)
310 return; 448 return;
311 449
312 gtk_widget_realize(fileinfo_win); 450 gtk_widget_realize(fileinfo_win);
331 g_strdup_printf("%d", tuple_get_int(tuple, FIELD_YEAR, NULL))); 469 g_strdup_printf("%d", tuple_get_int(tuple, FIELD_YEAR, NULL)));
332 470
333 if (tuple_get_int(tuple, FIELD_TRACK_NUMBER, NULL)) 471 if (tuple_get_int(tuple, FIELD_TRACK_NUMBER, NULL))
334 fileinfo_entry_set_text_free(entry_track, 472 fileinfo_entry_set_text_free(entry_track,
335 g_strdup_printf("%d", tuple_get_int(tuple, FIELD_TRACK_NUMBER, NULL))); 473 g_strdup_printf("%d", tuple_get_int(tuple, FIELD_TRACK_NUMBER, NULL)));
474
475 fileinfo_label_set_text(label_codec_name, tuple_get_string(tuple, FIELD_CODEC, NULL));
476 fileinfo_label_set_text(label_quality, tuple_get_string(tuple, FIELD_QUALITY, NULL));
477
478 tmp = (gchar *)tuple_get_string(tuple, FIELD_MIMETYPE, NULL);
479 icon = mime_icon_lookup(48, tmp ? tmp : "audio/x-generic");
480 if (icon) {
481 if (image_fileicon) gtk_image_set_from_pixbuf (GTK_IMAGE(image_fileicon), icon);
482 g_object_unref(icon);
483 }
336 484
337 tmp = fileinfo_recursive_get_image( 485 tmp = fileinfo_recursive_get_image(
338 tuple_get_string(tuple, FIELD_FILE_PATH, NULL), 486 tuple_get_string(tuple, FIELD_FILE_PATH, NULL),
339 tuple_get_string(tuple, FIELD_FILE_NAME, NULL), 0); 487 tuple_get_string(tuple, FIELD_FILE_NAME, NULL), 0);
340 488