summaryrefslogtreecommitdiff
path: root/gtk2_ardour/midi_region_view.cc
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2010-11-21 23:54:57 +0000
committerCarl Hetherington <carl@carlh.net>2010-11-21 23:54:57 +0000
commit03d28648208bbb1be9108593e9327b6375ecb5ef (patch)
tree5ce596371bca8da86fe9b35c670add23a06bad1b /gtk2_ardour/midi_region_view.cc
parent8631c4443945140f207cf1194c85c47bb0cc2571 (diff)
Update ghost note presence when mouse mode is changed. Fixes #3559.
git-svn-id: svn://localhost/ardour2/branches/3.0@8066 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/midi_region_view.cc')
-rw-r--r--gtk2_ardour/midi_region_view.cc55
1 files changed, 48 insertions, 7 deletions
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc
index bb1eb76fcb..3b2eee3461 100644
--- a/gtk2_ardour/midi_region_view.cc
+++ b/gtk2_ardour/midi_region_view.cc
@@ -100,6 +100,8 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &
, _optimization_iterator (_events.end())
, _list_editor (0)
, no_sound_notes (false)
+ , _last_event_x (0)
+ , _last_event_y (0)
, pre_enter_cursor (0)
{
_note_group->raise_to_top();
@@ -130,6 +132,8 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &
, _optimization_iterator (_events.end())
, _list_editor (0)
, no_sound_notes (false)
+ , _last_event_x (0)
+ , _last_event_y (0)
{
_note_group->raise_to_top();
PublicEditor::DropDownKeys.connect (sigc::mem_fun (*this, &MidiRegionView::drop_down_keys));
@@ -158,6 +162,8 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other)
, _optimization_iterator (_events.end())
, _list_editor (0)
, no_sound_notes (false)
+ , _last_event_x (0)
+ , _last_event_y (0)
{
Gdk::Color c;
int r,g,b,a;
@@ -188,6 +194,8 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other, boost::shared_ptr<M
, _optimization_iterator (_events.end())
, _list_editor (0)
, no_sound_notes (false)
+ , _last_event_x (0)
+ , _last_event_y (0)
{
Gdk::Color c;
int r,g,b,a;
@@ -259,6 +267,18 @@ MidiRegionView::connect_to_diskstream ()
bool
MidiRegionView::canvas_event(GdkEvent* ev)
{
+ switch (ev->type) {
+ case GDK_ENTER_NOTIFY:
+ case GDK_LEAVE_NOTIFY:
+ _last_event_x = ev->crossing.x;
+ _last_event_y = ev->crossing.y;
+ break;
+ case GDK_MOTION_NOTIFY:
+ _last_event_x = ev->motion.x;
+ _last_event_y = ev->motion.y;
+ break;
+ }
+
if (!trackview.editor().internal_editing()) {
return false;
}
@@ -302,17 +322,26 @@ MidiRegionView::canvas_event(GdkEvent* ev)
return false;
}
+void
+MidiRegionView::remove_ghost_note ()
+{
+ delete _ghost_note;
+ _ghost_note = 0;
+}
+
bool
MidiRegionView::enter_notify (GdkEventCrossing* ev)
{
- /* FIXME: do this on switch to note tool, too, if the pointer is already in */
+ trackview.editor().MouseModeChanged.connect (
+ _mouse_mode_connection, invalidator (*this), ui_bind (&MidiRegionView::mouse_mode_changed, this), gui_context ()
+ );
Keyboard::magic_widget_grab_focus();
group->grab_focus();
-
- if (trackview.editor().current_mouse_mode() == MouseRange) {
- create_ghost_note (ev->x, ev->y);
- }
+
+ if (trackview.editor().current_mouse_mode() == MouseRange) {
+ create_ghost_note (ev->x, ev->y);
+ }
return false;
}
@@ -320,12 +349,24 @@ MidiRegionView::enter_notify (GdkEventCrossing* ev)
bool
MidiRegionView::leave_notify (GdkEventCrossing*)
{
+ _mouse_mode_connection.disconnect ();
+
trackview.editor().hide_verbose_canvas_cursor ();
- delete _ghost_note;
- _ghost_note = 0;
+ remove_ghost_note ();
return false;
}
+void
+MidiRegionView::mouse_mode_changed ()
+{
+ if (trackview.editor().current_mouse_mode() == MouseRange && trackview.editor().internal_editing()) {
+ create_ghost_note (_last_event_x, _last_event_y);
+ } else {
+ remove_ghost_note ();
+ trackview.editor().hide_verbose_canvas_cursor ();
+ }
+}
+
bool
MidiRegionView::button_press (GdkEventButton* ev)
{