Foldback GUI: Add menus to send box

This commit is contained in:
Len Ovens 2019-09-07 14:51:01 -07:00
parent 3ecf0fde19
commit a8447a35ac
2 changed files with 185 additions and 43 deletions

View File

@ -41,6 +41,7 @@
#include "keyboard.h"
#include "public_editor.h"
#include "send_ui.h"
#include "timers.h"
#include "io_selector.h"
#include "utils.h"
#include "gui_thread.h"
@ -113,8 +114,7 @@ FoldbackSend::FoldbackSend (boost::shared_ptr<Send> snd, \
_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &FoldbackSend::level_adjusted));
lc->Changed.connect (_connections, invalidator (*this), boost::bind (&FoldbackSend::level_changed, this), gui_context ());
_send_proc->ActiveChanged.connect (_connections, invalidator (*this), boost::bind (&FoldbackSend::send_state_changed, this), gui_context ());
/// create button_press() then enable next line
//_button.signal_button_press_event().connect (sigc::mem_fun (*this, &FoldbackSend::button_press), false);
_button.signal_button_press_event().connect (sigc::mem_fun (*this, &FoldbackSend::button_press));
show ();
@ -123,14 +123,14 @@ FoldbackSend::FoldbackSend (boost::shared_ptr<Send> snd, \
FoldbackSend::~FoldbackSend ()
{
_connections.drop_connections();
_slider.set_controllable (boost::shared_ptr<AutomationControl> ());
pan_control.set_controllable (boost::shared_ptr<AutomationControl> ());
_send = boost::shared_ptr<Send> ();
_send_route = boost::shared_ptr<Route> ();
_foldback_route = boost::shared_ptr<Route> ();
_send_proc = boost::shared_ptr<Processor> ();
_send_del = boost::shared_ptr<Delivery> ();
_connections.drop_connections();
pan_control.set_controllable (boost::shared_ptr<AutomationControl> ());
_slider.set_controllable (boost::shared_ptr<AutomationControl> ());
}
@ -147,6 +147,18 @@ FoldbackSend::led_clicked(GdkEventButton *ev)
}
}
gboolean
FoldbackSend::button_press (GdkEventButton* ev)
{
if (ev->button == 1) {
Menu* menu = build_send_menu ();
Gtkmm2ext::anchored_menu_popup(menu, &_button, "", 1, ev->time);
return true;
}
return false;
}
void
FoldbackSend::send_state_changed ()
{
@ -203,6 +215,59 @@ FoldbackSend::set_tooltip ()
ArdourWidgets::set_tooltip (_button, Gtkmm2ext::markup_escape_text (sm));
}
Menu*
FoldbackSend::build_send_menu ()
{
using namespace Menu_Helpers;
if (!_send) {
return NULL;
}
Menu* menu = manage (new Menu);
MenuList& items = menu->items ();
menu->set_name ("ArdourContextMenu");
items.push_back (
MenuElem(_("Copy track/bus gain to send"), sigc::bind (sigc::mem_fun (*this, &FoldbackSend::set_gain), -0.1))
);
items.push_back (
MenuElem(_("Set send gain to -inf"), sigc::bind (sigc::mem_fun (*this, &FoldbackSend::set_gain), 0.0))
);
items.push_back (
MenuElem(_("Set send gain to 0dB"), sigc::bind (sigc::mem_fun (*this, &FoldbackSend::set_gain), 1.0))
);
items.push_back (MenuElem(_("Remove This Send"), sigc::mem_fun (*this, &FoldbackSend::remove_me)));
return menu;
}
void
FoldbackSend::set_gain (float new_gain)
{
if (new_gain < 0) {
// get level from sending route
new_gain = _send_route->gain_control ()->get_value ();
}
boost::shared_ptr<AutomationControl> lc = _send->gain_control();
if (!lc) {
return;
}
lc->set_value (new_gain, Controllable::NoGroup);
}
void
FoldbackSend::remove_me ()
{
boost::shared_ptr<Processor> send_proc = boost::dynamic_pointer_cast<Processor> (_send);
_connections.drop_connections();
_send_route->remove_processor (send_proc);
}
FoldbackStrip* FoldbackStrip::_entered_foldback_strip;
PBD::Signal1<void,FoldbackStrip*> FoldbackStrip::CatchDeletion;
@ -236,7 +301,7 @@ FoldbackStrip::init ()
comment_area = 0;
_width_owner = 0;
/* the length of this string determines the width of the mixer strip when it is set to `wide' */
/* the length of this string determines the width of the foldback strip */
longest_label = "longest label";
output_button.set_text (_("Output"));
@ -248,6 +313,7 @@ FoldbackStrip::init ()
send_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
send_scroller.add (send_display);
send_scroller.get_child()->set_name ("FoldbackBusStripBase");
send_scroller.signal_button_press_event().connect (sigc::mem_fun (*this, &FoldbackStrip::send_button_press_event));
insert_box = new ProcessorBox (0, boost::bind (&FoldbackStrip::plugin_selector, this), _pr_selection, 0);
insert_box->set_no_show_all ();
@ -272,12 +338,6 @@ FoldbackStrip::init ()
mute_solo_table.set_homogeneous (true);
mute_solo_table.set_spacings (2);
show_sends_button->set_text (_("Show Sends"));
show_sends_box.pack_start (*show_sends_button, true, true);
show_sends_button->show();
name_button.set_name ("mixer strip button");
name_button.set_text_ellipsize (Pango::ELLIPSIZE_END);
@ -286,6 +346,13 @@ FoldbackStrip::init ()
_next_button.set_name ("mixer strip button");
_next_button.set_text (_("Next"));
_show_sends_button.set_name ("send alert button");
_show_sends_button.set_text (_("Show Sends"));
UI::instance()->set_tip (&_show_sends_button, _("make mixer strips show sends to this bus"), "");
_show_sends_button.signal_button_press_event().connect (sigc::mem_fun(*this, &FoldbackStrip::show_sends_press), false);
show_sends_box.pack_start (_show_sends_button, true, true);
_show_sends_button.show();
prev_next_box.set_homogeneous (true);
prev_next_box.pack_start (_previous_button, true, true);
prev_next_box.pack_start (_next_button, true, true);
@ -380,6 +447,7 @@ FoldbackStrip::~FoldbackStrip ()
fb_level_control = 0;
_connections.drop_connections();
clear_send_box ();
send_blink_connection.disconnect ();
if (this ==_entered_foldback_strip)
_entered_foldback_strip = NULL;
@ -458,7 +526,11 @@ FoldbackStrip::set_route (boost::shared_ptr<Route> rt)
update_fb_level_control();
BusSendDisplayChanged (boost::shared_ptr<Route> ());
show_sends_button->show();
_showing_sends = false;
_show_sends_button.set_active (false);
send_blink_connection.disconnect ();
_show_sends_button.show();
delete route_ops_menu;
route_ops_menu = 0;
@ -732,18 +804,6 @@ FoldbackStrip::connect_to_pan ()
boost::shared_ptr<Pannable> p = _route->pannable ();
//p->automation_state_changed.connect (panstate_connection, invalidator (*this), boost::bind (&PannerUI::pan_automation_state_changed, &panners), gui_context());
/* This call reduncant, PannerUI::set_panner() connects to _panshell->Changed itself
* However, that only works a panner was previously set.
*
* PannerUI must remain subscribed to _panshell->Changed() in case
* we switch the panner eg. AUX-Send and back
* _route->panner_shell()->Changed() vs _panshell->Changed
*/
/*if (panners._panner == 0) {
panners.panshell_changed ();
}*/
update_panner_choices();
}
@ -1215,7 +1275,7 @@ FoldbackStrip::previous_button_button_press (GdkEventButton* ev)
}
}
} else {
// only one route do nothing
// only one route or none do nothing
return true;
}
//use previous to set route
@ -1230,6 +1290,42 @@ FoldbackStrip::previous_button_button_press (GdkEventButton* ev)
return false;
}
gboolean
FoldbackStrip::show_sends_press (GdkEventButton* ev)
{
if (ev->button == 1 || ev->button == 3) {
if (_showing_sends) {
BusSendDisplayChanged (boost::shared_ptr<Route> ()); /* EMIT SIGNAL */
_showing_sends = false;
_show_sends_button.set_active (false);
send_blink_connection.disconnect ();
} else {
BusSendDisplayChanged (_route); /* EMIT SIGNAL */
_showing_sends = true;
_show_sends_button.set_active (true);
send_blink_connection = Timers::blink_connect (sigc::mem_fun (*this, &FoldbackStrip::send_blink));
}
return true;
}
return false;
}
void
FoldbackStrip::send_blink (bool onoff)
{
if (!(&_show_sends_button)) {
return;
}
if (onoff) {
_show_sends_button.set_active_state (Gtkmm2ext::ExplicitActive);
} else {
_show_sends_button.unset_active_state ();
}
}
gboolean
FoldbackStrip::next_button_button_press (GdkEventButton* ev)
@ -1252,7 +1348,7 @@ FoldbackStrip::next_button_button_press (GdkEventButton* ev)
}
}
} else {
// only one route do nothing
// only one or no route do nothing
return true;
}
//use next to set route
@ -1512,6 +1608,48 @@ FoldbackStrip::ab_plugins ()
insert_box->processor_operation (ProcessorBox::ProcessorsAB);
}
void
FoldbackStrip::create_selected_sends (bool include_buses)
{
boost::shared_ptr<StripableList> slist (new StripableList);
PresentationInfo::Flag fl = PresentationInfo::AudioTrack;
if (include_buses) {
fl = PresentationInfo::MixerRoutes;
}
_session->get_stripables (*slist, fl);
for (StripableList::iterator i = (*slist).begin(); i != (*slist).end(); ++i) {
if ((*i)->is_selected() && !(*i)->is_master() && !(*i)->is_monitor()) {
boost::shared_ptr<Route> rt = boost::dynamic_pointer_cast<Route>(*i);
if (rt) {
rt->add_foldback_send (_route);
}
}
}
}
bool
FoldbackStrip::send_button_press_event (GdkEventButton *ev)
{
if (ev->button == 3) {
list_send_operations ();
sends_menu->popup (3, ev->time);
return true;
}
return false;
}
void
FoldbackStrip::list_send_operations ()
{
delete sends_menu;
build_sends_menu ();
}
void
FoldbackStrip::build_sends_menu ()
{
@ -1522,19 +1660,11 @@ FoldbackStrip::build_sends_menu ()
MenuList& items = sends_menu->items();
items.push_back (
MenuElem(_("Assign all tracks"), sigc::bind (sigc::mem_fun (*this, &RouteUI::create_sends), PreFader, false))
MenuElem(_("Assign selected tracks (prefader)"), sigc::bind (sigc::mem_fun (*this, &FoldbackStrip::create_selected_sends), false))
);
items.push_back (
MenuElem(_("Assign all tracks and buses (prefader)"), sigc::bind (sigc::mem_fun (*this, &RouteUI::create_sends), PreFader, true))
);
items.push_back (
MenuElem(_("Assign selected tracks (prefader)"), sigc::bind (sigc::mem_fun (*this, &RouteUI::create_selected_sends), PreFader, false))
);
items.push_back (
MenuElem(_("Assign selected tracks and buses (prefader)"), sigc::bind (sigc::mem_fun (*this, &RouteUI::create_selected_sends), PreFader, true)));
MenuElem(_("Assign selected tracks and buses (prefader)"), sigc::bind (sigc::mem_fun (*this, &FoldbackStrip::create_selected_sends), true)));
items.push_back (MenuElem(_("Copy track/bus gains to sends"), sigc::mem_fun (*this, &RouteUI::set_sends_gain_from_track)));
items.push_back (MenuElem(_("Set sends gain to -inf"), sigc::mem_fun (*this, &RouteUI::set_sends_gain_to_zero)));

View File

@ -86,7 +86,13 @@ private:
boost::shared_ptr<ARDOUR::Processor> _send_proc;
boost::shared_ptr<ARDOUR::Delivery> _send_del;
Gtk::Menu* send_menu;
void led_clicked(GdkEventButton *);
gboolean button_press (GdkEventButton*);
Gtk::Menu* build_send_menu ();
void set_gain (float new_gain);
void remove_me ();
void send_state_changed ();
void level_adjusted ();
void level_changed ();
@ -174,6 +180,7 @@ private:
Width _width;
void* _width_owner;
ARDOUR::Session* _session;
bool _showing_sends;
Gtk::EventBox spacer;
Gtk::VBox send_display;
@ -203,6 +210,7 @@ private:
guint32 mode_switch_in_progress;
ArdourWidgets::ArdourButton name_button;
ArdourWidgets::ArdourButton _show_sends_button;
ArdourWidgets::ArdourButton _previous_button;
ArdourWidgets::ArdourButton _next_button;
ArdourWidgets::ArdourButton _comment_button;
@ -222,9 +230,6 @@ private:
void io_changed_proxy ();
Gtk::Menu *send_action_menu;
void build_send_action_menu ();
PBD::ScopedConnection panstate_connection;
PBD::ScopedConnection panstyle_connection;
void connect_to_pan ();
@ -242,14 +247,21 @@ private:
void build_route_ops_menu ();
gboolean name_button_button_press (GdkEventButton*);
void list_route_operations ();
Gtk::Menu* route_select_menu;
void build_route_select_menu ();
gboolean previous_button_button_press (GdkEventButton*);
gboolean next_button_button_press (GdkEventButton*);
void list_fb_routes ();
gboolean previous_button_button_press (GdkEventButton*);
gboolean next_button_button_press (GdkEventButton*);
gboolean show_sends_press (GdkEventButton*);
void send_blink (bool);
Gtk::Menu *sends_menu;
bool send_button_press_event (GdkEventButton *ev);
void build_sends_menu ();
void list_send_operations ();
void create_selected_sends (bool include_buses);
void remove_current_fb ();
Gtk::Style *passthru_style;