/* * Copyright 2014 (c) Anna Schumaker. */ extern "C" { #include #include #include #include #include #include } #include #include static Gtk::ToggleButton *o_ban; static Gtk::ToggleButton *o_fav; static class PlaylistTab : public Tab { private: PlaylistLabel *playlist_label; public: PlaylistTab() : Tab(playlist_get_queue()) { tab_builder->add_from_file(gui :: share_file("QueueLabel.ui")); tab_builder->get_widget_derived("PlaylistLabel", playlist_label); tab_toolbar->init(tab_pq, playlist_label, tab_window, 0); playlist_label->init(tab_pq); tab_label = playlist_label; tab_vbox.pack_start(*tab_window, true, true); Glib :: wrap(GTK_NOTEBOOK(gui_builder_widget("o_notebook")), false)->insert_page(tab_vbox, *playlist_label, 0); } ~PlaylistTab() { tab_unmap(); } bool on_key_press_event(const std::string &key) { enum playlist_t cur; std::vector ids; if (key != "Delete") return Tab :: on_key_press_event(key); cur = gui_playlist_cur(); tab_selected_ids(ids); for (unsigned int i = 0; i < ids.size(); i++) if (cur == PL_HIDDEN) collection_unban(track_get(ids[i])); else playlist_remove(cur, track_get(ids[i])); return true; } } *p_tab; static void on_ban() { struct track *track = audio_cur_track(); if (o_ban->get_active()) { if (collection_ban(track)) audio_next(); } else collection_unban(track); } static void on_favorite() { struct track *track = audio_cur_track(); if (o_fav->get_active()) playlist_add(PL_FAVORITED, track); else playlist_remove(PL_FAVORITED, track); } static void *playlist_init(struct queue *queue) { return gui_queue_alloc(queue, "Playlist", 0); } static void playlist_added(struct queue *queue, unsigned int pos) { if (p_tab) p_tab->on_track_added(pos); } static void playlist_removed(struct queue *queue, unsigned int pos) { p_tab->on_track_removed(pos); } static void playlist_cleared(struct queue *queue, unsigned int n) { p_tab->on_tracks_cleared(n); } static void playlist_updated(struct queue *queue, unsigned int pos) { p_tab->on_track_updated(pos); } struct queue_ops playlist_ops = { playlist_init, gui_queue_free, playlist_added, playlist_removed, playlist_cleared, NULL, playlist_updated, }; void plist :: init() { p_tab = new PlaylistTab; o_ban = Glib :: wrap(GTK_TOGGLE_BUTTON(gui_builder_widget("o_hide")), false); o_fav = Glib :: wrap(GTK_TOGGLE_BUTTON(gui_builder_widget("o_favorite")), false); o_ban->signal_toggled().connect(sigc::ptr_fun(on_ban)); o_fav->signal_toggled().connect(sigc::ptr_fun(on_favorite)); }