/* vim: set ai et ts=4 sw=4: */ #ifdef HAVE_CONFIG_H #include #endif #include #include "liteamp.h" #include "sidebar.h" #include "dnd.h" #include "callbacks.h" #include "util.h" /*-----------------------------------------------------------------*/ static const gchar* sidebar_conf_filename = ".liteamp/sidebar.conf"; /*-----------------------------------------------------------------*/ // // protypes // static gboolean item_rbtn_button_press_event_cb(GtkButton* button, GdkEventButton* event, Sidebar* sidebar); static void item_rbtn_toggled_cb(GtkToggleButton* togglebutton, SidebarItem* item); /*-----------------------------------------------------------------*/ // // boiler plate // static void sidebar_class_init(SidebarClass* klass); static void sidebar_init(Sidebar* item); static GtkWidgetClass *parent_class = NULL; GType sidebar_get_type() { static GType sidebar_type = 0; if(!sidebar_type) { GTypeInfo sidebar_info = { sizeof(SidebarClass), NULL, NULL, (GClassInitFunc) sidebar_class_init, NULL, NULL, sizeof(Sidebar), 0, (GInstanceInitFunc) sidebar_init }; sidebar_type = g_type_register_static(GTK_TYPE_VBUTTON_BOX, "Sidebar", &sidebar_info, 0); } return sidebar_type; } static void sidebar_class_init(SidebarClass* klass) { // nothing to do GtkObjectClass* object_class; GtkWidgetClass* widget_class; object_class = (GtkObjectClass*)klass; widget_class = (GtkWidgetClass*)klass; parent_class = gtk_type_class(gtk_widget_get_type()); } static void sidebar_init(Sidebar* sidebar) { // nothing to do } /*-----------------------------------------------------------------*/ // // sidebar management // GtkWidget* sidebar_new() { Sidebar* sidebar = g_object_new(sidebar_get_type(), NULL); gtk_button_box_set_layout( GTK_BUTTON_BOX(sidebar), GTK_BUTTONBOX_START); gtk_button_box_set_spacing(GTK_BUTTON_BOX(sidebar), 2); gtk_container_set_border_width(GTK_CONTAINER(sidebar), 2); sidebar->items = NULL; // create stock items //sidebar_add_item(sidebar, SIDEBAR_ITEM(sidebar_item_new_stock(SIDEBAR_ITEM_STOCK_ALL))); //sidebar_add_item(sidebar, SIDEBAR_ITEM(sidebar_item_new_stock(SIDEBAR_ITEM_STOCK_AUDIOCD))); //sidebar_add_item(sidebar, SIDEBAR_ITEM(sidebar_item_new_stock(SIDEBAR_ITEM_STOCK_RADIO))); //sidebar_add_item(sidebar, SIDEBAR_ITEM(sidebar_item_new_stock(SIDEBAR_ITEM_STOCK_FAVORITES))); sidebar->filename = g_build_filename(g_get_home_dir(), sidebar_conf_filename, NULL); // read sidebar settings with gnome-config sidebar_read(sidebar); if(!sidebar->items) sidebar_add_item(sidebar, SIDEBAR_ITEM(sidebar_item_new(NULL, NULL, NULL, SIDEBAR_ITEM_STOCK_NONE))); dnd_enable(GTK_WIDGET(sidebar)); dnd_connect(GTK_WIDGET(sidebar)); return GTK_WIDGET(sidebar); } /** * read sidebar settings using gnome-config */ void sidebar_read(Sidebar* sidebar) { gint num, count; gchar key[256]; gchar* title; gchar* icon; gchar* filename; SidebarItem* item; g_return_if_fail(IS_SIDEBAR(sidebar)); g_snprintf(key, sizeof(key), "=%s=/sidebar/", sidebar->filename); gnome_config_push_prefix(key); count = gnome_config_get_int("NumberOfPlaylists=0"); for(num = 1; num <= count; num++) { g_snprintf(key, sizeof(key), "Title%d", num); title = gnome_config_get_string(key); g_snprintf(key, sizeof(key), "Icon%d", num); icon = gnome_config_get_string(key); g_snprintf(key, sizeof(key), "Filename%d", num); filename = gnome_config_get_string(key); item = SIDEBAR_ITEM(sidebar_item_new(title, icon, filename, SIDEBAR_ITEM_STOCK_NONE)); g_assert(item != NULL); sidebar_add_item(sidebar, item); g_free(title); g_free(icon); g_free(filename); } gnome_config_pop_prefix(); } /** * write sidebar settings using gnome-config */ void sidebar_write(Sidebar* sidebar) { GList* list; gint num; gchar key[256]; SidebarItem* item; g_return_if_fail(IS_SIDEBAR(sidebar)); g_snprintf(key, sizeof(key), "=%s=/sidebar/", sidebar->filename); gnome_config_clean_section(key); gnome_config_push_prefix(key); num = 0; list = sidebar->items; while(list != NULL && list->data != NULL) { item = list->data; g_assert(IS_SIDEBAR_ITEM(item)); if(!sidebar_item_is_stock(item)) { num++; g_snprintf(key, sizeof(key), "Title%d", num); gnome_config_set_string(key, item->title); g_snprintf(key, sizeof(key), "Icon%d", num); gnome_config_set_string(key, item->icon); g_snprintf(key, sizeof(key), "Filename%d", num); gnome_config_set_string(key, item->filename); } list = g_list_next(list); } gnome_config_set_int("NumberOfPlaylists", num); gnome_config_pop_prefix(); gnome_config_sync(); } /** * add an item widget to sidebar */ void sidebar_add_item(Sidebar* sidebar, SidebarItem* item) { g_return_if_fail(IS_SIDEBAR(sidebar)); g_return_if_fail(IS_SIDEBAR_ITEM(item)); sidebar->items = g_list_append(sidebar->items, item); gtk_radio_button_set_group(GTK_RADIO_BUTTON(item), sidebar->items_rbg); sidebar->items_rbg = gtk_radio_button_get_group(GTK_RADIO_BUTTON(item)); gtk_widget_show_all(GTK_WIDGET(item)); g_signal_connect(G_OBJECT(item), "button-press-event", G_CALLBACK(item_rbtn_button_press_event_cb), sidebar); g_signal_connect(G_OBJECT(item), "toggled", G_CALLBACK(item_rbtn_toggled_cb), item); gtk_box_pack_start(GTK_BOX(sidebar), GTK_WIDGET(item), FALSE, FALSE, 0); } /** * remove the sidebar item */ void sidebar_remove_item(Sidebar* sidebar, SidebarItem* item) { gboolean active; GList* list; GList* next; g_return_if_fail(IS_SIDEBAR(sidebar)); g_return_if_fail(IS_SIDEBAR_ITEM(item)); list = g_list_find(sidebar->items, item); next = g_list_next(list); if(next == NULL) next = g_list_previous(list); active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(item)); gtk_widget_destroy(GTK_WIDGET(item)); if(next != NULL) { sidebar->items_rbg = gtk_radio_button_get_group( GTK_RADIO_BUTTON(next->data)); if(active) { gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(next->data), TRUE); } } else { sidebar->items_rbg = NULL; } sidebar->items = g_list_remove(sidebar->items, item); } SidebarItem* sidebar_get_active_item(Sidebar* sidebar) { GList* list; SidebarItem* item; g_return_if_fail(IS_SIDEBAR(sidebar)); list = sidebar->items; while(list != NULL && list->data != NULL) { item = list->data; if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(item))) { return item; } list = g_list_next(list); } return NULL; } void sidebar_refresh(Sidebar* sidebar) { GList* list; SidebarItem* item; g_return_if_fail(IS_SIDEBAR(sidebar)); list = sidebar->items; while(list != NULL && list->data != NULL) { item = list->data; g_assert(IS_SIDEBAR_ITEM(item)); sidebar_item_refresh(item); list = g_list_next(list); } } void sidebar_show_dialog(Sidebar* sidebar) { SidebarItem* item; item = sidebar_get_active_item(sidebar); if(item == NULL) return; if(sidebar_item_show_dialog(item)) { sidebar_write(sidebar); } } /*-----------------------------------------------------------------*/ // // callbacks // static gboolean item_rbtn_button_press_event_cb( GtkButton* button, GdkEventButton* event, Sidebar* sidebar) { if(event->button == 3) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); gnome_popup_menu_do_popup( liteamp.sidebar_popup_menu, NULL, NULL, event, sidebar, GTK_WIDGET(button)); return TRUE;//consume event } return FALSE;//bypass event } static void item_rbtn_toggled_cb( GtkToggleButton* togglebutton, SidebarItem* item) { if(gtk_toggle_button_get_active(togglebutton)) { liteamp_read_tracks(item); } } /*sidebar.c*/