X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmixer_strip.cc;h=8ab7454ab8846e519714b2095955d14864bae692;hb=ae6dbb836cc1ab1bcbc21883f282361c43f10883;hp=07e17159dcb0d0fe9a326fad08f20461a0dc668e;hpb=955d731fa6933e6769986687a781d16f7889da67;p=ardour.git diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 07e17159dc..8ab7454ab8 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -58,7 +58,7 @@ #include "io_selector.h" #include "utils.h" #include "gui_thread.h" -#include "route_group_dialog.h" +#include "route_group_menu.h" #include "i18n.h" @@ -75,11 +75,10 @@ int MixerStrip::scrollbar_height = 0; MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, bool in_mixer) : AxisView(sess) - , RouteUI (sess, _("Mute"), _("Solo"), _("Record")) + , RouteUI (sess) ,_mixer(mx) , _mixer_owned (in_mixer) - , pre_processor_box (PreFader, sess, mx.plugin_selector(), mx.selection(), this, in_mixer) - , post_processor_box (PostFader, sess, mx.plugin_selector(), mx.selection(), this, in_mixer) + , processor_box (sess, mx.plugin_selector(), mx.selection(), this, in_mixer) , gpm (sess) , panners (sess) , button_table (3, 2) @@ -102,11 +101,10 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, bool in_mixer) MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, boost::shared_ptr rt, bool in_mixer) : AxisView(sess) - , RouteUI (sess, _("Mute"), _("Solo"), _("Record")) + , RouteUI (sess) ,_mixer(mx) , _mixer_owned (in_mixer) - , pre_processor_box (PreFader, sess, mx.plugin_selector(), mx.selection(), this, in_mixer) - , post_processor_box (PostFader, sess, mx.plugin_selector(), mx.selection(), this, in_mixer) + , processor_box (sess, mx.plugin_selector(), mx.selection(), this, in_mixer) , gpm (sess) , panners (sess) , button_table (3, 2) @@ -117,6 +115,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, boost::shared_ptr rt { init (); + set_button_names (); set_route (rt); } @@ -230,11 +229,10 @@ MixerStrip::init () global_vpacker.pack_start (whvbox, Gtk::PACK_SHRINK); global_vpacker.pack_start (button_table,Gtk::PACK_SHRINK); - global_vpacker.pack_start (pre_processor_box, true, true); + global_vpacker.pack_start (processor_box, true, true); global_vpacker.pack_start (middle_button_table,Gtk::PACK_SHRINK); global_vpacker.pack_start (gain_meter_alignment,Gtk::PACK_SHRINK); global_vpacker.pack_start (bottom_button_table,Gtk::PACK_SHRINK); - global_vpacker.pack_start (post_processor_box, true, true); if (!is_midi_track()) { global_vpacker.pack_start (panners, Gtk::PACK_SHRINK); } @@ -297,8 +295,14 @@ MixerStrip::init () else set_name ("AudioTrackStripBase"); - add_events (Gdk::BUTTON_RELEASE_MASK); + add_events (Gdk::BUTTON_RELEASE_MASK| + Gdk::ENTER_NOTIFY_MASK| + Gdk::LEAVE_NOTIFY_MASK| + Gdk::KEY_PRESS_MASK| + Gdk::KEY_RELEASE_MASK); + set_flags (get_flags() | Gtk::CAN_FOCUS); + SwitchIO.connect (mem_fun (*this, &MixerStrip::switch_io)); } @@ -339,9 +343,8 @@ MixerStrip::set_route (boost::shared_ptr rt) _current_delivery = _route->main_outs (); panners.set_panner (rt->main_outs()->panner()); - gpm.set_controls (rt, rt->shared_peak_meter(), rt->gain_control(), rt->amp()); - pre_processor_box.set_route (rt); - post_processor_box.set_route (rt); + gpm.set_controls (rt, rt->shared_peak_meter(), rt->amp()); + processor_box.set_route (rt); if (set_color_from_route()) { set_color (unique_random_color()); @@ -435,8 +438,7 @@ MixerStrip::set_route (boost::shared_ptr rt) /* now force an update of all the various elements */ - pre_processor_box.update(); - post_processor_box.update(); + processor_box.update(); mute_changed (0); solo_changed (0); name_changed (); @@ -453,7 +455,7 @@ MixerStrip::set_route (boost::shared_ptr rt) add_events (Gdk::BUTTON_RELEASE_MASK); - pre_processor_box.show(); + processor_box.show(); if (!route()->is_master() && !route()->is_control()) { /* we don't allow master or control routes to be hidden */ @@ -468,11 +470,10 @@ MixerStrip::set_route (boost::shared_ptr rt) button_table.show(); middle_button_table.show(); bottom_button_table.show(); - pre_processor_box.show_all (); + processor_box.show_all (); gpm.show_all (); panners.show_all (); gain_meter_alignment.show (); - post_processor_box.show_all (); gain_unit_button.show(); gain_unit_label.show(); meter_point_button.show(); @@ -524,8 +525,7 @@ MixerStrip::set_width_enum (Width w, void* owner) gpm.set_width (w); panners.set_width (w); - pre_processor_box.set_width (w); - post_processor_box.set_width (w); + processor_box.set_width (w); boost::shared_ptr gain_automation = _route->gain_control()->alist(); @@ -539,17 +539,13 @@ MixerStrip::set_width_enum (Width w, void* owner) xml_node->add_property ("strip-width", enum_2_string (_width)); } + set_button_names (); + switch (w) { case Wide: - - if (rec_enable_button) { - ((Gtk::Label*)rec_enable_button->get_child())->set_text (_("Record")); - } if (show_sends_button) { ((Gtk::Label*)show_sends_button->get_child())->set_text (_("Sends")); } - ((Gtk::Label*)mute_button->get_child())->set_text (_("Mute")); - ((Gtk::Label*)solo_button->get_child())->set_text (_("Solo")); if (_route->comment() == "") { comment_button.unset_bg (STATE_NORMAL); @@ -576,14 +572,9 @@ MixerStrip::set_width_enum (Width w, void* owner) break; case Narrow: - if (rec_enable_button) { - ((Gtk::Label*)rec_enable_button->get_child())->set_text (_("Rec")); - } if (show_sends_button) { ((Gtk::Label*)show_sends_button->get_child())->set_text (_("Snd")); } - ((Gtk::Label*)mute_button->get_child())->set_text (_("M")); - ((Gtk::Label*)solo_button->get_child())->set_text (_("S")); if (_route->comment() == "") { comment_button.unset_bg (STATE_NORMAL); @@ -613,9 +604,7 @@ MixerStrip::set_width_enum (Width w, void* owner) update_output_display (); route_group_changed (0); name_changed (); -#ifdef GTKOSX - WidthChanged(); -#endif + WidthChanged (); } void @@ -950,14 +939,14 @@ MixerStrip::diskstream_changed () } void -MixerStrip::input_changed (IOChange change, void *src) +MixerStrip::input_changed (IOChange /*change*/, void */*src*/) { Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &MixerStrip::update_input_display)); set_width_enum (_width, this); } void -MixerStrip::output_changed (IOChange change, void *src) +MixerStrip::output_changed (IOChange /*change*/, void */*src*/) { Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &MixerStrip::update_output_display)); set_width_enum (_width, this); @@ -1070,50 +1059,24 @@ MixerStrip::set_route_group (RouteGroup *rg) _route->set_route_group (rg, this); } -void -MixerStrip::add_route_group_to_menu (RouteGroup *rg, RadioMenuItem::Group* group) -{ - using namespace Menu_Helpers; - - MenuList& items = group_menu->items(); - - items.push_back (RadioMenuElem (*group, rg->name(), bind (mem_fun(*this, &MixerStrip::set_route_group), rg))); - - if (_route->route_group() == rg) { - static_cast(&items.back())->set_active (); - } -} - bool MixerStrip::select_route_group (GdkEventButton *ev) { using namespace Menu_Helpers; - if (group_menu == 0) { - group_menu = new Menu; - } - group_menu->set_name ("ArdourContextMenu"); - MenuList& items = group_menu->items(); - RadioMenuItem::Group group; + if (ev->button == 1) { - switch (ev->button) { - case 1: - - items.clear (); - - items.push_back (MenuElem (_("New group..."), mem_fun (*this, &MixerStrip::set_route_group_to_new))); - - items.push_back (SeparatorElem ()); - - items.push_back (RadioMenuElem (group, _("No group"), bind (mem_fun(*this, &MixerStrip::set_route_group), (RouteGroup *) 0))); - - _session.foreach_route_group (bind (mem_fun (*this, &MixerStrip::add_route_group_to_menu), &group)); + if (group_menu == 0) { + + group_menu = new RouteGroupMenu ( + _session, + (RouteGroup::Property) (RouteGroup::Gain | RouteGroup::Mute | RouteGroup::Solo) + ); + + group_menu->GroupSelected.connect (mem_fun (*this, &MixerStrip::set_route_group)); + } group_menu->popup (1, ev->time); - break; - - default: - break; } return true; @@ -1125,9 +1088,14 @@ MixerStrip::route_group_changed (void *ignored) ENSURE_GUI_THREAD(bind (mem_fun(*this, &MixerStrip::route_group_changed), ignored)); RouteGroup *rg = _route->route_group(); - + if (rg) { - group_label.set_text (rg->name()); + /* XXX: this needs a better algorithm */ + string truncated = rg->name (); + if (truncated.length () > 5) { + truncated = truncated.substr (0, 5); + } + group_label.set_text (truncated); } else { switch (_width) { case Wide: @@ -1304,12 +1272,10 @@ MixerStrip::map_frozen () if (at) { switch (at->freeze_state()) { case AudioTrack::Frozen: - pre_processor_box.set_sensitive (false); - post_processor_box.set_sensitive (false); + processor_box.set_sensitive (false); break; default: - pre_processor_box.set_sensitive (true); - post_processor_box.set_sensitive (true); + processor_box.set_sensitive (true); // XXX need some way, maybe, to retoggle redirect editors break; } @@ -1446,16 +1412,19 @@ MixerStrip::switch_io (boost::shared_ptr target) _current_delivery = _route->internal_send_for (target); + cerr << "internal send from " << _route->name() << " to " << target->name() << " = " + << _current_delivery << endl; + if (_current_delivery) { send = boost::dynamic_pointer_cast(_current_delivery); send->set_metering (true); _current_delivery->GoingAway.connect (mem_fun (*this, &MixerStrip::revert_to_default_display)); - gain_meter().set_controls (_route, send->meter(), send->amp()->gain_control(), send->amp()); + gain_meter().set_controls (_route, send->meter(), send->amp()); panner_ui().set_panner (_current_delivery->panner()); } else { _current_delivery = _route->main_outs (); - gain_meter().set_controls (_route, _route->shared_peak_meter(), _route->gain_control(), _route->amp()); + gain_meter().set_controls (_route, _route->shared_peak_meter(), _route->amp()); panner_ui().set_panner (_route->main_outs()->panner()); } @@ -1477,25 +1446,162 @@ MixerStrip::revert_to_default_display () _current_delivery = _route->main_outs(); - gain_meter().set_controls (_route, _route->shared_peak_meter(), _route->gain_control(), _route->amp()); + gain_meter().set_controls (_route, _route->shared_peak_meter(), _route->amp()); gain_meter().setup_meters (); panner_ui().set_panner (_route->main_outs()->panner()); panner_ui().setup_pan (); } void -MixerStrip::set_route_group_to_new () +MixerStrip::set_button_names () { - RouteGroup* g = new RouteGroup (_session, "", RouteGroup::Active); - g->set_active (true, this); + switch (_width) { + case Wide: + rec_enable_button_label.set_text (_("Rec")); + mute_button_label.set_text (_("Mute")); + if (!Config->get_solo_control_is_listen_control()) { + solo_button_label.set_text (_("Solo")); + } else { + switch (Config->get_listen_position()) { + case AfterFaderListen: + solo_button_label.set_text (_("AFL")); + break; + case PreFaderListen: + solo_button_label.set_text (_("PFL")); + break; + } + } + break; - RouteGroupDialog d (g, Gtk::Stock::NEW); - int const r = d.do_run (); + default: + rec_enable_button_label.set_text (_("R")); + mute_button_label.set_text (_("M")); + if (!Config->get_solo_control_is_listen_control()) { + solo_button_label.set_text (_("S")); + } else { + switch (Config->get_listen_position()) { + case AfterFaderListen: + solo_button_label.set_text (_("A")); + break; + case PreFaderListen: + solo_button_label.set_text (_("P")); + break; + } + } + break; + + } +} - if (r == Gtk::RESPONSE_OK) { - _session.add_route_group (g); - _route->set_route_group (g, this); - } else { - delete g; +bool +MixerStrip::on_key_press_event (GdkEventKey* ev) +{ + GdkEventButton fake; + fake.type = GDK_BUTTON_PRESS; + fake.button = 1; + fake.state = ev->state; + + switch (ev->keyval) { + case GDK_m: + mute_press (&fake); + return true; + break; + + case GDK_s: + solo_press (&fake); + return true; + break; + + case GDK_r: + rec_enable_press (&fake); + return true; + break; + + case GDK_e: + show_sends_press (&fake); + return true; + break; + + case GDK_g: + if (ev->state & Keyboard::PrimaryModifier) { + step_gain_down (); + } else { + step_gain_up (); + } + return true; + break; + + case GDK_0: + if (_route) { + _route->set_gain (1.0, this); + } + return true; + + default: + break; } + + return false; +} + + +bool +MixerStrip::on_key_release_event (GdkEventKey* ev) +{ + GdkEventButton fake; + fake.type = GDK_BUTTON_RELEASE; + fake.button = 1; + fake.state = ev->state; + + switch (ev->keyval) { + case GDK_m: + mute_release (&fake); + return true; + break; + + case GDK_s: + solo_release (&fake); + return true; + break; + + case GDK_r: + rec_enable_release (&fake); + return true; + break; + + case GDK_e: + show_sends_release (&fake); + return true; + break; + + case GDK_g: + return true; + break; + + default: + break; + } + + return false; +} + +bool +MixerStrip::on_enter_notify_event (GdkEventCrossing*) +{ + Keyboard::magic_widget_grab_focus (); + grab_focus (); + return false; +} + +bool +MixerStrip::on_leave_notify_event (GdkEventCrossing* ev) +{ + switch (ev->detail) { + case GDK_NOTIFY_INFERIOR: + break; + default: + Keyboard::magic_widget_drop_focus (); + } + + return false; }