Allow deletion of program changes in the same way as notes.

git-svn-id: svn://localhost/ardour2/branches/3.0@8304 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2010-12-20 13:30:31 +00:00
parent 570ed69d2a
commit 3ec58e478c
5 changed files with 51 additions and 21 deletions

View File

@ -2,6 +2,7 @@
#include <glibmm/regex.h>
#include "gtkmm2ext/keyboard.h"
#include "ardour/midi_patch_manager.h"
#include "ardour_ui.h"
#include "midi_region_view.h"
@ -108,22 +109,27 @@ CanvasProgramChange::on_patch_menu_selected(const PatchPrimaryKey& key)
}
bool
CanvasProgramChange::on_event(GdkEvent* ev)
CanvasProgramChange::on_event (GdkEvent* ev)
{
switch (ev->type) {
case GDK_BUTTON_PRESS:
switch (ev->button.button) {
case 1:
{
/* XXX: icky dcast */
Editor* e = dynamic_cast<Editor*> (&_region.get_time_axis_view().editor());
if (e->current_mouse_mode() == Editing::MouseObject && e->internal_editing()) {
{
/* XXX: icky dcast */
Editor* e = dynamic_cast<Editor*> (&_region.get_time_axis_view().editor());
if (e->current_mouse_mode() == Editing::MouseObject && e->internal_editing()) {
if (Gtkmm2ext::Keyboard::is_delete_event (&ev->button)) {
_region.delete_program_change (this);
return true;
} else if (ev->button.button == 1) {
e->drags()->set (new ProgramChangeDrag (e, this, &_region), ev);
return true;
}
}
case 3:
// lazy init
if (ev->button.button == 3) {
if (!_popup_initialized) {
initialize_popup_menus();
_popup_initialized = true;
@ -132,6 +138,7 @@ CanvasProgramChange::on_event(GdkEvent* ev)
return true;
}
break;
}
case GDK_KEY_PRESS:
switch (ev->key.keyval) {

View File

@ -1674,21 +1674,20 @@ MidiRegionView::move_program_change (PCEvent pc, double t)
boost::shared_ptr<Evoral::Control> control = _model->control (Evoral::Parameter (MidiPgmChangeAutomation, pc.channel, 0));
assert (control);
/* XXX: seems that these events should have IDs, or that this code should
at least be in ControlList.
*/
control->list()->erase (pc.time, pc.value);
control->list()->add (t, pc.value);
boost::shared_ptr<Evoral::ControlList> list = control->list ();
Evoral::ControlList::iterator i = list->begin ();
while (i != list->end() && ((*i)->when != pc.time || (*i)->value != pc.value)) {
++i;
}
_pgm_changes.clear ();
display_program_changes ();
}
assert (i != list->end ());
list->erase (i);
list->add (t, pc.value);
void
MidiRegionView::delete_program_change (CanvasProgramChange* pc)
{
boost::shared_ptr<Evoral::Control> control = _model->control (Evoral::Parameter (MidiPgmChangeAutomation, pc->channel(), 0));
assert (control);
control->list()->erase (pc->event_time(), pc->program());
_pgm_changes.clear ();
display_program_changes ();
}

View File

@ -150,6 +150,7 @@ class MidiRegionView : public RegionView
void alter_program_change(PCEvent& old_program, const MIDI::Name::PatchPrimaryKey& new_patch);
void move_program_change (PCEvent, double);
void delete_program_change (ArdourCanvas::CanvasProgramChange *);
/** Alter a given program to the new given one.
* (Called on context menu select on CanvasProgramChange)

View File

@ -124,6 +124,7 @@ public:
void erase_range (double start, double end);
void erase (iterator);
void erase (iterator, iterator);
void erase (double, double);
bool move_ranges (std::list< RangeMove<double> > const &);
void modify (iterator, double, double);

View File

@ -449,6 +449,28 @@ ControlList::erase (iterator start, iterator end)
maybe_signal_changed ();
}
/** Erase the first event which matches the given time and value */
void
ControlList::erase (double when, double value)
{
{
Glib::Mutex::Lock lm (_lock);
iterator i = begin ();
while (i != end() && ((*i)->when != when || (*i)->value != value)) {
++i;
}
if (i != end ()) {
_events.erase (i);
}
mark_dirty ();
}
maybe_signal_changed ();
}
void
ControlList::reset_range (double start, double endt)
{