X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Flibrary.c;h=ab6cee7c2d34535ac46b9944d2e0f16df8a1b200;hb=dbdc240caac90c4a20c3055f39be26b3d0cdf685;hp=eefce46050a53bd464a38b17e5db84623b3db8f1;hpb=a4397d674b2f7ea33653ff1137193835c668c7de;p=melted_gui diff --git a/src/library.c b/src/library.c index eefce46..ab6cee7 100644 --- a/src/library.c +++ b/src/library.c @@ -21,12 +21,17 @@ # include #endif +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + #include #include #include #include #include #include +#include #include "omnplay.h" #include "ui.h" @@ -48,8 +53,9 @@ playlist_item_t* omnplay_library_find(omnplay_instance_t* app, char* id) return item; }; -void omnplay_library_normalize_item(omnplay_instance_t* app, playlist_item_t* item) +int omnplay_library_normalize_item(omnplay_instance_t* app, playlist_item_t* item) { + int r = 0; playlist_item_t* lib; pthread_mutex_lock(&app->library.lock); @@ -62,18 +68,27 @@ void omnplay_library_normalize_item(omnplay_instance_t* app, playlist_item_t* it { if(!item->title[0]) + { strcpy(item->title, lib->title); + r = 1; + }; - if(!item->dur) + if(!item->dur || item->in < lib->in || (item->in + item->dur) > (lib->in + lib->dur)) { item->dur = lib->dur; item->in = lib->in; + r = 1; }; } else + { + r = 1; item->error = PLAYLIST_ITEM_ERROR_LIB; + }; pthread_mutex_unlock(&app->library.lock); + + return r; }; void omnplay_library_sort(omnplay_instance_t* app) @@ -209,21 +224,42 @@ void omnplay_library_save(omnplay_instance_t* app) static void omnplay_get_content_cb(omnplay_instance_t* app, playlist_item_t* item, void* data) { - fprintf(stderr, "requested: id=[%s]\n", item->id); + gdk_threads_enter(); + gtk_label_set_text(GTK_LABEL(data), item->id); + gdk_flush(); + gdk_threads_leave(); }; -void omnplay_library_refresh(omnplay_instance_t* app) +static void* omnplay_library_refresh_proc(void* data) { + GtkWidget *refresh_ui[2]; + omnplay_instance_t* app = (omnplay_instance_t*)data; int count, i; playlist_item_t* items; +#ifndef _WIN32 + gdk_threads_enter(); +#endif /* _WIN32 */ + /* create UI for monitoring update */ + ui_library_refresh(app, &refresh_ui[0], &refresh_ui[1]); + gtk_widget_show_all(refresh_ui[0]); + gtk_window_present(GTK_WINDOW(refresh_ui[0])); +#ifndef _WIN32 + gdk_flush(); + gdk_threads_leave(); +#endif /* _WIN32 */ items = (playlist_item_t*)malloc(sizeof(playlist_item_t) * MAX_LIBRARY_ITEMS); - count = omnplay_get_content(app, items, MAX_LIBRARY_ITEMS, omnplay_get_content_cb, NULL); + count = omnplay_get_content(app, items, MAX_LIBRARY_ITEMS, omnplay_get_content_cb, refresh_ui[1]); if(count > 0) { + gdk_threads_enter(); + gtk_label_set_text(GTK_LABEL(refresh_ui[1]), "Quering whois..."); + gdk_flush(); + gdk_threads_leave(); + if(app->library.whois[0]) omnplay_whois_list(app, items, &count); @@ -238,10 +274,39 @@ void omnplay_library_refresh(omnplay_instance_t* app) pthread_mutex_unlock(&app->library.lock); + gdk_threads_enter(); omnplay_library_draw(app); + gdk_flush(); + gdk_threads_leave(); }; free(items); + + gdk_threads_enter(); + omnplay_playlist_normalize(app); + gdk_flush(); + gdk_threads_leave(); + +#ifndef _WIN32 + gdk_threads_enter(); +#endif /* _WIN32 */ + gtk_widget_destroy(refresh_ui[0]); +#ifndef _WIN32 + gdk_flush(); + gdk_threads_leave(); +#endif /* _WIN32 */ + + return NULL; +}; + +void omnplay_library_refresh(omnplay_instance_t* app) +{ + if(app->library.refresh_thread_r) + pthread_join(app->library.refresh_thread, NULL); + app->library.refresh_thread_r = 1; + + pthread_create(&app->library.refresh_thread, NULL, + omnplay_library_refresh_proc, app); }; void omnplay_library_draw(omnplay_instance_t* app) @@ -341,3 +406,44 @@ playlist_item_t* omnplay_library_get_selected(omnplay_instance_t* app, int *coun return items; }; + +void omnplay_library_search(omnplay_instance_t* app, int next) +{ + int idx = 0, i; + int* idxs; + const char *search; + GtkTreePath* path; + + pthread_mutex_lock(&app->library.lock); + + idxs = get_selected_idx_library(app); + if(idxs) idx = idxs[1]; + free(idxs); + + if(!next) idx = 0; + else idx++; + + search = gtk_entry_get_text(GTK_ENTRY(app->library.search)); + + if(search[0]) + { + for(i = idx; i < app->library.count; i++) + if( strcasestr(app->library.item[i].id, search) || + strcasestr(app->library.item[i].title, search)) + break; + + if(i < app->library.count) + { + g_warning("found at pos=%d\n", i); + + /* select */ + path = gtk_tree_path_new_from_indices(i, -1); + gtk_tree_selection_select_path(gtk_tree_view_get_selection( + GTK_TREE_VIEW(app->library_grid)), path); + gtk_tree_view_set_cursor(GTK_TREE_VIEW(app->library_grid), path, NULL, FALSE); + gtk_tree_path_free(path); + }; + }; + + pthread_mutex_unlock(&app->library.lock); +};