X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fsearch_screen.c;fp=src%2Fsearch_screen.c;h=582868f89a5248b95bf5e7aad2c3c487b7cc8c6c;hb=71eece00473c745dbe74c7dd9abd6a5fa52ea3ab;hp=0000000000000000000000000000000000000000;hpb=496d310181c50d216bf2f44e9a970a791aa2aba0;p=jamendo diff --git a/src/search_screen.c b/src/search_screen.c new file mode 100644 index 0000000..582868f --- /dev/null +++ b/src/search_screen.c @@ -0,0 +1,119 @@ +/* + * search_screen.c + * + * Created on: 2009-10-13 + * Author: marcin + */ + +#include +#include "search_screen.h" +#include "jamendo_api.h" +#include "album_listview.h" + +/** TODO: Get rid of global variables */ +GtkWidget* album_listview = NULL; +int search_mode = 1; +GtkWidget* search_toolbar = NULL; + +typedef GList* (*SearchFunction)(const gchar*); + +struct { + const gchar* name; + SearchFunction function; +} search_mode_data[] = { + { "Artist", jamendo_search_for_albums_by_artist }, + { "Tag", jamendo_search_for_albums_by_tag }, +// { "User Playlist", jamendo_search_for_user_playlist }, + { "User Starred Albums", jamendo_search_for_user_starred_albums } }; + +static void search_mode_menu_clicked(GtkButton *button, int idx) { + search_mode = idx; + g_object_set(G_OBJECT(search_toolbar), "label", search_mode_data[search_mode].name, NULL); +} + +static HildonAppMenu* search_mode_menu_create() { + HildonAppMenu *menu = HILDON_APP_MENU (hildon_app_menu_new ()); + int i; + GtkWidget* button = NULL; + for (i = 0; i < G_N_ELEMENTS(search_mode_data); i++) { + button = hildon_gtk_radio_button_new_from_widget(HILDON_SIZE_AUTO, GTK_RADIO_BUTTON(button)); + gtk_button_set_label(GTK_BUTTON(button), search_mode_data[i].name); + g_signal_connect_after(button, "clicked", G_CALLBACK(search_mode_menu_clicked), (gpointer)i); + if (search_mode == i) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); + } + + hildon_app_menu_append(menu, GTK_BUTTON(button)); + } + gtk_widget_show_all(GTK_WIDGET (menu)); + return menu; +} + +typedef struct { + SearchFunction func; + gchar* query; + GtkWidget* win; +} SearchData; + +gboolean do_searching(SearchData* data) { + GList* album_list = NULL; + if (data->func) { + album_list = data->func(data->query); + album_listview_update_model(album_listview, album_list); + + if (!album_list) { + hildon_banner_show_information(data->win, NULL, "Not found"); + } + + album_list_free(album_list); + } else { + hildon_banner_show_information(data->win, NULL, "Not implemented"); + } + + hildon_gtk_window_set_progress_indicator(GTK_WINDOW(data->win), 0); + g_free(data->query); + g_free(data); + return FALSE; +} + +static void search_clicked(HildonFindToolbar* toolbar, GtkWidget* win) { + hildon_gtk_window_set_progress_indicator(GTK_WINDOW(win), 1); + hildon_banner_show_information(win, NULL, "Searching"); + + SearchData* data = g_new0(SearchData,1); + data->func = search_mode_data[search_mode].function; + g_object_get(G_OBJECT(toolbar), "prefix", &data->query, NULL); + data->win = win; + + g_idle_add((GSourceFunc) do_searching, data); +} + +static void close_clicked(HildonFindToolbar* toolbar, GtkWidget* win) { + g_object_set(G_OBJECT(toolbar), "prefix", "", NULL); +} + +GtkWidget* search_screen_new() { + GtkWidget* window; + GtkWidget *pannable_area; + HildonAppMenu* menu; + + window = hildon_stackable_window_new(); + gtk_window_set_title(GTK_WINDOW(window), "Search"); + + pannable_area = hildon_pannable_area_new(); + album_listview = album_listview_create(NULL); + hildon_pannable_area_add_with_viewport(HILDON_PANNABLE_AREA(pannable_area), album_listview); + gtk_container_add(GTK_CONTAINER(window), pannable_area); + + /* Create search toolbar */ + search_toolbar = hildon_find_toolbar_new(NULL); + g_signal_connect(G_OBJECT(search_toolbar), "search", G_CALLBACK(search_clicked), window); + g_signal_connect(G_OBJECT(search_toolbar), "close", G_CALLBACK(close_clicked), window); + hildon_window_add_toolbar(HILDON_WINDOW(window), GTK_TOOLBAR(search_toolbar)); + + /* Create menu */ + menu = search_mode_menu_create(); + hildon_window_set_app_menu(HILDON_WINDOW (window), menu); + + return window; +}