X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fadd_route_dialog.cc;h=57c9cc2719a4b00c0a2e72f24d5c51a024192d92;hb=2bb22d2a14ead4e14bc842237219a893e1226980;hp=433cd6e43695d5cc16f274730dff61188eb17fcd;hpb=b98712ff5b5853b4307032a6e6279ba74bc24c39;p=ardour.git diff --git a/gtk2_ardour/add_route_dialog.cc b/gtk2_ardour/add_route_dialog.cc index 433cd6e436..57c9cc2719 100644 --- a/gtk2_ardour/add_route_dialog.cc +++ b/gtk2_ardour/add_route_dialog.cc @@ -58,18 +58,18 @@ using namespace ARDOUR; using namespace ARDOUR_UI_UTILS; std::vector AddRouteDialog::channel_combo_strings; +std::vector > AddRouteDialog::builtin_types; AddRouteDialog::AddRouteDialog () : ArdourDialog (_("Add Track/Bus/VCA")) , routes_adjustment (1, 1, 128, 1, 4) , routes_spinner (routes_adjustment) , configuration_label (_("Configuration:")) - , manual_label (_("Manual Configuration:")) + , manual_label (_("Configuration:")) , add_label (_("Add:")) - , type_label (_("Type:")) , name_label (_("Name:")) , group_label (_("Group:")) - , insert_label (_("Insert At:")) + , insert_label (_("Position:")) , strict_io_label (_("Pin Mode:")) , mode_label (_("Record Mode:")) , instrument_label (_("Instrument:")) @@ -87,13 +87,102 @@ AddRouteDialog::AddRouteDialog () refill_track_modes (); - track_bus_combo.append_text (_("Audio Tracks")); - track_bus_combo.append_text (_("MIDI Tracks")); - track_bus_combo.append_text (_("Audio+MIDI Tracks")); - track_bus_combo.append_text (_("Audio Busses")); - track_bus_combo.append_text (_("MIDI Busses")); - track_bus_combo.append_text (_("VCA Masters")); - track_bus_combo.set_active (0); + if (builtin_types.empty()) { + builtin_types.push_back ( + std::pair(_("Audio Tracks"), _(" \ +Use the settings, below, to create 1 or more new Audio tracks.\n \ +\n\n \ +You may select:\n \ +* The number of tracks to add.\n \ +* A Name for the new track(s).\n \ +* Mono, Stereo, or Multichannel operation for the new track(s).\n \ +* A Group which the track will be assigned to.\n \ +* The Pin Connections mode. (see tooltip for details).\n \ +* Normal (non-destructive) or Tape (destructive) recording mode.\n \ +\n \ +The track will be added in the location specified by \"Position\".\n \ +") + )); + builtin_types.push_back ( + std::pair(_("MIDI Tracks"), _(" \ +Use the settings, below, to create 1 or more new MIDI tracks.\n \ +\n\n \ +You may select:\n \ +* The number of tracks to add.\n \ +* A Name for the track(s).\n \ +* An Instrument plugin (or select \"None\" to drive an external device)\n \ +* A Group which the track will be assigned to.\n \ +* The Pin Connections mode. (see tooltip for details)\n \ +\n \ +The track will be added in the location specified by \"Position\".\n \ +") + )); + builtin_types.push_back ( + std::pair(_("Audio+MIDI Tracks"), _(" \ +Use the settings, below, to create 1 or more new Audio+MIDI tracks.\n \ +\n\n \ +You may select:\n \ +* The number of tracks to add.\n \ +* A Name for the track(s).\n \ +* An Instrument plugin (or select \"None\" to drive an external device)\n \ +* A Group which will be assigned to the track(s).\n \ +* Pin Connections mode. (see tooltip for details).\n \ +* Normal (non-destructive) or Tape (destructive) recording mode.\n \ +\n \ +The track will be added in the location specified by \"Position\".\n \ +") + )); + builtin_types.push_back ( + std::pair(_("Audio Busses"), _(" \ +Use the settings, below, to create new Audio Busses.\n \ +\n\n \ +You may select:\n \ +* The number of busses to add.\n \ +* A Name for the busses.\n \ +* A Group which will be assigned to the Busses.\n \ +* Pin Connections mode. (see tooltip for details).\n \ +\n \ +The Busses will be added in the location specified by \"Position\".\n \ +") + )); + builtin_types.push_back ( + std::pair(_("MIDI Busses"), _(" \ +Use the settings, below, to create new MIDI Busses.\n \ +\n \ +MIDI Busses can combine the output of multiple tracks. \n \ +MIDI Busses are sometimes used to host a single \"heavy\" instrument plugin which is fed from multiple MIDI tracks. \ +\n\n \ +You may select:\n \ +* The number of busses to add.\n \ +* A Name for the busses.\n \ +* An Instrument plugin (or select \"None\" to drive an external device)\n \ +* A Group which will be assigned to the busses.\n \ +* Pin Connections mode. (see tooltip for details).\n \ +\n \ +The busses will be added in the location specified by \"Position\".\n \ +") + )); + builtin_types.push_back ( + std::pair(_("VCA Masters"), _(" \ +Use the settings, below, to create 1 or more VCA Master(s).\n \ +\n\n \ +You may select:\n \ +* The number of VCAs to add.\n \ +* A name for the new VCAs. \"%n\" will be replaced by an index number for each VCA.\n \ +") + )); + builtin_types.push_back ( + std::pair(_("Listen Busses"), _(" \ +Use the settings, below, to create new Listen Busses.\n \ +Listen Busses are used as master outputs for monitor channels which are fed by\n \ +hidden monitor sends.\n \ +\n\n \ +You may select:\n \ +* The number of Listen Busses to add.\n \ +* A name for the new Listen Busses.\n \ +") + )); + } insert_at_combo.append_text (_("First")); insert_at_combo.append_text (_("Before Selection")); @@ -105,16 +194,17 @@ AddRouteDialog::AddRouteDialog () strict_io_combo.append_text (_("Strict-I/O")); strict_io_combo.set_active (Config->get_strict_io () ? 1 : 0); + /* top-level VBox */ VBox* vbox = manage (new VBox); - get_vbox()->set_spacing (4); - vbox->set_spacing (18); vbox->set_border_width (5); + /* this box contains the template chooser, and the template details */ HBox* template_hbox = manage (new HBox); template_hbox->set_spacing (8); + /* scrollbars for the template chooser and template descriptions.... */ Gtk::ScrolledWindow *template_scroller = manage (new Gtk::ScrolledWindow()); template_scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); template_scroller->add (trk_template_chooser); @@ -123,18 +213,19 @@ AddRouteDialog::AddRouteDialog () desc_scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); desc_scroller->add (trk_template_desc); - template_hbox->pack_start (*template_scroller, true, true); + /* this is the outer sample that surrounds the description and the settings-table */ + trk_template_outer_frame.set_name (X_("TextHighlightFrame")); + /* this is the "inner frame" that surrounds the description text */ trk_template_desc_frame.set_name (X_("TextHighlightFrame")); trk_template_desc_frame.add (*desc_scroller); - template_hbox->pack_start (trk_template_desc_frame, true, true); /* template_chooser is the treeview showing available templates */ trk_template_model = TreeStore::create (track_template_columns); trk_template_chooser.set_model (trk_template_model); - trk_template_chooser.append_column (_("Template"), track_template_columns.name); + trk_template_chooser.append_column (_("Template/Type"), track_template_columns.name); #ifdef MIXBUS - trk_template_chooser.append_column (_("Created With"), track_template_columns.created_with); + trk_template_chooser.append_column (_("Modified With"), track_template_columns.modified_with); #endif trk_template_chooser.set_headers_visible (true); trk_template_chooser.get_selection()->set_mode (SELECTION_SINGLE); @@ -149,109 +240,118 @@ AddRouteDialog::AddRouteDialog () trk_template_desc.set_name (X_("TextOnBackground")); trk_template_desc.set_border_width (6); + Table *settings_table = manage (new Table (2, 6, false)); + settings_table->set_row_spacings (8); + settings_table->set_col_spacings (4); + settings_table->set_col_spacing (3, 20); + settings_table->set_border_width (12); + + VBox* settings_vbox = manage (new VBox); + settings_vbox->pack_start(trk_template_desc_frame , true, true); + settings_vbox->pack_start(*settings_table , true, true); + settings_vbox->set_border_width (4); + + trk_template_outer_frame.add (*settings_vbox); + + template_hbox->pack_start (*template_scroller, true, true); + template_hbox->pack_start (trk_template_outer_frame, true, true); + vbox->pack_start (*template_hbox, true, true); + + /* Now pack the "settings table" with manual controls (these controls are sensitized by the left-side selection) */ + + int n = 0; + HBox *separator_hbox = manage (new HBox); separator_hbox->pack_start (manual_label, false, false); separator_hbox->pack_start (*(manage (new Gtk::HSeparator)), true, true); separator_hbox->set_spacing (6); - vbox->pack_start (*separator_hbox, true, true); - - /* track/bus choice */ - - Table *add_table = manage (new Table (8, 8, false)); - add_table->set_row_spacings (8); - add_table->set_col_spacings (3); - add_table->set_col_spacing (1, 12); - add_table->set_col_spacing (3, 12); - add_table->set_col_spacing (5, 12); - add_table->set_border_width (0); + settings_table->attach (*separator_hbox, 0, 6, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); - int n = 0; + ++n; - // Number + /* Number */ add_label.set_alignment (Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER); - add_table->attach (add_label, 0, 1, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); - add_table->attach (routes_spinner, 1, 2, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); + settings_table->attach (add_label, 0, 1, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); + Gtk::Alignment *align = manage (new Alignment (0, .5, 0, 0)); + align->add (routes_spinner); + settings_table->attach (*align, 1, 2, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); - // Type - type_label.set_alignment (Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER); - add_table->attach (type_label, 2,3, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); - add_table->attach (track_bus_combo, 3, 4, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); + ++n; - // Name + /* Name */ name_label.set_alignment (Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER); - add_table->attach (name_label, 4, 5, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); - add_table->attach (name_template_entry, 5, 8, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0); + settings_table->attach (name_label, 0, 1, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); + settings_table->attach (name_template_entry, 1, 3, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); - ++n; - - // Route configuration + /* Route configuration */ configuration_label.set_alignment (Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER); - add_table->attach (configuration_label, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); - add_table->attach (channel_combo, 3, 4, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0); - - // Group choice - group_label.set_alignment (Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER); - add_table->attach (group_label, 4, 5, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); - add_table->attach (route_group_combo, 5, 8, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0); + settings_table->attach (configuration_label, 4, 5, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); + settings_table->attach (channel_combo, 5, 6, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); ++n; - // instrument choice (for MIDI) + /* instrument choice (for MIDI) */ instrument_label.set_alignment (Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER); - add_table->attach (instrument_label, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); - add_table->attach (instrument_combo, 3, 4, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0); + settings_table->attach (instrument_label, 0, 1, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); + settings_table->attach (instrument_combo, 1, 3, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); + + /* Group choice */ + group_label.set_alignment (Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER); + settings_table->attach (group_label, 4, 5, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); + settings_table->attach (route_group_combo, 5, 6, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); ++n; - // New Route's I/O is.. {strict/flexible} + /* New Route's I/O is.. {strict/flexible} */ if (Profile->get_mixbus ()) { strict_io_combo.set_active (1); } else { strict_io_label.set_alignment (Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER); - add_table->attach (strict_io_label, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); - add_table->attach (strict_io_combo, 3, 4, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0); + settings_table->attach (strict_io_label, 0, 1, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); + settings_table->attach (strict_io_combo, 1, 3, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); ArdourWidgets::set_tooltip (strict_io_combo, _("With strict-i/o enabled, Effect Processors will not modify the number of channels on a track. The number of output channels will always match the number of input channels.")); - // recording mode + /* recording mode */ mode_label.set_alignment (Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER); - add_table->attach (mode_label, 4, 5, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); - add_table->attach (mode_combo, 5, 8, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0); + settings_table->attach (mode_label, 4, 5, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); + settings_table->attach (mode_combo, 5, 6, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); ++n; } - // Separator - ++n; - add_table->attach (*(manage (new Gtk::HSeparator)), 0, 8, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); + HBox* outer_box = manage (new HBox); + outer_box->set_spacing (4); - ++n; - ++n; - // New route will be inserted at.. + /* New route will be inserted at.. */ insert_label.set_alignment (Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER); - add_table->attach (insert_label, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); - add_table->attach (insert_at_combo, 3, 4, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0); + outer_box->pack_start (insert_label, false, false); + outer_box->pack_start (insert_at_combo, false, false); + /* quick-add button (add item but don't close dialog) */ Gtk::Button* addnoclose_button = manage (new Gtk::Button(_("Add selected items (and leave dialog open)"))); addnoclose_button->set_can_default (); addnoclose_button->signal_clicked ().connect (sigc::bind (sigc::mem_fun (*this, &Gtk::Dialog::response), Add)); - add_table->attach (*addnoclose_button, 5, 8, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0); + outer_box->pack_end (*addnoclose_button, false, false); - vbox->pack_start (*add_table, false, true); + vbox->pack_start (*outer_box, true, true); get_vbox()->pack_start (*vbox, false, false); name_template_entry.signal_insert_text ().connect (sigc::mem_fun (*this, &AddRouteDialog::name_template_entry_insertion)); name_template_entry.signal_delete_text ().connect (sigc::mem_fun (*this, &AddRouteDialog::name_template_entry_deletion)); - track_bus_combo.signal_changed().connect (sigc::mem_fun (*this, &AddRouteDialog::track_type_chosen)); channel_combo.signal_changed().connect (sigc::mem_fun (*this, &AddRouteDialog::channel_combo_changed)); channel_combo.set_row_separator_func (sigc::mem_fun (*this, &AddRouteDialog::channel_separator)); route_group_combo.set_row_separator_func (sigc::mem_fun (*this, &AddRouteDialog::route_separator)); route_group_combo.signal_changed ().connect (sigc::mem_fun (*this, &AddRouteDialog::group_changed)); + routes_spinner.signal_activate ().connect (sigc::bind (sigc::mem_fun (*this, &Gtk::Dialog::response), AddAndClose)); + name_template_entry.signal_activate ().connect (sigc::bind (sigc::mem_fun (*this, &Gtk::Dialog::response), AddAndClose)); + trk_template_chooser.signal_row_activated ().connect (sigc::hide (sigc::hide (sigc::bind (sigc::mem_fun (*this, &Gtk::Dialog::response), AddAndClose)))); + show_all_children (); /* track template info will be managed whenever @@ -262,7 +362,7 @@ AddRouteDialog::AddRouteDialog () set_response_sensitive (AddAndClose, true); set_default_response (AddAndClose); - track_type_chosen (); + refill_channel_setups (); } AddRouteDialog::~AddRouteDialog () @@ -272,7 +372,7 @@ AddRouteDialog::~AddRouteDialog () void AddRouteDialog::on_response (int r) { - name_edited_by_user = false; + reset_name_edited (); /* Don't call ArdourDialog::on_response() because that will automatically hide the dialog. */ @@ -282,131 +382,132 @@ AddRouteDialog::on_response (int r) void AddRouteDialog::trk_template_row_selected () { - if (trk_template_chooser.get_selection()->count_selected_rows() > 0) { - TreeIter iter = trk_template_chooser.get_selection ()->get_selected (); + if (trk_template_chooser.get_selection()->count_selected_rows() != 1) { + return; + } - if (!iter) { - return; - } + TreeIter iter = trk_template_chooser.get_selection ()->get_selected (); + assert (iter); - string d = (*iter)[track_template_columns.description]; - trk_template_desc.get_buffer ()->set_text (d); + string d = (*iter)[track_template_columns.description]; + trk_template_desc.get_buffer ()->set_text (d); - const string n = (*iter)[track_template_columns.name]; - const string p = (*iter)[track_template_columns.path]; + const string n = (*iter)[track_template_columns.name]; + const string p = (*iter)[track_template_columns.path]; - if ( n != _("Manual Configuration") && p.substr (0, 11) == "urn:ardour:") { - /* lua script - meta-template */ - const std::map rs (ARDOUR_UI::instance()->route_setup_info (p.substr (11))); + if (p.substr (0, 11) == "urn:ardour:") { + /* lua script - meta-template */ + const std::map rs (ARDOUR_UI::instance()->route_setup_info (p.substr (11))); - trk_template_desc.set_sensitive (true); + trk_template_desc.set_sensitive (true); - manual_label.set_sensitive (false); - add_label.set_sensitive (false); - type_label.set_sensitive (false); + add_label.set_sensitive (rs.find ("how_many") != rs.end ()); + name_label.set_sensitive (rs.find ("name") != rs.end()); + group_label.set_sensitive (rs.find ("group") != rs.end()); + configuration_label.set_sensitive (rs.find ("channels") != rs.end ()); + mode_label.set_sensitive (rs.find ("track_mode") != rs.end ()); + instrument_label.set_sensitive (rs.find ("instrument") != rs.end ()); + strict_io_label.set_sensitive (rs.find ("strict_io") != rs.end()); - name_label.set_sensitive (rs.find ("name") != rs.end()); - group_label.set_sensitive (rs.find ("group") != rs.end()); - strict_io_label.set_sensitive (rs.find ("strict_io") != rs.end()); - configuration_label.set_sensitive (rs.find ("channels") != rs.end ()); - mode_label.set_sensitive (rs.find ("track_mode") != rs.end ()); - instrument_label.set_sensitive (rs.find ("instrument") != rs.end ()); - strict_io_label.set_sensitive (rs.find ("strict_io") != rs.end()); + routes_spinner.set_sensitive (rs.find ("how_many") != rs.end ()); + name_template_entry.set_sensitive (rs.find ("name") != rs.end ()); + route_group_combo.set_sensitive (rs.find ("group") != rs.end()); + channel_combo.set_sensitive (rs.find ("channels") != rs.end ()); + mode_combo.set_sensitive (rs.find ("track_mode") != rs.end ()); + instrument_combo.set_sensitive (rs.find ("instrument") != rs.end ()); + strict_io_combo.set_sensitive (rs.find ("strict_io") != rs.end()); - track_bus_combo.set_sensitive (false); - routes_spinner.set_sensitive (rs.find ("how_many") != rs.end ()); - name_template_entry.set_sensitive (rs.find ("name") != rs.end ()); - route_group_combo.set_sensitive (rs.find ("group") != rs.end()); - channel_combo.set_sensitive (rs.find ("channels") != rs.end ()); - mode_combo.set_sensitive (rs.find ("track_mode") != rs.end ()); - instrument_combo.set_sensitive (rs.find ("instrument") != rs.end ()); - strict_io_combo.set_sensitive (rs.find ("strict_io") != rs.end()); + bool any_enabled = rs.find ("how_many") != rs.end () + || rs.find ("name") != rs.end () + || rs.find ("group") != rs.end() + || rs.find ("channels") != rs.end () + || rs.find ("track_mode") != rs.end () + || rs.find ("instrument") != rs.end () + || rs.find ("strict_io") != rs.end(); - std::map::const_iterator it; + manual_label.set_sensitive (any_enabled); - if ((it = rs.find ("name")) != rs.end()) { - name_template_entry.set_text (it->second); - } + std::map::const_iterator it; + + if ((it = rs.find ("name")) != rs.end()) { + name_template_entry.set_text (it->second); + } else { + name_template_entry.set_text (""); + } - if ((it = rs.find ("how_many")) != rs.end()) { + if ((it = rs.find ("how_many")) != rs.end()) { + if (atoi (it->second.c_str()) > 0) { routes_adjustment.set_value (atoi (it->second.c_str())); } + } - if ((it = rs.find ("track_mode")) != rs.end()) { - switch ((ARDOUR::TrackMode) atoi (it->second.c_str())) { - case ARDOUR::Normal: - mode_combo.set_active_text (_("Normal")); - break; -#ifdef XXX_OLD_DESTRUCTIVE_API_XXX - case ARDOUR::NonLayered: - mode_combo.set_active_text (_("Nn Layered")); - break; -#endif - case ARDOUR::Destructive: - if (!ARDOUR::Profile->get_mixbus ()) { - mode_combo.set_active_text (_("Tape")); - } - break; - } + if ((it = rs.find ("track_mode")) != rs.end()) { + switch ((ARDOUR::TrackMode) atoi (it->second.c_str())) { + case ARDOUR::Normal: + mode_combo.set_active_text (_("Normal")); + break; + case ARDOUR::Destructive: + if (!ARDOUR::Profile->get_mixbus ()) { + mode_combo.set_active_text (_("Tape")); + } + break; + default: // "NonLayered" enum is still present for session-format compat + break; } + } - if ((it = rs.find ("strict_io")) != rs.end()) { - if (it->second == X_("true")) { - strict_io_combo.set_active (1); - } else if (it->second == X_("false")) { - strict_io_combo.set_active (0); - } + if ((it = rs.find ("strict_io")) != rs.end()) { + if (it->second == X_("true")) { + strict_io_combo.set_active (1); + } else if (it->second == X_("false")) { + strict_io_combo.set_active (0); } + } - if ((it = rs.find ("channels")) != rs.end()) { - uint32_t channels = atoi (it->second.c_str()); - for (ChannelSetups::iterator i = channel_setups.begin(); i != channel_setups.end(); ++i) { - if ((*i).channels == channels) { - channel_combo.set_active_text ((*i).name); - break; - } + if ((it = rs.find ("channels")) != rs.end()) { + uint32_t channels = atoi (it->second.c_str()); + for (ChannelSetups::iterator i = channel_setups.begin(); i != channel_setups.end(); ++i) { + if ((*i).channels == channels) { + channel_combo.set_active_text ((*i).name); + break; } } + } - } else if ( n != _("Manual Configuration")) { - /* user-template */ - trk_template_desc.set_sensitive (true); - - manual_label.set_sensitive (false); - add_label.set_sensitive (false); - type_label.set_sensitive (false); - name_label.set_sensitive (true); - group_label.set_sensitive (false); - strict_io_label.set_sensitive (false); - configuration_label.set_sensitive (false); - mode_label.set_sensitive (false); - instrument_label.set_sensitive (false); - - routes_spinner.set_sensitive (true); - track_bus_combo.set_sensitive (false); - name_template_entry.set_sensitive (true); - channel_combo.set_sensitive (false); - mode_combo.set_sensitive (false); - instrument_combo.set_sensitive (false); - strict_io_combo.set_sensitive (false); - route_group_combo.set_sensitive (false); + } else if (!p.empty ()) { + /* user-template */ + trk_template_desc.set_sensitive (true); - } else { - /* all manual mode */ - trk_template_desc.set_sensitive (false); - - manual_label.set_sensitive (true); - add_label.set_sensitive (true); - type_label.set_sensitive (true); - name_label.set_sensitive (true); - group_label.set_sensitive (true); - strict_io_label.set_sensitive (true); - - track_bus_combo.set_sensitive (true); - routes_spinner.set_sensitive (true); - name_template_entry.set_sensitive (true); - track_type_chosen (); - } + manual_label.set_sensitive (true); + add_label.set_sensitive (true); + name_label.set_sensitive (true); + group_label.set_sensitive (false); + strict_io_label.set_sensitive (false); + configuration_label.set_sensitive (false); + mode_label.set_sensitive (false); + instrument_label.set_sensitive (false); + + routes_spinner.set_sensitive (true); + name_template_entry.set_sensitive (true); + channel_combo.set_sensitive (false); + mode_combo.set_sensitive (false); + instrument_combo.set_sensitive (false); + strict_io_combo.set_sensitive (false); + route_group_combo.set_sensitive (false); + + } else { + /* all manual mode */ + trk_template_desc.set_sensitive (false); + + manual_label.set_sensitive (true); + add_label.set_sensitive (true); + name_label.set_sensitive (true); + group_label.set_sensitive (true); + strict_io_label.set_sensitive (true); + + routes_spinner.set_sensitive (true); + name_template_entry.set_sensitive (true); + track_type_chosen (); } } @@ -414,13 +515,21 @@ AddRouteDialog::trk_template_row_selected () void AddRouteDialog::name_template_entry_insertion (Glib::ustring const &,int*) { - name_edited_by_user = true; + if (name_template ().empty ()) { + name_edited_by_user = false; + } else { + name_edited_by_user = true; + } } void AddRouteDialog::name_template_entry_deletion (int, int) { - name_edited_by_user = true; + if (name_template ().empty ()) { + name_edited_by_user = false; + } else { + name_edited_by_user = true; + } } void @@ -433,13 +542,13 @@ std::string AddRouteDialog::get_template_path () { string p; - + if (trk_template_chooser.get_selection()->count_selected_rows() > 0) { TreeIter iter = trk_template_chooser.get_selection()->get_selected(); if (iter) { string n = (*iter)[track_template_columns.name]; - if ( n != _("Manual Configuration") ) { + if (n != _("Manual Configuration")) { p = (*iter)[track_template_columns.path]; } } @@ -450,9 +559,15 @@ AddRouteDialog::get_template_path () AddRouteDialog::TypeWanted -AddRouteDialog::type_wanted() const +AddRouteDialog::type_wanted() { - std::string str = track_bus_combo.get_active_text(); + if (trk_template_chooser.get_selection()->count_selected_rows() != 1) { + return AudioTrack; + } + TreeIter iter = trk_template_chooser.get_selection ()->get_selected (); + assert (iter); + + const string str = (*iter)[track_template_columns.name]; if (str == _("Audio Busses")) { return AudioBus; } else if (str == _("MIDI Busses")){ @@ -463,8 +578,13 @@ AddRouteDialog::type_wanted() const return MixedTrack; } else if (str == _("Audio Tracks")) { return AudioTrack; - } else { + } else if (str == _("VCA Masters")) { return VCAMaster; + } else if (str == _("Listen Busses")) { + return ListenBus; + } else { + assert (0); + return AudioTrack; } } @@ -489,11 +609,15 @@ AddRouteDialog::maybe_update_name_template_entry () case MidiBus: name_template_entry.set_text (_("Bus")); break; + case ListenBus: + name_template_entry.set_text (_("Listener")); + break; case VCAMaster: name_template_entry.set_text (VCA::default_name_template()); break; } - name_edited_by_user = false; + /* ignore programatic change, restore false */ + reset_name_edited (); } void @@ -501,26 +625,46 @@ AddRouteDialog::track_type_chosen () { switch (type_wanted()) { case AudioTrack: - mode_combo.set_sensitive (true); - channel_combo.set_sensitive (true); - instrument_combo.set_sensitive (false); + configuration_label.set_sensitive (true); + channel_combo.set_sensitive (true); + mode_label.set_sensitive (true); + mode_combo.set_sensitive (true); + instrument_label.set_sensitive (false); + instrument_combo.set_sensitive (false); + + group_label.set_sensitive (true); route_group_combo.set_sensitive (true); + + strict_io_label.set_sensitive (true); strict_io_combo.set_sensitive (true); + + insert_label.set_sensitive (true); insert_at_combo.set_sensitive (true); + break; case MidiTrack: - channel_combo.set_sensitive (false); - mode_combo.set_sensitive (false); - instrument_combo.set_sensitive (true); + configuration_label.set_sensitive (false); + channel_combo.set_sensitive (false); + mode_label.set_sensitive (false); + mode_combo.set_sensitive (false); + instrument_label.set_sensitive (true); + instrument_combo.set_sensitive (true); + + group_label.set_sensitive (true); route_group_combo.set_sensitive (true); + + strict_io_label.set_sensitive (true); strict_io_combo.set_sensitive (true); + + insert_label.set_sensitive (true); insert_at_combo.set_sensitive (true); + break; case MixedTrack: { @@ -530,52 +674,113 @@ AddRouteDialog::track_type_chosen () msg.set_position (WIN_POS_MOUSE); msg.run (); } - channel_combo.set_sensitive (true); - mode_combo.set_sensitive (true); - instrument_combo.set_sensitive (true); + configuration_label.set_sensitive (true); + channel_combo.set_sensitive (true); + mode_label.set_sensitive (true); + mode_combo.set_sensitive (true); + instrument_label.set_sensitive (true); + instrument_combo.set_sensitive (true); + + group_label.set_sensitive (true); route_group_combo.set_sensitive (true); + + strict_io_label.set_sensitive (true); strict_io_combo.set_sensitive (true); + + insert_label.set_sensitive (true); insert_at_combo.set_sensitive (true); + break; case AudioBus: - mode_combo.set_sensitive (false); - channel_combo.set_sensitive (true); - instrument_combo.set_sensitive (false); + configuration_label.set_sensitive (true); - mode_label.set_sensitive (true); + channel_combo.set_sensitive (true); + + mode_label.set_sensitive (false); + mode_combo.set_sensitive (false); + instrument_label.set_sensitive (false); + instrument_combo.set_sensitive (false); + + group_label.set_sensitive (true); route_group_combo.set_sensitive (true); + + strict_io_label.set_sensitive (true); strict_io_combo.set_sensitive (true); + + insert_label.set_sensitive (true); insert_at_combo.set_sensitive (true); + break; case VCAMaster: - mode_combo.set_sensitive (false); - channel_combo.set_sensitive (false); - instrument_combo.set_sensitive (false); + configuration_label.set_sensitive (false); + channel_combo.set_sensitive (false); + mode_label.set_sensitive (false); + mode_combo.set_sensitive (false); + instrument_label.set_sensitive (false); + instrument_combo.set_sensitive (false); + + group_label.set_sensitive (false); route_group_combo.set_sensitive (false); + + strict_io_label.set_sensitive (false); strict_io_combo.set_sensitive (false); + + insert_label.set_sensitive (false); insert_at_combo.set_sensitive (false); + break; case MidiBus: - mode_combo.set_sensitive (false); - channel_combo.set_sensitive (false); - instrument_combo.set_sensitive (true); + configuration_label.set_sensitive (false); - mode_label.set_sensitive (true); + channel_combo.set_sensitive (false); + + mode_label.set_sensitive (false); + mode_combo.set_sensitive (false); + instrument_label.set_sensitive (true); + instrument_combo.set_sensitive (true); + + group_label.set_sensitive (true); + route_group_combo.set_sensitive (true); + + strict_io_label.set_sensitive (true); strict_io_combo.set_sensitive (true); + + insert_label.set_sensitive (true); insert_at_combo.set_sensitive (true); + + break; + case ListenBus: + + configuration_label.set_sensitive (false); + channel_combo.set_sensitive (false); + + mode_label.set_sensitive (false); + mode_combo.set_sensitive (false); + + instrument_label.set_sensitive (false); + instrument_combo.set_sensitive (false); + + group_label.set_sensitive (false); + route_group_combo.set_sensitive (false); + + strict_io_label.set_sensitive (false); + strict_io_combo.set_sensitive (false); + + insert_label.set_sensitive (false); + insert_at_combo.set_sensitive (false); + break; } maybe_update_name_template_entry (); - } string @@ -612,9 +817,6 @@ AddRouteDialog::refill_track_modes () vector s; s.push_back (_("Normal")); -#ifdef XXX_OLD_DESTRUCTIVE_API_XXX - s.push_back (_("Non Layered")); -#endif if (!ARDOUR::Profile->get_mixbus ()) { s.push_back (_("Tape")); } @@ -661,7 +863,7 @@ AddRouteDialog::channels () switch (type_wanted()) { case AudioTrack: case AudioBus: - ret.set (DataType::MIDI, channel_count ()); + ret.set (DataType::AUDIO, channel_count ()); ret.set (DataType::MIDI, 0); break; @@ -672,9 +874,15 @@ AddRouteDialog::channels () break; case MixedTrack: - ret.set (DataType::MIDI, channel_count ()); + ret.set (DataType::AUDIO, channel_count ()); ret.set (DataType::MIDI, 1); break; + + case ListenBus: + ret.set (DataType::AUDIO, 2); + ret.set (DataType::MIDI, 0); + break; + default: break; } @@ -686,10 +894,10 @@ void AddRouteDialog::on_show () { routes_spinner.grab_focus (); - name_edited_by_user = false; + reset_name_edited (); - refill_channel_setups (); refill_route_groups (); + refill_channel_setups (); Dialog::on_show (); } @@ -751,6 +959,20 @@ AddRouteDialog::refill_channel_setups () } trk_template_model->clear(); + bool selected_default = false; + + for (std::vector >::const_iterator i = builtin_types.begin(); i != builtin_types.end(); ++i) { + TreeModel::Row row = *(trk_template_model->append ()); + row[track_template_columns.name] = (*i).first; + row[track_template_columns.path] = ""; + row[track_template_columns.description] = (*i).second; + row[track_template_columns.modified_with] = ""; + + if (!selected_default && !Profile->get_mixbus ()) { + trk_template_chooser.get_selection()->select(row); + selected_default = true; + } + } /* Add any Lua scripts (factory templates) found in the scripts folder */ LuaScriptList& ms (LuaScripting::instance ().scripts (LuaScriptInfo::EditorAction)); @@ -759,7 +981,8 @@ AddRouteDialog::refill_channel_setups () continue; } TreeModel::Row row; - if ( (*s)->name == "Add tracks") { //somewhat-special, most-used template + if ((*s)->name == "Create Audio Tracks Interactively" && Profile->get_mixbus ()) { + /* somewhat-special, Ben says: "most-used template" */ row = *(trk_template_model->prepend ()); } else { row = *(trk_template_model->append ()); @@ -767,13 +990,19 @@ AddRouteDialog::refill_channel_setups () row[track_template_columns.name] = (*s)->name; row[track_template_columns.path] = "urn:ardour:" + (*s)->path; row[track_template_columns.description] = (*s)->description; - row[track_template_columns.created_with] = _("{Factory Template}"); + row[track_template_columns.modified_with] = _("{Factory Template}"); - if ( (*s)->name == "Add tracks") { //somewhat-special, most-used template + if ((*s)->name == "Create Audio Tracks Interactively" && Profile->get_mixbus ()) { trk_template_chooser.get_selection()->select(row); + selected_default = true; } } + if (!selected_default && !trk_template_model->children().empty()) { + TreeModel::Children rows = trk_template_model->children(); + trk_template_chooser.get_selection()->select(rows[0]); + } + std::vector route_templates; ARDOUR::find_route_templates (route_templates); @@ -783,16 +1012,9 @@ AddRouteDialog::refill_channel_setups () row[track_template_columns.name] = x->name; row[track_template_columns.path] = x->path; row[track_template_columns.description] = x->description; - row[track_template_columns.created_with] = x->created_with; + row[track_template_columns.modified_with] = x->modified_with; } - /* Add a special item for "Manual Configuration" */ - TreeModel::Row row = *(trk_template_model->prepend ()); - row[track_template_columns.name] = _("Manual Configuration"); - row[track_template_columns.path] = "urn:ardour:manual"; - row[track_template_columns.description] = _("Use the controls, below, to add tracks."); - row[track_template_columns.created_with] = ""; - set_popdown_strings (channel_combo, channel_combo_strings); if (!channel_current_choice.empty()) {