new color management design starts to take shape (canvas color only for now)
[ardour.git] / gtk2_ardour / editor_canvas_events.cc
index f09c4d028f2a1da24ace96c1e70b10126c4d5f96..824b547938c177ce54b6898c2011bcbfcd11d646 100644 (file)
@@ -47,16 +47,67 @@ using namespace Gtk;
 bool
 Editor::track_canvas_scroll (GdkEventScroll* ev)
 {
+       int x, y;
+       double wx, wy;
+       
        switch (ev->direction) {
        case GDK_SCROLL_UP:
+         if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
+           //if (ev->state == GDK_CONTROL_MASK) {
+             /* XXX 
+              the ev->x will be out of step with the canvas
+              if we're in mid zoom, so we have to get the damn mouse 
+              pointer again
+             */
+               track_canvas.get_pointer (x, y);
+               track_canvas.window_to_world (x, y, wx, wy);
+               wx += horizontal_adjustment.get_value();
+               wy += vertical_adjustment.get_value();
+               
+               GdkEvent event;
+               event.type = GDK_BUTTON_RELEASE;
+               event.button.x = wx;
+               event.button.y = wy;
+               
+               jack_nframes_t where = event_frame (&event, 0, 0);
+               temporal_zoom_to_frame (true, where);
+               return true;
+         } else {
                scroll_tracks_up_line ();
                return true;
-               break;
-
+         }
+         break;
        case GDK_SCROLL_DOWN:
+         if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
+           //if (ev->state == GDK_CONTROL_MASK) {
+               track_canvas.get_pointer (x, y);
+               track_canvas.window_to_world (x, y, wx, wy);
+               wx += horizontal_adjustment.get_value();
+               wy += vertical_adjustment.get_value();
+               
+               GdkEvent event;
+               event.type = GDK_BUTTON_RELEASE;
+               event.button.x = wx;
+               event.button.y = wy;
+               
+               jack_nframes_t where = event_frame (&event, 0, 0);
+               temporal_zoom_to_frame (false, where);
+               return true;
+         } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
+               if (clicked_trackview) {
+                 if (!current_stepping_trackview) {
+                   step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500);
+                   current_stepping_trackview = clicked_trackview;
+                 }
+                 gettimeofday (&last_track_height_step_timestamp, 0);
+                 current_stepping_trackview->step_height (true);
+               }
+               return true;
+         } else {
                scroll_tracks_down_line ();
                return true;
-               
+         }
+         break;        
        default:
                /* no left/right handling yet */
                break;
@@ -80,6 +131,10 @@ Editor::track_canvas_event (GdkEvent *event, ArdourCanvas::Item* item)
                track_canvas.get_pointer (x, y);
                return track_canvas_motion (event);
 
+       case GDK_BUTTON_PRESS:
+               track_canvas.grab_focus();
+               break;
+
        case GDK_BUTTON_RELEASE:
                switch (event->button.button) {
                case 4:
@@ -90,6 +145,7 @@ Editor::track_canvas_event (GdkEvent *event, ArdourCanvas::Item* item)
                break;
 
        case GDK_SCROLL:
+               track_canvas.grab_focus();
                track_canvas_scroll (&event->scroll);
                break;
 
@@ -147,7 +203,7 @@ bool
 Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
 {
        gint ret = FALSE;
-       
+
        switch (event->type) {
        case GDK_BUTTON_PRESS:
        case GDK_2BUTTON_PRESS:
@@ -444,7 +500,7 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item,
        if ((atv = dynamic_cast<AudioTimeAxisView*>(&tv)) != 0) {
 
                if (atv->is_audio_track()) {
-
+                       
                        AudioPlaylist* pl = atv->get_diskstream()->playlist();
                        Playlist::RegionList* rl = pl->regions_at (event_frame (event));
 
@@ -459,7 +515,7 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item,
                                delete rl;
 
                                return canvas_region_view_event (event, arv->get_canvas_group(), arv);
-                       }
+                       } 
                }
        }