From: <tsz...@us...> - 2014-05-04 22:07:00
|
Revision: 1293 http://sourceforge.net/p/aqualung/code/1293 Author: tszilagyi Date: 2014-05-04 22:06:57 +0000 (Sun, 04 May 2014) Log Message: ----------- Refactor file info dialog invocation and access to tree stores This is needed to create a feature allowing to go to the previous / next file in the natural order of wherever the file info dialog was opened from, without closing and reopening the dialog. The prev/next buttons to do this are already on the file info dialog, but they don't yet rebuild the dialog content. However, the generic tree traversal is already implemented, taking care that the containing store (in case the dialog was opened from a file or podcast store) cannot be left while browsing. Modified Paths: -------------- trunk/src/file_info.c trunk/src/file_info.h trunk/src/gui_main.c trunk/src/playlist.c trunk/src/playlist.h trunk/src/store_file.c trunk/src/store_podcast.c Modified: trunk/src/file_info.c =================================================================== --- trunk/src/file_info.c 2014-05-02 12:29:01 UTC (rev 1292) +++ trunk/src/file_info.c 2014-05-04 22:06:57 UTC (rev 1293) @@ -93,8 +93,11 @@ } pageidx_t; typedef struct { - int is_called_from_browser; + gboolean allow_ms_import; int bail_out; + fileinfo_model_func_t mfun; + int mindepth; + char * name; char * filename; file_decoder_t * fdec; metadata_t * meta; @@ -107,6 +110,8 @@ GtkWidget * cover_align; GtkWidget * hbox; GtkWidget * button_table; + GtkWidget * prev_button; + GtkWidget * next_button; GtkWidget * save_button; GtkWidget * nb; GtkWidget * combo; @@ -196,6 +201,7 @@ if (fi->fdec != NULL) { file_decoder_delete(fi->fdec); } + free(fi->name); free(fi->filename); for (i = 0; i < FI_MAXPAGES; i++) { @@ -561,7 +567,7 @@ /* tabwidth is 2, +1 if called from Music Store, +1 if editable */ int tabwidth = 2; - tabwidth += fi->is_called_from_browser? 1 : 0; + tabwidth += fi->allow_ms_import? 1 : 0; tabwidth += meta->writable ? 1 : 0; return tabwidth; } @@ -1428,7 +1434,7 @@ ++col; /* Import button */ - if (fi->is_called_from_browser) { + if (fi->allow_ms_import) { importbtn = fi_procframe_importbtn(fi, frame); gtk_table_attach(GTK_TABLE(table), importbtn, col, col+1, n_rows-1, n_rows, GTK_FILL, GTK_FILL, 5, 3); @@ -1651,7 +1657,7 @@ g_signal_connect(fi->save_button, "clicked", G_CALLBACK(fi_save), (gpointer)fi); gtk_table_attach(GTK_TABLE(fi->button_table), fi->save_button, - 0, 1, 0, 1, GTK_FILL, GTK_FILL, 5, 3); + 0, 1, 0, 1, GTK_FILL, GTK_FILL, 3, 0); gtk_widget_show_all(fi->info_window); } @@ -1694,9 +1700,130 @@ } +gboolean +leaf_iter(GtkTreeModel * model, GtkTreeIter * iter, gboolean last, GtkTreeIter * out) { + if (gtk_tree_model_iter_has_child(model, iter)) { + GtkTreeIter child_iter; + printf("down\n"); + gint nth = 0; + if (last) { + nth = gtk_tree_model_iter_n_children(model, iter) - 1; + } + if (!gtk_tree_model_iter_nth_child(model, &child_iter, iter, nth)) { + printf("fail nth_child\n"); + return FALSE; + } else { + return leaf_iter(model, &child_iter, last, out); + } + } else { + printf("ready\n"); + *out = *iter; + return TRUE; + } +} + +gboolean +next_iter(GtkTreeModel * model, GtkTreeIter * iter, GtkTreeIter * next, int mindepth) { + GtkTreeIter copy = *iter; + if (gtk_tree_model_iter_next(model, ©)) { + printf("next\n"); + *iter = copy; + return leaf_iter(model, iter, FALSE, next); + } else { + GtkTreeIter parent_iter; + printf("up\n"); + if (!gtk_tree_model_iter_parent(model, &parent_iter, iter)) { + printf("fail\n"); + return FALSE; + } else { + GtkTreePath * path = gtk_tree_model_get_path(model, &parent_iter); + if (gtk_tree_path_get_depth(path) <= mindepth) { + gtk_tree_path_free(path); + printf("limit by mindepth\n"); + return FALSE; + } + gtk_tree_path_free(path); + return next_iter(model, &parent_iter, next, mindepth); + } + } +} + +gboolean +prev_iter(GtkTreeModel * model, GtkTreeIter * iter, GtkTreeIter * prev, int mindepth) { + GtkTreePath * path = gtk_tree_model_get_path(model, iter); + if (gtk_tree_path_prev(path)) { + printf("prev\n"); + if (!gtk_tree_model_get_iter(model, iter, path)) { + printf("fail\n"); + gtk_tree_path_free(path); + return FALSE; + } else { + gtk_tree_path_free(path); + return leaf_iter(model, iter, TRUE, prev); + } + } else { + GtkTreeIter parent_iter; + printf("up\n"); + gtk_tree_path_free(path); + if (!gtk_tree_model_iter_parent(model, &parent_iter, iter)) { + printf("fail\n"); + return FALSE; + } else { + path = gtk_tree_model_get_path(model, &parent_iter); + printf("depth = %d\n", gtk_tree_path_get_depth(path)); + if (gtk_tree_path_get_depth(path) <= mindepth) { + gtk_tree_path_free(path); + printf("limit by mindepth\n"); + return FALSE; + } + gtk_tree_path_free(path); + return prev_iter(model, &parent_iter, prev, mindepth); + } + } +} + +gint +fi_prev(GtkWidget * widget, gpointer data) { + fi_t * fi = data; + GtkTreeModel * model = fi->model; + GtkTreeIter iter = fi->track_iter; + GtkTreeIter prev; + + if (!prev_iter(model, &iter, &prev, fi->mindepth)) { + return TRUE; + } + free(fi->name); + free(fi->filename); + fi->track_iter = prev; + fi->mfun(fi->model, fi->track_iter, &fi->name, &fi->filename); + + printf("now at: %s '%s'\n", gtk_tree_model_get_string_from_iter(model, &prev), fi->name); // leak + return TRUE; +} + +gint +fi_next(GtkWidget * widget, gpointer data) { + fi_t * fi = data; + GtkTreeModel * model = fi->model; + GtkTreeIter iter = fi->track_iter; + GtkTreeIter next; + + if (!next_iter(model, &iter, &next, fi->mindepth)) { + return TRUE; + } + free(fi->name); + free(fi->filename); + fi->track_iter = next; + fi->mfun(fi->model, fi->track_iter, &fi->name, &fi->filename); + + printf("now at: %s '%s'\n", gtk_tree_model_get_string_from_iter(model, &next), fi->name); // leak + return TRUE; +} + void -show_file_info(char * name, char * file, int is_called_from_browser, - GtkTreeModel * model, GtkTreeIter track_iter, gboolean cover_flag) { +show_file_info(GtkTreeModel * model, GtkTreeIter iter_track, + fileinfo_model_func_t mfun, int mindepth, + gboolean allow_ms_import, gboolean cover_flag) { char str[MAXLEN]; gchar * file_display; @@ -1719,9 +1846,7 @@ GtkWidget * label; GtkWidget * entry; - decoder_t * dec = NULL; - int is_cdda = 0; fileinfo_t fileinfo; @@ -1730,20 +1855,28 @@ return; } + fi->mfun = mfun; + fi->mindepth = mindepth; + fi->model = model; + fi->track_iter = iter_track; + mfun(fi->model, fi->track_iter, &fi->name, &fi->filename); + #ifdef HAVE_CDDA - if (g_str_has_prefix(file, "CDDA ")) { + if (g_str_has_prefix(fi->filename, "CDDA ")) { char device_path[CDDA_MAXLEN]; long hash; int track; cdda_drive_t * drive; - if (sscanf(file, "CDDA %s %lX %u", device_path, &hash, &track) < 3) { + if (sscanf(fi->filename, "CDDA %s %lX %u", device_path, &hash, &track) < 3) { + fi_delete(fi); return; } drive = cdda_get_drive_by_device_path(device_path); if ((drive == NULL) || (drive->disc.hash == 0L)) { + fi_delete(fi); return; } @@ -1766,8 +1899,9 @@ } file_decoder_set_meta_cb(fi->fdec, fi_procmeta, fi); - if (file_decoder_open(fi->fdec, file) != 0) { + if (file_decoder_open(fi->fdec, fi->filename) != 0) { fi->bail_out = 1; + fi_delete(fi); return; } @@ -1783,10 +1917,7 @@ fileinfo.total_samples = fi->fdec->fileinfo.total_samples; } - fi->is_called_from_browser = is_called_from_browser; - fi->model = model; - fi->track_iter = track_iter; - fi->filename = strdup(file); + fi->allow_ms_import = allow_ms_import; fi->trash = trashlist_new(); fi->info_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); @@ -1818,7 +1949,7 @@ entry_name = gtk_entry_new(); gtk_widget_set_can_focus(entry_name, FALSE); - gtk_entry_set_text(GTK_ENTRY(entry_name), name); + gtk_entry_set_text(GTK_ENTRY(entry_name), fi->name); gtk_editable_set_editable(GTK_EDITABLE(entry_name), FALSE); gtk_table_attach(GTK_TABLE(table), entry_name, 1, 2, 0, 1, (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), GTK_FILL, 5, 2); @@ -1829,7 +1960,7 @@ gtk_table_attach(GTK_TABLE(table), hbox_path, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 5, 2); - file_display = g_filename_display_name(file); + file_display = g_filename_display_name(fi->filename); entry_path = gtk_entry_new(); gtk_widget_set_can_focus(entry_path, FALSE); gtk_entry_set_text(GTK_ENTRY(entry_path), file_display); @@ -1850,13 +1981,13 @@ if (options.show_cover_for_ms_tracks_only == TRUE) { if (cover_flag == TRUE) { display_cover(fi->cover_image_area, fi->event_box, fi->cover_align, - 48, 48, file, FALSE, TRUE); + 48, 48, fi->filename, FALSE, TRUE); } else { hide_cover_thumbnail(); } } else { display_cover(fi->cover_image_area, fi->event_box, fi->cover_align, - 48, 48, file, FALSE, TRUE); + 48, 48, fi->filename, FALSE, TRUE); } fi->hbox = gtk_hbox_new(FALSE, 0); @@ -1993,13 +2124,25 @@ gtk_widget_grab_focus(fi->nb); - fi->button_table = gtk_table_new(1, 2, TRUE); - gtk_box_pack_end(GTK_BOX(fi->hbox), fi->button_table, FALSE, TRUE, 3); + fi->button_table = gtk_table_new(1, 2, FALSE); + gtk_box_pack_end(GTK_BOX(fi->hbox), fi->button_table, FALSE, TRUE, 2); - dismiss_btn = gtk_button_new_from_stock (GTK_STOCK_CLOSE); + fi->prev_button = gui_stock_label_button(NULL, GTK_STOCK_GO_BACK); + g_signal_connect(fi->prev_button, "clicked", + G_CALLBACK(fi_prev), (gpointer)fi); + gtk_table_attach(GTK_TABLE(fi->button_table), fi->prev_button, + 1, 2, 0, 1, GTK_FILL, GTK_FILL, 3, 0); + + fi->next_button = gui_stock_label_button(NULL, GTK_STOCK_GO_FORWARD); + g_signal_connect(fi->next_button, "clicked", + G_CALLBACK(fi_next), (gpointer)fi); + gtk_table_attach(GTK_TABLE(fi->button_table), fi->next_button, + 2, 3, 0, 1, GTK_FILL, GTK_FILL, 3, 0); + + dismiss_btn = gtk_button_new_from_stock(GTK_STOCK_CLOSE); g_signal_connect(dismiss_btn, "clicked", G_CALLBACK(dismiss), (gpointer)fi); - gtk_table_attach(GTK_TABLE(fi->button_table), dismiss_btn, 1, 2, 0, 1, - GTK_FILL, GTK_FILL, 5, 3); + gtk_table_attach(GTK_TABLE(fi->button_table), dismiss_btn, 3, 4, 0, 1, + GTK_FILL, GTK_FILL, 3, 0); gtk_widget_show_all(fi->info_window); Modified: trunk/src/file_info.h =================================================================== --- trunk/src/file_info.h 2014-05-02 12:29:01 UTC (rev 1292) +++ trunk/src/file_info.h 2014-05-04 22:06:57 UTC (rev 1293) @@ -24,9 +24,16 @@ #include <glib.h> #include <gtk/gtk.h> +/* Since we want to use the fileinfo dialog over different models, the + * caller must provide us a function to access relevant fields of its + * tree model. + * Returns TRUE if successful (name and file points to valid data). + */ +typedef gboolean (*fileinfo_model_func_t)(GtkTreeModel * model, GtkTreeIter iter, char**name, char**file); -void show_file_info(char * name, char * file, int is_called_from_browser, - GtkTreeModel * model, GtkTreeIter iter_track, gboolean cover_flag); +void show_file_info(GtkTreeModel * model, GtkTreeIter iter_track, + fileinfo_model_func_t fi_mfun, int mindepth, + gboolean allow_ms_import, gboolean cover_flag); #endif /* AQUALUNG_FILE_INFO_H */ Modified: trunk/src/gui_main.c =================================================================== --- trunk/src/gui_main.c 2014-05-02 12:29:01 UTC (rev 1292) +++ trunk/src/gui_main.c 2014-05-04 22:06:57 UTC (rev 1293) @@ -904,13 +904,21 @@ void conf__fileinfo_cb(gpointer data) { + playlist_t * pl; + GtkTreePath * p; + GtkTreeIter iter; + if (is_file_loaded) { - - GtkTreeIter dummy; - const char * name = gtk_label_get_text(GTK_LABEL(label_title)); - - show_file_info((char *)name, current_file, 0, NULL, dummy, TRUE); + pl = playlist_get_playing(); + } else { + pl = playlist_get_current(); } + if (pl == NULL) return; + p = playlist_get_playing_path(pl); + if (p == NULL) return; + gtk_tree_model_get_iter(GTK_TREE_MODEL(pl->store), &iter, p); + gtk_tree_path_free(p); + show_file_info(GTK_TREE_MODEL(pl->store), iter, playlist_model_func, 0, FALSE, TRUE); } @@ -1146,11 +1154,12 @@ return TRUE; case GDK_i: case GDK_I: - if (!options.playlist_is_embedded) { - conf__fileinfo_cb(NULL); - return TRUE; - } - break; + if (options.playlist_is_embedded) { + return playlist_window_key_pressed(widget, event); + } else { + conf__fileinfo_cb(NULL); + } + break; case GDK_BackSpace: if (allow_seeks && total_samples != 0) { seek_t seek; @@ -1375,34 +1384,21 @@ gint -main_window_button_pressed(GtkWidget * widget, GdkEventButton * event) { +main_window_button_pressed(GtkWidget * widget, GdkEventButton * event, gpointer data) { if (event->button == 3) { - - GtkWidget * fileinfo; - if (options.playlist_is_embedded) { - fileinfo = plist__fileinfo; - } else { - fileinfo = conf__fileinfo; - } - - if (is_file_loaded && (current_file[0] != '\0')) { - - const char * name = gtk_label_get_text(GTK_LABEL(label_title)); - - strncpy(fileinfo_name, name, MAXLEN-1); - strncpy(fileinfo_file, current_file, MAXLEN-1); - - gtk_widget_set_sensitive(fileinfo, TRUE); - } else { - gtk_widget_set_sensitive(fileinfo, FALSE); - } - - if (options.playlist_is_embedded) { - playlist_menu_set_popup_sensitivity(playlist_get_current()); + /* translate and crop event coordinates over playlist widget */ + event->x -= playlist_window->allocation.x; + if (event->x > playlist_window->allocation.width) { + event->x = -1; + } + event->y -= playlist_window->allocation.y; + if (event->y > playlist_window->allocation.height) { + event->y = -1; + } + return playlist_window_button_pressed(widget, event, playlist_get_current()); } - gtk_menu_popup(GTK_MENU(conf_menu), NULL, NULL, NULL, NULL, event->button, event->time); } @@ -2807,7 +2803,7 @@ if (!options.playlist_is_embedded) { gtk_menu_shell_append(GTK_MENU_SHELL(conf_menu), conf__fileinfo); gtk_menu_shell_append(GTK_MENU_SHELL(conf_menu), conf__separator1); - } + } gtk_menu_shell_append(GTK_MENU_SHELL(conf_menu), conf__about); gtk_menu_shell_append(GTK_MENU_SHELL(conf_menu), conf__separator2); gtk_menu_shell_append(GTK_MENU_SHELL(conf_menu), conf__quit); @@ -2819,9 +2815,8 @@ if (!options.playlist_is_embedded) { g_signal_connect_swapped(G_OBJECT(conf__fileinfo), "activate", G_CALLBACK(conf__fileinfo_cb), NULL); - gtk_widget_set_sensitive(conf__fileinfo, FALSE); gtk_widget_show(conf__fileinfo); - } + } gtk_widget_show(conf__options); if (!options.disable_skin_support_settings) { @@ -3793,10 +3788,6 @@ /* set timeout function */ timeout_tag = aqualung_timeout_add(TIMEOUT_PERIOD, timeout_callback, NULL); - if (options.playlist_is_embedded) { - gtk_widget_set_sensitive(plist__fileinfo, FALSE); - } - /* re-apply skin to override possible WM theme */ if (!options.disable_skin_support_settings) { apply_skin(options.skin); Modified: trunk/src/playlist.c =================================================================== --- trunk/src/playlist.c 2014-05-02 12:29:01 UTC (rev 1292) +++ trunk/src/playlist.c 2014-05-04 22:06:57 UTC (rev 1293) @@ -136,9 +136,7 @@ gchar command[RB_CONTROL_SIZE]; -gchar fileinfo_name[MAXLEN]; -gchar fileinfo_file[MAXLEN]; -int fileinfo_cover; +GtkTreeIter * fileinfo_iter = NULL; int playlist_dirty; int playlist_auto_save_tag = -1; @@ -1294,17 +1292,10 @@ if (path && gtk_tree_model_get_iter(GTK_TREE_MODEL(pl->store), &iter, path) && !gtk_tree_model_iter_has_child(GTK_TREE_MODEL(pl->store), &iter)) { - - GtkTreeIter dummy; playlist_data_t * data; - gtk_tree_model_get(GTK_TREE_MODEL(pl->store), &iter, PL_COL_DATA, &data, -1); - - playlist_data_get_display_name(fileinfo_name, data); - strncpy(fileinfo_file, data->file, MAXLEN-1); - fileinfo_cover = IS_PL_COVER(data); - - show_file_info(fileinfo_name, fileinfo_file, 0, NULL, dummy, fileinfo_cover); + show_file_info(GTK_TREE_MODEL(pl->store), iter, playlist_model_func, + 0, FALSE, IS_PL_COVER(data)); } if (path) { @@ -1507,7 +1498,7 @@ } gint -doubleclick_handler(GtkWidget * widget, GdkEventButton * event, gpointer data) { +playlist_window_button_pressed(GtkWidget * widget, GdkEventButton * event, gpointer data) { GtkTreePath * path; GtkTreeIter iter; @@ -1527,26 +1518,17 @@ if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(pl->view), event->x, event->y, &path, NULL, NULL, NULL) && gtk_tree_model_get_iter(GTK_TREE_MODEL(pl->store), &iter, path)) { - if (gtk_tree_selection_count_selected_rows(pl->select) == 0) { gtk_tree_view_set_cursor(GTK_TREE_VIEW(pl->view), path, NULL, FALSE); } - if (gtk_tree_model_iter_has_child(GTK_TREE_MODEL(pl->store), &iter)) { gtk_widget_set_sensitive(plist__fileinfo, FALSE); } else { - playlist_data_t * data; - gtk_widget_set_sensitive(plist__fileinfo, TRUE); - - gtk_tree_model_get(GTK_TREE_MODEL(pl->store), &iter, PL_COL_DATA, &data, -1); - - playlist_data_get_display_name(fileinfo_name, data); - strncpy(fileinfo_file, data->file, MAXLEN-1); - fileinfo_cover = IS_PL_COVER(data); + fileinfo_iter = gtk_tree_iter_copy(&iter); } } else { - gtk_widget_set_sensitive(plist__fileinfo, FALSE); + gtk_widget_set_sensitive(plist__fileinfo, TRUE); } playlist_menu_set_popup_sensitivity(pl); @@ -2581,8 +2563,24 @@ void plist__fileinfo_cb(gpointer user_data) { - GtkTreeIter dummy; - show_file_info(fileinfo_name, fileinfo_file, 0, NULL, dummy, fileinfo_cover); + playlist_t * pl = playlist_get_current(); + playlist_data_t * pldata; + GtkTreeIter iter; + + if (!pl) return; + if (fileinfo_iter) { + gtk_tree_model_get(GTK_TREE_MODEL(pl->store), fileinfo_iter, PL_COL_DATA, &pldata, -1); + iter = *fileinfo_iter; + gtk_tree_iter_free(fileinfo_iter); + fileinfo_iter = NULL; // mark it as consumed + } else { + GtkTreePath * p = playlist_get_playing_path(pl); + if (p == NULL) return; + gtk_tree_model_get_iter(GTK_TREE_MODEL(pl->store), &iter, p); + gtk_tree_path_free(p); + } + show_file_info(GTK_TREE_MODEL(pl->store), iter, playlist_model_func, 0, + FALSE, IS_PL_COVER(pldata)); } void @@ -4032,7 +4030,7 @@ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(pl->view), FALSE); g_signal_connect(G_OBJECT(pl->view), "button_press_event", - G_CALLBACK(doubleclick_handler), pl); + G_CALLBACK(playlist_window_button_pressed), pl); /* setup drag and drop */ @@ -5873,5 +5871,15 @@ gtk_tree_path_free(active_path); } +/* passed as fileinfo_model_func_t argument to show_file_info */ +gboolean +playlist_model_func(GtkTreeModel * model, GtkTreeIter iter, char**name, char**file) { + playlist_data_t * data; + gtk_tree_model_get(model, &iter, PL_COL_NAME, name, -1); + gtk_tree_model_get(model, &iter, PL_COL_DATA, &data, -1); + *file = strdup(data->file); + return TRUE; +} + // vim: shiftwidth=8:tabstop=8:softtabstop=8 : Modified: trunk/src/playlist.h =================================================================== --- trunk/src/playlist.h 2014-05-02 12:29:01 UTC (rev 1292) +++ trunk/src/playlist.h 2014-05-04 22:06:57 UTC (rev 1293) @@ -155,6 +155,9 @@ void playlist_remove_cdda(char * device_path); #endif /* HAVE_CDDA */ +gint playlist_window_button_pressed(GtkWidget * widget, GdkEventButton * event, gpointer data); +gboolean playlist_model_func(GtkTreeModel * model, GtkTreeIter iter, char**name, char**file); + enum { PL_FLAG_ACTIVE = (1 << 0), PL_FLAG_COVER = (1 << 1), Modified: trunk/src/store_file.c =================================================================== --- trunk/src/store_file.c 2014-05-02 12:29:01 UTC (rev 1292) +++ trunk/src/store_file.c 2014-05-04 22:06:57 UTC (rev 1293) @@ -224,6 +224,7 @@ void track__fileinfo_cb(gpointer data); +static gboolean store_model_func(GtkTreeModel * model, GtkTreeIter iter, char**name, char**file); struct keybinds store_keybinds[] = { {store__addlist_defmode, GDK_a, GDK_A, 0}, @@ -2679,50 +2680,12 @@ void track__fileinfo_cb(gpointer user_data) { + GtkTreeModel * model; GtkTreeIter iter_track; - GtkTreeIter iter_record; - GtkTreeIter iter_artist; - GtkTreeModel * model; - track_data_t * data; - - char * ptrack_name; - char * precord_name; - char * partist_name; - - char track_name[MAXLEN]; - char record_name[MAXLEN]; - char artist_name[MAXLEN]; - - char list_str[MAXLEN]; - if (gtk_tree_selection_get_selected(music_select, &model, &iter_track)) { - - gtk_tree_model_get(model, &iter_track, - MS_COL_NAME, &ptrack_name, - MS_COL_DATA, &data, -1); - - strncpy(track_name, ptrack_name, MAXLEN-1); - g_free(ptrack_name); - - gtk_tree_model_iter_parent(model, &iter_record, &iter_track); - gtk_tree_model_get(model, &iter_record, MS_COL_NAME, &precord_name, -1); - strncpy(record_name, precord_name, MAXLEN-1); - g_free(precord_name); - - gtk_tree_model_iter_parent(model, &iter_artist, &iter_record); - gtk_tree_model_get(model, &iter_artist, MS_COL_NAME, &partist_name, -1); - strncpy(artist_name, partist_name, MAXLEN-1); - g_free(partist_name); - - make_title_string(list_str, options.title_format, - artist_name, record_name, track_name); - - if (is_store_iter_readonly(&iter_track)) { - show_file_info(list_str, data->file, 0, model, iter_track, TRUE); - } else { - show_file_info(list_str, data->file, 1, model, iter_track, TRUE); - } + show_file_info(model, iter_track, store_model_func, 1, + is_store_iter_readonly(&iter_track), TRUE); } } @@ -4923,5 +4886,29 @@ } } +/* passed as fileinfo_model_func_t argument to show_file_info */ +static gboolean +store_model_func(GtkTreeModel * model, GtkTreeIter iter, char**name, char**file) { + char * artist_name; + char * record_name; + char * track_name; + track_data_t * data; + GtkTreeIter iter_record; + GtkTreeIter iter_artist; + char buf[MAXLEN]; + + gtk_tree_model_get(model, &iter, MS_COL_NAME, &track_name, MS_COL_DATA, &data, -1); + gtk_tree_model_iter_parent(model, &iter_record, &iter); + gtk_tree_model_get(model, &iter_record, MS_COL_NAME, &record_name, -1); + gtk_tree_model_iter_parent(model, &iter_artist, &iter_record); + gtk_tree_model_get(model, &iter_artist, MS_COL_NAME, &artist_name, -1); + + make_title_string(buf, options.title_format, artist_name, record_name, track_name); + + *name = strndup(buf, MAXLEN-1); + *file = strdup(data->file); + return TRUE; +} + // vim: shiftwidth=8:tabstop=8:softtabstop=8 : Modified: trunk/src/store_podcast.c =================================================================== --- trunk/src/store_podcast.c 2014-05-02 12:29:01 UTC (rev 1292) +++ trunk/src/store_podcast.c 2014-05-04 22:06:57 UTC (rev 1293) @@ -115,6 +115,8 @@ void podcast_track__export_cb(gpointer data); #endif /* HAVE_TRANSCODING */ +static gboolean store_model_func(GtkTreeModel * model, GtkTreeIter iter, char**name, char**file); + struct keybinds podcast_store_keybinds[] = { {podcast_store__addlist_defmode, GDK_a, GDK_A, 0}, {podcast_store__update_cb, GDK_u, GDK_U, 0}, @@ -581,24 +583,10 @@ podcast_track__fileinfo_cb(gpointer data) { GtkTreeIter iter_track; - GtkTreeIter pod_iter; GtkTreeModel * model; - char list_str[MAXLEN]; - if (gtk_tree_selection_get_selected(music_select, &model, &iter_track)) { - - podcast_item_t * item; - podcast_t * podcast; - - gtk_tree_model_get(GTK_TREE_MODEL(music_store), &iter_track, MS_COL_DATA, &item, -1); - - gtk_tree_model_iter_parent(GTK_TREE_MODEL(music_store), &pod_iter, &iter_track); - gtk_tree_model_get(GTK_TREE_MODEL(music_store), &pod_iter, MS_COL_DATA, &podcast, -1); - - make_title_string(list_str, options.title_format, podcast->author, podcast->title, item->title); - - show_file_info(list_str, item->file, 0, model, iter_track, TRUE); + show_file_info(model, iter_track, store_model_func, 1, FALSE, TRUE); } } @@ -2148,5 +2136,24 @@ xmlFreeDoc(doc); } +/* passed as fileinfo_model_func_t argument to show_file_info */ +static gboolean +store_model_func(GtkTreeModel * model, GtkTreeIter iter, char**name, char**file) { + podcast_item_t * item; + podcast_t * podcast; + GtkTreeIter pod_iter; + char buf[MAXLEN]; + + gtk_tree_model_get(model, &iter, MS_COL_DATA, &item, -1); + gtk_tree_model_iter_parent(model, &pod_iter, &iter); + gtk_tree_model_get(model, &pod_iter, MS_COL_DATA, &podcast, -1); + make_title_string(buf, options.title_format, podcast->author, podcast->title, item->title); + + *name = strndup(buf, MAXLEN-1); + *file = strdup(item->file); + + return TRUE; +} + // vim: shiftwidth=8:tabstop=8:softtabstop=8 : This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |