Initial commit
[jamendo] / src / search_screen.c
1 /*
2  * search_screen.c
3  *
4  *  Created on: 2009-10-13
5  *      Author: marcin
6  */
7
8 #include <hildon/hildon.h>
9 #include "search_screen.h"
10 #include "jamendo_api.h"
11 #include "album_listview.h"
12
13 /** TODO: Get rid of global variables */
14 GtkWidget* album_listview = NULL;
15 int search_mode = 1;
16 GtkWidget* search_toolbar = NULL;
17
18 typedef GList* (*SearchFunction)(const gchar*);
19
20 struct {
21         const gchar* name;
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 } };
28
29 static void search_mode_menu_clicked(GtkButton *button, int idx) {
30         search_mode = idx;
31         g_object_set(G_OBJECT(search_toolbar), "label", search_mode_data[search_mode].name, NULL);
32 }
33
34 static HildonAppMenu* search_mode_menu_create() {
35         HildonAppMenu *menu = HILDON_APP_MENU (hildon_app_menu_new ());
36         int i;
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);
44                 }
45
46                 hildon_app_menu_append(menu, GTK_BUTTON(button));
47         }
48         gtk_widget_show_all(GTK_WIDGET (menu));
49         return menu;
50 }
51
52 typedef struct {
53         SearchFunction func;
54         gchar* query;
55         GtkWidget* win;
56 } SearchData;
57
58 gboolean do_searching(SearchData* data) {
59         GList* album_list = NULL;
60         if (data->func) {
61                 album_list = data->func(data->query);
62                 album_listview_update_model(album_listview, album_list);
63
64                 if (!album_list) {
65                         hildon_banner_show_information(data->win, NULL, "Not found");
66                 }
67
68                 album_list_free(album_list);
69         } else {
70                 hildon_banner_show_information(data->win, NULL, "Not implemented");
71         }
72
73         hildon_gtk_window_set_progress_indicator(GTK_WINDOW(data->win), 0);
74         g_free(data->query);
75         g_free(data);
76         return FALSE;
77 }
78
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");
82
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);
86         data->win = win;
87
88         g_idle_add((GSourceFunc) do_searching, data);
89 }
90
91 static void close_clicked(HildonFindToolbar* toolbar, GtkWidget* win) {
92         g_object_set(G_OBJECT(toolbar), "prefix", "", NULL);
93 }
94
95 GtkWidget* search_screen_new() {
96         GtkWidget* window;
97         GtkWidget *pannable_area;
98         HildonAppMenu* menu;
99
100         window = hildon_stackable_window_new();
101         gtk_window_set_title(GTK_WINDOW(window), "Search");
102
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);
107
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));
113
114         /* Create menu */
115         menu = search_mode_menu_create();
116         hildon_window_set_app_menu(HILDON_WINDOW (window), menu);
117
118         return window;
119 }