Mercurial > audlegacy-plugins
diff src/streambrowser/gui/streambrowser_win.c @ 2913:113454baecf8
lots of changes: most important - bookmarks code almost finished, fixed bold-text gui bug, and others...
author | Calin Crisan ccrisan@gmail.com |
---|---|
date | Fri, 15 Aug 2008 16:00:43 +0200 |
parents | 6c53f9fa9029 |
children |
line wrap: on
line diff
--- a/src/streambrowser/gui/streambrowser_win.c Tue Aug 12 23:49:32 2008 +0200 +++ b/src/streambrowser/gui/streambrowser_win.c Fri Aug 15 16:00:43 2008 +0200 @@ -8,6 +8,7 @@ #include "../streambrowser.h" #include "streambrowser_win.h" +#include "../bookmarks.h" typedef struct { @@ -28,12 +29,12 @@ static gboolean on_notebook_switch_page(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data); static gboolean on_tree_view_cursor_changed(GtkTreeView *tree_view, gpointer data); static gboolean on_add_button_clicked(GtkButton *button, gpointer data); +static gboolean on_bookmark_button_clicked(GtkButton *button, gpointer data); static gboolean on_search_entry_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data); static gboolean on_tree_view_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data); static gboolean on_tree_view_button_pressed(GtkWidget *widget, GdkEventButton *event, gpointer data); static streamdir_gui_t* find_streamdir_gui_by_name(gchar *name); -//static streamdir_gui_t* find_streamdir_gui_by_tree_view(GtkTreeView *tree_view); todo: remove this static streamdir_gui_t* find_streamdir_gui_by_table(GtkTable *table); static streamdir_gui_t* find_streamdir_gui_by_streamdir(streamdir_t *streamdir); static gboolean tree_view_search_equal_func(GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer data); @@ -41,6 +42,7 @@ static GtkWidget* notebook; static GtkWidget* search_entry; static GtkWidget* add_button; +static GtkWidget* bookmark_button; static GtkWidget* streambrowser_window; static GList* streamdir_gui_list; static GtkCellRenderer* cell_renderer_pixbuf; @@ -75,17 +77,24 @@ g_signal_connect(G_OBJECT(add_button), "clicked", G_CALLBACK(on_add_button_clicked), NULL); gtk_widget_show(add_button); - GtkWidget *vbox1 = gtk_vbox_new(FALSE, 3); + /* bookmark button */ + bookmark_button = gtk_button_new_with_label(_("Add Bookmark")); + gtk_button_set_image(GTK_BUTTON(bookmark_button), gtk_image_new_from_file(BOOKMARKS_ICON)); + g_signal_connect(G_OBJECT(bookmark_button), "clicked", G_CALLBACK(on_bookmark_button_clicked), NULL); + gtk_widget_show(bookmark_button); + + GtkWidget *vbox1 = gtk_vbox_new(FALSE, 4); gtk_box_pack_start(GTK_BOX(vbox1), notebook, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox1), hbox1, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox1), add_button, FALSE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(vbox1), bookmark_button, FALSE, TRUE, 0); gtk_widget_show(vbox1); /* streambrowser window */ streambrowser_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(streambrowser_window), _("Stream browser")); gtk_window_set_position(GTK_WINDOW(streambrowser_window), GTK_WIN_POS_CENTER); - gtk_window_set_default_size(GTK_WINDOW(streambrowser_window), 700, 400); + gtk_window_set_default_size(GTK_WINDOW(streambrowser_window), 1000, 700); gtk_window_set_icon_from_file(GTK_WINDOW(streambrowser_window), STREAMBROWSER_ICON, NULL); g_signal_connect(G_OBJECT(streambrowser_window), "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), streambrowser_window); gtk_container_add(GTK_CONTAINER(streambrowser_window), vbox1); @@ -153,7 +162,7 @@ category = category_get_by_index(streamdir, i); gtk_tree_store_append(store, &iter, NULL); - gtk_tree_store_set(store, &iter, 0, "gtk-directory", 1, category->name, 2, "", -1); + gtk_tree_store_set(store, &iter, 0, "gtk-directory", 1, category->name, 2, "", 3, PANGO_WEIGHT_NORMAL, -1); } } @@ -189,7 +198,7 @@ streaminfo = streaminfo_get_by_index(category, i); gtk_tree_store_append(store, &new_iter, &iter); - gtk_tree_store_set(store, &new_iter, 0, "gtk-media-play", 1, streaminfo->name, 2, streaminfo->current_track, -1); + gtk_tree_store_set(store, &new_iter, 0, "gtk-media-play", 1, streaminfo->name, 2, streaminfo->current_track, 3, PANGO_WEIGHT_NORMAL, -1); } gtk_tree_path_free(path); @@ -214,7 +223,7 @@ return; /* update the streaminfo*/ - gtk_tree_store_set(store, &new_iter, 0, "gtk-media-play", 1, streaminfo->name, 2, streaminfo->current_track, -1); + gtk_tree_store_set(store, &new_iter, 0, "gtk-media-play", 1, streaminfo->name, 2, streaminfo->current_track, 3, PANGO_WEIGHT_NORMAL -1); gtk_tree_path_free(path); } @@ -238,12 +247,13 @@ return; if (fetching) { - gchar temp[DEF_STRING_LEN]; - sprintf(temp, "<span style='italic' weight='heavy'>%s</span>", category->name); - gtk_tree_store_set(store, &iter, 0, "gtk-refresh", 1, temp, 2, "", -1); + gtk_tree_store_set(store, &iter, 0, "gtk-refresh", 1, category->name, 2, "", 3, PANGO_WEIGHT_BOLD, -1); } else { - gtk_tree_store_set(store, &iter, 0, "gtk-directory", 1, category->name, 2, "", -1); + gtk_tree_store_set(store, &iter, 0, "gtk-directory", 1, category->name, 2, "", 3, PANGO_WEIGHT_NORMAL, -1); + + /* we also expand the corresponding category tree element in the treeview */ + gtk_tree_view_expand_row(tree_view, path, FALSE); } } @@ -261,13 +271,10 @@ return; if (fetching) { - gchar temp[DEF_STRING_LEN]; - sprintf(temp, "<span style='italic' weight='heavy'>%s</span>", streaminfo->name); - - gtk_tree_store_set(store, &iter, 0, "gtk-refresh", 1, temp, 2, streaminfo->current_track, -1); + gtk_tree_store_set(store, &iter, 0, "gtk-media-play", 1, streaminfo->name, 2, streaminfo->current_track, 3, PANGO_WEIGHT_BOLD, -1); } else { - gtk_tree_store_set(store, &iter, 0, "gtk-media-play", 1, streaminfo->name, 2, streaminfo->current_track, -1); + gtk_tree_store_set(store, &iter, 0, "gtk-media-play", 1, streaminfo->name, 2, streaminfo->current_track, 3, PANGO_WEIGHT_NORMAL, -1); } } @@ -287,7 +294,7 @@ { GtkWidget *tree_view = gtk_tree_view_new(); - GtkTreeStore *store = gtk_tree_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + GtkTreeStore *store = gtk_tree_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT); gtk_tree_view_set_model(GTK_TREE_VIEW(tree_view), GTK_TREE_MODEL(store)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view), TRUE); @@ -306,7 +313,8 @@ column = gtk_tree_view_column_new(); gtk_tree_view_column_pack_start(column, cell_renderer_text, TRUE); - gtk_tree_view_column_add_attribute(column, cell_renderer_text, "markup", 1); + gtk_tree_view_column_add_attribute(column, cell_renderer_text, "text", 1); + gtk_tree_view_column_add_attribute(column, cell_renderer_text, "weight", 3); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Stream name")); gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column); @@ -353,6 +361,14 @@ /* clear the search box */ gtk_entry_set_text(GTK_ENTRY(search_entry), ""); + + /* if this is the last page, aka the bookmarks page, bookmark button has to say "Remove bookmark", instead of "Add bookmark"0 */ + if (page_num == gtk_notebook_get_n_pages(notebook) - 1) { + gtk_button_set_label(GTK_BUTTON(bookmark_button), _("Remove Bookmark")); + } + else { + gtk_button_set_label(GTK_BUTTON(bookmark_button), _("Add Bookmark")); + } return TRUE; } @@ -420,7 +436,6 @@ } /* single click triggers a refresh of the selected item */ else { - // todo: separate single from double click somehow tree_view_button_pressed = TRUE; } @@ -473,6 +488,66 @@ return TRUE; } +static gboolean on_bookmark_button_clicked(GtkButton *button, gpointer data) +{ + GtkTreePath *path; + GtkTreeViewColumn *focus_column; + + /* get the currently selected tree view */ + GtkWidget *table = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook))); + streamdir_gui_t *streamdir_gui = find_streamdir_gui_by_table(GTK_TABLE(table)); + if (streamdir_gui == NULL) + return TRUE; + + GtkTreeView *tree_view = GTK_TREE_VIEW(streamdir_gui->tree_view); + + /* get the currently selected path in the tree */ + gtk_tree_view_get_cursor(tree_view, &path, &focus_column); + + if (path == NULL) + return TRUE; + + gint *indices = gtk_tree_path_get_indices(path); + if (gtk_tree_path_get_depth(path) == 1) { + gtk_tree_path_free(path); + return TRUE; + } + + int category_index = indices[0]; + int streaminfo_index = indices[1]; + + gtk_tree_path_free(path); + + /* get the currently selected stream (info) */ + streamdir_t *streamdir = streamdir_gui->streamdir; + category_t *category = category_get_by_index(streamdir_gui->streamdir, category_index); + streaminfo_t *streaminfo = streaminfo_get_by_index(category, streaminfo_index); + + /* if we have the bookmarks tab focused, we remove the stream, rather than add it. otherwise we simply add it */ + if (strcmp(streamdir->name, BOOKMARKS_NAME) == 0) { + bookmark_remove(streaminfo->name); + + update_function(streamdir, category, NULL, FALSE); + } + else { + bookmark_t bookmark; + strncpy(bookmark.streamdir_name, streamdir->name, DEF_STRING_LEN); + strncpy(bookmark.name, streaminfo->name, DEF_STRING_LEN); + strncpy(bookmark.playlist_url, streaminfo->playlist_url, DEF_STRING_LEN); + strncpy(bookmark.url, streaminfo->url, DEF_STRING_LEN); + + bookmark_add(&bookmark); + + /* find the corresponding category (having the current streamdir name) in the bookmarks */ + streamdir_t *bookmarks_streamdir = find_streamdir_gui_by_name(BOOKMARKS_NAME)->streamdir; + category_t *bookmarks_category = category_get_by_name(bookmarks_streamdir, streamdir->name); + + update_function(bookmarks_streamdir, bookmarks_category, NULL, FALSE); + } + + return TRUE; +} + static gboolean on_search_entry_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data) { if (event->keyval == GDK_Return || event->keyval == GDK_KP_Enter) { @@ -519,23 +594,6 @@ return NULL; } -/* todo: remove this -static streamdir_gui_t *find_streamdir_gui_by_tree_view(GtkTreeView *tree_view) -{ - GList *iterator; - streamdir_gui_t *streamdir_gui; - - for (iterator = g_list_first(streamdir_gui_list); iterator != NULL; iterator = g_list_next(iterator)) { - streamdir_gui = iterator->data; - - if ((void *) streamdir_gui->tree_view == (void *) tree_view) - return streamdir_gui; - } - - return NULL; -} -*/ - static streamdir_gui_t *find_streamdir_gui_by_table(GtkTable *table) { GList *iterator;