summaryrefslogtreecommitdiff
path: root/gtk2_ardour/canvas-midi-event.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour/canvas-midi-event.cc')
-rw-r--r--gtk2_ardour/canvas-midi-event.cc60
1 files changed, 58 insertions, 2 deletions
diff --git a/gtk2_ardour/canvas-midi-event.cc b/gtk2_ardour/canvas-midi-event.cc
index 0709024075..56ec1ec160 100644
--- a/gtk2_ardour/canvas-midi-event.cc
+++ b/gtk2_ardour/canvas-midi-event.cc
@@ -36,6 +36,7 @@ CanvasMidiEvent::CanvasMidiEvent(MidiRegionView& region, Item* item,
: _region(region)
, _item(item)
, _text(0)
+ , _channel_selector_widget()
, _state(None)
, _note(note)
, _selected(false)
@@ -43,6 +44,12 @@ CanvasMidiEvent::CanvasMidiEvent(MidiRegionView& region, Item* item,
_text = new Text(*(item->property_parent()));
}
+CanvasMidiEvent::~CanvasMidiEvent()
+{
+ if(_text) delete _text;
+ if(_channel_selector_widget) delete _channel_selector_widget;
+}
+
void
CanvasMidiEvent::move_event(double dx, double dy)
{
@@ -71,6 +78,50 @@ CanvasMidiEvent::hide_velocity(void)
_text->hide();
}
+void
+CanvasMidiEvent::on_channel_change(uint8_t channel)
+{
+ _region.note_selected(this, true);
+ hide_channel_selector();
+ _region.change_channel(channel);
+}
+
+void
+CanvasMidiEvent::show_channel_selector(void)
+{
+ if(_channel_selector_widget == 0) {
+ cerr << "Note has channel: " << int(_note->channel()) << endl;
+ SingleMidiChannelSelector* _channel_selector = new SingleMidiChannelSelector(_note->channel());
+ _channel_selector->show_all();
+ _channel_selector->channel_selected.connect(
+ sigc::mem_fun(this, &CanvasMidiEvent::on_channel_change));
+
+ _channel_selector_widget =
+ new Widget(*(_item->property_parent()),
+ x1(),
+ y2() + 2,
+ (Gtk::Widget &) *_channel_selector);
+
+ _channel_selector_widget->hide();
+ _channel_selector_widget->property_height() = 100;
+ _channel_selector_widget->property_width() = 100;
+ _channel_selector_widget->raise_to_top();
+ _channel_selector_widget->show();
+ } else {
+ hide_channel_selector();
+ }
+}
+
+void
+CanvasMidiEvent::hide_channel_selector(void)
+{
+ if(_channel_selector_widget) {
+ _channel_selector_widget->hide();
+ delete _channel_selector_widget;
+ _channel_selector_widget = 0;
+ }
+}
+
void
CanvasMidiEvent::selected(bool yn)
{
@@ -120,7 +171,6 @@ CanvasMidiEvent::on_event(GdkEvent* ev)
}
return true;
} else if(ev->scroll.direction == GDK_SCROLL_DOWN) {
-
_region.note_selected(this, true);
if (_region.mouse_state() == MidiRegionView::SelectTouchDragging) {
// TODO: absolute velocity
@@ -164,6 +214,8 @@ CanvasMidiEvent::on_event(GdkEvent* ev)
case GDK_BUTTON_PRESS:
if (ev->button.button == 1) {
_state = Pressed;
+ } else if (ev->button.button == 3) {
+ show_channel_selector();
}
return true;
@@ -236,7 +288,11 @@ CanvasMidiEvent::on_event(GdkEvent* ev)
event_x = ev->button.x;
event_y = ev->button.y;
_item->property_parent().get_value()->w2i(event_x, event_y);
-
+
+ if(ev->button.button == 3) {
+ return true;
+ }
+
switch (_state) {
case Pressed: // Clicked
if (_region.midi_view()->editor.current_midi_edit_mode() == Editing::MidiEditSelect) {