diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in index 03192470bc..bc95ac4ce6 100644 --- a/gtk2_ardour/ardour.menus.in +++ b/gtk2_ardour/ardour.menus.in @@ -374,6 +374,7 @@ + diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 60e973e098..6b10f51b4f 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -2176,7 +2176,7 @@ ARDOUR_UI::transport_rewind (int option) { float current_transport_speed; - if (_session) { + if (_session) { current_transport_speed = _session->transport_speed(); if (current_transport_speed >= 0.0f) { @@ -2389,7 +2389,7 @@ ARDOUR_UI::save_session_as () } - Session::SaveAs sa; + Session::SaveAs sa; sa.new_parent_folder = save_as_dialog->new_parent_folder (); sa.new_name = save_as_dialog->new_name (); @@ -3750,6 +3750,46 @@ ARDOUR_UI::setup_order_hint (AddRouteDialog::InsertAt place) } } +void +ARDOUR_UI::duplicate_routes () +{ + /* Copy the track selection because it will/may change as we add new ones */ + TrackSelection tracks (editor->get_selection().tracks); + int err = 0; + + for (TrackSelection::iterator t = tracks.begin(); t != tracks.end(); ++t) { + + RouteUI* rui = dynamic_cast (*t); + + if (!rui) { + /* some other type of timeaxis view, not a route */ + continue; + } + + XMLNode& state (rui->route()->get_state()); + RouteList rl = _session->new_route_from_template (1, state, string(), SharePlaylist); + + /* normally the state node would be added to a parent, and + * ownership would transfer. Because we don't do that here, + * we need to delete the node ourselves. + */ + + delete &state; + + if (rl.empty()) { + err++; + break; + } + } + + if (err) { + MessageDialog msg (_("1 or more tracks/busses could not be duplicated"), + true, MESSAGE_ERROR, BUTTONS_OK, true); + msg.set_position (WIN_POS_MOUSE); + msg.run (); + } +} + void ARDOUR_UI::add_route (Gtk::Window* /* ignored */) { @@ -4490,7 +4530,7 @@ what you would like to do.\n"), PROGRAM_NAME)); int ARDOUR_UI::sr_mismatch_dialog (framecnt_t desired, framecnt_t actual) { - HBox* hbox = new HBox(); + HBox* hbox = new HBox(); Image* image = new Image (Stock::DIALOG_WARNING, ICON_SIZE_DIALOG); ArdourDialog dialog (_("Sample Rate Mismatch"), true); Label message (string_compose (_("\ @@ -4889,14 +4929,14 @@ ARDOUR_UI::transport_numpad_event (int num) _pending_locate_num = _pending_locate_num*10 + num; } else { switch (num) { - case 0: toggle_roll(false, false); break; - case 1: transport_rewind(1); break; - case 2: transport_forward(1); break; - case 3: transport_record(true); break; + case 0: toggle_roll(false, false); break; + case 1: transport_rewind(1); break; + case 2: transport_forward(1); break; + case 3: transport_record(true); break; case 4: toggle_session_auto_loop(); break; - case 5: transport_record(false); toggle_session_auto_loop(); break; - case 6: toggle_punch(); break; - case 7: toggle_click(); break; + case 5: transport_record(false); toggle_session_auto_loop(); break; + case 6: toggle_punch(); break; + case 7: toggle_click(); break; case 8: toggle_auto_return(); break; case 9: toggle_follow_edits(); break; } diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index b43b2d62a2..d10b7c7ac5 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -248,6 +248,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr void add_routes_part_two (); void add_routes_thread (); + void duplicate_routes (); + void add_video (Gtk::Window* float_window); void remove_video (); void start_video_server_menu (Gtk::Window* float_window); @@ -788,4 +790,3 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr }; #endif /* __ardour_gui_h__ */ - diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index e4379fe432..e848f8d194 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -132,6 +132,11 @@ ARDOUR_UI::install_actions () ActionManager::session_sensitive_actions.push_back (act); ActionManager::write_sensitive_actions.push_back (act); + act = ActionManager::register_action (main_actions, X_("duplicate-routes"), _("Duplicate Tracks/Busses"), + sigc::mem_fun(*this, &ARDOUR_UI::duplicate_routes)); + ActionManager::session_sensitive_actions.push_back (act); + ActionManager::write_sensitive_actions.push_back (act); + ActionManager::track_selection_sensitive_actions.push_back (act); act = ActionManager::register_action (main_actions, X_("cancel-solo"), _("Cancel Solo"), sigc::mem_fun(*this, &ARDOUR_UI::cancel_solo)); ActionManager::session_sensitive_actions.push_back (act);