/* * Copyright 2014 (c) Anna Schumaker. */ #include #include #include #include #include #include #include class OcarinaTab; static std::map tab_map; static class QueueColumns : public Gtk::TreeModelColumnRecord { public: QueueColumns() { add(q_col_track); add(q_col_title); add(q_col_length); add(q_col_artist); add(q_col_album); add(q_col_year); add(q_col_genre); add(q_col_count); add(q_col_played); } Gtk::TreeModelColumn q_col_track; Gtk::TreeModelColumn q_col_title; Gtk::TreeModelColumn q_col_length; Gtk::TreeModelColumn q_col_artist; Gtk::TreeModelColumn q_col_album; Gtk::TreeModelColumn q_col_year; Gtk::TreeModelColumn q_col_genre; Gtk::TreeModelColumn q_col_count; Gtk::TreeModelColumn q_col_played; } queue_cols; static unsigned int q_col_width[] = { 20, 300, 1, 125, 125, 1, 125, 1, 1 }; /* * Tab class definition */ class OcarinaTab { private: Glib::RefPtr model; /* Tab widgets */ Gtk::VBox tab_box; Gtk::Label tab_name; Gtk::Label tab_size; /* Page widgets */ Gtk::VBox page_box; Gtk::HBox page_toolbar; Gtk::SearchEntry page_entry; Gtk::ToggleButton page_random; //Gtk::ToggleButton page_repeat; Gtk::ScrolledWindow page_scroll; Gtk::TreeView page_view; void setup_columns(); void set_tab_size(); public: OcarinaTab(const std::string &, Playqueue *); ~OcarinaTab(); void on_row_inserted(unsigned int); void on_row_deleted(unsigned int); }; OcarinaTab::OcarinaTab(const std::string &text, Playqueue *pq) : tab_name("" + text + "", 1, 0.5), tab_size("0", 1, 0.5) { Gtk::Notebook *notebook; get_builder()->get_widget("o_notebook", notebook); model = Glib::RefPtr(new PlayqueueModel(pq)); /* Make tab label */ tab_name.set_use_markup(); tab_box.pack_start(tab_name); tab_box.pack_start(tab_size); tab_box.show_all(); set_tab_size(); /* Make page content */ page_random.set_image_from_icon_name("media-playlist-shuffle"); page_random.set_active(pq->get_flags() & PQ_RANDOM); //page_repeat.set_image_from_icon_name("media-playlist-repeat"); page_toolbar.set_spacing(5); page_view.append_column("#", queue_cols.q_col_track); page_view.append_column("Title", queue_cols.q_col_title); page_view.append_column("Length", queue_cols.q_col_length); page_view.append_column("Artist", queue_cols.q_col_artist); page_view.append_column("Album", queue_cols.q_col_album); page_view.append_column("Year", queue_cols.q_col_year); page_view.append_column("Genre", queue_cols.q_col_genre); page_view.append_column("Count", queue_cols.q_col_count); page_view.append_column("Played", queue_cols.q_col_played); page_view.set_model(model); page_scroll.add(page_view); setup_columns(); page_toolbar.pack_start(page_entry); page_toolbar.pack_start(page_random, false, false); //page_toolbar.pack_start(page_repeat, false, false); page_box.pack_start(page_toolbar, false, false); page_box.pack_start(page_scroll); page_box.show_all(); /* Add to notebook */ notebook->prepend_page(page_box, tab_box); tab_map[pq] = this; }; OcarinaTab::~OcarinaTab() { Gtk::Notebook *notebook; get_builder()->get_widget("o_notebook", notebook); notebook->remove_page(page_box); tab_map.erase(model->queue); } void OcarinaTab::setup_columns() { std::vector columns = page_view.get_columns(); for (unsigned int i = 0; i < columns.size(); i++) { columns[i]->set_resizable(); columns[i]->set_fixed_width(q_col_width[i]); } } void OcarinaTab::set_tab_size() { std::stringstream ss; ss << model->queue->size(); tab_size.set_text(ss.str()); } void OcarinaTab::on_row_inserted(unsigned int row) { model->on_row_inserted(row); set_tab_size(); } void OcarinaTab::on_row_deleted(unsigned int row) { model->on_row_deleted(row); set_tab_size(); } /* * Do stuff with tabs */ static void on_track_added(Playqueue *pq, unsigned int row) { tab_map[pq]->on_row_inserted(row); } static void on_track_deleted(Playqueue *pq, unsigned int row) { tab_map[pq]->on_row_deleted(row); } void init_tabs() { new OcarinaTab("Library", deck::get_library_pq()); get_callbacks()->on_queue_track_add = on_track_added; get_callbacks()->on_queue_track_del = on_track_deleted; } void cleanup_tabs() { std::map::iterator it; for (it = tab_map.begin(); it != tab_map.end(); it++) delete it->second; }