Foldback: consistent mouse handling part 1

* un-hardcode button numbers, use portable modifier API
* allow to toggle Send bypass with middle-click
* add support for delete-operator
* Only act on single-click press
This commit is contained in:
Robin Gareus 2021-03-26 02:17:09 +01:00
parent 345726e223
commit b12cad80bc
No known key found for this signature in database
GPG key ID: A090BCE02CF57F04
2 changed files with 44 additions and 39 deletions

View file

@ -125,6 +125,7 @@ FoldbackSend::FoldbackSend (boost::shared_ptr<Send> snd, \
lc->Changed.connect (_connections, invalidator (*this), boost::bind (&FoldbackSend::level_changed, this), gui_context ()); 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 ()); _send_proc->ActiveChanged.connect (_connections, invalidator (*this), boost::bind (&FoldbackSend::send_state_changed, this), gui_context ());
_button.signal_button_press_event().connect (sigc::mem_fun (*this, &FoldbackSend::button_press)); _button.signal_button_press_event().connect (sigc::mem_fun (*this, &FoldbackSend::button_press));
_button.signal_button_release_event().connect (sigc::mem_fun (*this, &FoldbackSend::button_release));
_send_route->PropertyChanged.connect (_connections, invalidator (*this), boost::bind (&FoldbackSend::route_property_changed, this, _1), gui_context()); _send_route->PropertyChanged.connect (_connections, invalidator (*this), boost::bind (&FoldbackSend::route_property_changed, this, _1), gui_context());
show (); show ();
@ -160,30 +161,48 @@ FoldbackSend::name_changed ()
} }
void void
FoldbackSend::led_clicked(GdkEventButton *ev) FoldbackSend::led_clicked (GdkEventButton *ev)
{ {
if (_send_proc) { if (!_send_proc) {
if (_button.get_active ()) { return;
_send_proc->enable (false); }
if (_button.get_active ()) {
} else { _send_proc->enable (false);
_send_proc->enable (true); } else {
} _send_proc->enable (true);
} }
} }
gboolean bool
FoldbackSend::button_press (GdkEventButton* ev) FoldbackSend::button_press (GdkEventButton* ev)
{ {
if (ev->button == 1) { if (ev->button == 1 && ev->type == GDK_BUTTON_PRESS) {
Menu* menu = build_send_menu (); Menu* menu = build_send_menu ();
Gtkmm2ext::anchored_menu_popup(menu, &_button, "", ev->button, ev->time);
Gtkmm2ext::anchored_menu_popup(menu, &_button, "", 1, ev->time);
return true; return true;
} }
return false; return false;
} }
bool
FoldbackSend::button_release (GdkEventButton* ev)
{
if (!_send_proc) {
return false;
}
if (Keyboard::is_delete_event (ev)) {
remove_me ();
} else if (Keyboard::is_button2_event (ev)
#ifndef __APPLE__
&& (Keyboard::no_modifier_keys_pressed (ev) && ((ev->state & Gdk::BUTTON2_MASK) == Gdk::BUTTON2_MASK))
#endif
) {
_send_proc->enable (!_send_proc->enabled ());
}
return false;
}
void void
FoldbackSend::send_state_changed () FoldbackSend::send_state_changed ()
{ {
@ -273,7 +292,6 @@ FoldbackSend::build_send_menu ()
items.push_back (MenuElem(_("Remove This Send"), sigc::mem_fun (*this, &FoldbackSend::remove_me))); items.push_back (MenuElem(_("Remove This Send"), sigc::mem_fun (*this, &FoldbackSend::remove_me)));
return menu; return menu;
} }
void void
@ -333,7 +351,6 @@ FoldbackSend::remove_me ()
boost::shared_ptr<Processor> send_proc = boost::dynamic_pointer_cast<Processor> (_send); boost::shared_ptr<Processor> send_proc = boost::dynamic_pointer_cast<Processor> (_send);
_connections.drop_connections(); _connections.drop_connections();
_send_route->remove_processor (send_proc); _send_route->remove_processor (send_proc);
} }
@ -746,12 +763,9 @@ FoldbackStrip::set_packed (bool yn)
gint gint
FoldbackStrip::output_release (GdkEventButton *ev) FoldbackStrip::output_release (GdkEventButton *ev)
{ {
switch (ev->button) { if (Keyboard::is_context_menu_event (ev)) {
case 3:
edit_output_configuration (); edit_output_configuration ();
break;
} }
return false; return false;
} }
@ -764,13 +778,12 @@ FoldbackStrip::output_press (GdkEventButton *ev)
} }
MenuList& citems = output_menu.items(); MenuList& citems = output_menu.items();
switch (ev->button) {
case 3: if (Keyboard::is_context_menu_event (ev)) {
return false; //wait for the mouse-up to pop the dialog return false; //wait for the mouse-up to pop the dialog
}
case 1: if (ev->button == 1) {
{
output_menu.set_name ("ArdourContextMenu"); output_menu.set_name ("ArdourContextMenu");
citems.clear (); citems.clear ();
output_menu_bundles.clear (); output_menu_bundles.clear ();
@ -808,16 +821,9 @@ FoldbackStrip::output_press (GdkEventButton *ev)
citems.push_back (SeparatorElem()); citems.push_back (SeparatorElem());
citems.push_back (MenuElem (_("Routing Grid"), sigc::mem_fun (*(static_cast<RouteUI*>(this)), &RouteUI::edit_output_configuration))); citems.push_back (MenuElem (_("Routing Grid"), sigc::mem_fun (*(static_cast<RouteUI*>(this)), &RouteUI::edit_output_configuration)));
Gtkmm2ext::anchored_menu_popup(&output_menu, &output_button, "", Gtkmm2ext::anchored_menu_popup(&output_menu, &output_button, "", ev->button, ev->time);
1, ev->time);
break;
} }
return true;
default:
break;
}
return TRUE;
} }
void void
@ -1270,20 +1276,18 @@ FoldbackStrip::build_route_select_menu ()
gboolean gboolean
FoldbackStrip::name_button_button_press (GdkEventButton* ev) FoldbackStrip::name_button_button_press (GdkEventButton* ev)
{ {
if (ev->button == 1) { if (ev->button == 1 && ev->type == GDK_BUTTON_PRESS) {
StripableList slist; StripableList slist;
boost::shared_ptr<Route> previous = boost::shared_ptr<Route> (); boost::shared_ptr<Route> previous = boost::shared_ptr<Route> ();
_session->get_stripables (slist, PresentationInfo::FoldbackBus); _session->get_stripables (slist, PresentationInfo::FoldbackBus);
if (slist.size () > 1) { if (slist.size () > 1) {
Menu* menu = build_route_select_menu (); Menu* menu = build_route_select_menu ();
Gtkmm2ext::anchored_menu_popup(menu, &name_button, "", ev->button, ev->time);
Gtkmm2ext::anchored_menu_popup(menu, &name_button, "",
1, ev->time);
} }
return true; return true;
} else if (ev->button == 3) { } else if (Keyboard::is_context_menu_event (ev)) {
Menu* r_menu = build_route_ops_menu (); Menu* r_menu = build_route_ops_menu ();
r_menu->popup (3, ev->time); r_menu->popup (ev->button, ev->time);
return true; return true;
} }
return false; return false;
@ -1626,7 +1630,7 @@ FoldbackStrip::create_selected_sends (bool post_fader)
bool bool
FoldbackStrip::send_button_press_event (GdkEventButton *ev) FoldbackStrip::send_button_press_event (GdkEventButton *ev)
{ {
if (ev->button == 3) { if (Keyboard::is_context_menu_event (ev)) {
Menu* menu = build_sends_menu (); Menu* menu = build_sends_menu ();
menu->popup (3, ev->time); menu->popup (3, ev->time);
return true; return true;

View file

@ -91,7 +91,8 @@ private:
uint32_t _width; uint32_t _width;
void led_clicked(GdkEventButton *); void led_clicked(GdkEventButton *);
gboolean button_press (GdkEventButton*); bool button_press (GdkEventButton*);
bool button_release (GdkEventButton*);
Gtk::Menu* build_send_menu (); Gtk::Menu* build_send_menu ();
void set_gain (float new_gain); void set_gain (float new_gain);
void set_send_position (bool post); void set_send_position (bool post);