175
192
PictureEntry_Clear();
196
* - 'filename' : path + filename of picture file
178
198
void Picture_Load_Filename (gchar *filename, gpointer user_data)
181
201
gchar *filename_utf8;
202
gchar *filename_utf8_folded = NULL;
203
gchar *front_folded = NULL;
204
gchar *back_folded = NULL;
205
gchar *cd_folded = NULL;
206
gchar *inside_folded = NULL;
207
//gchar *inlay_folded = NULL;
209
// Filename must be passed in filesystem encoding!
210
pic = Picture_Load_File_Data(filename);
183
212
filename_utf8 = filename_to_display(filename);
184
pic = Picture_Load_File_Data(filename_utf8);
186
// By default, set the filename in the description
187
pic->description = g_path_get_basename(filename_utf8);
214
if (pic && filename_utf8)
216
// Behaviour following the tag type...
217
switch (ETCore->ETFileDisplayed->ETFileDescription->TagType)
221
pic->type = PICTURE_TYPE_FRONT_COVER;
228
// By default, set the filename in the description
229
pic->description = g_path_get_basename(filename_utf8);
231
// Try to identify the type of the picture from the file name
232
filename_utf8_folded = g_utf8_casefold(pic->description, -1);
233
front_folded = g_utf8_casefold("Front", -1);
234
back_folded = g_utf8_casefold("Back", -1);
235
cd_folded = g_utf8_casefold("CD", -1);
236
inside_folded = g_utf8_casefold("inside", -1);
237
//inlay_folded = g_utf8_casefold("inlay", -1);
238
if ( strstr(filename_utf8_folded, front_folded) != NULL )
239
pic->type = PICTURE_TYPE_FRONT_COVER;
240
else if ( strstr(filename_utf8_folded, back_folded) != NULL )
241
pic->type = PICTURE_TYPE_BACK_COVER;
242
else if ( strstr(filename_utf8_folded, cd_folded) != NULL )
243
pic->type = PICTURE_TYPE_MEDIA;
244
else if ( strstr(filename_utf8_folded, inside_folded) != NULL )
245
pic->type = PICTURE_TYPE_LEAFLET_PAGE;
246
//else if ( strstr(filename_utf8_folded, inlay_folded) != NULL )
247
// pic->type = PICTURE_TYPE_LEAFLET_PAGE;
253
PictureEntry_Update(pic, 1);
255
// FIXME: Call Picture_Free(pic) here? It seems PictureEntry_Update makes copies of pic.
189
259
g_free(filename_utf8);
192
PictureEntry_Update(pic, 1);
260
g_free(filename_utf8_folded);
261
g_free(front_folded);
264
g_free(inside_folded);
265
//g_free(inlay_folded);
367
460
gtk_widget_set_size_request(type, 256, 256);
368
461
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(PictureTypesWindow)->vbox),ScrollWindowPictureTypes,TRUE,TRUE,0);
370
// Load pictures types
371
for (i = 0; i < sizeof(picture_types)/sizeof(picture_types[0]); i++)
463
// Behaviour following the tag type...
464
switch (ETCore->ETFileDisplayed->ETFileDescription->TagType)
373
GtkTreeIter itertype;
375
gtk_list_store_append(store, &itertype);
376
gtk_list_store_set(store, &itertype,
377
PICTURE_TYPE_COLUMN_TEXT, _(Picture_Type_String(picture_types[i])),
378
PICTURE_TYPE_COLUMN_TYPE_CODE, picture_types[i],
380
// Line to select by default
381
if (pic->type == picture_types[i])
468
// Load picture type (only Front Cover!)
469
GtkTreeIter itertype;
471
gtk_list_store_append(store, &itertype);
472
gtk_list_store_set(store, &itertype,
473
PICTURE_TYPE_COLUMN_TEXT, _(Picture_Type_String(PICTURE_TYPE_FRONT_COVER)),
474
PICTURE_TYPE_COLUMN_TYPE_CODE, PICTURE_TYPE_FRONT_COVER,
476
// Line to select by default
382
477
type_iter_to_select = itertype;
484
// Load pictures types
485
for (i = 0; i < sizeof(picture_types)/sizeof(picture_types[0]); i++)
487
GtkTreeIter itertype;
489
gtk_list_store_append(store, &itertype);
490
gtk_list_store_set(store, &itertype,
491
PICTURE_TYPE_COLUMN_TEXT, _(Picture_Type_String(picture_types[i])),
492
PICTURE_TYPE_COLUMN_TYPE_CODE, picture_types[i],
494
// Line to select by default
495
if (pic->type == picture_types[i])
496
type_iter_to_select = itertype;
384
502
// Select the line by default
385
503
selectiontype = gtk_tree_view_get_selection(GTK_TREE_VIEW(type));
386
504
gtk_tree_selection_select_iter(selectiontype, &type_iter_to_select);
506
// Set visible the current selected line
507
rowPath = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &type_iter_to_select);
508
gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(type), rowPath, NULL, FALSE, 0, 0);
509
gtk_tree_path_free(rowPath);
389
512
label = gtk_label_new(_("Picture Description:"));
390
513
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(PictureTypesWindow)->vbox),label,FALSE,FALSE,4);
444
void save_selected_pic (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gchar *filename)
448
gtk_tree_model_get(model, iter, PICTURE_COLUMN_DATA, &pic, -1);
449
Picture_Save_File_Data(pic, filename);
452
void get_selected_pic (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, GtkTreeIter *iter_set)
457
void Picture_Properties_Button_Clicked (GObject *object)
459
GtkWidget *dialog, *type, *label, *desc;
460
GtkWidget *ScrollWindowPictureTypes;
461
GtkCellRenderer *renderer;
462
GtkTreeViewColumn *column;
463
GtkTreeSelection *selection;
466
GtkTreeModel *model2;
467
GtkTreeIter iter2, default_type_iter;
468
GtkWindow *parent_window = NULL;
470
gint picture_types[] =
473
PICTURE_TYPE_FILE_ICON,
474
PICTURE_TYPE_OTHER_FILE_ICON,
475
PICTURE_TYPE_FRONT_COVER,
476
PICTURE_TYPE_BACK_COVER,
477
PICTURE_TYPE_LEAFLET_PAGE,
479
PICTURE_TYPE_LEAD_ARTIST_LEAD_PERFORMER_SOLOIST,
480
PICTURE_TYPE_ARTIST_PERFORMER,
481
PICTURE_TYPE_CONDUCTOR,
482
PICTURE_TYPE_BAND_ORCHESTRA,
483
PICTURE_TYPE_COMPOSER,
484
PICTURE_TYPE_LYRICIST_TEXT_WRITER,
485
PICTURE_TYPE_RECORDING_LOCATION,
486
PICTURE_TYPE_DURING_RECORDING,
487
PICTURE_TYPE_DURING_PERFORMANCE,
488
PICTURE_TYPE_MOVIDE_VIDEO_SCREEN_CAPTURE,
489
PICTURE_TYPE_A_BRIGHT_COLOURED_FISH,
490
PICTURE_TYPE_ILLUSTRATION,
491
PICTURE_TYPE_BAND_ARTIST_LOGOTYPE,
492
PICTURE_TYPE_PUBLISHER_STUDIO_LOGOTYPE
496
parent_window = (GtkWindow *) gtk_widget_get_toplevel(GTK_WIDGET(object));
497
if (!GTK_WIDGET_TOPLEVEL(parent_window))
499
g_warning("Could not get parent window\n");
503
model2 = gtk_tree_view_get_model(GTK_TREE_VIEW(PictureEntryView));
504
gtk_tree_selection_selected_foreach(gtk_tree_view_get_selection(GTK_TREE_VIEW(PictureEntryView)),
505
(GtkTreeSelectionForeachFunc) get_selected_pic, &iter2);
506
gtk_tree_model_get(model2, &iter2, PICTURE_COLUMN_DATA, &pic, -1);
508
dialog = gtk_dialog_new_with_buttons(_("Picture Properties"),
510
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
517
// Set window position
518
if (MESSAGE_BOX_POSITION_NONE)
519
gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_NONE);
520
else if (MESSAGE_BOX_POSITION_CENTER)
521
gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_CENTER);
522
else if (MESSAGE_BOX_POSITION_MOUSE)
523
gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_MOUSE);
525
ScrollWindowPictureTypes = gtk_scrolled_window_new(NULL, NULL);
526
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ScrollWindowPictureTypes),
527
GTK_POLICY_AUTOMATIC,
528
GTK_POLICY_AUTOMATIC);
529
store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
530
type = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
531
gtk_container_add(GTK_CONTAINER(ScrollWindowPictureTypes), type);
533
renderer = gtk_cell_renderer_text_new();
534
column = gtk_tree_view_column_new();
535
gtk_tree_view_column_pack_start(column, renderer, FALSE);
536
gtk_tree_view_column_set_title(column, _("Picture Type"));
537
gtk_tree_view_column_set_attributes(column, renderer,
540
gtk_tree_view_append_column(GTK_TREE_VIEW(type), column);
541
gtk_widget_set_size_request(type, 256, 256);
542
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),ScrollWindowPictureTypes,TRUE,TRUE,0);
544
// Load pictures types
545
for (i = 0; i < sizeof(picture_types)/sizeof(picture_types[0]); i++)
549
gtk_list_store_append(store, &iter);
550
gtk_list_store_set(store, &iter,
551
0, _(Picture_Type_String(picture_types[i])),
554
if (pic->type == picture_types[i])
555
default_type_iter = iter;
558
label = gtk_label_new(_("Picture Description:"));
559
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),label,FALSE,FALSE,4);
561
// Entry for the description
562
desc = gtk_entry_new();
563
if (pic->description)
564
gtk_entry_set_text(GTK_ENTRY(desc), pic->description);
566
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),desc,FALSE,FALSE,0);
568
gtk_widget_show_all(dialog);
569
gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(type)),
572
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
577
model = gtk_tree_view_get_model(GTK_TREE_VIEW(type));
578
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(type));
579
if (gtk_tree_selection_get_selected(selection, &model, &iter))
584
gtk_tree_model_get(model, &iter, 1, &t, -1);
587
buffer = g_strdup(gtk_entry_get_text(GTK_ENTRY(desc)));
588
Strip_String(buffer);
589
if (pic->description)
590
g_free(pic->description);
591
if ( g_utf8_strlen(buffer, -1) > 0 )
593
pic->description = buffer;
596
pic->description = 0;
600
gtk_list_store_set(GTK_LIST_STORE(model2), &iter2,
606
gtk_widget_destroy(dialog);
609
void Picture_Save_Button_Clicked (GObject *object)
611
GtkWidget *FileSelectionWindow;
612
GtkWindow *parent_window = NULL;
613
static gchar *init_dir = NULL;
615
parent_window = (GtkWindow*) gtk_widget_get_toplevel(GTK_WIDGET(object));
616
if (!GTK_WIDGET_TOPLEVEL(parent_window))
618
g_warning("Could not get parent window\n");
622
FileSelectionWindow = gtk_file_chooser_dialog_new(_("Save picture"),
624
GTK_FILE_CHOOSER_ACTION_SAVE,
625
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
626
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
628
// Set the default folder if defined
630
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(FileSelectionWindow),init_dir);
632
if (gtk_dialog_run(GTK_DIALOG(FileSelectionWindow)) == GTK_RESPONSE_ACCEPT)
634
gchar *filename, *filename_utf8;
636
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(FileSelectionWindow));
637
filename_utf8 = filename_to_display(filename);
638
gtk_tree_selection_selected_foreach(gtk_tree_view_get_selection(GTK_TREE_VIEW(PictureEntryView)),
639
(GtkTreeSelectionForeachFunc) save_selected_pic, filename_utf8);
640
g_free(filename_utf8);
642
// Save the directory selected for initialize next time
644
init_dir = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(FileSelectionWindow));
646
gtk_widget_destroy(FileSelectionWindow);
649
589
void Picture_Save_Button_Clicked (GObject *object)
651
591
GtkWidget *FileSelectionWindow;
1038
1027
g_free(pic->data);
1040
pic = (Picture *)NULL;
1043
#define LOAD_BUFFER_SIZE 4096
1033
* Load the picture represented by the 'filename' (must be passed in
1034
* file system encoding, not UTF-8)
1045
1036
Picture *Picture_Load_File_Data (const gchar *filename)
1048
1039
gchar *buffer = 0;
1049
1040
size_t size = 0;
1043
if (lstat(filename, &st)==-1)
1044
return (Picture *)NULL;
1047
buffer = g_malloc(size);
1052
fd = open(filename, O_RDONLY);
1049
FILE *fd = fopen(filename, "rb");
1053
gchar *filename_utf8;
1056
/* Picture file not opened */
1057
filename_utf8 = filename_to_display(filename);
1058
msg = g_strdup_printf(_("Can't open file :\n'%s'!\n(%s)"),
1059
filename_utf8,g_strerror(errno));
1060
msgbox = msg_box_new (_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0);
1062
msg_box_hide_check_button(MSG_BOX(msgbox));
1063
msg_box_run(MSG_BOX(msgbox));
1064
gtk_widget_destroy(msgbox);
1066
Statusbar_Message(_("Picture file not loaded..."),TRUE);
1067
g_free(filename_utf8);
1061
p = g_realloc(buffer, size + LOAD_BUFFER_SIZE);
1066
r = read(fd, buffer + size, LOAD_BUFFER_SIZE);
1071
if (fread(buffer, size, 1, fd) != 1)
1076
1076
pic = Picture_Allocate();
1077
1077
pic->size = size;