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