Mercurial > audlegacy-plugins
annotate src/streambrowser/gui/streambrowser_win.c @ 2791:f9c6a9cb442e
streambrowser has now an icon
author | Calin Crisan ccrisan@gmail.com |
---|---|
date | Wed, 09 Jul 2008 22:52:56 +0300 |
parents | c156102069ae |
children | 4c9db0b2194f |
rev | line source |
---|---|
2735 | 1 |
2 #include <string.h> | |
3 #include <glib.h> | |
4 #include <gtk/gtk.h> | |
2782
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
5 #include <gdk/gdkkeysyms.h> |
2735 | 6 |
7 #include "../streambrowser.h" | |
8 #include "streambrowser_win.h" | |
9 | |
10 | |
11 typedef struct { | |
12 | |
13 streamdir_t* streamdir; | |
14 GtkWidget* table; | |
15 GtkWidget* tree_view; | |
16 | |
17 } streamdir_gui_t; | |
18 | |
19 | |
20 void (* update_function) (streamdir_t *streamdir, category_t *category, streaminfo_t *streaminfo); | |
21 | |
22 static GtkWidget* gtk_label_new_with_icon(gchar *icon_filename, gchar *label_text); | |
23 static GtkWidget* gtk_streamdir_tree_view_new(); | |
24 static GtkWidget* gtk_streamdir_table_new(GtkWidget *tree_view); | |
25 | |
26 static gboolean on_notebook_switch_page(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data); | |
27 static gboolean on_tree_view_cursor_changed(GtkTreeView *tree_view, gpointer data); | |
28 static gboolean on_add_button_clicked(GtkButton *button, gpointer data); | |
2782
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
29 static gboolean on_search_entry_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data); |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
30 static gboolean on_tree_view_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data); |
2735 | 31 |
32 static streamdir_gui_t* find_streamdir_gui_by_name(gchar *name); | |
33 static streamdir_gui_t* find_streamdir_gui_by_tree_view(GtkTreeView *tree_view); | |
34 static streamdir_gui_t* find_streamdir_gui_by_table(GtkTable *table); | |
2790
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
35 static streamdir_gui_t* find_streamdir_gui_by_streamdir(streamdir_t *streamdir); |
2782
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
36 static gboolean tree_view_search_equal_func(GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer data); |
2735 | 37 |
38 | |
39 static GtkWidget* notebook; | |
40 static GtkWidget* search_entry; | |
41 static GtkWidget* add_button; | |
42 static GtkWidget* streambrowser_window; | |
43 static GList* streamdir_gui_list; | |
44 static GtkCellRenderer* cell_renderer_pixbuf; | |
45 static GtkCellRenderer* cell_renderer_text; | |
46 | |
47 | |
48 void streambrowser_win_init() | |
49 { | |
50 /* notebook */ | |
51 notebook = gtk_notebook_new(); | |
52 g_signal_connect(G_OBJECT(notebook), "switch-page", G_CALLBACK(on_notebook_switch_page), NULL); | |
53 gtk_widget_show(notebook); | |
54 | |
2764
d45b4beadf6c
Made "bluetooth" and "streambrowser" plugins translatable.
Stany HENRY <StrassBoy@gmail.com>
parents:
2757
diff
changeset
|
55 GtkWidget *search_label = gtk_label_new(_("Search:")); |
2735 | 56 gtk_widget_show(search_label); |
57 | |
58 /* search entry */ | |
59 search_entry = gtk_entry_new(); | |
2782
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
60 g_signal_connect(G_OBJECT(search_entry), "key-press-event", G_CALLBACK(on_search_entry_key_pressed), NULL); |
2735 | 61 gtk_widget_show(search_entry); |
62 | |
63 GtkWidget *hbox1 = gtk_hbox_new(FALSE, 0); | |
64 gtk_box_pack_start(GTK_BOX(hbox1), search_label, FALSE, TRUE, 3); | |
65 gtk_box_pack_start(GTK_BOX(hbox1), search_entry, TRUE, TRUE, 3); | |
66 gtk_widget_show(hbox1); | |
67 | |
68 /* add button */ | |
69 add_button = gtk_button_new_from_stock(GTK_STOCK_ADD); | |
70 g_signal_connect(G_OBJECT(add_button), "clicked", G_CALLBACK(on_add_button_clicked), NULL); | |
71 gtk_widget_show(add_button); | |
72 | |
73 GtkWidget *vbox1 = gtk_vbox_new(FALSE, 3); | |
74 gtk_box_pack_start(GTK_BOX(vbox1), notebook, TRUE, TRUE, 0); | |
75 gtk_box_pack_start(GTK_BOX(vbox1), hbox1, FALSE, TRUE, 0); | |
76 gtk_box_pack_start(GTK_BOX(vbox1), add_button, FALSE, TRUE, 0); | |
77 gtk_widget_show(vbox1); | |
78 | |
79 /* streambrowser window */ | |
80 streambrowser_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
2764
d45b4beadf6c
Made "bluetooth" and "streambrowser" plugins translatable.
Stany HENRY <StrassBoy@gmail.com>
parents:
2757
diff
changeset
|
81 gtk_window_set_title(GTK_WINDOW(streambrowser_window), _("Stream browser")); |
2735 | 82 gtk_window_set_position(GTK_WINDOW(streambrowser_window), GTK_WIN_POS_CENTER); |
83 gtk_window_set_default_size(GTK_WINDOW(streambrowser_window), 700, 400); | |
2791
f9c6a9cb442e
streambrowser has now an icon
Calin Crisan ccrisan@gmail.com
parents:
2790
diff
changeset
|
84 gtk_window_set_icon_from_file(GTK_WINDOW(streambrowser_window), STREAMBROWSER_ICON, NULL); |
2735 | 85 g_signal_connect(G_OBJECT(streambrowser_window), "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), streambrowser_window); |
86 gtk_container_add(GTK_CONTAINER(streambrowser_window), vbox1); | |
87 | |
88 /* others */ | |
89 cell_renderer_pixbuf = gtk_cell_renderer_pixbuf_new(); | |
90 cell_renderer_text = gtk_cell_renderer_text_new(); | |
91 } | |
92 | |
93 void streambrowser_win_done() | |
94 { | |
95 } | |
96 | |
97 void streambrowser_win_show() | |
98 { | |
99 gtk_widget_show(streambrowser_window); | |
100 } | |
101 | |
102 void streambrowser_win_hide() | |
103 { | |
104 gtk_widget_hide(streambrowser_window); | |
105 } | |
106 | |
107 void streambrowser_win_set_streamdir(streamdir_t *streamdir, gchar *icon_filename) | |
108 { | |
109 GtkWidget *tree_view = NULL; | |
110 | |
111 /* search for an old instance of this streamdir and replace it */ | |
112 streamdir_gui_t *streamdir_gui = find_streamdir_gui_by_name(streamdir->name); | |
113 if (streamdir_gui != NULL) { | |
114 streamdir_delete(streamdir_gui->streamdir); | |
115 streamdir_gui->streamdir = streamdir; | |
116 tree_view = streamdir_gui->tree_view; | |
117 } | |
118 /* if no older instance of this streamdir has been found, we add a brand new one */ | |
119 else { | |
120 streamdir_gui = g_malloc(sizeof(streamdir_gui_t)); | |
121 | |
122 tree_view = gtk_streamdir_tree_view_new(); | |
123 | |
124 GtkWidget *table = gtk_streamdir_table_new(tree_view); | |
125 gtk_widget_show_all(table); | |
126 | |
127 GtkWidget *label = gtk_label_new_with_icon(icon_filename, streamdir->name); | |
128 gtk_widget_show_all(label); | |
129 | |
130 streamdir_gui->streamdir = streamdir; | |
131 streamdir_gui->tree_view = tree_view; | |
132 streamdir_gui->table = table; | |
133 | |
134 streamdir_gui_list = g_list_append(streamdir_gui_list, streamdir_gui); | |
135 | |
136 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table, label); | |
137 } | |
138 | |
139 /* fill the tree with categories */ | |
140 GtkTreeIter iter; | |
141 GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view))); | |
142 | |
143 gtk_tree_store_clear(store); | |
144 | |
145 int i, count = category_get_count(streamdir); | |
146 category_t *category; | |
147 for (i = 0; i < count; i++) { | |
148 category = category_get_by_index(streamdir, i); | |
149 | |
150 gtk_tree_store_append(store, &iter, NULL); | |
2790
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
151 gtk_tree_store_set(store, &iter, 0, "gtk-directory", 1, category->name, 2, "", -1); |
2735 | 152 } |
153 } | |
154 | |
155 void streambrowser_win_set_category(streamdir_t *streamdir, category_t *category) | |
156 { | |
157 streamdir_gui_t *streamdir_gui = find_streamdir_gui_by_name(streamdir->name); | |
158 if (streamdir_gui == NULL) { | |
159 failure("gui: streambrowser_win_set_category() called with non-existent streamdir\n"); | |
160 return; | |
161 } | |
162 | |
163 GtkTreeView *tree_view = GTK_TREE_VIEW(streamdir_gui->tree_view); | |
164 GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view))); | |
165 GtkTreePath *path; | |
166 GtkTreeIter iter, new_iter; | |
167 | |
168 /* clear all the previously added streaminfo in this category */ | |
169 path = gtk_tree_path_new_from_indices(category_get_index(streamdir, category), 0, -1); | |
170 if (gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path)) { | |
171 while (gtk_tree_store_remove(store, &iter)) | |
172 ; | |
173 } | |
174 | |
175 /* find the corresponding category tree iter */ | |
176 path = gtk_tree_path_new_from_indices(category_get_index(streamdir, category), -1); | |
177 if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path)) | |
178 return; | |
179 | |
180 /* append the new streaminfos to the current category / iter */ | |
181 int i, count = streaminfo_get_count(category); | |
182 streaminfo_t *streaminfo; | |
183 for (i = 0; i < count; i++) { | |
184 streaminfo = streaminfo_get_by_index(category, i); | |
185 | |
186 gtk_tree_store_append(store, &new_iter, &iter); | |
2790
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
187 gtk_tree_store_set(store, &new_iter, 0, "gtk-directory", 1, streaminfo->name, 2, streaminfo->current_track, -1); |
2735 | 188 } |
189 } | |
190 | |
191 void streambrowser_win_set_update_function(void (*function) (streamdir_t *streamdir, category_t *category, streaminfo_t *streaminfo)) | |
192 { | |
193 update_function = function; | |
194 } | |
195 | |
2790
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
196 void streambrowser_win_set_category_state(streamdir_t *streamdir, category_t *category, gboolean fetching) |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
197 { |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
198 streamdir_gui_t *streamdir_gui = find_streamdir_gui_by_streamdir(streamdir); |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
199 GtkTreeView *tree_view = GTK_TREE_VIEW(streamdir_gui->tree_view); |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
200 GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(tree_view)); |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
201 GtkTreePath *path; |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
202 GtkTreeIter iter; |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
203 |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
204 /* find the corresponding category tree iter */ |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
205 path = gtk_tree_path_new_from_indices(category_get_index(streamdir, category), -1); |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
206 if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path)) |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
207 return; |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
208 |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
209 if (fetching) { |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
210 gchar temp[DEF_STRING_LEN]; |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
211 sprintf(temp, "<span style='italic' weight='heavy'>%s</span>", category->name); |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
212 gtk_tree_store_set(store, &iter, 0, "gtk-refresh", 1, temp, 2, "", -1); |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
213 } |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
214 else { |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
215 gtk_tree_store_set(store, &iter, 0, "gtk-directory", 1, category->name, 2, "", -1); |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
216 } |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
217 } |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
218 |
2735 | 219 static GtkWidget* gtk_label_new_with_icon(gchar *icon_filename, gchar *label_text) |
220 { | |
221 GtkWidget *hbox = gtk_hbox_new(FALSE, 1); | |
222 GtkWidget *label = gtk_label_new(label_text); | |
223 GtkWidget *icon = gtk_image_new_from_file(icon_filename); | |
224 | |
225 gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, TRUE, 0); | |
226 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); | |
227 | |
228 return hbox; | |
229 } | |
230 | |
231 static GtkWidget *gtk_streamdir_tree_view_new() | |
232 { | |
233 GtkWidget *tree_view = gtk_tree_view_new(); | |
2757
4ec0e13208de
added shoutcast icon; fixed some small bugs
Calin Crisan ccrisan@gmail.com
parents:
2735
diff
changeset
|
234 |
2790
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
235 GtkTreeStore *store = gtk_tree_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); |
2735 | 236 gtk_tree_view_set_model(GTK_TREE_VIEW(tree_view), GTK_TREE_MODEL(store)); |
237 | |
2757
4ec0e13208de
added shoutcast icon; fixed some small bugs
Calin Crisan ccrisan@gmail.com
parents:
2735
diff
changeset
|
238 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view), TRUE); |
2782
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
239 gtk_tree_view_set_search_entry(GTK_TREE_VIEW(tree_view), GTK_ENTRY(search_entry)); |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
240 gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(tree_view), tree_view_search_equal_func, NULL, NULL); |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
241 g_signal_connect(G_OBJECT(tree_view), "key-press-event", G_CALLBACK(on_tree_view_key_pressed), NULL); |
2735 | 242 |
2783
8be380729806
made columns resizable in streambrowser's main win
Calin Crisan ccrisan@gmail.com
parents:
2782
diff
changeset
|
243 GtkTreeViewColumn *column = gtk_tree_view_column_new(); |
8be380729806
made columns resizable in streambrowser's main win
Calin Crisan ccrisan@gmail.com
parents:
2782
diff
changeset
|
244 gtk_tree_view_column_pack_start(column, cell_renderer_pixbuf, TRUE); |
2790
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
245 gtk_tree_view_column_add_attribute(column, cell_renderer_pixbuf, "stock-id", 0); |
2783
8be380729806
made columns resizable in streambrowser's main win
Calin Crisan ccrisan@gmail.com
parents:
2782
diff
changeset
|
246 gtk_tree_view_column_set_resizable(column, TRUE); |
8be380729806
made columns resizable in streambrowser's main win
Calin Crisan ccrisan@gmail.com
parents:
2782
diff
changeset
|
247 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column); |
8be380729806
made columns resizable in streambrowser's main win
Calin Crisan ccrisan@gmail.com
parents:
2782
diff
changeset
|
248 |
8be380729806
made columns resizable in streambrowser's main win
Calin Crisan ccrisan@gmail.com
parents:
2782
diff
changeset
|
249 column = gtk_tree_view_column_new(); |
8be380729806
made columns resizable in streambrowser's main win
Calin Crisan ccrisan@gmail.com
parents:
2782
diff
changeset
|
250 gtk_tree_view_column_pack_start(column, cell_renderer_text, TRUE); |
2790
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
251 gtk_tree_view_column_add_attribute(column, cell_renderer_text, "markup", 1); |
2783
8be380729806
made columns resizable in streambrowser's main win
Calin Crisan ccrisan@gmail.com
parents:
2782
diff
changeset
|
252 gtk_tree_view_column_set_resizable(column, TRUE); |
8be380729806
made columns resizable in streambrowser's main win
Calin Crisan ccrisan@gmail.com
parents:
2782
diff
changeset
|
253 gtk_tree_view_column_set_title(column, _("Stream name")); |
8be380729806
made columns resizable in streambrowser's main win
Calin Crisan ccrisan@gmail.com
parents:
2782
diff
changeset
|
254 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column); |
8be380729806
made columns resizable in streambrowser's main win
Calin Crisan ccrisan@gmail.com
parents:
2782
diff
changeset
|
255 |
8be380729806
made columns resizable in streambrowser's main win
Calin Crisan ccrisan@gmail.com
parents:
2782
diff
changeset
|
256 column = gtk_tree_view_column_new(); |
8be380729806
made columns resizable in streambrowser's main win
Calin Crisan ccrisan@gmail.com
parents:
2782
diff
changeset
|
257 gtk_tree_view_column_pack_start(column, cell_renderer_text, TRUE); |
8be380729806
made columns resizable in streambrowser's main win
Calin Crisan ccrisan@gmail.com
parents:
2782
diff
changeset
|
258 gtk_tree_view_column_add_attribute(column, cell_renderer_text, "text", 2); |
8be380729806
made columns resizable in streambrowser's main win
Calin Crisan ccrisan@gmail.com
parents:
2782
diff
changeset
|
259 gtk_tree_view_column_set_resizable(column, TRUE); |
8be380729806
made columns resizable in streambrowser's main win
Calin Crisan ccrisan@gmail.com
parents:
2782
diff
changeset
|
260 gtk_tree_view_column_set_title(column, _("Now playing")); |
8be380729806
made columns resizable in streambrowser's main win
Calin Crisan ccrisan@gmail.com
parents:
2782
diff
changeset
|
261 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column); |
2757
4ec0e13208de
added shoutcast icon; fixed some small bugs
Calin Crisan ccrisan@gmail.com
parents:
2735
diff
changeset
|
262 |
2735 | 263 g_signal_connect(G_OBJECT(tree_view), "cursor-changed", G_CALLBACK(on_tree_view_cursor_changed), NULL); |
264 | |
265 return tree_view; | |
266 } | |
267 | |
268 static GtkWidget* gtk_streamdir_table_new(GtkWidget *tree_view) | |
269 { | |
270 GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL); | |
271 gtk_container_add(GTK_CONTAINER(scrolled_window), tree_view); | |
272 | |
273 GtkWidget *table = gtk_table_new(1, 1, FALSE); | |
274 gtk_table_attach(GTK_TABLE(table), scrolled_window, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); | |
275 | |
276 return table; | |
277 } | |
278 | |
279 static gboolean on_notebook_switch_page(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data) | |
280 { | |
281 if (page_num < 0) | |
282 return FALSE; | |
283 | |
284 /* update the current selected stream */ | |
2757
4ec0e13208de
added shoutcast icon; fixed some small bugs
Calin Crisan ccrisan@gmail.com
parents:
2735
diff
changeset
|
285 |
4ec0e13208de
added shoutcast icon; fixed some small bugs
Calin Crisan ccrisan@gmail.com
parents:
2735
diff
changeset
|
286 /* |
2735 | 287 streamdir_gui_t *streamdir_gui = g_list_nth_data(streamdir_gui_list, page_num); |
288 update_function(streamdir_gui->streamdir, NULL, NULL); | |
2757
4ec0e13208de
added shoutcast icon; fixed some small bugs
Calin Crisan ccrisan@gmail.com
parents:
2735
diff
changeset
|
289 */ |
4ec0e13208de
added shoutcast icon; fixed some small bugs
Calin Crisan ccrisan@gmail.com
parents:
2735
diff
changeset
|
290 |
4ec0e13208de
added shoutcast icon; fixed some small bugs
Calin Crisan ccrisan@gmail.com
parents:
2735
diff
changeset
|
291 /* clear the search box */ |
4ec0e13208de
added shoutcast icon; fixed some small bugs
Calin Crisan ccrisan@gmail.com
parents:
2735
diff
changeset
|
292 gtk_entry_set_text(GTK_ENTRY(search_entry), ""); |
2735 | 293 |
294 return TRUE; | |
295 } | |
296 | |
297 static gboolean on_tree_view_cursor_changed(GtkTreeView *tree_view, gpointer data) | |
298 { | |
299 GtkTreePath *path; | |
300 GtkTreeViewColumn *focus_column; | |
301 | |
2757
4ec0e13208de
added shoutcast icon; fixed some small bugs
Calin Crisan ccrisan@gmail.com
parents:
2735
diff
changeset
|
302 /* obtain the current category */ |
2735 | 303 gtk_tree_view_get_cursor(tree_view, &path, &focus_column); |
304 | |
305 if (path == NULL) | |
306 return TRUE; | |
2757
4ec0e13208de
added shoutcast icon; fixed some small bugs
Calin Crisan ccrisan@gmail.com
parents:
2735
diff
changeset
|
307 |
2735 | 308 gint *indices = gtk_tree_path_get_indices(path); |
309 if (gtk_tree_path_get_depth(path) != 1) { | |
310 gtk_tree_path_free(path); | |
311 return TRUE; | |
312 } | |
313 | |
2782
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
314 if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(tree_view), path)) { |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
315 gtk_tree_path_free(path); |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
316 return TRUE; |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
317 } |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
318 |
2735 | 319 int category_index = indices[0]; |
320 | |
321 gtk_tree_path_free(path); | |
322 | |
323 streamdir_gui_t *streamdir_gui = find_streamdir_gui_by_tree_view(tree_view); | |
324 if (streamdir_gui == NULL) | |
325 return TRUE; | |
2757
4ec0e13208de
added shoutcast icon; fixed some small bugs
Calin Crisan ccrisan@gmail.com
parents:
2735
diff
changeset
|
326 |
4ec0e13208de
added shoutcast icon; fixed some small bugs
Calin Crisan ccrisan@gmail.com
parents:
2735
diff
changeset
|
327 /* issue an update on the current category */ |
2735 | 328 update_function(streamdir_gui->streamdir, category_get_by_index(streamdir_gui->streamdir, category_index), NULL); |
2757
4ec0e13208de
added shoutcast icon; fixed some small bugs
Calin Crisan ccrisan@gmail.com
parents:
2735
diff
changeset
|
329 |
4ec0e13208de
added shoutcast icon; fixed some small bugs
Calin Crisan ccrisan@gmail.com
parents:
2735
diff
changeset
|
330 /* clear the search box */ |
4ec0e13208de
added shoutcast icon; fixed some small bugs
Calin Crisan ccrisan@gmail.com
parents:
2735
diff
changeset
|
331 gtk_entry_set_text(GTK_ENTRY(search_entry), ""); |
2735 | 332 |
333 return TRUE; | |
334 } | |
335 | |
336 static gboolean on_add_button_clicked(GtkButton *button, gpointer data) | |
337 { | |
338 GtkTreePath *path; | |
339 GtkTreeViewColumn *focus_column; | |
340 | |
341 GtkWidget *table = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook))); | |
342 streamdir_gui_t *streamdir_gui = find_streamdir_gui_by_table(GTK_TABLE(table)); | |
343 if (streamdir_gui == NULL) | |
344 return TRUE; | |
345 | |
346 GtkWidget *tree_view = streamdir_gui->tree_view; | |
347 | |
348 gtk_tree_view_get_cursor(GTK_TREE_VIEW(tree_view), &path, &focus_column); | |
349 | |
350 if (path == NULL) | |
351 return TRUE; | |
352 | |
353 gint *indices = gtk_tree_path_get_indices(path); | |
354 if (gtk_tree_path_get_depth(path) != 2) { | |
355 gtk_tree_path_free(path); | |
356 return TRUE; | |
357 } | |
358 | |
359 int category_index = indices[0]; | |
360 int streaminfo_index = indices[1]; | |
361 | |
362 gtk_tree_path_free(path); | |
363 | |
364 streamdir_t *streamdir = streamdir_gui->streamdir; | |
365 category_t *category = category_get_by_index(streamdir_gui->streamdir, category_index); | |
366 streaminfo_t *streaminfo = streaminfo_get_by_index(category, streaminfo_index); | |
367 | |
368 update_function(streamdir, category, streaminfo); | |
369 | |
370 return TRUE; | |
371 } | |
372 | |
2782
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
373 static gboolean on_search_entry_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data) |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
374 { |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
375 if (event->keyval == GDK_Return || event->keyval == GDK_KP_Enter) |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
376 on_add_button_clicked(GTK_BUTTON(add_button), NULL); |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
377 |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
378 /* todo: remove this |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
379 GtkWidget *table = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook))); |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
380 streamdir_gui_t *streamdir_gui = find_streamdir_gui_by_table(GTK_TABLE(table)); |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
381 if (streamdir_gui == NULL) |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
382 return FALSE; |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
383 |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
384 GtkWidget *tree_view = streamdir_gui->tree_view; |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
385 GtkTreeIter iter; |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
386 gboolean is_expanded = FALSE; |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
387 GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view))); |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
388 GtkTreePath *path; |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
389 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter)) |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
390 return FALSE; |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
391 |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
392 while (gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter)) { |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
393 path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter); |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
394 |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
395 if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(tree_view), path)) { |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
396 is_expanded = TRUE; |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
397 break; |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
398 } |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
399 |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
400 gtk_tree_path_free(path); |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
401 } |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
402 |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
403 if (!is_expanded) |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
404 gtk_tree_view_set_search_column(GTK_TREE_VIEW(tree_view), ); |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
405 else |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
406 gtk_tree_view_set_search_column(GTK_TREE_VIEW(tree_view), 1); |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
407 */ |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
408 |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
409 return FALSE; |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
410 } |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
411 |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
412 static gboolean on_tree_view_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data) |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
413 { |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
414 gtk_widget_grab_focus(search_entry); |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
415 on_search_entry_key_pressed(widget, event, data); |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
416 |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
417 return FALSE; |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
418 } |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
419 |
2735 | 420 static streamdir_gui_t *find_streamdir_gui_by_name(gchar *name) |
421 { | |
422 GList *iterator; | |
423 streamdir_gui_t *streamdir_gui; | |
424 | |
425 for (iterator = g_list_first(streamdir_gui_list); iterator != NULL; iterator = g_list_next(iterator)) { | |
426 streamdir_gui = iterator->data; | |
427 | |
428 if (strcmp(streamdir_gui->streamdir->name, name) == 0) | |
429 return streamdir_gui; | |
430 } | |
431 | |
432 return NULL; | |
433 } | |
434 | |
435 static streamdir_gui_t *find_streamdir_gui_by_tree_view(GtkTreeView *tree_view) | |
436 { | |
437 GList *iterator; | |
438 streamdir_gui_t *streamdir_gui; | |
439 | |
440 for (iterator = g_list_first(streamdir_gui_list); iterator != NULL; iterator = g_list_next(iterator)) { | |
441 streamdir_gui = iterator->data; | |
442 | |
443 if ((void *) streamdir_gui->tree_view == (void *) tree_view) | |
444 return streamdir_gui; | |
445 } | |
446 | |
447 return NULL; | |
448 } | |
449 | |
450 static streamdir_gui_t *find_streamdir_gui_by_table(GtkTable *table) | |
451 { | |
452 GList *iterator; | |
453 streamdir_gui_t *streamdir_gui; | |
454 | |
455 for (iterator = g_list_first(streamdir_gui_list); iterator != NULL; iterator = g_list_next(iterator)) { | |
456 streamdir_gui = iterator->data; | |
457 | |
458 if ((void *) streamdir_gui->table == (void *) table) | |
459 return streamdir_gui; | |
460 } | |
461 | |
462 return NULL; | |
463 } | |
464 | |
2790
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
465 static streamdir_gui_t* find_streamdir_gui_by_streamdir(streamdir_t *streamdir) |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
466 { |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
467 GList *iterator; |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
468 streamdir_gui_t *streamdir_gui; |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
469 |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
470 for (iterator = g_list_first(streamdir_gui_list); iterator != NULL; iterator = g_list_next(iterator)) { |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
471 streamdir_gui = iterator->data; |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
472 |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
473 if ((void *) streamdir_gui->streamdir == (void *) streamdir) |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
474 return streamdir_gui; |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
475 } |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
476 |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
477 return NULL; |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
478 } |
c156102069ae
background fetching of streaming info is now indicated in gui
Calin Crisan ccrisan@gmail.com
parents:
2783
diff
changeset
|
479 |
2782
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
480 static gboolean tree_view_search_equal_func(GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer data) |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
481 { |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
482 GValue value = {0, }; |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
483 gboolean ret; |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
484 |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
485 gtk_tree_model_get_value(model, iter, column, &value); |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
486 const gchar *string = g_value_get_string(&value); |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
487 |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
488 // todo: why do I get "warning: implicit declaration" for strcasestr !? |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
489 ret = ((char *) strcasestr(string, key) == NULL); |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
490 |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
491 g_value_unset(&value); |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
492 |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
493 return ret; |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
494 } |
c5005707a575
added basic search functionality
Calin Crisan ccrisan@gmail.com
parents:
2764
diff
changeset
|
495 |