X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fadd_route_dialog.cc;h=42ae4b2633348b18d09f1cde6cf4c2ceefa2deba;hb=5b2eb6107c3ae056e7c27182008b46b4df5c2b28;hp=e9480c1daceb277ba8dbc04110f651a746d84928;hpb=39a3705d3a79563dfd06c40b5cfe335bd44f7273;p=ardour.git diff --git a/gtk2_ardour/add_route_dialog.cc b/gtk2_ardour/add_route_dialog.cc index e9480c1dac..42ae4b2633 100644 --- a/gtk2_ardour/add_route_dialog.cc +++ b/gtk2_ardour/add_route_dialog.cc @@ -58,7 +58,7 @@ using namespace ARDOUR; using namespace ARDOUR_UI_UTILS; std::vector AddRouteDialog::channel_combo_strings; -std::vector AddRouteDialog::builtin_types; +std::vector > AddRouteDialog::builtin_types; AddRouteDialog::AddRouteDialog () : ArdourDialog (_("Add Track/Bus/VCA")) @@ -88,12 +88,91 @@ AddRouteDialog::AddRouteDialog () refill_track_modes (); if (builtin_types.empty()) { - builtin_types.push_back (_("Audio Tracks")); - builtin_types.push_back (_("MIDI Tracks")); - builtin_types.push_back (_("Audio+MIDI Tracks")); - builtin_types.push_back (_("Audio Busses")); - builtin_types.push_back (_("MIDI Busses")); - builtin_types.push_back (_("VCA Masters")); + 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 Tracks.\n \ +\n\n \ +You may select:\n \ +* The number of buses 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(_("MIDI Busses"), _(" \ +Use the settings, below, to create new MIDI Busses.\n \ +\n \ +MIDI Busses can combine the output of multiple tracks. \n \ +MIDI Buses 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 buses 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 \ +\n \ +The track 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 buses to add.\n \ +* A name for the new VCAs. \"%n\" will be replaced by an index number for each VCA.\n \ +") + )); } insert_at_combo.append_text (_("First")); @@ -106,16 +185,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); @@ -124,18 +204,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/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); @@ -150,92 +231,104 @@ 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); + settings_table->attach (*separator_hbox, 0, 6, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); - /* track/bus choice */ - - Table *add_table = manage (new Table (8, 6, false)); - add_table->set_row_spacings (8); - add_table->set_col_spacings (4); - add_table->set_col_spacing (3, 20); - add_table->set_border_width (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::SHRINK, 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); - add_table->attach (*align, 1, 2, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); + settings_table->attach (*align, 1, 2, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); ++n; - // Name + /* Name */ name_label.set_alignment (Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER); - add_table->attach (name_label, 0, 1, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); - add_table->attach (name_template_entry, 1, 3, n, n + 1, Gtk::FILL, Gtk::SHRINK, 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); - // Route configuration + /* Route configuration */ configuration_label.set_alignment (Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER); - add_table->attach (configuration_label, 4, 5, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); - add_table->attach (channel_combo, 5, 6, n, n + 1, Gtk::FILL, Gtk::SHRINK, 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, 0, 1, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); - add_table->attach (instrument_combo, 1, 3, n, n + 1, Gtk::FILL, Gtk::SHRINK, 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 choice */ group_label.set_alignment (Gtk::ALIGN_RIGHT, Gtk::ALIGN_CENTER); - add_table->attach (group_label, 4, 5, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); - add_table->attach (route_group_combo, 5, 6, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); + 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, 0, 1, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); - add_table->attach (strict_io_combo, 1, 3, n, n + 1, Gtk::FILL, Gtk::SHRINK, 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::SHRINK, 0, 0); - add_table->attach (mode_combo, 5, 6, n, n + 1, Gtk::FILL, Gtk::SHRINK, 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; } + HBox* outer_box = manage (new HBox); + outer_box->set_spacing (4); - add_table->attach (*(manage (new Gtk::HSeparator)), 0, 6, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); - - ++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, 0, 1, n, n + 1, Gtk::FILL, Gtk::SHRINK, 0, 0); - add_table->attach (insert_at_combo, 1, 3, n, n + 1, Gtk::FILL, Gtk::SHRINK, 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, 4, 6, n, n + 1, Gtk::FILL, Gtk::SHRINK, 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); @@ -246,6 +339,10 @@ AddRouteDialog::AddRouteDialog () 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 @@ -266,7 +363,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. */ @@ -325,6 +422,8 @@ AddRouteDialog::trk_template_row_selected () 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()) { @@ -407,13 +506,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 @@ -426,13 +533,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]; } } @@ -495,7 +602,8 @@ AddRouteDialog::maybe_update_name_template_entry () name_template_entry.set_text (VCA::default_name_template()); break; } - name_edited_by_user = false; + /* ignore programatic change, restore false */ + reset_name_edited (); } void @@ -503,26 +611,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: { @@ -532,47 +660,88 @@ 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; } @@ -684,9 +853,10 @@ void AddRouteDialog::on_show () { routes_spinner.grab_focus (); - name_edited_by_user = false; + reset_name_edited (); refill_route_groups (); + refill_channel_setups (); Dialog::on_show (); } @@ -750,12 +920,12 @@ 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) { + 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); + row[track_template_columns.name] = (*i).first; row[track_template_columns.path] = ""; - row[track_template_columns.description] = _("Use the controls below"); - row[track_template_columns.created_with] = ""; + 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); @@ -770,8 +940,8 @@ AddRouteDialog::refill_channel_setups () continue; } TreeModel::Row row; - if ( (*s)->name == "Create Audio Tracks Interactively" && Profile->get_mixbus ()) { - // somewhat-special, Ben says: "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 ()); @@ -779,7 +949,7 @@ 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 == "Create Audio Tracks Interactively" && Profile->get_mixbus ()) { trk_template_chooser.get_selection()->select(row); @@ -787,6 +957,11 @@ AddRouteDialog::refill_channel_setups () } } + 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); @@ -796,7 +971,7 @@ 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; } set_popdown_strings (channel_combo, channel_combo_strings);