4 * Created on: 2009-10-13
8 #include <hildon/hildon.h>
9 #include "search_screen.h"
10 #include "jamendo_api.h"
11 #include "album_listview.h"
13 /** TODO: Get rid of global variables */
14 GtkWidget* album_listview = NULL;
16 GtkWidget* search_toolbar = NULL;
18 typedef GList* (*SearchFunction)(const gchar*);
22 SearchFunction function;
23 } search_mode_data[] = {
24 { "Artist", jamendo_search_for_albums_by_artist },
25 { "Tag", jamendo_search_for_albums_by_tag },
26 // { "User Playlist", jamendo_search_for_user_playlist },
27 { "User Starred Albums", jamendo_search_for_user_starred_albums } };
29 static void search_mode_menu_clicked(GtkButton *button, int idx) {
31 g_object_set(G_OBJECT(search_toolbar), "label", search_mode_data[search_mode].name, NULL);
34 static HildonAppMenu* search_mode_menu_create() {
35 HildonAppMenu *menu = HILDON_APP_MENU (hildon_app_menu_new ());
37 GtkWidget* button = NULL;
38 for (i = 0; i < G_N_ELEMENTS(search_mode_data); i++) {
39 button = hildon_gtk_radio_button_new_from_widget(HILDON_SIZE_AUTO, GTK_RADIO_BUTTON(button));
40 gtk_button_set_label(GTK_BUTTON(button), search_mode_data[i].name);
41 g_signal_connect_after(button, "clicked", G_CALLBACK(search_mode_menu_clicked), (gpointer)i);
42 if (search_mode == i) {
43 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
46 hildon_app_menu_append(menu, GTK_BUTTON(button));
48 gtk_widget_show_all(GTK_WIDGET (menu));
58 gboolean do_searching(SearchData* data) {
59 GList* album_list = NULL;
61 album_list = data->func(data->query);
62 album_listview_update_model(album_listview, album_list);
65 hildon_banner_show_information(data->win, NULL, "Not found");
68 album_list_free(album_list);
70 hildon_banner_show_information(data->win, NULL, "Not implemented");
73 hildon_gtk_window_set_progress_indicator(GTK_WINDOW(data->win), 0);
79 static void search_clicked(HildonFindToolbar* toolbar, GtkWidget* win) {
80 hildon_gtk_window_set_progress_indicator(GTK_WINDOW(win), 1);
81 hildon_banner_show_information(win, NULL, "Searching");
83 SearchData* data = g_new0(SearchData,1);
84 data->func = search_mode_data[search_mode].function;
85 g_object_get(G_OBJECT(toolbar), "prefix", &data->query, NULL);
88 g_idle_add((GSourceFunc) do_searching, data);
91 static void close_clicked(HildonFindToolbar* toolbar, GtkWidget* win) {
92 g_object_set(G_OBJECT(toolbar), "prefix", "", NULL);
95 GtkWidget* search_screen_new() {
97 GtkWidget *pannable_area;
100 window = hildon_stackable_window_new();
101 gtk_window_set_title(GTK_WINDOW(window), "Search");
103 pannable_area = hildon_pannable_area_new();
104 album_listview = album_listview_create(NULL);
105 hildon_pannable_area_add_with_viewport(HILDON_PANNABLE_AREA(pannable_area), album_listview);
106 gtk_container_add(GTK_CONTAINER(window), pannable_area);
108 /* Create search toolbar */
109 search_toolbar = hildon_find_toolbar_new(NULL);
110 g_signal_connect(G_OBJECT(search_toolbar), "search", G_CALLBACK(search_clicked), window);
111 g_signal_connect(G_OBJECT(search_toolbar), "close", G_CALLBACK(close_clicked), window);
112 hildon_window_add_toolbar(HILDON_WINDOW(window), GTK_TOOLBAR(search_toolbar));
115 menu = search_mode_menu_create();
116 hildon_window_set_app_menu(HILDON_WINDOW (window), menu);