using namespace ARDOUR;
using namespace PBD;
-uint32_t RouteUI::_max_invert_buttons = 4;
+uint32_t RouteUI::_max_invert_buttons = 3;
RouteUI::RouteUI (ARDOUR::Session* sess)
: AxisView(sess)
solo_safe_led = 0;
_solo_release = 0;
_mute_release = 0;
- route_active_menu_item = 0;
denormal_menu_item = 0;
step_edit_item = 0;
multiple_mute_change = false;
xml_node = 0;
}
- route_active_menu_item = 0;
denormal_menu_item = 0;
}
}
if (Config->get_solo_control_is_listen_control()) {
- _session->set_listen (_session->get_routes(), !_route->listening(), Session::rt_cleanup, true);
+ _session->set_listen (_session->get_routes(), !_route->listening_via_monitor(), Session::rt_cleanup, true);
} else {
_session->set_solo (_session->get_routes(), !_route->self_soloed(), Session::rt_cleanup, true);
}
}
if (Config->get_solo_control_is_listen_control()) {
- _session->set_listen (_route->route_group()->route_list(), !_route->listening(), Session::rt_cleanup, true);
+ _session->set_listen (_route->route_group()->route_list(), !_route->listening_via_monitor(), Session::rt_cleanup, true);
} else {
_session->set_solo (_route->route_group()->route_list(), !_route->self_soloed(), Session::rt_cleanup, true);
}
}
if (Config->get_solo_control_is_listen_control()) {
- _session->set_listen (rl, !_route->listening());
+ _session->set_listen (rl, !_route->listening_via_monitor());
} else {
_session->set_solo (rl, !_route->self_soloed());
}
using namespace Menu_Helpers;
MenuList& items = record_menu->items();
- items.push_back (CheckMenuElem (_("Step Edit"), sigc::mem_fun (*this, &RouteUI::toggle_step_edit)));
+ items.push_back (CheckMenuElem (_("Step Entry"), sigc::mem_fun (*this, &RouteUI::toggle_step_edit)));
step_edit_item = dynamic_cast<CheckMenuItem*> (&items.back());
if (_route->record_enabled()) {
sends_menu->set_name ("ArdourContextMenu");
MenuList& items = sends_menu->items();
- items.push_back (MenuElem(_("Assign all tracks (prefader)"), sigc::bind (sigc::mem_fun (*this, &RouteUI::create_sends), PreFader)));
- items.push_back (MenuElem(_("Assign all tracks (postfader)"), sigc::bind (sigc::mem_fun (*this, &RouteUI::create_sends), PostFader)));
- items.push_back (MenuElem(_("Assign selected tracks (prefader)"), sigc::bind (sigc::mem_fun (*this, &RouteUI::create_selected_sends), PreFader)));
- items.push_back (MenuElem(_("Assign selected tracks (postfader)"), sigc::bind (sigc::mem_fun (*this, &RouteUI::create_selected_sends), PostFader)));
- items.push_back (MenuElem(_("Copy track gains to sends"), sigc::mem_fun (*this, &RouteUI::set_sends_gain_from_track)));
+ items.push_back (
+ MenuElem(_("Assign all tracks (prefader)"), sigc::bind (sigc::mem_fun (*this, &RouteUI::create_sends), PreFader, false))
+ );
+
+ items.push_back (
+ MenuElem(_("Assign all tracks and buses (prefader)"), sigc::bind (sigc::mem_fun (*this, &RouteUI::create_sends), PreFader, true))
+ );
+
+ items.push_back (
+ MenuElem(_("Assign all tracks (postfader)"), sigc::bind (sigc::mem_fun (*this, &RouteUI::create_sends), PostFader, false))
+ );
+
+ items.push_back (
+ MenuElem(_("Assign all tracks and buses (postfader)"), sigc::bind (sigc::mem_fun (*this, &RouteUI::create_sends), PostFader, true))
+ );
+
+ items.push_back (
+ MenuElem(_("Assign selected tracks (prefader)"), sigc::bind (sigc::mem_fun (*this, &RouteUI::create_selected_sends), PreFader, false))
+ );
+
+ items.push_back (
+ MenuElem(_("Assign selected tracks and buses (prefader)"), sigc::bind (sigc::mem_fun (*this, &RouteUI::create_selected_sends), PreFader, true)));
+
+ items.push_back (
+ MenuElem(_("Assign selected tracks (postfader)"), sigc::bind (sigc::mem_fun (*this, &RouteUI::create_selected_sends), PostFader, false))
+ );
+
+ items.push_back (
+ MenuElem(_("Assign selected tracks and buses (postfader)"), sigc::bind (sigc::mem_fun (*this, &RouteUI::create_selected_sends), PostFader, true))
+ );
+
+ items.push_back (MenuElem(_("Copy track/bus gains to sends"), sigc::mem_fun (*this, &RouteUI::set_sends_gain_from_track)));
items.push_back (MenuElem(_("Set sends gain to -inf"), sigc::mem_fun (*this, &RouteUI::set_sends_gain_to_zero)));
items.push_back (MenuElem(_("Set sends gain to 0dB"), sigc::mem_fun (*this, &RouteUI::set_sends_gain_to_unity)));
}
void
-RouteUI::create_sends (Placement p)
+RouteUI::create_sends (Placement p, bool include_buses)
{
- _session->globally_add_internal_sends (_route, p);
+ _session->globally_add_internal_sends (_route, p, include_buses);
}
void
-RouteUI::create_selected_sends (Placement p)
+RouteUI::create_selected_sends (Placement p, bool include_buses)
{
boost::shared_ptr<RouteList> rlist (new RouteList);
TrackSelection& selected_tracks (ARDOUR_UI::instance()->the_editor().get_selection().tracks);
RouteUI* rui;
if ((rtv = dynamic_cast<RouteTimeAxisView*>(*i)) != 0) {
if ((rui = dynamic_cast<RouteUI*>(rtv)) != 0) {
- if (boost::dynamic_pointer_cast<AudioTrack>(rui->route())) {
+ if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(rui->route())) {
rlist->push_back (rui->route());
}
}
if (Config->get_solo_control_is_listen_control()) {
- if (r->listening()) {
+ if (r->listening_via_monitor()) {
return 1;
} else {
return 0;
if (Config->get_solo_control_is_listen_control()) {
- if (r->listening()) {
+ if (r->listening_via_monitor()) {
return 1;
} else {
return 0;
if (Config->get_solo_control_is_listen_control()) {
- if (solo_button->get_active() != (x = _route->listening())) {
+ if (solo_button->get_active() != (x = _route->listening_via_monitor())) {
++_i_am_the_modifier;
solo_button->set_active(x);
--_i_am_the_modifier;
return 0;
}
- if (Config->get_show_solo_mutes()) {
+
+ if (Config->get_show_solo_mutes() && !Config->get_solo_control_is_listen_control ()) {
if (r->muted ()) {
/* full mute */
--_i_am_the_modifier;
}
- mute_button->set_visual_state (mute_visual_state (_session, _route));
+ mute_button->set_visual_state (mute_visual_state (_session, _route));
}
void
}
bool
-RouteUI::solo_safe_button_release (GdkEventButton* ev)
+RouteUI::solo_safe_button_release (GdkEventButton*)
{
_route->set_solo_safe (!(solo_safe_led->visual_state() > 0), this);
return true;
_route->set_solo_safe (check->get_active(), this);
}
-bool
-RouteUI::choose_color()
+/** Ask the user to choose a colour, and then set all selected tracks
+ * to that colour.
+ */
+void
+RouteUI::choose_color ()
{
bool picked;
- Gdk::Color color;
-
- color = Gtkmm2ext::UI::instance()->get_color (_("Color Selection"), picked, &_color);
+ Gdk::Color const color = Gtkmm2ext::UI::instance()->get_color (_("Color Selection"), picked, &_color);
if (picked) {
- set_color (color);
+ ARDOUR_UI::instance()->the_editor().get_selection().tracks.foreach_route_ui (
+ boost::bind (&RouteUI::set_color, _1, color)
+ );
}
-
- return picked;
}
void
if ((xml_node = _route->extra_xml ("GUI")) == 0) {
xml_node = new XMLNode ("GUI");
_route->add_extra_xml (*xml_node);
+ } else {
+ /* the Route has one; it may have been loaded */
+ if (Stateful::loading_state_version != 0 && Stateful::loading_state_version < 3000) {
+ /* the GUI extra XML is in 2.X format; we must convert it to the new
+ format to avoid problems later
+ */
+
+ XMLNode* new_xml_node = new XMLNode (X_("GUI"));
+ XMLPropertyList old_gui_props = xml_node->properties ();
+ for (XMLPropertyIterator i = old_gui_props.begin(); i != old_gui_props.end(); ++i) {
+ new_xml_node->add_property ((*i)->name().c_str (), (*i)->value().c_str ());
+ }
+
+ XMLNodeList old_children = xml_node->children ();
+ for (XMLNodeConstIterator i = old_children.begin(); i != old_children.end(); ++i) {
+ XMLNode* new_child = new XMLNode (AutomationTimeAxisView::state_node_name);
+ new_child->add_property (X_("automation-id"), (*i)->name());
+
+ XMLPropertyList old_props = (*i)->properties ();
+ for (XMLPropertyIterator j = old_props.begin(); j != old_props.end(); ++j) {
+ new_child->add_property ((*j)->name().c_str (), (*j)->value().c_str ());
+ }
+
+ new_xml_node->add_child_nocopy (*new_child);
+ }
+
+ _route->add_extra_xml (*new_xml_node);
+ xml_node = new_xml_node;
+ }
}
}
}
const string sym = ARDOUR::EventTypeMap::instance().to_symbol(param);
for (iter = kids.begin(); iter != kids.end(); ++iter) {
+
if ((*iter)->name() == AutomationTimeAxisView::state_node_name) {
XMLProperty* type = (*iter)->property("automation-id");
- if (type && type->value() == sym)
+ if (type && type->value() == sym) {
return *iter;
+ }
}
}
}
void
-RouteUI::remove_this_route ()
+RouteUI::remove_this_route (bool apply_to_selection)
{
- if ((route()->is_master() || route()->is_monitor()) &&
- !Config->get_allow_special_bus_removal()) {
- MessageDialog msg (_("That would be bad news ...."),
- false,
- Gtk::MESSAGE_INFO,
+ if (apply_to_selection) {
+ ARDOUR_UI::instance()->the_editor().get_selection().tracks.foreach_route_ui (boost::bind (&RouteUI::remove_this_route, _1, false));
+ } else {
+ if ((route()->is_master() || route()->is_monitor()) &&
+ !Config->get_allow_special_bus_removal()) {
+ MessageDialog msg (_("That would be bad news ...."),
+ false,
+ Gtk::MESSAGE_INFO,
Gtk::BUTTONS_OK);
- msg.set_secondary_text (string_compose (_(
+ msg.set_secondary_text (string_compose (_(
"Removing the master or monitor bus is such a bad idea\n\
that %1 is not going to allow it.\n\
\n\
edit your ardour.rc file to set the\n\
\"allow-special-bus-removal\" option to be \"yes\""), PROGRAM_NAME));
- msg.present ();
- msg.run ();
- return;
- }
-
- vector<string> choices;
- string prompt;
-
- if (is_track()) {
- prompt = string_compose (_("Do you really want to remove track \"%1\" ?\n\nYou may also lose the playlist used by this track.\n(this cannot be undone)"), _route->name());
- } else {
- prompt = string_compose (_("Do you really want to remove bus \"%1\" ?\n(this cannot be undone)"), _route->name());
- }
-
- choices.push_back (_("No, do nothing."));
- choices.push_back (_("Yes, remove it."));
-
- string title;
- if (is_track()) {
- title = _("Remove track");
- } else {
- title = _("Remove bus");
- }
-
- Choice prompter (title, prompt, choices);
-
- if (prompter.run () == 1) {
- Glib::signal_idle().connect (sigc::bind (sigc::ptr_fun (&RouteUI::idle_remove_this_route), this));
+ msg.present ();
+ msg.run ();
+ return;
+ }
+
+ vector<string> choices;
+ string prompt;
+
+ if (is_track()) {
+ prompt = string_compose (_("Do you really want to remove track \"%1\" ?\n\nYou may also lose the playlist used by this track.\n\n(This action cannot be undone, and the session file will be overwritten)"), _route->name());
+ } else {
+ prompt = string_compose (_("Do you really want to remove bus \"%1\" ?\n\nYou may also lose the playlist used by this track.\n\n(This action cannot be undone, and the session file will be overwritten)"), _route->name());
+ }
+
+ choices.push_back (_("No, do nothing."));
+ choices.push_back (_("Yes, remove it."));
+
+ string title;
+ if (is_track()) {
+ title = _("Remove track");
+ } else {
+ title = _("Remove bus");
+ }
+
+ Choice prompter (title, prompt, choices);
+
+ if (prompter.run () == 1) {
+ Glib::signal_idle().connect (sigc::bind (sigc::ptr_fun (&RouteUI::idle_remove_this_route), this));
+ }
}
}
name_prompter.show_all ();
switch (name_prompter.run ()) {
-
case Gtk::RESPONSE_ACCEPT:
- name_prompter.get_result (result);
- if (result.length()) {
+ name_prompter.get_result (result);
+ if (result.length()) {
_route->set_name (result);
}
break;
}
void
-RouteUI::toggle_route_active ()
-{
- bool yn;
-
- if (route_active_menu_item) {
- if (route_active_menu_item->get_active() != (yn = _route->active())) {
- _route->set_active (!yn);
- }
- }
-}
-
-void
-RouteUI::route_active_changed ()
+RouteUI::set_route_active (bool a, bool apply_to_selection)
{
- if (route_active_menu_item) {
- Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&CheckMenuItem::set_active, route_active_menu_item, _route->active()));
+ if (apply_to_selection) {
+ ARDOUR_UI::instance()->the_editor().get_selection().tracks.foreach_route_ui (boost::bind (&RouteTimeAxisView::set_route_active, _1, a, false));
+ } else {
+ _route->set_active (a, this);
}
}
-
void
RouteUI::toggle_denormal_protection ()
{
RouteUI::save_as_template ()
{
sys::path path;
- Glib::ustring safe_name;
+ std::string safe_name;
string name;
path = ARDOUR::user_route_template_directory ();
p.set_title (_("Save As Template"));
p.set_prompt (_("Template name:"));
+ p.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
switch (p.run()) {
case RESPONSE_ACCEPT:
break;
{
if (p == "disable-disarm-during-roll") {
check_rec_enable_sensitivity ();
- } else if (p == "solo-control-is-listen-control") {
- set_button_names ();
- } else if (p == "listen-position") {
+ } else if (p == "use-monitor-bus" || p == "solo-control-is-listen-control" || p == "listen-position") {
set_button_names ();
}
}
b->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::invert_toggled), i, b));
b->signal_button_press_event().connect (sigc::mem_fun (*this, &RouteUI::invert_press));
- b->set_name (X_("InvertButton"));
+ b->set_name (X_("MixerInvertButton"));
if (to_add == 1) {
b->add (*manage (new Label (X_("Ø"))));
} else {
_route->set_phase_invert (c, !_route->phase_invert (c));
}
+
+void
+RouteUI::set_invert_sensitive (bool yn)
+{
+ for (list<BindableToggleButton*>::iterator b = _invert_buttons.begin(); b != _invert_buttons.end(); ++b) {
+ (*b)->set_sensitive (yn);
+ }
+}