X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fcanvas-note-event.cc;h=958ba3e29aa699836acdc00ad4227894d355cdad;hb=09efd82c6aea973e3eb9497ef2b09256bf5ddde4;hp=88b6633dd33bf0c4dc38a3929be9091226238dfd;hpb=7863c03cfc6c116dbef73ffc2f096ed50699cfb4;p=ardour.git diff --git a/gtk2_ardour/canvas-note-event.cc b/gtk2_ardour/canvas-note-event.cc index 88b6633dd3..958ba3e29a 100644 --- a/gtk2_ardour/canvas-note-event.cc +++ b/gtk2_ardour/canvas-note-event.cc @@ -32,9 +32,9 @@ namespace Canvas { /// dividing the hue circle in 16 parts, hand adjusted for equal look, courtesy Thorsten Wilms const uint32_t CanvasNoteEvent::midi_channel_colors[16] = { - 0xd32d2dff, 0xd36b2dff, 0xd3972dff, 0xd3d12dff, - 0xa0d32dff, 0x7dd32dff, 0x2dd45eff, 0x2dd3c4ff, - 0x2da5d3ff, 0x2d6fd3ff, 0x432dd3ff, 0x662dd3ff, + 0xd32d2dff, 0xd36b2dff, 0xd3972dff, 0xd3d12dff, + 0xa0d32dff, 0x7dd32dff, 0x2dd45eff, 0x2dd3c4ff, + 0x2da5d3ff, 0x2d6fd3ff, 0x432dd3ff, 0x662dd3ff, 0x832dd3ff, 0xa92dd3ff, 0xd32dbfff, 0xd32d67ff }; @@ -47,28 +47,30 @@ CanvasNoteEvent::CanvasNoteEvent(MidiRegionView& region, Item* item, , _state(None) , _note(note) , _selected(false) + , _valid (true) { } -CanvasNoteEvent::~CanvasNoteEvent() -{ +CanvasNoteEvent::~CanvasNoteEvent() +{ if (_text) { _text->hide(); delete _text; } - + delete _channel_selector_widget; } -void -CanvasNoteEvent::move_event(double dx, double dy) +void +CanvasNoteEvent::invalidate () { - _item->move(dx, dy); - if (_text) { - _text->hide(); - _text->move(dx, dy); - _text->show(); - } + _valid = false; +} + +void +CanvasNoteEvent::validate () +{ + _valid = true; } void @@ -98,7 +100,7 @@ CanvasNoteEvent::hide_velocity() } } -void +void CanvasNoteEvent::on_channel_selection_change(uint16_t selection) { // make note change its color if its channel is not marked active @@ -114,7 +116,7 @@ CanvasNoteEvent::on_channel_selection_change(uint16_t selection) _item->show(); } -void +void CanvasNoteEvent::on_channel_change(uint8_t channel) { _region.note_selected(this, true); @@ -132,11 +134,11 @@ CanvasNoteEvent::show_channel_selector(void) _channel_selector->channel_selected.connect( sigc::mem_fun(this, &CanvasNoteEvent::on_channel_change)); - _channel_selector_widget = new Widget(*(_item->property_parent()), - x1(), - y2() + 2, + _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; @@ -177,211 +179,73 @@ CanvasNoteEvent::selected(bool selected) #define SCALE_USHORT_TO_UINT8_T(x) ((x) / 257) -uint32_t +uint32_t CanvasNoteEvent::base_color() { using namespace ARDOUR; - + ColorMode mode = _region.color_mode(); - + const uint8_t min_opacity = 15; uint8_t opacity = std::max(min_opacity, uint8_t(_note->velocity() + _note->velocity())); - + switch (mode) { case TrackColor: { Gdk::Color color = _region.midi_stream_view()->get_region_color(); return RGBA_TO_UINT( - SCALE_USHORT_TO_UINT8_T(color.get_red()), - SCALE_USHORT_TO_UINT8_T(color.get_green()), - SCALE_USHORT_TO_UINT8_T(color.get_blue()), + SCALE_USHORT_TO_UINT8_T(color.get_red()), + SCALE_USHORT_TO_UINT8_T(color.get_green()), + SCALE_USHORT_TO_UINT8_T(color.get_blue()), opacity); } - + case ChannelColors: - return UINT_RGBA_CHANGE_A(CanvasNoteEvent::midi_channel_colors[_note->channel()], + return UINT_RGBA_CHANGE_A(CanvasNoteEvent::midi_channel_colors[_note->channel()], opacity); - + default: return meter_style_fill_color(_note->velocity()); }; - + return 0; } bool CanvasNoteEvent::on_event(GdkEvent* ev) { - MidiStreamView *streamview = _region.midi_stream_view(); - static uint8_t drag_delta_note = 0; - static double drag_delta_x = 0; - static double last_x, last_y; - double event_x, event_y, dx, dy; - bool select_mod; - uint8_t d_velocity = 10; - - if (_region.get_time_axis_view().editor().current_mouse_mode() != Editing::MouseNote) { + PublicEditor& editor (_region.get_time_axis_view().editor()); + + if (!editor.internal_editing()) { return false; } - - const Editing::MidiEditMode midi_edit_mode - = _region.midi_view()->editor().current_midi_edit_mode(); switch (ev->type) { - case GDK_SCROLL: - if (Keyboard::modifier_state_equals (ev->scroll.state, Keyboard::Level4Modifier)) { - d_velocity = 1; - } - - if (ev->scroll.direction == GDK_SCROLL_UP) { - _region.change_velocity(this, d_velocity, true); - return true; - } else if (ev->scroll.direction == GDK_SCROLL_DOWN) { - _region.change_velocity(this, -d_velocity, true); - return true; - } else { - return false; - } - - case GDK_KEY_PRESS: - if (_note && ev->key.keyval == GDK_Delete) { - selected(true); - _region.start_delta_command(); - _region.command_remove_note(this); - } - break; - - case GDK_KEY_RELEASE: - if (ev->key.keyval == GDK_Delete) { - _region.apply_command(); - } - break; - case GDK_ENTER_NOTIFY: _region.note_entered(this); - //_item->grab_focus(); - //show_velocity(); //Keyboard::magic_widget_grab_focus(); break; case GDK_LEAVE_NOTIFY: //Keyboard::magic_widget_drop_focus(); - if (! selected()) { + _region.note_left (this); + if (!selected()) { hide_velocity(); } - //_region.get_canvas_group()->grab_focus(); break; case GDK_BUTTON_PRESS: - if (ev->button.button == 1) { - _state = Pressed; - } else if (ev->button.button == 3) { + if (ev->button.button == 3) { show_channel_selector(); - } - return true; - - case GDK_MOTION_NOTIFY: - event_x = ev->motion.x; - event_y = ev->motion.y; - - switch (_state) { - case Pressed: // Drag begin - if (midi_edit_mode == Editing::MidiEditSelect - && _region.mouse_state() != MidiRegionView::SelectTouchDragging - && _region.mouse_state() != MidiRegionView::EraseTouchDragging) { - _item->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, - Gdk::Cursor(Gdk::FLEUR), ev->motion.time); - _state = Dragging; - _item->property_parent().get_value()->w2i(event_x, event_y); - event_x = _region.snap_to_pixel(event_x); - last_x = event_x; - last_y = event_y; - drag_delta_x = 0; - drag_delta_note = 0; - _region.note_selected(this, true); - } - return true; - - case Dragging: // Drag motion - if (ev->motion.is_hint) { - int t_x; - int t_y; - GdkModifierType state; - gdk_window_get_pointer(ev->motion.window, &t_x, &t_y, &state); - event_x = t_x; - event_y = t_y; - } - _item->property_parent().get_value()->w2i(event_x, event_y); - - event_x = _region.snap_to_pixel(event_x); - - dx = event_x - last_x; - dy = event_y - last_y; - last_x = event_x; - - drag_delta_x += dx; - - // Snap to note rows - if (abs(dy) < streamview->note_height()) { - dy = 0.0; - } else { - int8_t this_delta_note; - if (dy > 0) { - this_delta_note = (int8_t)ceil(dy / streamview->note_height() / 2.0); - } else { - this_delta_note = (int8_t)floor(dy / streamview->note_height() / 2.0); - } - drag_delta_note -= this_delta_note; - dy = streamview->note_height() * this_delta_note; - last_y = last_y + dy; - } - - _region.move_selection(dx, dy); - return true; - default: - break; } break; case GDK_BUTTON_RELEASE: - select_mod = (ev->motion.state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)); - 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 (midi_edit_mode == Editing::MidiEditSelect) { - _state = None; - if (_selected && !select_mod && _region.selection_size() > 1) { - _region.unique_select(this); - } else if (_selected) { - _region.note_deselected(this, select_mod); - } else { - _region.note_selected(this, select_mod); - } - } else if (midi_edit_mode == Editing::MidiEditErase) { - _region.start_delta_command(); - _region.command_remove_note(this); - _region.apply_command(); - } - - return true; - case Dragging: // Dropped - _item->ungrab(ev->button.time); - _state = None; - if (_note) { - _region.note_dropped(this, drag_delta_x, drag_delta_note); - } - return true; - default: - break; - } + break; default: break;