#include "io_selector.h"
#include "utils.h"
#include "gui_thread.h"
-#include "route_group_dialog.h"
+#include "route_group_menu.h"
#include "i18n.h"
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)
MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, boost::shared_ptr<Route> 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)
{
init ();
+ set_button_names ();
set_route (rt);
}
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);
}
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));
}
_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());
/* 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 ();
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 */
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();
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<AutomationList> gain_automation = _route->gain_control()->alist();
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);
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);
update_output_display ();
route_group_changed (0);
name_changed ();
-#ifdef GTKOSX
- WidthChanged();
-#endif
+ WidthChanged ();
}
void
}
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);
_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<RadioMenuItem*>(&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;
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;
}
_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<Send>(_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());
}
_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;
}