using namespace Gtkmm2ext;
using namespace std;
-sigc::signal<void,boost::shared_ptr<Route> > MixerStrip::SwitchIO;
-
int MixerStrip::scrollbar_height = 0;
PBD::Signal1<void,MixerStrip*> MixerStrip::CatchDeletion;
, processor_box (sess, boost::bind (&MixerStrip::plugin_selector, this), mx.selection(), this, in_mixer)
, gpm (sess, 250)
, panners (sess)
+ , button_size_group (Gtk::SizeGroup::create (Gtk::SIZE_GROUP_HORIZONTAL))
, button_table (3, 1)
, rec_solo_table (2, 2)
, top_button_table (1, 2)
, processor_box (sess, sigc::mem_fun(*this, &MixerStrip::plugin_selector), mx.selection(), this, in_mixer)
, gpm (sess, 250)
, panners (sess)
+ , button_size_group (Gtk::SizeGroup::create (Gtk::SIZE_GROUP_HORIZONTAL))
, button_table (3, 1)
, middle_button_table (1, 2)
, bottom_button_table (1, 2)
hide_button.set_events (hide_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
- mute_button->set_name ("MixerMuteButton");
- solo_button->set_name ("MixerSoloButton");
-
monitor_input_button->set_diameter (3);
monitor_disk_button->set_diameter (3);
button_table.set_homogeneous (false);
button_table.set_spacings (0);
+ if (solo_button) {
+ button_size_group->add_widget (*solo_button);
+ }
+ if (mute_button) {
+ button_size_group->add_widget (*mute_button);
+ }
+ if (solo_isolated_led) {
+ button_size_group->add_widget (*solo_isolated_led);
+ }
+ if (solo_safe_led) {
+ button_size_group->add_widget (*solo_safe_led);
+ }
+ if (rec_enable_button) {
+ button_size_group->add_widget (*rec_enable_button);
+ }
+ if (monitor_disk_button) {
+ button_size_group->add_widget (*monitor_disk_button);
+ }
+ if (monitor_input_button) {
+ button_size_group->add_widget (*monitor_input_button);
+ }
+
button_table.attach (name_button, 0, 1, 0, 1);
button_table.attach (input_button_box, 0, 1, 1, 2);
button_table.attach (_invert_button_box, 0, 1, 2, 3);
middle_button_table.set_homogeneous (true);
- middle_button_table.set_spacings (0);
+ middle_button_table.set_spacings (2);
middle_button_table.attach (*mute_button, 0, 1, 0, 1);
middle_button_table.attach (*solo_button, 1, 2, 0, 1);
input_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::input_press), false);
output_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::output_press), false);
- /* we don't need this if its not an audio track, but we don't know that yet and it doesn't
- hurt (much).
- */
-
- rec_enable_button->set_name ("MixerRecordEnableButton");
-
/* ditto for this button and busses */
name_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::name_button_button_press), false);
set_flags (get_flags() | Gtk::CAN_FOCUS);
- SwitchIO.connect (sigc::mem_fun (*this, &MixerStrip::switch_io));
-
AudioEngine::instance()->PortConnectedOrDisconnected.connect (
*this, invalidator (*this), boost::bind (&MixerStrip::port_connected_or_disconnected, this, _1, _3), gui_context ()
);
are recognised when they occur.
*/
_visibility.add (&_invert_button_box, X_("PhaseInvert"), _("Phase Invert"));
- _visibility.add (solo_safe_led, X_("SoloSafe"), _("Solo Safe"));
- _visibility.add (solo_isolated_led, X_("SoloIsolated"), _("Solo Isolated"));
+ _visibility.add (solo_safe_led, X_("SoloSafe"), _("Solo Safe"), true, boost::bind (&MixerStrip::override_solo_visibility, this));
+ _visibility.add (solo_isolated_led, X_("SoloIsolated"), _("Solo Isolated"), true, boost::bind (&MixerStrip::override_solo_visibility, this));
_visibility.add (&_comment_button, X_("Comments"), _("Comments"));
_visibility.add (&group_button, X_("Group"), _("Group"));
_visibility.add (&meter_point_button, X_("MeterPoint"), _("Meter Point"));
switch (w) {
case Wide:
if (show_sends_button) {
- ((Gtk::Label*)show_sends_button->get_child())->set_text (_("Sends"));
+ show_sends_button->set_text (_("Sends"));
}
((Gtk::Label*)gpm.gain_automation_style_button.get_child())->set_text (
case Narrow:
if (show_sends_button) {
- ((Gtk::Label*)show_sends_button->get_child())->set_text (_("Snd"));
+ show_sends_button->set_text (_("Snd"));
}
((Gtk::Label*)gpm.gain_automation_style_button.get_child())->set_text (
output_menu_bundles.clear ();
citems.push_back (MenuElem (_("Disconnect"), sigc::mem_fun (*(static_cast<RouteUI*>(this)), &RouteUI::disconnect_output)));
+
+ for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
+ citems.push_back (
+ MenuElem (
+ string_compose ("Add %1 port", (*i).to_i18n_string()),
+ sigc::bind (sigc::mem_fun (*this, &MixerStrip::add_output_port), *i)
+ )
+ );
+ }
+
citems.push_back (SeparatorElem());
ARDOUR::BundleList current = _route->output()->bundles_connected ();
case 3:
{
citems.push_back (MenuElem (_("Disconnect"), sigc::mem_fun (*(static_cast<RouteUI*>(this)), &RouteUI::disconnect_input)));
+
+ for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
+ citems.push_back (
+ MenuElem (
+ string_compose ("Add %1 port", (*i).to_i18n_string()),
+ sigc::bind (sigc::mem_fun (*this, &MixerStrip::add_input_port), *i)
+ )
+ );
+ }
+
citems.push_back (SeparatorElem());
input_menu_bundles.clear ();
{
using namespace Menu_Helpers;
- if (b->ports_are_outputs() == false || b->nchannels() != _route->n_inputs()) {
+ if (b->ports_are_outputs() == false || b->nchannels() != _route->n_inputs() || *b == *_route->output()->bundle()) {
return;
}
{
using namespace Menu_Helpers;
- if (b->ports_are_inputs() == false || b->nchannels() != _route->n_outputs()) {
+ if (b->ports_are_inputs() == false || b->nchannels() != _route->n_outputs() || *b == *_route->input()->bundle()) {
return;
}
gpm.reset_peak_display();
}
+/** The bus that we are displaying sends to has changed, or been turned off.
+ * @param send_to New bus that we are displaying sends to, or 0.
+ */
void
-MixerStrip::switch_io (boost::shared_ptr<Route> target)
+MixerStrip::bus_send_display_changed (boost::shared_ptr<Route> send_to)
{
- /* don't respond to switch IO signal outside of the mixer window */
-
- if (!_mixer_owned) {
- return;
- }
-
- if (_route == target || _route->is_master()) {
- /* don't change the display for the target or the master bus */
- return;
- } else if (!is_track() && show_sends_button) {
- /* make sure our show sends button is inactive, and we no longer blink,
- since we're not the target.
- */
- send_blink_connection.disconnect ();
- show_sends_button->set_active (false);
- show_sends_button->set_state (STATE_NORMAL);
- }
-
- if (!target) {
- /* switch back to default */
- revert_to_default_display ();
- return;
- }
-
- boost::shared_ptr<Send> send = _route->internal_send_for (target);
+ RouteUI::bus_send_display_changed (send_to);
- if (send) {
- show_send (send);
+ if (send_to) {
+ boost::shared_ptr<Send> send = _route->internal_send_for (send_to);
+ if (send) {
+ show_send (send);
+ } else {
+ revert_to_default_display ();
+ }
} else {
revert_to_default_display ();
}
void
MixerStrip::revert_to_default_display ()
{
- if (show_sends_button) {
- show_sends_button->set_active (false);
- }
-
drop_send ();
set_current_delivery (_route->main_outs ());
{
switch (_width) {
case Wide:
- rec_enable_button_label.set_text (_("Rec"));
- mute_button_label.set_text (_("Mute"));
+ rec_enable_button->set_text (_("Rec"));
+ mute_button->set_text (_("Mute"));
monitor_input_button->set_text (_("In"));
monitor_disk_button->set_text (_("Disk"));
if (_route && _route->solo_safe()) {
- solo_button->remove ();
- if (solo_safe_image == 0) {
- solo_safe_image = new Gtk::Image (::get_icon("solo-safe-enabled"));
- solo_safe_image->show ();
+ if (solo_safe_pixbuf == 0) {
+ solo_safe_pixbuf = ::get_icon("solo-safe-icon");
}
- solo_button->add (*solo_safe_image);
+ solo_button->set_image (solo_safe_pixbuf);
+ solo_button->set_text (string());
} else {
- solo_button->remove ();
- solo_button->add (solo_button_label);
- solo_button_label.show ();
+ solo_button->set_image (Glib::RefPtr<Gdk::Pixbuf>());
if (!Config->get_solo_control_is_listen_control()) {
- solo_button_label.set_text (_("Solo"));
+ solo_button->set_text (_("Solo"));
} else {
switch (Config->get_listen_position()) {
case AfterFaderListen:
- solo_button_label.set_text (_("AFL"));
+ solo_button->set_text (_("AFL"));
break;
case PreFaderListen:
- solo_button_label.set_text (_("PFL"));
+ solo_button->set_text (_("PFL"));
break;
}
}
break;
default:
- rec_enable_button_label.set_text (_("R"));
- mute_button_label.set_text (_("M"));
+ rec_enable_button->set_text (_("R"));
+ mute_button->set_text (_("M"));
monitor_input_button->set_text (_("I"));
monitor_disk_button->set_text (_("D"));
if (_route && _route->solo_safe()) {
solo_button->remove ();
- if (solo_safe_image == 0) {
- solo_safe_image = new Gtk::Image (::get_icon("solo-safe-enabled"));
- solo_safe_image->show ();
+ if (solo_safe_pixbuf == 0) {
+ solo_safe_pixbuf =::get_icon("solo-safe-icon");
}
- solo_button->add (*solo_safe_image);
+ solo_button->set_image (solo_safe_pixbuf);
+ solo_button->set_text (string());
} else {
- solo_button->remove ();
- solo_button->add (solo_button_label);
- solo_button_label.show ();
+ solo_button->set_image (Glib::RefPtr<Gdk::Pixbuf>());
if (!Config->get_solo_control_is_listen_control()) {
- solo_button_label.set_text (_("S"));
+ solo_button->set_text (_("S"));
} else {
switch (Config->get_listen_position()) {
case AfterFaderListen:
- solo_button_label.set_text (_("A"));
+ solo_button->set_text (_("A"));
break;
case PreFaderListen:
- solo_button_label.set_text (_("P"));
+ solo_button->set_text (_("P"));
break;
}
}
_visibility.set_state (Config->get_mixer_strip_visibility ());
}
}
+
+/** Called to decide whether the solo isolate / solo lock button visibility should
+ * be overridden from that configured by the user. We do this for the master bus.
+ *
+ * @return optional value that is present if visibility state should be overridden.
+ */
+boost::optional<bool>
+MixerStrip::override_solo_visibility () const
+{
+ if (_route && _route->is_master ()) {
+ return boost::optional<bool> (false);
+ }
+
+ return boost::optional<bool> ();
+}
+
+void
+MixerStrip::add_input_port (DataType t)
+{
+ _route->input()->add_port ("", this, t);
+}
+
+void
+MixerStrip::add_output_port (DataType t)
+{
+ _route->output()->add_port ("", this, t);
+}
+
+void
+MixerStrip::route_active_changed ()
+{
+ reset_strip_style ();
+}