using namespace ARDOUR;
using namespace PBD;
+struct EditorOrderRouteSorter {
+ bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
+ return a->order_key () < b->order_key ();
+ }
+};
+
PortExportChannelSelector::PortExportChannelSelector (ARDOUR::Session * session, ProfileManagerPtr manager) :
ExportChannelSelector (session, manager),
channels_label (_("Channels:"), Gtk::ALIGN_LEFT),
split_checkbox.set_active (state->config->get_split());
channels_spinbutton.set_value (state->config->get_n_chans());
+ /* when loading presets, config is ready set here (shared ptr)
+ * fill_route_list () -> update_channel_count () -> set_channel_count () -> update_config()
+ * will call config->clear_channels(); and clear the config
+ */
+ channel_view.set_config (ChannelConfigPtr ());
fill_route_list ();
channel_view.set_config (state->config);
}
channel_view.add_route (master);
}
+ routes.sort (EditorOrderRouteSorter ());
+
for (RouteList::iterator it = routes.begin(); it != routes.end(); ++it) {
if ((*it)->is_master () || (*it)->is_monitor ()) {
continue;
PortExportChannelSelector::RouteCols::get_channel (uint32_t channel)
{
if (channel > n_channels) {
- std::cout << "Invalid channel cout for get_channel!" << std::endl;
+ std::cout << "Invalid channel count for get_channel!" << std::endl;
}
std::list<Channel>::iterator it = channels.begin();
/* Add column with toggle and text */
- append_column_editable (_("Bus or Track"), route_cols.selected);
+ append_column_editable (_("Export"), route_cols.selected);
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 = get_column (0);
+ Gtk::TreeView::Column* column = Gtk::manage (new Gtk::TreeView::Column);
+ column->set_title (_("Bus or Track"));
column->pack_start (*text_renderer);
+ column->set_expand (true);
column->add_attribute (text_renderer->property_text(), route_cols.name);
+ append_column (*column);
Gtk::CellRendererToggle *toggle = dynamic_cast<Gtk::CellRendererToggle *>(get_column_cell_renderer (0));
+ toggle->set_alignment (0.0, 0.5);
toggle->signal_toggled().connect (sigc::mem_fun (*this, &PortExportChannelSelector::ChannelTreeView::update_toggle_selection));
static_columns = get_columns().size();
if (config == c) { return; }
config = c;
+ if (!config) { return; }
uint32_t i = 1;
ExportChannelConfiguration::ChannelList chan_list = config->get_channels();
Gtk::CellRendererCombo* combo_renderer = Gtk::manage (new Gtk::CellRendererCombo);
combo_renderer->property_text_column() = 2;
+ combo_renderer->property_has_entry() = false;
column->pack_start (*combo_renderer);
append_column (*column);
factory.reset (new RegionExportChannelFactory (_session, region, track, type));
state->config->set_region_processing_type (type);
- for (size_t chan = 0; chan < region_chans; ++chan) {
+ const size_t cc = type == RegionExportChannelFactory::Processed ? track_chans : region_chans;
+ for (size_t chan = 0; chan < cc; ++chan) {
state->config->register_channel (factory->create (chan));
}
TrackExportChannelSelector::TrackExportChannelSelector (ARDOUR::Session * session, ProfileManagerPtr manager)
: ExportChannelSelector(session, manager)
- , region_contents_button(source_group, _("Export region contents"))
- , track_output_button(source_group, _("Export track output"))
+ , 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(region_contents_button);
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 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 (_("Track"), track_cols.selected);
+ 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 = track_view.get_column (0);
- column->pack_start (*text_renderer);
+ 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 ();
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()
{
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);
}
}
Gtk::TreeModel::iterator iter = track_list->append();
Gtk::TreeModel::Row row = *iter;
- row[track_cols.selected] = true;
+ row[track_cols.selected] = false;
row[track_cols.label] = route->name();
row[track_cols.route] = route;
+ row[track_cols.order_key] = route->order_key();
}
void
}
state->config->set_name (route->name());
+
}
CriticalSelectionChanged ();