Refactor so that all the locate-related stuff in CursorDrag is in one method. Also...
[ardour.git] / gtk2_ardour / editor_canvas.cc
index 27f9128ce59d7397fdaa4a5f52cdf35ddd8376ce..f52f8852caad03b8e39cf3299e5b41701fb1e087 100644 (file)
 
 */
 
+#ifdef WAF_BUILD
+#include "gtk2ardour-config.h"
+#endif
+
 #include <libgnomecanvasmm/init.h>
 #include <libgnomecanvasmm/pixbuf.h>
 #include <jack/types.h>
@@ -27,6 +31,7 @@
 
 #include "ardour_ui.h"
 #include "editor.h"
+#include "global_signals.h"
 #include "waveview.h"
 #include "simplerect.h"
 #include "simpleline.h"
@@ -46,6 +51,9 @@
 #include "editor_group_tabs.h"
 #include "editor_routes.h"
 #include "editor_summary.h"
+#include "keyboard.h"
+#include "editor_cursors.h"
+#include "mouse_cursors.h"
 
 #include "i18n.h"
 
@@ -57,7 +65,7 @@ using namespace Glib;
 using namespace Gtkmm2ext;
 using namespace Editing;
 
-/* XXX this is a hack. it ought to be the maximum value of an nframes64_t */
+/* XXX this is a hack. it ought to be the maximum value of an framepos_t */
 
 const double max_canvas_coordinate = (double) JACK_MAX_FRAMES;
 
@@ -282,9 +290,11 @@ Editor::initialize_canvas ()
        track_canvas->signal_button_press_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_button_press_event));
        track_canvas->signal_button_release_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_button_release_event));
        track_canvas->signal_drag_motion().connect (sigc::mem_fun (*this, &Editor::track_canvas_drag_motion));
+       track_canvas->signal_key_press_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_key_press));
+       track_canvas->signal_key_release_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_key_release));
 
        track_canvas->set_name ("EditorMainCanvas");
-       track_canvas->add_events (Gdk::POINTER_MOTION_HINT_MASK|Gdk::SCROLL_MASK);
+       track_canvas->add_events (Gdk::POINTER_MOTION_HINT_MASK | Gdk::SCROLL_MASK | Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK);
        track_canvas->signal_leave_notify_event().connect (sigc::mem_fun(*this, &Editor::left_track_canvas));
        track_canvas->signal_enter_notify_event().connect (sigc::mem_fun(*this, &Editor::entered_track_canvas));
        track_canvas->set_flags (CAN_FOCUS);
@@ -338,8 +348,8 @@ Editor::track_canvas_size_allocated ()
                        playhead_cursor->set_length (_canvas_height);
                }
 
-               for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) {
-                       (*x)->set_line_vpos (0, _canvas_height);
+               for (LocationMarkerMap::iterator i = location_markers.begin(); i != location_markers.end(); ++i) {
+                       i->second->canvas_height_set (_canvas_height);
                }
 
                vertical_adjustment.set_page_size (_canvas_height);
@@ -423,7 +433,7 @@ bool
 Editor::track_canvas_map_handler (GdkEventAny* /*ev*/)
 {
        if (current_canvas_cursor) {
-               track_canvas->get_window()->set_cursor (*current_canvas_cursor);
+               set_canvas_cursor (current_canvas_cursor);
        }
        return false;
 }
@@ -443,14 +453,14 @@ Editor::track_canvas_drag_data_received (const RefPtr<Gdk::DragContext>& context
 }
 
 bool
-Editor::idle_drop_paths (vector<ustring> paths, nframes64_t frame, double ypos)
+Editor::idle_drop_paths (vector<string> paths, framepos_t frame, double ypos)
 {
        drop_paths_part_two (paths, frame, ypos);
        return false;
 }
 
 void
-Editor::drop_paths_part_two (const vector<ustring>& paths, nframes64_t frame, double ypos)
+Editor::drop_paths_part_two (const vector<string>& paths, framepos_t frame, double ypos)
 {
        RouteTimeAxisView* tv;
 
@@ -490,9 +500,9 @@ Editor::drop_paths (const RefPtr<Gdk::DragContext>& context,
                    const SelectionData& data,
                    guint info, guint time)
 {
-       vector<ustring> paths;
+       vector<string> paths;
        GdkEvent ev;
-       nframes64_t frame;
+       framepos_t frame;
        double wx;
        double wy;
        double cy;
@@ -538,10 +548,10 @@ Editor::drop_regions (const RefPtr<Gdk::DragContext>& /*context*/,
 void
 Editor::maybe_autoscroll (bool allow_horiz, bool allow_vert)
 {
-       nframes64_t rightmost_frame = leftmost_frame + current_page_frames();
+       framepos_t rightmost_frame = leftmost_frame + current_page_frames();
        bool startit = false;
 
-       double ty = _drags->current_pointer_y() - get_trackview_group_vertical_offset ();
+       double const ty = _drags->current_pointer_y() - get_trackview_group_vertical_offset ();
 
        autoscroll_y = 0;
        autoscroll_x = 0;
@@ -554,7 +564,7 @@ Editor::maybe_autoscroll (bool allow_horiz, bool allow_vert)
        }
 
        if (_drags->current_pointer_frame() > rightmost_frame && allow_horiz) {
-               if (rightmost_frame < max_frames) {
+               if (rightmost_frame < max_framepos) {
                        autoscroll_x = 1;
                        startit = true;
                }
@@ -565,7 +575,7 @@ Editor::maybe_autoscroll (bool allow_horiz, bool allow_vert)
                }
        }
 
-       if ((autoscroll_x != last_autoscroll_x) || (autoscroll_y != last_autoscroll_y) || (autoscroll_x == 0 && autoscroll_y == 0)) {
+       if (autoscroll_active && ((autoscroll_x != last_autoscroll_x) || (autoscroll_y != last_autoscroll_y) || (autoscroll_x == 0 && autoscroll_y == 0))) {
                stop_canvas_autoscroll ();
        }
 
@@ -586,8 +596,8 @@ Editor::_autoscroll_canvas (void *arg)
 bool
 Editor::autoscroll_canvas ()
 {
-       nframes64_t new_frame;
-       nframes64_t limit = max_frames - current_page_frames();
+       framepos_t new_frame;
+       framepos_t limit = max_framepos - current_page_frames();
        GdkEventMotion ev;
        double new_pixel;
        double target_pixel;
@@ -715,7 +725,7 @@ Editor::start_canvas_autoscroll (int dx, int dy)
        autoscroll_active = true;
        autoscroll_x = dx;
        autoscroll_y = dy;
-       autoscroll_x_distance = (nframes64_t) floor (current_page_frames()/50.0);
+       autoscroll_x_distance = (framepos_t) floor (current_page_frames()/50.0);
        autoscroll_y_distance = fabs (dy * 5); /* pixels */
        autoscroll_cnt = 0;
 
@@ -738,7 +748,7 @@ Editor::stop_canvas_autoscroll ()
 bool
 Editor::left_track_canvas (GdkEventCrossing */*ev*/)
 {
-        DropDownKeys ();
+       DropDownKeys ();
        set_entered_track (0);
        set_entered_regionview (0);
        reset_canvas_action_sensitivity (false);
@@ -780,7 +790,7 @@ Editor::set_horizontal_position (double p)
        time_line_group->move (x_delta, 0);
        cursor_group->move (x_delta, 0);
 
-       leftmost_frame = (nframes64_t) floor (p * frames_per_unit);
+       leftmost_frame = (framepos_t) floor (p * frames_per_unit);
 
        update_fixed_rulers ();
        redisplay_tempo (true);
@@ -789,6 +799,8 @@ Editor::set_horizontal_position (double p)
                _summary->set_overlays_dirty ();
        }
 
+       HorizontalPositionChanged (); /* EMIT SIGNAL */
+
 #ifndef GTKOSX
        if (!autoscroll_active && !_stationary_playhead) {
                /* force rulers and canvas to move in lock step */
@@ -914,3 +926,35 @@ Editor::horizontal_position () const
 {
        return frame_to_unit (leftmost_frame);
 }
+void
+Editor::set_canvas_cursor (Gdk::Cursor* cursor, bool save)
+{
+       if (save) {
+               current_canvas_cursor = cursor;
+       }
+
+       if (is_drawable()) {
+               track_canvas->get_window()->set_cursor (*cursor);
+       }
+}
+
+bool
+Editor::track_canvas_key_press (GdkEventKey* event)
+{
+       /* XXX: event does not report the modifier key pressed down, AFAICS, so use the Keyboard object instead */
+       if (mouse_mode == Editing::MouseZoom && Keyboard::the_keyboard().key_is_down (GDK_Control_L)) {
+               set_canvas_cursor (_cursors->zoom_out);
+       }
+
+       return false;
+}
+
+bool
+Editor::track_canvas_key_release (GdkEventKey* event)
+{
+       if (mouse_mode == Editing::MouseZoom && !Keyboard::the_keyboard().key_is_down (GDK_Control_L)) {
+               set_canvas_cursor (_cursors->zoom_in);
+       }
+
+       return false;
+}