+
+/* Track export channel selector */
+
+TrackExportChannelSelector::TrackExportChannelSelector (ARDOUR::Session * session, ProfileManagerPtr manager)
+ : ExportChannelSelector(session, manager)
+ , track_output_button(_("Apply track/bus processing"))
+ , select_tracks_button (_("Select all tracks"))
+ , select_busses_button (_("Select all busses"))
+ , select_none_button (_("Deselect all"))
+{
+ pack_start(main_layout);
+
+ // Options
+ options_box.pack_start(track_output_button);
+ options_box.pack_start (select_tracks_button);
+ options_box.pack_start (select_busses_button);
+ options_box.pack_start (select_none_button);
+ main_layout.pack_start(options_box, false, false);
+
+ // Track scroller
+ track_scroller.add (track_view);
+ track_scroller.set_size_request (-1, 130);
+ track_scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
+ main_layout.pack_start(track_scroller);
+
+ // Track list
+ track_list = Gtk::ListStore::create (track_cols);
+ track_list->set_sort_column (track_cols.order_key, Gtk::SORT_ASCENDING);
+ track_view.set_model (track_list);
+ track_view.set_headers_visible (true);
+
+ track_view.append_column_editable (_("Export"), track_cols.selected);
+ Gtk::CellRendererToggle *toggle = dynamic_cast<Gtk::CellRendererToggle *>(track_view.get_column_cell_renderer (0));
+ toggle->set_alignment (0.0, 0.5);
+
+ toggle->signal_toggled().connect (sigc::hide (sigc::mem_fun (*this, &TrackExportChannelSelector::update_config)));
+
+ Gtk::CellRendererText* text_renderer = Gtk::manage (new Gtk::CellRendererText);
+ text_renderer->property_editable() = false;
+ text_renderer->set_alignment (0.0, 0.5);
+
+ Gtk::TreeView::Column* column = Gtk::manage (new Gtk::TreeView::Column);
+ column->set_title (_("Track name"));
+
+ track_view.append_column (*column);
+ column->pack_start (*text_renderer, false);
+ column->add_attribute (text_renderer->property_text(), track_cols.label);
+
+ select_tracks_button.signal_clicked().connect (sigc::mem_fun (*this, &TrackExportChannelSelector::select_tracks));
+ select_busses_button.signal_clicked().connect (sigc::mem_fun (*this, &TrackExportChannelSelector::select_busses));
+ select_none_button.signal_clicked().connect (sigc::mem_fun (*this, &TrackExportChannelSelector::select_none));
+
+ track_output_button.signal_clicked().connect (sigc::mem_fun (*this, &TrackExportChannelSelector::track_outputs_selected));
+
+ fill_list();
+
+ show_all_children ();
+}
+
+void
+TrackExportChannelSelector::sync_with_manager ()
+{
+ // TODO implement properly
+ update_config();
+}
+
+void
+TrackExportChannelSelector::select_tracks ()
+{
+ for (Gtk::ListStore::Children::iterator it = track_list->children().begin(); it != track_list->children().end(); ++it) {
+ Gtk::TreeModel::Row row = *it;
+ boost::shared_ptr<Route> route = row[track_cols.route];
+ if (boost::dynamic_pointer_cast<Track> (route)) {
+ // it's a track
+ row[track_cols.selected] = true;
+ }
+ }
+ update_config();
+}
+
+void
+TrackExportChannelSelector::select_busses ()
+{
+ for (Gtk::ListStore::Children::iterator it = track_list->children().begin(); it != track_list->children().end(); ++it) {
+ Gtk::TreeModel::Row row = *it;
+ boost::shared_ptr<Route> route = row[track_cols.route];
+ if (!boost::dynamic_pointer_cast<Track> (route)) {
+ // it's not a track, must be a bus
+ row[track_cols.selected] = true;
+ }
+ }
+ update_config();
+}
+
+void
+TrackExportChannelSelector::select_none ()
+{
+ for (Gtk::ListStore::Children::iterator it = track_list->children().begin(); it != track_list->children().end(); ++it) {
+ Gtk::TreeModel::Row row = *it;
+ row[track_cols.selected] = false;
+ }
+ update_config();
+}
+
+void
+TrackExportChannelSelector::track_outputs_selected ()
+{
+ update_config();
+}
+
+void
+TrackExportChannelSelector::fill_list()
+{
+ track_list->clear();
+ RouteList routes = *_session->get_routes();
+
+ for (RouteList::iterator it = routes.begin(); it != routes.end(); ++it) {
+ if (!boost::dynamic_pointer_cast<Track>(*it)) {
+ // not a track, must be a bus
+ if ((*it)->is_master () || (*it)->is_monitor ()) {
+ continue;
+ }
+ if (!(*it)->active ()) {
+ // don't include inactive busses
+ continue;
+ }
+
+ // not monitor or master bus
+ add_track (*it);
+ }
+ }
+ for (RouteList::iterator it = routes.begin(); it != routes.end(); ++it) {
+ if (boost::dynamic_pointer_cast<AudioTrack>(*it)) {
+ if (!(*it)->active ()) {
+ // don't include inactive tracks
+ continue;
+ }
+ add_track (*it);
+ }
+ }
+}
+
+void
+TrackExportChannelSelector::add_track (boost::shared_ptr<Route> route)
+{
+ Gtk::TreeModel::iterator iter = track_list->append();
+ Gtk::TreeModel::Row row = *iter;
+
+ row[track_cols.selected] = false;
+ row[track_cols.label] = route->name();
+ row[track_cols.route] = route;
+ row[track_cols.order_key] = route->presentation_info().order();
+}
+
+void
+TrackExportChannelSelector::update_config()
+{
+ manager->clear_channel_configs();
+
+ for (Gtk::ListStore::Children::iterator it = track_list->children().begin(); it != track_list->children().end(); ++it) {
+ Gtk::TreeModel::Row row = *it;
+
+ if (!row[track_cols.selected]) {
+ continue;
+ }
+
+ ExportProfileManager::ChannelConfigStatePtr state;
+
+ boost::shared_ptr<Route> route = row[track_cols.route];
+
+ if (track_output_button.get_active()) {
+ uint32_t outs = route->n_outputs().n_audio();
+ for (uint32_t i = 0; i < outs; ++i) {
+ boost::shared_ptr<AudioPort> port = route->output()->audio (i);
+ if (port) {
+ ExportChannelPtr channel (new PortExportChannel ());
+ PortExportChannel * pec = static_cast<PortExportChannel *> (channel.get());
+ pec->add_port(port);
+ if (!state) {
+ state = manager->add_channel_config();
+ }
+ state->config->register_channel(channel);
+ }
+ }
+ } else {
+ std::list<ExportChannelPtr> list;
+ RouteExportChannel::create_from_route (list, route);
+ if (list.size () == 0) {
+ continue;
+ }
+ state = manager->add_channel_config();
+ state->config->register_channels (list);
+ }
+
+ if (state) {
+ state->config->set_name (route->name());
+ }
+
+ }
+
+ CriticalSelectionChanged ();
+}