X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmixer_strip.cc;h=1b0c82975c88556ef4694c976844c28ac0b8a13a;hb=eb1e423b7521d4c277c11a884113f40e7406ade8;hp=c55648bfbb531aaf4f7567a0bbaeaa9a0701f15d;hpb=b48e803cf65b8437e7268e59199d65a3247b73ac;p=ardour.git diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index c55648bfbb..1b0c82975c 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -22,18 +22,13 @@ #include +#include + #include "pbd/convert.h" #include "pbd/enumwriter.h" #include "pbd/replace_all.h" #include "pbd/stacktrace.h" -#include -#include -#include -#include -#include -#include - #include "ardour/amp.h" #include "ardour/audio_track.h" #include "ardour/audioengine.h" @@ -56,11 +51,18 @@ #include "ardour/vca.h" #include "ardour/vca_manager.h" +#include "gtkmm2ext/gtk_ui.h" +#include "gtkmm2ext/menu_elems.h" +#include "gtkmm2ext/utils.h" +#include "gtkmm2ext/doi.h" + +#include "widgets/tooltips.h" + #include "ardour_window.h" +#include "enums_convert.h" #include "mixer_strip.h" #include "mixer_ui.h" #include "keyboard.h" -#include "ardour_button.h" #include "public_editor.h" #include "send_ui.h" #include "io_selector.h" @@ -68,13 +70,12 @@ #include "gui_thread.h" #include "route_group_menu.h" #include "meter_patterns.h" -#include "tooltips.h" #include "ui_config.h" #include "pbd/i18n.h" using namespace ARDOUR; -using namespace ARDOUR_UI_UTILS; +using namespace ArdourWidgets; using namespace PBD; using namespace Gtk; using namespace Gtkmm2ext; @@ -97,7 +98,6 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, bool in_mixer) , solo_iso_table (1, 2) , mute_solo_table (1, 2) , bottom_button_table (1, 3) - , meter_point_button (_("pre")) , monitor_section_button (0) , midi_input_enable_button (0) , _plugin_insert_cnt (0) @@ -130,9 +130,9 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, boost::shared_ptr rt , solo_iso_table (1, 2) , mute_solo_table (1, 2) , bottom_button_table (1, 3) - , meter_point_button (_("pre")) , monitor_section_button (0) , midi_input_enable_button (0) + , _plugin_insert_cnt (0) , _comment_button (_("Comments")) , trim_control (ArdourKnob::default_elements, ArdourKnob::Flags (ArdourKnob::Detent | ArdourKnob::ArcToZero)) , _visibility (X_("mixer-element-visibility")) @@ -152,7 +152,6 @@ MixerStrip::init () ignore_toggle = false; comment_area = 0; _width_owner = 0; - spacer = 0; /* the length of this string determines the width of the mixer strip when it is set to `wide' */ longest_label = "longest label"; @@ -179,13 +178,7 @@ MixerStrip::init () output_button.set_text (_("Output")); output_button.set_name ("mixer strip button"); - set_tooltip (&meter_point_button, _("Click to select metering point")); - meter_point_button.set_name ("mixer strip button"); - - bottom_button_table.attach (meter_point_button, 2, 3, 0, 1); - - meter_point_button.signal_button_press_event().connect (sigc::mem_fun (gpm, &GainMeter::meter_press), false); - meter_point_button.signal_button_release_event().connect (sigc::mem_fun (gpm, &GainMeter::meter_release), false); + bottom_button_table.attach (gpm.meter_point_button, 2, 3, 0, 1); hide_button.set_events (hide_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK)); @@ -322,6 +315,24 @@ MixerStrip::init () global_vpacker.pack_start (name_button, Gtk::PACK_SHRINK); } +#ifndef MIXBUS + //add a spacer underneath the master bus; + //this fills the area that is taken up by the scrollbar on the tracks; + //and therefore keeps the faders "even" across the bottom + int scrollbar_height = 0; + { + Gtk::Window window (WINDOW_TOPLEVEL); + HScrollbar scrollbar; + window.add (scrollbar); + scrollbar.set_name ("MixerWindow"); + scrollbar.ensure_style(); + Gtk::Requisition requisition(scrollbar.size_request ()); + scrollbar_height = requisition.height; + } + spacer.set_size_request (-1, scrollbar_height); + global_vpacker.pack_end (spacer, false, false); +#endif + global_frame.add (global_vpacker); global_frame.set_shadow_type (Gtk::SHADOW_IN); global_frame.set_name ("BaseFrame"); @@ -353,7 +364,6 @@ MixerStrip::init () number_label.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::number_button_button_press), false); name_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::name_button_button_press), false); - name_button.signal_button_release_event().connect (sigc::mem_fun(*this, &MixerStrip::name_button_button_release), false); group_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::select_route_group), false); @@ -417,6 +427,22 @@ MixerStrip::~MixerStrip () _entered_mixer_strip = NULL; } +void +MixerStrip::vca_assign (boost::shared_ptr vca) +{ + boost::shared_ptr sl = boost::dynamic_pointer_cast ( route() ); + if (sl) + sl->assign(vca); +} + +void +MixerStrip::vca_unassign (boost::shared_ptr vca) +{ + boost::shared_ptr sl = boost::dynamic_pointer_cast ( route() ); + if (sl) + sl->unassign(vca); +} + bool MixerStrip::mixer_strip_enter_event (GdkEventCrossing* /*ev*/) { @@ -532,9 +558,8 @@ MixerStrip::set_route (boost::shared_ptr rt) solo_button->hide (); mute_button->show (); rec_mon_table.hide (); - if (solo_iso_table.get_parent()) { - solo_iso_table.get_parent()->remove(solo_iso_table); - } + solo_iso_table.set_sensitive(false); + control_slave_ui.set_sensitive(false); if (monitor_section_button == 0) { Glib::RefPtr act = ActionManager::get_action ("Common", "ToggleMonitorSection"); _session->MonitorChanged.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::monitor_changed, this), gui_context()); @@ -555,18 +580,14 @@ MixerStrip::set_route (boost::shared_ptr rt) mute_button->show (); solo_button->show (); rec_mon_table.show (); + solo_iso_table.set_sensitive(true); + control_slave_ui.set_sensitive(true); } if (_mixer_owned && route()->is_master() ) { - - HScrollbar scrollbar; - Gtk::Requisition requisition(scrollbar.size_request ()); - int scrollbar_height = requisition.height; - - spacer = manage (new EventBox); - spacer->set_size_request (-1, scrollbar_height+2); - global_vpacker.pack_start (*spacer, false, false); - spacer->show(); + spacer.show(); + } else { + spacer.hide(); } if (is_track()) { @@ -634,7 +655,7 @@ MixerStrip::set_route (boost::shared_ptr rt) } } - meter_point_button.set_text (meter_point_string (_route->meter_point())); + gpm.meter_point_button.set_text (meter_point_string (_route->meter_point())); delete route_ops_menu; route_ops_menu = 0; @@ -702,7 +723,7 @@ MixerStrip::set_route (boost::shared_ptr rt) mute_solo_table.show(); bottom_button_table.show(); gpm.show_all (); - meter_point_button.show(); + gpm.meter_point_button.show(); input_button_box.show_all(); output_button.show(); name_button.show(); @@ -721,9 +742,9 @@ MixerStrip::set_stuff_from_route () { /* if width is not set, it will be set by the MixerUI or editor */ - string str = gui_property ("strip-width"); - if (!str.empty()) { - set_width_enum (Width (string_2_enum (str, _width)), this); + Width width; + if (get_gui_property ("strip-width", width)) { + set_width_enum (width, this); } } @@ -742,7 +763,7 @@ MixerStrip::set_width_enum (Width w, void* owner) _width = w; if (_width_owner == this) { - set_gui_property ("strip-width", enum_2_string (_width)); + set_gui_property ("strip-width", _width); } set_button_names (); @@ -756,14 +777,10 @@ MixerStrip::set_width_enum (Width w, void* owner) show_sends_button->set_text (_("Aux")); } - gpm.gain_automation_style_button.set_text ( - gpm.astyle_string(gain_automation->automation_style())); gpm.gain_automation_state_button.set_text ( gpm.astate_string(gain_automation->automation_state())); if (_route->panner()) { - ((Gtk::Label*)panners.pan_automation_style_button.get_child())->set_text ( - panners.astyle_string(_route->panner()->automation_style())); ((Gtk::Label*)panners.pan_automation_state_button.get_child())->set_text ( panners.astate_string(_route->panner()->automation_state())); } @@ -782,15 +799,11 @@ MixerStrip::set_width_enum (Width w, void* owner) show_sends_button->set_text (_("Snd")); } - gpm.gain_automation_style_button.set_text ( - gpm.short_astyle_string(gain_automation->automation_style())); gpm.gain_automation_state_button.set_text ( gpm.short_astate_string(gain_automation->automation_state())); gain_meter().setup_meters (); // recalc meter width if (_route->panner()) { - ((Gtk::Label*)panners.pan_automation_style_button.get_child())->set_text ( - panners.short_astyle_string(_route->panner()->automation_style())); ((Gtk::Label*)panners.pan_automation_state_button.get_child())->set_text ( panners.short_astate_string(_route->panner()->automation_state())); } @@ -818,12 +831,7 @@ void MixerStrip::set_packed (bool yn) { _packed = yn; - - if (_packed) { - set_gui_property ("visible", true); - } else { - set_gui_property ("visible", false); - } + set_gui_property ("visible", _packed); } @@ -918,7 +926,9 @@ MixerStrip::output_press (GdkEventButton *ev) citems.push_back (SeparatorElem()); citems.push_back (MenuElem (_("Routing Grid"), sigc::mem_fun (*(static_cast(this)), &RouteUI::edit_output_configuration))); - output_menu.popup (1, ev->time); + Gtkmm2ext::anchored_menu_popup(&output_menu, &output_button, "", + 1, ev->time); + break; } @@ -1020,7 +1030,8 @@ MixerStrip::input_press (GdkEventButton *ev) citems.push_back (SeparatorElem()); citems.push_back (MenuElem (_("Routing Grid"), sigc::mem_fun (*(static_cast(this)), &RouteUI::edit_input_configuration))); - input_menu.popup (1, ev->time); + Gtkmm2ext::anchored_menu_popup(&input_menu, &input_button, "", + 1, ev->time); break; } @@ -1083,11 +1094,7 @@ MixerStrip::maybe_add_bundle_to_input_menu (boost::shared_ptr b, ARDOUR: input_menu_bundles.push_back (b); MenuList& citems = input_menu.items(); - - std::string n = b->name (); - replace_all (n, "_", " "); - - citems.push_back (MenuElem (n, sigc::bind (sigc::mem_fun(*this, &MixerStrip::bundle_input_chosen), b))); + citems.push_back (MenuElemNoMnemonic (b->name (), sigc::bind (sigc::mem_fun(*this, &MixerStrip::bundle_input_chosen), b))); } void @@ -1111,21 +1118,17 @@ MixerStrip::maybe_add_bundle_to_output_menu (boost::shared_ptr b, ARDOUR output_menu_bundles.push_back (b); MenuList& citems = output_menu.items(); - - std::string n = b->name (); - replace_all (n, "_", " "); - - citems.push_back (MenuElem (n, sigc::bind (sigc::mem_fun(*this, &MixerStrip::bundle_output_chosen), b))); + citems.push_back (MenuElemNoMnemonic (b->name (), sigc::bind (sigc::mem_fun(*this, &MixerStrip::bundle_output_chosen), b))); } void MixerStrip::update_diskstream_display () { - if (is_track() && input_selector) { - input_selector->hide_all (); - } + if (is_track() && input_selector) { + input_selector->hide_all (); + } - route_color_changed (); + route_color_changed (); } void @@ -1143,7 +1146,6 @@ MixerStrip::connect_to_pan () boost::shared_ptr p = _route->pannable (); p->automation_state_changed.connect (panstate_connection, invalidator (*this), boost::bind (&PannerUI::pan_automation_state_changed, &panners), gui_context()); - p->automation_style_changed.connect (panstyle_connection, invalidator (*this), boost::bind (&PannerUI::pan_automation_style_changed, &panners), gui_context()); /* This call reduncant, PannerUI::set_panner() connects to _panshell->Changed itself * However, that only works a panner was previously set. @@ -1618,6 +1620,7 @@ MixerStrip::route_group_changed () void MixerStrip::route_color_changed () { + using namespace ARDOUR_UI_UTILS; name_button.modify_bg (STATE_NORMAL, color()); number_label.set_fixed_colors (gdk_color_to_rgba (color()), gdk_color_to_rgba (color())); reset_strip_style (); @@ -1637,7 +1640,13 @@ MixerStrip::help_count_plugins (boost::weak_ptr p) if (!processor || !processor->display_to_user()) { return; } - if (boost::dynamic_pointer_cast (processor)) { + boost::shared_ptr pi = boost::dynamic_pointer_cast (processor); +#ifdef MIXBUS + if (pi && pi->is_channelstrip ()) { + return; + } +#endif + if (pi) { ++_plugin_insert_cnt; } } @@ -1658,13 +1667,26 @@ MixerStrip::build_route_ops_menu () items.push_back (MenuElem (_("Outputs..."), sigc::mem_fun (*this, &RouteUI::edit_output_configuration))); - items.push_back (SeparatorElem()); + if (!Profile->get_mixbus()) { + items.push_back (SeparatorElem()); + } - if (!_route->is_master()) { + if (!_route->is_master() +#ifdef MIXBUS + && !_route->mixbus() +#endif + ) { + if (Profile->get_mixbus()) { + items.push_back (SeparatorElem()); + } items.push_back (MenuElem (_("Save As Template..."), sigc::mem_fun(*this, &RouteUI::save_as_template))); } - items.push_back (MenuElem (_("Rename..."), sigc::mem_fun(*this, &RouteUI::route_rename))); - rename_menu_item = &items.back(); + + if (!Profile->get_mixbus()) { + items.push_back (MenuElem (_("Rename..."), sigc::mem_fun(*this, &RouteUI::route_rename))); + /* do not allow rename if the track is record-enabled */ + items.back().set_sensitive (!is_track() || !track()->rec_enable_control()->get_value()); + } items.push_back (SeparatorElem()); items.push_back (CheckMenuElem (_("Active"))); @@ -1688,6 +1710,12 @@ MixerStrip::build_route_ops_menu () items.push_back (MenuElem (_("Pin Connections..."), sigc::mem_fun (*this, &RouteUI::manage_pins))); } + if (_route->the_instrument () && _route->the_instrument ()->output_streams().n_audio() > 2) { + // TODO ..->n_audio() > 1 && separate_output_groups) hard to check here every time. + items.push_back (MenuElem (_("Fan out to Busses"), sigc::bind (sigc::mem_fun (*this, &RouteUI::fan_out), true, true))); + items.push_back (MenuElem (_("Fan out to Tracks"), sigc::bind (sigc::mem_fun (*this, &RouteUI::fan_out), false, true))); + } + items.push_back (SeparatorElem()); items.push_back (MenuElem (_("Adjust Latency..."), sigc::mem_fun (*this, &RouteUI::adjust_latency))); @@ -1723,12 +1751,15 @@ MixerStrip::build_route_ops_menu () gboolean MixerStrip::name_button_button_press (GdkEventButton* ev) { - if (ev->button == 3) { + if (ev->button == 1 || ev->button == 3) { list_route_operations (); - /* do not allow rename if the track is record-enabled */ - rename_menu_item->set_sensitive (!is_track() || !track()->rec_enable_control()->get_value()); - route_ops_menu->popup (1, ev->time); + if (ev->button == 1) { + Gtkmm2ext::anchored_menu_popup(route_ops_menu, &name_button, "", + 1, ev->time); + } else { + route_ops_menu->popup (3, ev->time); + } return true; } @@ -1736,28 +1767,12 @@ MixerStrip::name_button_button_press (GdkEventButton* ev) return false; } -gboolean -MixerStrip::name_button_button_release (GdkEventButton* ev) -{ - if (ev->button == 1) { - list_route_operations (); - - /* do not allow rename if the track is record-enabled */ - rename_menu_item->set_sensitive (!is_track() || !track()->rec_enable_control()->get_value()); - route_ops_menu->popup (1, ev->time); - } - - return false; -} - gboolean MixerStrip::number_button_button_press (GdkEventButton* ev) { if ( ev->button == 3 ) { list_route_operations (); - /* do not allow rename if the track is record-enabled */ - rename_menu_item->set_sensitive (!is_track() || !track()->rec_enable_control()->get_value()); route_ops_menu->popup (1, ev->time); return true; @@ -1819,7 +1834,7 @@ MixerStrip::name_changed () if (track_number == 0) { number_label.set_text ("-"); } else { - number_label.set_text (PBD::to_string (abs(_route->track_number ()), std::dec)); + number_label.set_text (PBD::to_string (abs(_route->track_number ()))); } } else { number_label.set_text (""); @@ -2068,7 +2083,7 @@ MixerStrip::monitor_changed () void MixerStrip::meter_changed () { - meter_point_button.set_text (meter_point_string (_route->meter_point())); + gpm.meter_point_button.set_text (meter_point_string (_route->meter_point())); gpm.setup_meters (); // reset peak when meter point changes gpm.reset_peak_display(); @@ -2109,7 +2124,7 @@ MixerStrip::drop_send () output_button.set_sensitive (true); group_button.set_sensitive (true); set_invert_sensitive (true); - meter_point_button.set_sensitive (true); + gpm.meter_point_button.set_sensitive (true); mute_button->set_sensitive (true); solo_button->set_sensitive (true); solo_isolated_led->set_sensitive (true); @@ -2156,7 +2171,7 @@ MixerStrip::show_send (boost::shared_ptr send) input_button.set_sensitive (false); group_button.set_sensitive (false); set_invert_sensitive (false); - meter_point_button.set_sensitive (false); + gpm.meter_point_button.set_sensitive (false); mute_button->set_sensitive (false); solo_button->set_sensitive (false); rec_enable_button->set_sensitive (false); @@ -2262,9 +2277,9 @@ MixerStrip::set_button_names () } if (_route) { - meter_point_button.set_text (meter_point_string (_route->meter_point())); + gpm.meter_point_button.set_text (meter_point_string (_route->meter_point())); } else { - meter_point_button.set_text (""); + gpm.meter_point_button.set_text (""); } }