/* * Copyright 2014 (c) Anna Schumaker. */ #include #include #include #include static Gtk::ToggleButton *o_ban; static Gtk::ToggleButton *o_fav; static class PlaylistColumns : public Gtk::TreeModelColumnRecord { public: Gtk::TreeModelColumn p_name; PlaylistColumns() { add(p_name); } } p_cols; class PlaylistWindow : public Gtk::ScrolledWindow { private: Glib::RefPtr _builder; public: Gtk::TreeView *p_treeview; Glib::RefPtr p_list; PlaylistWindow(BaseObjectType *cobject, const Glib::RefPtr builder) : Gtk::ScrolledWindow(cobject), _builder(builder) { _builder->get_widget("p_treeview", p_treeview); p_list = Glib::RefPtr::cast_static(_builder->get_object("p_list")); p_treeview->signal_cursor_changed().connect(sigc::mem_fun(*this, &PlaylistWindow::on_cursor_changed)); p_treeview->signal_button_press_event().connect(sigc::mem_fun(*this, &PlaylistWindow::on_clicked)); } ~PlaylistWindow() {} Glib::ustring current_playlist() { Gtk::TreePath path; Gtk::TreeModel::Row row; Gtk::TreeViewColumn *col; p_treeview->get_cursor(path, col); row = *(p_list->get_iter(path)); return row[p_cols.p_name]; } void on_cursor_changed() { playlist :: select(current_playlist()); } bool on_clicked(GdkEventButton *button) { return button->button == 3; } }; static class PlaylistTab : public Tab { private: Gtk::HBox playlist_hbox; PlaylistLabel *playlist_label; PlaylistWindow *playlist_window; public: PlaylistTab() : Tab(playlist :: get_queue()) { tab_builder->add_from_file(gui :: share_file("QueueLabel.ui")); tab_builder->add_from_file(gui :: share_file("PlaylistWindow.ui")); tab_builder->get_widget_derived("PlaylistLabel", playlist_label); tab_builder->get_widget_derived("PlaylistWindow", playlist_window); tab_toolbar->init(tab_pq, playlist_label, tab_window, 0); playlist_label->init(tab_pq); tab_label = playlist_label; playlist_hbox.pack_start(*playlist_window, false, true); playlist_hbox.pack_start(*tab_window, true, true); playlist_hbox.show(); tab_vbox.pack_start(playlist_hbox, true, true); gui :: get_widget("o_notebook")->insert_page(tab_vbox, *playlist_label, 0); } ~PlaylistTab() { tab_unmap(); } bool on_key_press_event(const std::string &key) { std::string cur; std::vector ids; if (key != "Delete") return Tab :: on_key_press_event(key); cur = playlist_window->current_playlist(); if (cur == "") return true; tab_selected_ids(ids); for (unsigned int i = 0; i < ids.size(); i++) playlist :: del(tags :: get_track(ids[i]), cur); return true; } } *p_tab; static void on_ban() { Track *track = audio :: current_track(); if (o_ban->get_active()) { if (!playlist :: has(track, "Banned")) { playlist :: add(track, "Banned"); audio :: next(); } } else playlist :: del(track, "Banned"); } static void on_favorite() { Track *track = audio :: current_track(); if (o_fav->get_active()) playlist :: add(track, "Favorites"); else playlist :: del(track, "Favorites"); } void plist :: track_loaded(Track *track) { o_ban->set_active(playlist :: has(track, "Banned")); o_fav->set_active(playlist :: has(track, "Favorites")); } void plist :: init() { p_tab = new PlaylistTab; o_ban = gui :: get_widget("o_ban"); o_fav = gui :: get_widget("o_favorite"); o_ban->signal_toggled().connect(sigc::ptr_fun(on_ban)); o_fav->signal_toggled().connect(sigc::ptr_fun(on_favorite)); }