#include "pbd/enumwriter.h"
#include "pbd/replace_all.h"
#include "pbd/stacktrace.h"
+#include "pbd/unwind.h"
#include "ardour/amp.h"
#include "ardour/audio_track.h"
#include "widgets/tooltips.h"
#include "ardour_window.h"
+#include "context_menu_helper.h"
#include "enums_convert.h"
#include "mixer_strip.h"
#include "mixer_ui.h"
, _comment_button (_("Comments"))
, trim_control (ArdourKnob::default_elements, ArdourKnob::Flags (ArdourKnob::Detent | ArdourKnob::ArcToZero))
, _visibility (X_("mixer-element-visibility"))
+ , _suspend_menu_callbacks (false)
, control_slave_ui (sess)
{
init ();
, _comment_button (_("Comments"))
, trim_control (ArdourKnob::default_elements, ArdourKnob::Flags (ArdourKnob::Detent | ArdourKnob::ArcToZero))
, _visibility (X_("mixer-element-visibility"))
+ , _suspend_menu_callbacks (false)
, control_slave_ui (sess)
{
init ();
gpm.gain_display.get_parent()->remove (gpm.gain_display);
}
- gpm.set_type (rt->meter_type());
-
mute_solo_table.attach (gpm.gain_display,0,1,1,2, EXPAND|FILL, EXPAND);
mute_solo_table.attach (gpm.peak_display,1,2,1,2, EXPAND|FILL, EXPAND);
solo_iso_table.set_sensitive(false);
control_slave_ui.set_sensitive(false);
if (monitor_section_button == 0) {
- Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMonitorSection");
+ Glib::RefPtr<Action> act = ActionManager::get_action ("Mixer", "ToggleMonitorSection");
_session->MonitorChanged.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::monitor_changed, this), gui_context());
+ _session->MonitorBusAddedOrRemoved.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::monitor_section_added_or_removed, this), gui_context());
monitor_section_button = manage (new ArdourButton);
monitor_changed ();
mute_solo_table.attach (*monitor_section_button, 1, 2, 0, 1);
monitor_section_button->show();
monitor_section_button->unset_flags (Gtk::CAN_FOCUS);
+ monitor_section_added_or_removed ();
}
- parameter_changed ("use-monitor-bus");
} else {
bottom_button_table.attach (group_button, 1, 2, 0, 1);
mute_solo_table.attach (*mute_button, 0, 1, 0, 1);
control_slave_ui.set_sensitive(true);
}
- if (_mixer_owned && route()->is_master() ) {
- spacer.show();
- } else {
- spacer.hide();
- }
+ hide_master_spacer (false);
if (is_track()) {
monitor_input_button->show ();
MixerStrip::output_press (GdkEventButton *ev)
{
using namespace Menu_Helpers;
- if (!_session->engine().connected()) {
- MessageDialog msg (_("Not connected to audio engine - no I/O changes are possible"));
- msg.run ();
+ if (!ARDOUR_UI_UTILS::engine_is_running ()) {
return true;
}
}
/* then other routes inputs */
- boost::shared_ptr<ARDOUR::RouteList> routes = _session->get_routes ();
- RouteList copy = *routes;
+ RouteList copy = _session->get_routelist ();
copy.sort (RouteCompareByName ());
for (ARDOUR::RouteList::const_iterator i = copy.begin(); i != copy.end(); ++i) {
maybe_add_bundle_to_output_menu ((*i)->input()->bundle(), current, intended_type);
citems.pop_back ();
}
- if (!ARDOUR::Profile->get_mixbus()) {
- citems.push_back (SeparatorElem());
+ citems.push_back (SeparatorElem());
+ if (!ARDOUR::Profile->get_mixbus()) {
+ bool need_separator = false;
for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
+ if (!_route->output()->can_add_port (*i)) {
+ continue;
+ }
+ need_separator = true;
citems.push_back (
MenuElem (
string_compose (_("Add %1 port"), (*i).to_i18n_string()),
)
);
}
+ if (need_separator) {
+ citems.push_back (SeparatorElem());
+ }
}
- citems.push_back (SeparatorElem());
citems.push_back (MenuElem (_("Routing Grid"), sigc::mem_fun (*(static_cast<RouteUI*>(this)), &RouteUI::edit_output_configuration)));
Gtkmm2ext::anchored_menu_popup(&output_menu, &output_button, "",
input_menu.set_name ("ArdourContextMenu");
citems.clear();
- if (!_session->engine().connected()) {
- MessageDialog msg (_("Not connected to audio engine - no I/O changes are possible"));
- msg.run ();
+ if (!ARDOUR_UI_UTILS::engine_is_running ()) {
return true;
}
}
citems.push_back (SeparatorElem());
+
+ bool need_separator = false;
for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
+ if (!_route->input()->can_add_port (*i)) {
+ continue;
+ }
+ need_separator = true;
citems.push_back (
MenuElem (
string_compose (_("Add %1 port"), (*i).to_i18n_string()),
)
);
}
+ if (need_separator) {
+ citems.push_back (SeparatorElem());
+ }
- citems.push_back (SeparatorElem());
citems.push_back (MenuElem (_("Routing Grid"), sigc::mem_fun (*(static_cast<RouteUI*>(this)), &RouteUI::edit_input_configuration)));
Gtkmm2ext::anchored_menu_popup(&input_menu, &input_button, "",
}
}
+void
+MixerStrip::monitor_section_added_or_removed ()
+{
+ assert (monitor_section_button);
+ if (mute_button->get_parent()) {
+ mute_button->get_parent()->remove(*mute_button);
+ }
+ if (monitor_section_button->get_parent()) {
+ monitor_section_button->get_parent()->remove(*monitor_section_button);
+ }
+ if (_session && _session->monitor_out ()) {
+ mute_solo_table.attach (*mute_button, 0, 1, 0, 1);
+ mute_solo_table.attach (*monitor_section_button, 1, 2, 0, 1);
+ mute_button->show();
+ monitor_section_button->show();
+ } else {
+ mute_solo_table.attach (*mute_button, 0, 2, 0, 1);
+ mute_button->show();
+ }
+}
+
/** Called when the metering point has changed */
void
MixerStrip::meter_changed ()
set_current_delivery (send);
- send->meter()->set_type(_route->shared_peak_meter()->get_type());
+ send->meter()->set_meter_type (_route->meter_type ());
send->set_metering (true);
_current_delivery->DropReferences.connect (send_gone_connection, invalidator (*this), boost::bind (&MixerStrip::revert_to_default_display, this), gui_context());
} else if (p == "track-name-number") {
name_changed ();
update_track_number_visibility();
- } else if (p == "use-monitor-bus") {
- if (monitor_section_button) {
- if (mute_button->get_parent()) {
- mute_button->get_parent()->remove(*mute_button);
- }
- if (monitor_section_button->get_parent()) {
- monitor_section_button->get_parent()->remove(*monitor_section_button);
- }
- if (Config->get_use_monitor_bus ()) {
- mute_solo_table.attach (*mute_button, 0, 1, 0, 1);
- mute_solo_table.attach (*monitor_section_button, 1, 2, 0, 1);
- mute_button->show();
- monitor_section_button->show();
- } else {
- mute_solo_table.attach (*mute_button, 0, 2, 0, 1);
- mute_button->show();
- }
- }
}
}
{
using namespace Gtk::Menu_Helpers;
- Gtk::Menu* m = manage (new Menu);
+ Gtk::Menu* m = ARDOUR_UI_UTILS::shared_popup_menu ();
MenuList& items = m->items ();
RadioMenuItem::Group group;
- _suspend_menu_callbacks = true;
+ PBD::Unwinder<bool> uw (_suspend_menu_callbacks, true);
add_level_meter_item_point (items, group, _("Input"), MeterInput);
add_level_meter_item_point (items, group, _("Pre Fader"), MeterPreFader);
add_level_meter_item_point (items, group, _("Post Fader"), MeterPostFader);
if (gpm.meter_channels().n_audio() == 0) {
m->popup (ev->button, ev->time);
- _suspend_menu_callbacks = false;
return;
}
sigc::bind (SetMeterTypeMulti, _strip_type, _route->route_group(), cmt)));
m->popup (ev->button, ev->time);
- _suspend_menu_callbacks = false;
}
void
MixerStrip::set_meter_type (MeterType t)
{
if (_suspend_menu_callbacks) return;
- gpm.set_type (t);
+ _route->set_meter_type (t);
}
void
{
return RouteUI::mark_hidden (!yn);
}
+
+void
+MixerStrip::hide_master_spacer (bool yn)
+{
+ if (_mixer_owned && route()->is_master() && !yn) {
+ spacer.show();
+ } else {
+ spacer.hide();
+ }
+}