X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fcanvas-note-event.cc;h=0e1afcc01774bcd6379d35e3209419a6b2b6b8fc;hb=04db4c788c8bf5070eb13b9165277ea81ab50070;hp=739019b31e3bf88535f2e5aa1904e1915529ec0b;hpb=2c80ff4129040f0083318e689a9548444296009b;p=ardour.git diff --git a/gtk2_ardour/canvas-note-event.cc b/gtk2_ardour/canvas-note-event.cc index 739019b31e..0e1afcc017 100644 --- a/gtk2_ardour/canvas-note-event.cc +++ b/gtk2_ardour/canvas-note-event.cc @@ -53,12 +53,14 @@ CanvasNoteEvent::CanvasNoteEvent(MidiRegionView& region, Item* item, const boost , _note(note) , _selected(false) , _valid (true) + , _mouse_x_fraction (-1.0) + , _mouse_y_fraction (-1.0) { } CanvasNoteEvent::~CanvasNoteEvent() { - CanvasNoteEventDeleted (this); + CanvasNoteEventDeleted (this); if (_text) { _text->hide(); @@ -85,8 +87,8 @@ CanvasNoteEvent::show_velocity() { if (!_text) { _text = new NoEventText (*(_item->property_parent())); - _text->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_MidiNoteVelocityText.get(); - _text->property_justification() = Gtk::JUSTIFY_CENTER; + _text->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_MidiNoteVelocityText.get(); + _text->property_justification() = Gtk::JUSTIFY_CENTER; } _text->property_x() = (x1() + x2()) /2; @@ -136,24 +138,32 @@ void CanvasNoteEvent::show_channel_selector(void) { if (_channel_selector_widget == 0) { + + if(_region.channel_selector_scoped_note() != 0){ + _region.channel_selector_scoped_note()->hide_channel_selector(); + _region.set_channel_selector_scoped_note(0); + } + SingleMidiChannelSelector* _channel_selector = new SingleMidiChannelSelector(_note->channel()); _channel_selector->show_all(); _channel_selector->channel_selected.connect( sigc::mem_fun(this, &CanvasNoteEvent::on_channel_change)); - _channel_selector->clicked.connect ( - sigc::mem_fun (this, &CanvasNoteEvent::hide_channel_selector)); + _channel_selector->clicked.connect ( + sigc::mem_fun (this, &CanvasNoteEvent::hide_channel_selector)); _channel_selector_widget = new Widget(*(_item->property_parent()), - x1(), - y2() + 2, - (Gtk::Widget &) *_channel_selector); + 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(); + + _region.set_channel_selector_scoped_note(this); } else { hide_channel_selector(); } @@ -174,15 +184,21 @@ CanvasNoteEvent::set_selected(bool selected) { if (!_note) { return; - } + } _selected = selected; - set_fill_color (base_color ()); + set_fill_color (base_color ()); if (_selected) { set_outline_color(calculate_outline(ARDOUR_UI::config()->canvasvar_MidiNoteSelected.get())); + + if(_region.channel_selector_scoped_note() != 0){ + _region.channel_selector_scoped_note()->hide_channel_selector(); + _region.set_channel_selector_scoped_note(0); + } } else { set_outline_color(calculate_outline(base_color())); + hide_channel_selector(); } } @@ -201,20 +217,20 @@ CanvasNoteEvent::base_color() switch (mode) { case TrackColor: - { - Gdk::Color color = _region.midi_stream_view()->get_region_color(); - return UINT_INTERPOLATE (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), - ARDOUR_UI::config()->canvasvar_MidiNoteSelected.get(), 0.5); - } + { + Gdk::Color color = _region.midi_stream_view()->get_region_color(); + return UINT_INTERPOLATE (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), + ARDOUR_UI::config()->canvasvar_MidiNoteSelected.get(), 0.5); + } case ChannelColors: - return UINT_INTERPOLATE (UINT_RGBA_CHANGE_A (CanvasNoteEvent::midi_channel_colors[_note->channel()], - opacity), - ARDOUR_UI::config()->canvasvar_MidiNoteSelected.get(), 0.5); + return UINT_INTERPOLATE (UINT_RGBA_CHANGE_A (CanvasNoteEvent::midi_channel_colors[_note->channel()], + opacity), + ARDOUR_UI::config()->canvasvar_MidiNoteSelected.get(), 0.5); default: return meter_style_fill_color(_note->velocity(), selected()); @@ -223,6 +239,63 @@ CanvasNoteEvent::base_color() return 0; } +void +CanvasNoteEvent::set_mouse_fractions (GdkEvent* ev) +{ + double ix, iy; + double bx1, bx2, by1, by2; + bool set_cursor = false; + + switch (ev->type) { + case GDK_MOTION_NOTIFY: + ix = ev->motion.x; + iy = ev->motion.y; + set_cursor = true; + break; + case GDK_ENTER_NOTIFY: + ix = ev->crossing.x; + iy = ev->crossing.y; + set_cursor = true; + break; + case GDK_BUTTON_PRESS: + case GDK_BUTTON_RELEASE: + ix = ev->button.x; + iy = ev->button.y; + break; + default: + _mouse_x_fraction = -1.0; + _mouse_y_fraction = -1.0; + return; + } + + _item->get_bounds (bx1, by1, bx2, by2); + _item->w2i (ix, iy); + /* hmm, something wrong here. w2i should give item-local coordinates + but it doesn't. for now, finesse this. + */ + ix = ix - bx1; + iy = iy - by1; + + /* fraction of width/height */ + double xf; + double yf; + bool notify = false; + + xf = ix / (bx2 - bx1); + yf = iy / (by2 - by1); + + if (xf != _mouse_x_fraction || yf != _mouse_y_fraction) { + notify = true; + } + + _mouse_x_fraction = xf; + _mouse_y_fraction = yf; + + if (notify) { + _region.note_mouse_position (_mouse_x_fraction, _mouse_y_fraction, set_cursor); + } +} + bool CanvasNoteEvent::on_event(GdkEvent* ev) { @@ -232,29 +305,29 @@ CanvasNoteEvent::on_event(GdkEvent* ev) switch (ev->type) { case GDK_ENTER_NOTIFY: - _region.note_entered(this); + set_mouse_fractions (ev); + _region.note_entered (this); break; case GDK_LEAVE_NOTIFY: + set_mouse_fractions (ev); _region.note_left (this); break; - case GDK_MOTION_NOTIFY: - double ix, iy; - ix = ev->motion.x; - iy = ev->motion.y; - _item->w2i (ix, iy); - cerr << "note motion at " << ix << ',' << iy << endl; - break; + case GDK_MOTION_NOTIFY: + set_mouse_fractions (ev); + break; case GDK_BUTTON_PRESS: - if (ev->button.button == 3 && Keyboard::no_modifiers_active (ev->button.state)) { - show_channel_selector(); + set_mouse_fractions (ev); + if (ev->button.button == 3 && Keyboard::no_modifiers_active (ev->button.state) && _selected) { + show_channel_selector(); return true; } break; case GDK_BUTTON_RELEASE: + set_mouse_fractions (ev); if (ev->button.button == 3 && Keyboard::no_modifiers_active (ev->button.state)) { return true; } @@ -267,6 +340,13 @@ CanvasNoteEvent::on_event(GdkEvent* ev) return false; } +bool +CanvasNoteEvent::mouse_near_ends () const +{ + return (_mouse_x_fraction >= 0.0 && _mouse_x_fraction < 0.25) || + (_mouse_x_fraction >= 0.75 && _mouse_x_fraction < 1.0); +} + } // namespace Canvas } // namespace Gnome