removed no-longer-used Editor::track_canvas_motion()
[ardour.git] / gtk2_ardour / editor.h
index 1398936979151d3a31207efad60c46b3e081e805..bf4783409c1309387c663cf68946a68f9cab02df 100644 (file)
@@ -23,6 +23,7 @@
 #include <list>
 #include <map>
 #include <set>
+#include <stack>
 #include <string>
 #include <sys/time.h>
 #include <cmath>
@@ -47,8 +48,8 @@
 #include "ardour/types.h"
 
 #include "canvas/fwd.h"
+#include "canvas/ruler.h"
 
-#include "gtk-custom-ruler.h"
 #include "ardour_button.h"
 #include "ardour_dialog.h"
 #include "ardour_dropdown.h"
@@ -116,6 +117,7 @@ class PlaylistSelector;
 class PluginSelector;
 class ProgressReporter;
 class RhythmFerret;
+class RulerDialog;
 class Selection;
 class SoundFileOmega;
 class StreamView;
@@ -422,6 +424,10 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        Gdk::Cursor* get_canvas_cursor () const { return current_canvas_cursor; }
        void set_canvas_cursor (Gdk::Cursor*, bool save=false);
+       
+       void push_canvas_cursor (Gdk::Cursor*);
+       void pop_canvas_cursor ();
+
        void set_current_trimmable (boost::shared_ptr<ARDOUR::Trimmable>);
        void set_current_movable (boost::shared_ptr<ARDOUR::Movable>);
 
@@ -446,14 +452,23 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
                _stepping_axis_view = v;
        }
 
-       ArdourCanvas::Group* get_trackview_group () const { return _trackview_group; }
-        ArdourCanvas::Group* get_time_bars_group () const;
-        ArdourCanvas::Group* get_track_canvas_group () const;
-        ArdourCanvas::GtkCanvasViewport* get_time_bars_canvas () const;
+       ArdourCanvas::Container* get_trackview_group () const { return _trackview_group; }
+        ArdourCanvas::Container* get_noscroll_group () const { return no_scroll_group; }
+        ArdourCanvas::ScrollGroup* get_hscroll_group () const { return h_scroll_group; }
+        ArdourCanvas::ScrollGroup* get_vscroll_group () const { return v_scroll_group; }
+        ArdourCanvas::ScrollGroup* get_hvscroll_group () const { return hv_scroll_group; }
+
         ArdourCanvas::GtkCanvasViewport* get_track_canvas () const;
 
         void override_visible_track_count ();
 
+       /* Ruler metrics methods */
+
+       void metric_get_timecode (std::vector<ArdourCanvas::Ruler::Mark>&, gdouble, gdouble, gint);
+       void metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>&, gdouble, gdouble, gint);
+       void metric_get_samples (std::vector<ArdourCanvas::Ruler::Mark>&, gdouble, gdouble, gint);
+       void metric_get_minsec (std::vector<ArdourCanvas::Ruler::Mark>&, gdouble, gdouble, gint);
+
   protected:
        void map_transport_state ();
        void map_position_change (framepos_t);
@@ -522,7 +537,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        JoinObjectRangeState _join_object_range_state;
 
-       void update_join_object_range_location (double, double);
+       void update_join_object_range_location (double);
 
        boost::optional<int>  pre_notebook_shrink_pane_width;
 
@@ -547,7 +562,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void refresh_location_display ();
        void refresh_location_display_internal (ARDOUR::Locations::LocationList&);
        void add_new_location (ARDOUR::Location *);
-       ArdourCanvas::Group* add_new_location_internal (ARDOUR::Location *);
+       ArdourCanvas::Container* add_new_location_internal (ARDOUR::Location *);
        void location_gone (ARDOUR::Location *);
        void remove_marker (ArdourCanvas::Item&, GdkEvent*);
        gint really_remove_marker (ARDOUR::Location* loc);
@@ -593,7 +608,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        LocationMarkerMap location_markers;
 
        void update_marker_labels ();
-       void update_marker_labels (ArdourCanvas::Group *);
+       void update_marker_labels (ArdourCanvas::Container *);
        void check_marker_label (Marker *);
 
        /** A set of lists of Markers that are in each of the canvas groups
@@ -602,7 +617,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
         *  a marker has moved we can decide whether we need to update the labels
         *  for all markers or for just a few.
         */
-       std::map<ArdourCanvas::Group *, std::list<Marker *> > _sorted_marker_lists;
+       std::map<ArdourCanvas::Container *, std::list<Marker *> > _sorted_marker_lists;
        void remove_sorted_marker (Marker *);
 
        void hide_marker (ArdourCanvas::Item*, GdkEvent*);
@@ -688,62 +703,77 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        Gtk::VBox           global_vpacker;
        Gtk::VBox           vpacker;
 
+       std::stack<Gdk::Cursor*> _cursor_stack;
        Gdk::Cursor*          current_canvas_cursor;
-       Gdk::Cursor* which_grabber_cursor ();
-       void set_canvas_cursor ();
+       Gdk::Cursor* which_grabber_cursor () const;
+       Gdk::Cursor* which_track_cursor () const;
+       Gdk::Cursor* which_mode_cursor () const;
+       Gdk::Cursor* which_trim_cursor (bool left_side) const;
+       bool reset_canvas_cursor ();
+       void choose_canvas_cursor_on_entry (GdkEventCrossing*, ItemType);
 
        ArdourCanvas::GtkCanvas* _track_canvas;
        ArdourCanvas::GtkCanvasViewport* _track_canvas_viewport;
 
-        ArdourCanvas::GtkCanvas* _time_bars_canvas;
-        ArdourCanvas::GtkCanvasViewport* _time_bars_canvas_viewport;
-
        bool within_track_canvas;
 
        friend class VerboseCursor;
        VerboseCursor* _verbose_cursor;
 
        void parameter_changed (std::string);
+       void ui_parameter_changed (std::string);
 
-       bool track_canvas_motion (GdkEvent*);
-
-       Gtk::EventBox             time_canvas_event_box;
        Gtk::EventBox             time_bars_event_box;
-       Gtk::EventBox             ruler_label_event_box;
+       Gtk::VBox                 time_bars_vbox;
 
-       ArdourCanvas::Group      *minsec_group;
        ArdourCanvas::Pixbuf     *logo_item;
-       ArdourCanvas::Group      *bbt_group;
-       ArdourCanvas::Group      *timecode_group;
-       ArdourCanvas::Group      *frame_group;
-       ArdourCanvas::Group      *tempo_group;
-       ArdourCanvas::Group      *meter_group;
-       ArdourCanvas::Group      *marker_group;
-       ArdourCanvas::Group      *range_marker_group;
-       ArdourCanvas::Group      *transport_marker_group;
-       ArdourCanvas::Group*      cd_marker_group;
+#if 0    
+    /* these will be needed when we have canvas rulers */
+       ArdourCanvas::Container      *minsec_group;
+       ArdourCanvas::Container      *bbt_group;
+       ArdourCanvas::Container      *timecode_group;
+       ArdourCanvas::Container      *frame_group;
+#endif
+
+       ArdourCanvas::Container      *tempo_group;
+       ArdourCanvas::Container      *meter_group;
+       ArdourCanvas::Container      *marker_group;
+       ArdourCanvas::Container      *range_marker_group;
+       ArdourCanvas::Container      *transport_marker_group;
+       ArdourCanvas::Container*      cd_marker_group;
 
        /* parent for groups which themselves contain time markers */
-       ArdourCanvas::Group*     _time_markers_group;
+       ArdourCanvas::Container*     _time_markers_group;
+
+       /* The group containing all other groups that are scrolled vertically
+          and horizontally.
+       */
+        ArdourCanvas::ScrollGroup* hv_scroll_group;
+
+       /* The group containing all other groups that are scrolled vertically ONLY
+       */
+        ArdourCanvas::ScrollGroup* v_scroll_group;
+
+       /* The group containing all other groups that are scrolled horizontally ONLY
+       */
+        ArdourCanvas::ScrollGroup* h_scroll_group;
 
-       ArdourCanvas::Group*      meter_bar_group;
-       ArdourCanvas::Group*      tempo_bar_group;
-       ArdourCanvas::Group*      marker_bar_group;
-       ArdourCanvas::Group*      range_marker_bar_group;
-       ArdourCanvas::Group*      transport_marker_bar_group;
-       ArdourCanvas::Group*      cd_marker_bar_group;
+       /* The group containing all trackviews. */
+       ArdourCanvas::Container* no_scroll_group;
 
-       /* The group containing all trackviews.  Only scrolled vertically. */
-       ArdourCanvas::Group* _trackview_group;
+       /* The group containing all trackviews. */
+       ArdourCanvas::Container* _trackview_group;
 
-       /* The group used for region motion.  Sits on top of _trackview_group */
-       ArdourCanvas::Group* _region_motion_group;
+       /* The group holding things (mostly regions) while dragging so they
+        * are on top of everything else
+        */
+       ArdourCanvas::Container* _drag_motion_group;
 
         /* a rect that sits at the bottom of all tracks to act as a drag-no-drop/clickable
         * target area.
         */
-        ArdourCanvas::Rectangle* _canvas_bottom_rect;
-        bool canvas_bottom_rect_event (GdkEvent* event);
+        ArdourCanvas::Rectangle* _canvas_drop_zone;
+        bool canvas_drop_zone_event (GdkEvent* event);
 
        enum RulerType {
                ruler_metric_timecode = 0,
@@ -760,7 +790,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
                ruler_video_timeline = 10,
        };
 
-       static GtkCustomMetric ruler_metrics[4];
        Glib::RefPtr<Gtk::ToggleAction> ruler_timecode_action;
        Glib::RefPtr<Gtk::ToggleAction> ruler_bbt_action;
        Glib::RefPtr<Gtk::ToggleAction> ruler_samples_action;
@@ -773,13 +802,10 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        Glib::RefPtr<Gtk::ToggleAction> ruler_cd_marker_action;
        bool                            no_ruler_shown_update;
 
-       bool ruler_button_press (GdkEventButton*);
-       bool ruler_button_release (GdkEventButton*);
-       bool ruler_mouse_motion (GdkEventMotion*);
-       bool ruler_scroll (GdkEventScroll* event);
-
        Gtk::Widget * ruler_grabbed_widget;
 
+       RulerDialog* ruler_dialog;
+
        void initialize_rulers ();
        void update_just_timecode ();
        void compute_fixed_ruler_scale (); //calculates the RulerScale of the fixed rulers
@@ -795,11 +821,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void store_ruler_visibility ();
        void restore_ruler_visibility ();
 
-       static gint _metric_get_timecode (GtkCustomRulerMark **, gdouble, gdouble, gint);
-       static gint _metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint);
-       static gint _metric_get_samples (GtkCustomRulerMark **, gdouble, gdouble, gint);
-       static gint _metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint);
-
        enum MinsecRulerScale {
                minsec_show_seconds,
                minsec_show_minutes,
@@ -853,21 +874,10 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
                                      ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin,
                                      ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end);
 
-       gint metric_get_timecode (GtkCustomRulerMark **, gdouble, gdouble, gint);
-       gint metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint);
-       gint metric_get_samples (GtkCustomRulerMark **, gdouble, gdouble, gint);
-       gint metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint);
-
-       Gtk::Widget        *_ruler_separator;
-       GtkWidget          *_timecode_ruler;
-       GtkWidget          *_bbt_ruler;
-       GtkWidget          *_samples_ruler;
-       GtkWidget          *_minsec_ruler;
-       Gtk::Widget        *timecode_ruler;
-       Gtk::Widget        *bbt_ruler;
-       Gtk::Widget        *samples_ruler;
-       Gtk::Widget        *minsec_ruler;
-       static Editor      *ruler_editor;
+       ArdourCanvas::Ruler* timecode_ruler;
+       ArdourCanvas::Ruler* bbt_ruler;
+       ArdourCanvas::Ruler* samples_ruler;
+       ArdourCanvas::Ruler* minsec_ruler;
 
        static const double timebar_height;
        guint32 visible_timebars;
@@ -893,7 +903,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        /* videtimline related actions */
        Gtk::Label                videotl_label;
-       ArdourCanvas::Group*      videotl_group;
+       ArdourCanvas::Container*      videotl_group;
        Glib::RefPtr<Gtk::ToggleAction> ruler_video_action;
        Glib::RefPtr<Gtk::ToggleAction> xjadeo_proc_action;
        Glib::RefPtr<Gtk::ToggleAction> xjadeo_ontop_action;
@@ -915,8 +925,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void export_video (bool range = false);
        void toggle_region_video_lock ();
 
-       Gtk::VBox          time_bars_vbox;
-
        friend class EditorCursor;
 
        EditorCursor*        playhead_cursor;
@@ -989,9 +997,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        Gtk::Menu *edit_controls_left_menu;
        Gtk::Menu *edit_controls_right_menu;
 
-       Gtk::VBox           ruler_label_vbox;
        Gtk::VBox           track_canvas_vbox;
-       Gtk::VBox           time_canvas_vbox;
        Gtk::VBox           edit_controls_vbox;
        Gtk::HBox           edit_controls_hbox;
 
@@ -1044,8 +1050,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        /* track views */
        TrackViewList track_views;
-       std::pair<TimeAxisView*, double> trackview_by_y_position (double);
-       TimeAxisView* axis_view_from_route (boost::shared_ptr<ARDOUR::Route>) const;
+       std::pair<TimeAxisView*, double> trackview_by_y_position (double, bool trackview_relative_offset = true) const;
+       RouteTimeAxisView* axis_view_from_route (boost::shared_ptr<ARDOUR::Route>) const;
 
        TrackViewList get_tracks_for_range_action () const;
 
@@ -1211,11 +1217,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void temporal_zoom_by_frame (framepos_t start, framepos_t end);
        void temporal_zoom_to_frame (bool coarser, framepos_t frame);
 
-       void insert_region_list_drag (boost::shared_ptr<ARDOUR::Region>, int x, int y);
        void insert_region_list_selection (float times);
 
-       void insert_route_list_drag (boost::shared_ptr<ARDOUR::Route>, int x, int y);
-
        /* import & embed */
 
        void add_external_audio_action (Editing::ImportMode);
@@ -1351,9 +1354,16 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        DragManager* _drags;
 
        void escape ();
+       void lock ();
+       void unlock ();
+       Gtk::Dialog* lock_dialog;
+
+       struct timeval last_event_time;
+       bool generic_event_handler (GdkEvent*);
+       bool lock_timeout_callback ();
+       void start_lock_event_timing ();
 
        Gtk::Menu fade_context_menu;
-       void popup_fade_context_menu (int, int, ArdourCanvas::Item*, ItemType);
 
        Gtk::Menu xfade_in_context_menu;
        Gtk::Menu xfade_out_context_menu;
@@ -1393,6 +1403,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        /* Canvas event handlers */
 
+       bool canvas_scroll_event (GdkEventScroll* event, bool from_canvas);
        bool canvas_control_point_event (GdkEvent* event,ArdourCanvas::Item*, ControlPoint*);
        bool canvas_line_event (GdkEvent* event,ArdourCanvas::Item*, AutomationLine*);
        bool canvas_selection_rect_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*);
@@ -1401,10 +1412,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        bool canvas_start_xfade_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
        bool canvas_end_xfade_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
        bool canvas_fade_in_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
-       bool canvas_fade_in_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
+       bool canvas_fade_in_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*, bool trim = false);
        bool canvas_fade_out_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
-       bool canvas_fade_out_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
+       bool canvas_fade_out_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*, bool trim = false);
        bool canvas_region_view_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
+       bool canvas_wave_view_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
        bool canvas_frame_handle_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
        bool canvas_region_view_name_highlight_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
        bool canvas_region_view_name_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
@@ -1417,6 +1429,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        bool canvas_automation_track_event(GdkEvent* event, ArdourCanvas::Item*, AutomationTimeAxisView*);
        bool canvas_note_event (GdkEvent* event, ArdourCanvas::Item *);
 
+       bool canvas_ruler_event (GdkEvent* event, ArdourCanvas::Item *, ItemType);
        bool canvas_tempo_bar_event (GdkEvent* event, ArdourCanvas::Item*);
        bool canvas_meter_bar_event (GdkEvent* event, ArdourCanvas::Item*);
        bool canvas_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
@@ -1441,15 +1454,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        friend class EditorRouteGroups;
        friend class EditorRegions;
 
-       /** true if the mouse is over a place where region trim can happen */
-       bool _over_region_trim_target;
-
        /* non-public event handlers */
 
        bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
        bool track_canvas_scroll (GdkEventScroll* event);
 
-       bool track_canvas_scroll_event (GdkEventScroll* event);
        bool track_canvas_button_press_event (GdkEventButton* event);
        bool track_canvas_button_release_event (GdkEventButton* event);
        bool track_canvas_motion_notify_event (GdkEventMotion* event);
@@ -1479,8 +1488,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        TempoLines* tempo_lines;
 
-       ArdourCanvas::Group* global_rect_group;
-       ArdourCanvas::Group* time_line_group;
+       ArdourCanvas::Container* global_rect_group;
+       ArdourCanvas::Container* time_line_group;
 
        void hide_measures ();
         void draw_measures (ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
@@ -2062,8 +2071,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        Gtk::MenuItem& action_menu_item (std::string const &);
        void action_pre_activated (Glib::RefPtr<Gtk::Action> const &);
 
-       void set_canvas_cursor_for_region_view (double, RegionView *);
-
        MouseCursors* _cursors;
 
        void follow_mixer_selection ();