diff options
author | Ben Loftis <ben@harrisonconsoles.com> | 2017-08-17 13:24:49 -0500 |
---|---|---|
committer | Ben Loftis <ben@harrisonconsoles.com> | 2017-08-17 13:32:01 -0500 |
commit | ed8b8ffc719b18f393bd4a12a617a71088d0ed92 (patch) | |
tree | 882b070a1b0f1f363df22091a7d0100b10372365 | |
parent | 6c49d9555ab57ea4e0360a9c37205b605d5b090a (diff) |
Track Templates: redesign of Add Track dialog.
-rw-r--r-- | gtk2_ardour/add_route_dialog.cc | 286 | ||||
-rw-r--r-- | gtk2_ardour/add_route_dialog.h | 37 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui.cc | 16 |
3 files changed, 281 insertions, 58 deletions
diff --git a/gtk2_ardour/add_route_dialog.cc b/gtk2_ardour/add_route_dialog.cc index d937172093..303596fdb8 100644 --- a/gtk2_ardour/add_route_dialog.cc +++ b/gtk2_ardour/add_route_dialog.cc @@ -60,6 +60,13 @@ AddRouteDialog::AddRouteDialog () , routes_adjustment (1, 1, 128, 1, 4) , routes_spinner (routes_adjustment) , configuration_label (_("Configuration:")) + , manual_label (_("Manual Configuration:")) + , add_label (_("Add:")) + , type_label (_("Type:")) + , name_label (_("Name:")) + , group_label (_("Group:")) + , insert_label (_("Insert At:")) + , strict_io_label (_("Pin Mode:")) , mode_label (_("Record Mode:")) , instrument_label (_("Instrument:")) , name_edited_by_user (false) @@ -95,92 +102,149 @@ AddRouteDialog::AddRouteDialog () strict_io_combo.set_active (Config->get_strict_io () ? 1 : 0); VBox* vbox = manage (new VBox); - Gtk::Label* l; get_vbox()->set_spacing (4); vbox->set_spacing (18); vbox->set_border_width (5); - HBox *type_hbox = manage (new HBox); - type_hbox->set_spacing (6); - - /* track/bus choice */ - - type_hbox->pack_start (*manage (new Label (_("Add:")))); - type_hbox->pack_start (routes_spinner); - type_hbox->pack_start (track_bus_combo); - - vbox->pack_start (*type_hbox, false, true); - - VBox* options_box = manage (new VBox); - Table *table2 = manage (new Table (3, 3, false)); - - options_box->set_spacing (6); - table2->set_row_spacings (6); - table2->set_col_spacing (1, 6); - - l = manage (new Label (_("<b>Options</b>"), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false)); - l->set_use_markup (); - options_box->pack_start (*l, false, true); - - l = manage (new Label ("", Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false)); - l->set_padding (8, 0); - table2->attach (*l, 0, 1, 0, 3, Gtk::FILL, Gtk::FILL, 0, 0); + { //Template & Template Description area + HBox* template_hbox = manage (new HBox); + template_hbox->set_spacing (8); + + Gtk::ScrolledWindow *template_scroller = manage (new Gtk::ScrolledWindow()); + template_scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); + template_scroller->add (trk_template_chooser); + + Gtk::ScrolledWindow *desc_scroller = manage (new Gtk::ScrolledWindow()); + desc_scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); + desc_scroller->add (trk_template_desc); + + template_hbox->pack_start (*template_scroller, true, true); + + 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 (_("Created With"), track_template_columns.created_with); + trk_template_chooser.set_headers_visible (true); + trk_template_chooser.get_selection()->set_mode (SELECTION_SINGLE); + trk_template_chooser.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &AddRouteDialog::trk_template_row_selected)); + trk_template_chooser.set_sensitive (true); + + //template_desc is the textview that displays the currently selected template's description + trk_template_desc.set_editable (false); + trk_template_desc.set_wrap_mode (Gtk::WRAP_WORD); + trk_template_desc.set_size_request(400,200); + trk_template_desc.set_name (X_("TextOnBackground")); + trk_template_desc.set_border_width (6); + + vbox->pack_start (*template_hbox, true, true); + } + +// { +// HBox *trk_go_hbox = manage (new HBox); +// trk_go_hbox->pack_start (*(manage (new Gtk::HSeparator)), true, true); +// trk_go_hbox->pack_start (*(manage (new Gtk::Button(_("Add template")))), false, false); +// trk_go_hbox->set_spacing (6); +// vbox->pack_start (*trk_go_hbox, true, true); +// } + + { + 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); int n = 0; - l = manage (new Label (_("Name:"), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false)); - table2->attach (*l, 1, 2, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); - table2->attach (name_template_entry, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0); - ++n; + // 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); - /* Route configuration */ + // 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); - configuration_label.set_alignment (Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER); - table2->attach (configuration_label, 1, 2, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); - table2->attach (channel_combo, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0); - ++n; + // 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); - mode_label.set_alignment (Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER); - table2->attach (mode_label, 1, 2, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); - table2->attach (mode_combo, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0); ++n; - instrument_label.set_alignment (Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER); - table2->attach (instrument_label, 1, 2, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); - table2->attach (instrument_combo, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0); - ++n; + // 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 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); - l = manage (new Label (_("Group:"), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false)); - table2->attach (*l, 1, 2, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); - table2->attach (route_group_combo, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0); ++n; - /* New route will be inserted at.. */ - l = manage (new Label (_("Insert:"), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false)); - table2->attach (*l, 1, 2, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); - table2->attach (insert_at_combo, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0); - ++n; + // 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); - /* New Route's Routing is.. */ + ++n; + // New Route's I/O is.. {strict/flexible} if (Profile->get_mixbus ()) { strict_io_combo.set_active (1); } else { - l = manage (new Label (_("Output Ports:"), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false)); - table2->attach (*l, 1, 2, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); - table2->attach (strict_io_combo, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0); + 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); 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 + 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); + ++n; } - options_box->pack_start (*table2, false, true); - vbox->pack_start (*options_box, false, true); + // Separator + ++n; + add_table->attach (*(manage (new Gtk::HSeparator)), 0, 8, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0); + + ++n; + ++n; + // 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); + + add_table->attach (*(manage (new Gtk::Button(_("Add selected items (and leave dialog open)"), Add))), 5, 8, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0); + + + vbox->pack_start (*add_table, false, true); get_vbox()->pack_start (*vbox, false, false); @@ -199,7 +263,7 @@ AddRouteDialog::AddRouteDialog () */ add_button (_("Add and Close"), AddAndClose); - add_button (_("Add"), Add); +// add_button (_("Add"), Add); set_response_sensitive (AddAndClose, true); set_default_response (AddAndClose); @@ -221,6 +285,63 @@ 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 (iter) { + string d = (*iter)[track_template_columns.description]; + trk_template_desc.get_buffer()->set_text (d); + + string n = (*iter)[track_template_columns.name]; + if ( n != _("Manual Configuration") ) { + + 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(false); + group_label.set_sensitive(false); + strict_io_label.set_sensitive(false); + configuration_label.set_sensitive(false); + mode_label.set_sensitive(false); + + routes_spinner.set_sensitive(false); + track_bus_combo.set_sensitive(false); + name_template_entry.set_sensitive(false); + 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 { + + 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(); + } + } + + + } + + +} + + +void AddRouteDialog::name_template_entry_insertion (Glib::ustring const &,int*) { name_edited_by_user = true; @@ -238,6 +359,26 @@ AddRouteDialog::channel_combo_changed () refill_track_modes (); } +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") ) { + p = (*iter)[track_template_columns.path]; + } + } + } + + return p; +} + + AddRouteDialog::TypeWanted AddRouteDialog::type_wanted() const { @@ -364,6 +505,7 @@ AddRouteDialog::track_type_chosen () } maybe_update_name_template_entry (); + } @@ -533,6 +675,34 @@ AddRouteDialog::refill_channel_setups () } } + trk_template_model->clear(); + + //Add any Lua scripts (factory templates) found in the scripts folder + LuaScriptList& ms (LuaScripting::instance ().scripts (LuaScriptInfo::TrackSetup)); + for (LuaScriptList::const_iterator s = ms.begin(); s != ms.end(); ++s) { + TreeModel::Row row; + if ( (*s)->name == "Add tracks") { //somewhat-special, most-used template + row = *(trk_template_model->prepend ()); + } else { + row = *(trk_template_model->append ()); + } + 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}"); + + if ( (*s)->name == "Add tracks") { //somewhat-special, most-used template + trk_template_chooser.get_selection()->select(row); + } + } + + //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] = ""; + /* clear template path for the rest */ chn.template_path = ""; diff --git a/gtk2_ardour/add_route_dialog.h b/gtk2_ardour/add_route_dialog.h index 718df8842d..0daef1048e 100644 --- a/gtk2_ardour/add_route_dialog.h +++ b/gtk2_ardour/add_route_dialog.h @@ -31,8 +31,12 @@ #include <gtkmm/button.h> #include <gtkmm/combobox.h> #include <gtkmm/comboboxtext.h> +#include <gtkmm/textview.h> #include <gtkmm/treemodel.h> +#include <gtkmm/treeview.h> +#include <gtkmm/treestore.h> #include <gtkmm/liststore.h> +#include <gtkmm/scrolledwindow.h> #include "ardour/plugin.h" #include "ardour/types.h" @@ -80,6 +84,8 @@ public: RouteDialogs::InsertAt insert_at(); bool use_strict_io(); + std::string get_template_path(); + private: Gtk::Entry name_template_entry; Gtk::ComboBoxText track_bus_combo; @@ -87,6 +93,13 @@ private: Gtk::SpinButton routes_spinner; Gtk::ComboBoxText channel_combo; Gtk::Label configuration_label; + Gtk::Label manual_label; + Gtk::Label add_label; + Gtk::Label type_label; + Gtk::Label name_label; + Gtk::Label group_label; + Gtk::Label insert_label; + Gtk::Label strict_io_label; Gtk::Label mode_label; Gtk::Label instrument_label; Gtk::ComboBoxText mode_combo; @@ -108,6 +121,30 @@ private: bool route_separator (const Glib::RefPtr<Gtk::TreeModel> &m, const Gtk::TreeModel::iterator &i); void maybe_update_name_template_entry (); + struct TrackTemplateColumns : public Gtk::TreeModel::ColumnRecord { + TrackTemplateColumns () { + add (name); + add (path); + add (description); + add (created_with); + } + + Gtk::TreeModelColumn<std::string> name; + Gtk::TreeModelColumn<std::string> path; + Gtk::TreeModelColumn<std::string> description; + Gtk::TreeModelColumn<std::string> created_with; + }; + + TrackTemplateColumns track_template_columns; + + Glib::RefPtr<Gtk::TreeStore> trk_template_model; + Gtk::TreeView trk_template_chooser; + + void trk_template_row_selected (); + + Gtk::TextView trk_template_desc; + Gtk::Frame trk_template_desc_frame; + void reset_template_option_visibility (); void new_group_dialog_finished (int, RouteGroupDialog*); void on_show (); diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 4b3c372281..bbdb4d7599 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -4388,6 +4388,22 @@ ARDOUR_UI::add_route_dialog_response (int r) return; } + std::string template_name = add_route_dialog->get_template_path(); + if ( !template_name.empty() ) { + + if (!template_name.empty() && template_name.substr (0, 11) == "urn:ardour:") { + + //ret = build_session_from_dialog (session_dialog, session_path, session_name); + meta_session_setup (template_name.substr (11)); + + } else { + + //could be a user's track template (from file). ToDo + } + + return; + } + if ((count = add_route_dialog->count()) <= 0) { return; } |