X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fcanvas-note-event.cc;h=77ef7b263f5a12cbee0d544c7023482217977e81;hb=73a6b8ef25bb90ad6c66b25b17da5962a38291d2;hp=bd402f8c085a2800d6a00969eb043baad5ca8d10;hpb=8d44391f4ba571c4dbcec0a87033c83414f515e8;p=ardour.git diff --git a/gtk2_ardour/canvas-note-event.cc b/gtk2_ardour/canvas-note-event.cc index bd402f8c08..77ef7b263f 100644 --- a/gtk2_ardour/canvas-note-event.cc +++ b/gtk2_ardour/canvas-note-event.cc @@ -30,9 +30,16 @@ using ARDOUR::MidiModel; namespace Gnome { 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, + 0x832dd3ff, 0xa92dd3ff, 0xd32dbfff, 0xd32d67ff + }; CanvasNoteEvent::CanvasNoteEvent(MidiRegionView& region, Item* item, - const boost::shared_ptr note) + const boost::shared_ptr note) : _region(region) , _item(item) , _text(0) @@ -45,14 +52,12 @@ CanvasNoteEvent::CanvasNoteEvent(MidiRegionView& region, Item* item, CanvasNoteEvent::~CanvasNoteEvent() { - cerr << "CanvasNoteEvent::~CanvasNoteEvent() " << int(_note->note()) << " velo " << int(_note->velocity()) << endl; if (_text) { _text->hide(); delete _text; } - if (_channel_selector_widget) - delete _channel_selector_widget; + delete _channel_selector_widget; } void @@ -67,30 +72,30 @@ CanvasNoteEvent::move_event(double dx, double dy) } void -CanvasNoteEvent::show_velocity(void) +CanvasNoteEvent::show_velocity() { - hide_velocity(); - _text = new Text(*(_item->property_parent())); + if (!_text) { + _text = new InteractiveText(*(_item->property_parent()), this); + } _text->property_x() = (x1() + x2()) /2; _text->property_y() = (y1() + y2()) /2; ostringstream velo(ios::ate); velo << int(_note->velocity()); _text->property_text() = velo.str(); _text->property_justification() = Gtk::JUSTIFY_CENTER; - _text->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_MidiNoteSelectedOutline.get(); + _text->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_MidiNoteVelocityText.get(); _text->show(); - _text->lower_to_bottom(); - _text->raise(2); + _text->raise_to_top(); } void -CanvasNoteEvent::hide_velocity(void) +CanvasNoteEvent::hide_velocity() { - if(_text) { + if (_text) { _text->hide(); delete _text; + _text = 0; } - _text = 0; } void @@ -98,8 +103,8 @@ CanvasNoteEvent::on_channel_selection_change(uint16_t selection) { // make note change its color if its channel is not marked active if ( (selection & (1 << _note->channel())) == 0 ) { - set_fill_color(ARDOUR_UI::config()->canvasvar_MidiNoteFillInactiveChannel.get()); - set_outline_color(ARDOUR_UI::config()->canvasvar_MidiNoteOutlineInactiveChannel.get()); + set_fill_color(ARDOUR_UI::config()->canvasvar_MidiNoteInactiveChannel.get()); + set_outline_color(calculate_outline(ARDOUR_UI::config()->canvasvar_MidiNoteInactiveChannel.get())); } else { // set the color according to the notes selection state selected(_selected); @@ -127,11 +132,10 @@ 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, - (Gtk::Widget &) *_channel_selector); + _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; @@ -154,24 +158,56 @@ CanvasNoteEvent::hide_channel_selector(void) } void -CanvasNoteEvent::selected(bool yn) +CanvasNoteEvent::selected(bool selected) { if (!_note) { return; - } else if (yn) { - set_fill_color(UINT_INTERPOLATE(note_fill_color(_note->velocity()), - ARDOUR_UI::config()->canvasvar_MidiNoteSelectedOutline.get(), 0.1)); - set_outline_color(ARDOUR_UI::config()->canvasvar_MidiNoteSelectedOutline.get()); - show_velocity(); + } else if (selected) { + set_fill_color(UINT_INTERPOLATE(base_color(), + ARDOUR_UI::config()->canvasvar_MidiNoteSelected.get(), 0.5)); + set_outline_color(calculate_outline( + ARDOUR_UI::config()->canvasvar_MidiNoteSelected.get())); } else { - set_fill_color(note_fill_color(_note->velocity())); - set_outline_color(note_outline_color(_note->velocity())); - hide_velocity(); + set_fill_color(base_color()); + set_outline_color(calculate_outline(base_color())); } - _selected = yn; + _selected = selected; } +#define SCALE_USHORT_TO_UINT8_T(x) ((x) / 257) + +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()), + opacity); + } + + case ChannelColors: + 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) @@ -184,8 +220,12 @@ CanvasNoteEvent::on_event(GdkEvent* ev) bool select_mod; uint8_t d_velocity = 10; - if (_region.get_time_axis_view().editor.current_mouse_mode() != Editing::MouseNote) + if (_region.get_time_axis_view().editor().current_mouse_mode() != Editing::MouseNote) { return false; + } + + const Editing::MidiEditMode midi_edit_mode + = _region.midi_view()->editor().current_midi_edit_mode(); switch (ev->type) { case GDK_SCROLL: @@ -194,20 +234,10 @@ CanvasNoteEvent::on_event(GdkEvent* ev) } if (ev->scroll.direction == GDK_SCROLL_UP) { - _region.note_selected(this, true); - if (_region.mouse_state() == MidiRegionView::SelectTouchDragging) { - // TODO: absolute velocity - } else { - _region.change_velocity(d_velocity, true); - } + _region.change_velocity(this, d_velocity, true); return true; } else if (ev->scroll.direction == GDK_SCROLL_DOWN) { - _region.note_selected(this, true); - if (_region.mouse_state() == MidiRegionView::SelectTouchDragging) { - // TODO: absolute velocity - } else { - _region.change_velocity(-d_velocity, true); - } + _region.change_velocity(this, -d_velocity, true); return true; } else { return false; @@ -229,17 +259,17 @@ CanvasNoteEvent::on_event(GdkEvent* ev) case GDK_ENTER_NOTIFY: _region.note_entered(this); - _item->grab_focus(); - show_velocity(); - Keyboard::magic_widget_grab_focus(); + //_item->grab_focus(); + //show_velocity(); + //Keyboard::magic_widget_grab_focus(); break; case GDK_LEAVE_NOTIFY: - Keyboard::magic_widget_drop_focus(); + //Keyboard::magic_widget_drop_focus(); if (! selected()) { hide_velocity(); } - _region.get_canvas_group()->grab_focus(); + //_region.get_canvas_group()->grab_focus(); break; case GDK_BUTTON_PRESS: @@ -256,7 +286,8 @@ CanvasNoteEvent::on_event(GdkEvent* ev) switch (_state) { case Pressed: // Drag begin - if (_region.mouse_state() != MidiRegionView::SelectTouchDragging) { + if (midi_edit_mode == Editing::MidiEditSelect + && _region.mouse_state() != MidiRegionView::SelectTouchDragging) { _item->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, Gdk::Cursor(Gdk::FLEUR), ev->motion.time); _state = Dragging; @@ -281,12 +312,10 @@ CanvasNoteEvent::on_event(GdkEvent* ev) } _item->property_parent().get_value()->w2i(event_x, event_y); - // Snap event_x = _region.snap_to_pixel(event_x); - dx = event_x - last_x; - dy = event_y - last_y; - + dx = event_x - last_x; + dy = event_y - last_y; last_x = event_x; drag_delta_x += dx; @@ -326,16 +355,16 @@ CanvasNoteEvent::on_event(GdkEvent* ev) switch (_state) { case Pressed: // Clicked - if (_region.midi_view()->editor.current_midi_edit_mode() == Editing::MidiEditSelect) { + if (midi_edit_mode == Editing::MidiEditSelect) { _state = None; - - if (_selected && !select_mod && _region.selection_size() > 1) + if (_selected && !select_mod && _region.selection_size() > 1) { _region.unique_select(this); - else if (_selected) + } else if (_selected) { _region.note_deselected(this, select_mod); - else + } else { _region.note_selected(this, select_mod); - } else if (_region.midi_view()->editor.current_midi_edit_mode() == Editing::MidiEditErase) { + } + } else if (midi_edit_mode == Editing::MidiEditErase) { _region.start_delta_command(); _region.command_remove_note(this); _region.apply_command(); @@ -345,12 +374,9 @@ CanvasNoteEvent::on_event(GdkEvent* ev) case Dragging: // Dropped _item->ungrab(ev->button.time); _state = None; - - if (_note) - _region.note_dropped(this, - _region.midi_view()->editor.pixel_to_frame(abs(drag_delta_x)) - * ((drag_delta_x < 0.0) ? -1 : 1), - drag_delta_note); + if (_note) { + _region.note_dropped(this, drag_delta_x, drag_delta_note); + } return true; default: break;