13
0

lollis: only allow velocity editing on currently selected region

This commit is contained in:
Paul Davis 2023-06-26 13:27:19 -06:00
parent 6ef84ca376
commit 7dc532a646
7 changed files with 53 additions and 3 deletions

View File

@ -56,6 +56,7 @@
#include "automation_time_axis.h" #include "automation_time_axis.h"
#include "automation_streamview.h" #include "automation_streamview.h"
#include "ghostregion.h"
#include "gui_thread.h" #include "gui_thread.h"
#include "route_time_axis.h" #include "route_time_axis.h"
#include "automation_line.h" #include "automation_line.h"
@ -1250,3 +1251,19 @@ AutomationTimeAxisView::set_velocity_mode (VelocityMode vm, bool force)
break; break;
} }
} }
void
AutomationTimeAxisView::set_selected_regionviews (RegionSelection& rs)
{
if (_parameter.type() != MidiVelocityAutomation) {
return;
}
for (auto & ghost : ghosts) {
if (std::find (rs.begin(), rs.end(), &ghost->parent_rv) != rs.end()) {
ghost->set_selected (true);
} else {
ghost->set_selected (false);
}
}
}

View File

@ -145,6 +145,8 @@ public:
VelocityMode velocity_mode () const { return _velocity_mode; } VelocityMode velocity_mode () const { return _velocity_mode; }
void set_velocity_mode (VelocityMode, bool force = false); void set_velocity_mode (VelocityMode, bool force = false);
void set_selected_regionviews (RegionSelection&);
protected: protected:
/* Note that for MIDI controller "automation" (in regions), all of these /* Note that for MIDI controller "automation" (in regions), all of these
* may be set. In this case, _automatable is likely _route so the * may be set. In this case, _automatable is likely _route so the

View File

@ -68,6 +68,8 @@ public:
void set_duration(double units); void set_duration(double units);
virtual void set_selected (bool) {}
guint source_track_color(unsigned char alpha = 0xff); guint source_track_color(unsigned char alpha = 0xff);
bool is_automation_ghost(); bool is_automation_ghost();

View File

@ -1849,4 +1849,3 @@ MidiTimeAxisView::create_velocity_automation_child (Evoral::Parameter const &, b
add_automation_child (Evoral::Parameter(MidiVelocityAutomation), velocity_track, show); add_automation_child (Evoral::Parameter(MidiVelocityAutomation), velocity_track, show);
} }

View File

@ -1145,6 +1145,10 @@ RouteTimeAxisView::set_selected_regionviews (RegionSelection& regions)
if (_view) { if (_view) {
_view->set_selected_regionviews (regions); _view->set_selected_regionviews (regions);
} }
for (auto & child : children) {
child->set_selected_regionviews (regions);
}
} }
/** Add the selectable things that we have to a list. /** Add the selectable things that we have to a list.

View File

@ -56,6 +56,7 @@ VelocityGhostRegion::VelocityGhostRegion (MidiRegionView& mrv, TimeAxisView& tv,
, dragging_line (nullptr) , dragging_line (nullptr)
, last_drag_x (-1) , last_drag_x (-1)
, drag_did_change (false) , drag_did_change (false)
, selected (false)
{ {
base_rect->Event.connect (sigc::mem_fun (*this, &VelocityGhostRegion::base_event)); base_rect->Event.connect (sigc::mem_fun (*this, &VelocityGhostRegion::base_event));
base_rect->set_fill_color (UIConfiguration::instance().color_mod ("ghost track base", "ghost track midi fill")); base_rect->set_fill_color (UIConfiguration::instance().color_mod ("ghost track base", "ghost track midi fill"));
@ -71,6 +72,11 @@ VelocityGhostRegion::~VelocityGhostRegion ()
bool bool
VelocityGhostRegion::base_event (GdkEvent* ev) VelocityGhostRegion::base_event (GdkEvent* ev)
{ {
if (!selected) {
/* eat event to prevent it passing up th the automation track */
return true;
}
std::vector<NoteBase*> affected_lollis; std::vector<NoteBase*> affected_lollis;
MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (&parent_rv); MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (&parent_rv);
@ -97,10 +103,12 @@ VelocityGhostRegion::base_event (GdkEvent* ev)
dragging_line->add_point (ArdourCanvas::Duple (ev->motion.x - r.x0, ev->motion.y - r.y0)); dragging_line->add_point (ArdourCanvas::Duple (ev->motion.x - r.x0, ev->motion.y - r.y0));
last_drag_x = ev->motion.x; last_drag_x = ev->motion.x;
} }
return true;
} }
break; break;
case GDK_BUTTON_PRESS: case GDK_BUTTON_PRESS:
if (ev->button.button == 1) { if (ev->button.button == 1) {
assert (!dragging);
desensitize_lollis (); desensitize_lollis ();
dragging = true; dragging = true;
drag_did_change = false; drag_did_change = false;
@ -115,15 +123,17 @@ VelocityGhostRegion::base_event (GdkEvent* ev)
dragging_line->raise_to_top(); dragging_line->raise_to_top();
base_rect->grab(); base_rect->grab();
mrv->begin_drag_edit (_("draw velocities")); mrv->begin_drag_edit (_("draw velocities"));
return true;
} }
break; break;
case GDK_BUTTON_RELEASE: case GDK_BUTTON_RELEASE:
if (ev->button.button == 1) { if (ev->button.button == 1 && dragging) {
mrv->end_drag_edit (drag_did_change); mrv->end_drag_edit (drag_did_change);
base_rect->ungrab(); base_rect->ungrab();
dragging_line->hide (); dragging_line->hide ();
dragging = false; dragging = false;
sensitize_lollis (); sensitize_lollis ();
return true;
} }
break; break;
default: default:
@ -131,6 +141,7 @@ VelocityGhostRegion::base_event (GdkEvent* ev)
break; break;
} }
return false; return false;
} }
@ -210,7 +221,13 @@ VelocityGhostRegion::set_colors ()
base_rect->set_fill_color (UIConfiguration::instance().color_mod ("ghost track base", "ghost track midi fill")); base_rect->set_fill_color (UIConfiguration::instance().color_mod ("ghost track base", "ghost track midi fill"));
for (auto & gev : events) { for (auto & gev : events) {
gev.second->item->set_fill_color (gev.second->event->base_color()); if (selected) {
gev.second->item->set_fill_color (gev.second->event->base_color());
gev.second->item->set_ignore_events (false);
} else {
gev.second->item->set_fill_color (UIConfiguration::instance().color ("ghost track wave"));
gev.second->item->set_ignore_events (true);
}
} }
} }
@ -361,3 +378,9 @@ VelocityGhostRegion::sensitize_lollis ()
} }
} }
void
VelocityGhostRegion::set_selected (bool yn)
{
selected = yn;
set_colors ();
}

View File

@ -47,11 +47,14 @@ public:
int y_position_to_velocity (double y) const; int y_position_to_velocity (double y) const;
void set_selected (bool);
private: private:
bool dragging; bool dragging;
ArdourCanvas::PolyLine* dragging_line; ArdourCanvas::PolyLine* dragging_line;
int last_drag_x; int last_drag_x;
bool drag_did_change; bool drag_did_change;
bool selected;
bool base_event (GdkEvent*); bool base_event (GdkEvent*);
bool lollevent (GdkEvent*, MidiGhostRegion::GhostEvent*); bool lollevent (GdkEvent*, MidiGhostRegion::GhostEvent*);