Tooltips for mixer strip width and hide buttons (#4477).
[ardour.git] / gtk2_ardour / editor_drag.h
index ab81db5a63438f9c650a809092eada0e56fb4a8c..44b2d50767c5dba7a2d788f02af3524f6835dd89 100644 (file)
@@ -24,7 +24,6 @@
 
 #include <gdk/gdk.h>
 #include <stdint.h>
-#include <bitset>
 
 #include "ardour/types.h"
 
@@ -125,7 +124,7 @@ public:
 
        ARDOUR::framepos_t adjusted_frame (ARDOUR::framepos_t, GdkEvent const *, bool snap = true) const;
        ARDOUR::framepos_t adjusted_current_frame (GdkEvent const *, bool snap = true) const;
-       
+
        /** Called to start a grab of an item.
         *  @param e Event that caused the grab to start.
         *  @param c Cursor to use, or 0.
@@ -213,6 +212,10 @@ protected:
                return _last_pointer_frame;
        }
 
+       void show_verbose_cursor_time (framepos_t);
+       void show_verbose_cursor_duration (framepos_t, framepos_t, double xoffset = 0);
+       void show_verbose_cursor_text (std::string const &);
+
        Editor* _editor; ///< our editor
        DragManager* _drags;
        ArdourCanvas::Item* _item; ///< our item
@@ -242,7 +245,9 @@ struct DraggingView
        DraggingView (RegionView *, RegionDrag *);
 
        RegionView* view; ///< the view
-       /** index into RegionDrag::_time_axis_views of the view that this region is currently beind displayed on */
+       /** index into RegionDrag::_time_axis_views of the view that this region is currently being displayed on,
+        *  or -1 if it is not visible.
+        */
        int time_axis_view;
        /** layer that this region is currently being displayed on */
        ARDOUR::layer_t layer;
@@ -272,9 +277,9 @@ protected:
        int _visible_y_high;
 
        friend class DraggingView;
-       
+
 private:
-       
+
        void region_going_away (RegionView *);
        PBD::ScopedConnection death_connection;
 };
@@ -366,7 +371,7 @@ private:
        void add_stateful_diff_commands_for_playlists (PlaylistSet const &);
 
        void collect_new_region_view (RegionView *);
-       
+
        bool _copy;
        RegionView* _new_region_view;
 };
@@ -444,7 +449,7 @@ class NoteDrag : public Drag
 
        ARDOUR::frameoffset_t total_dx () const;
        int8_t total_dy () const;
-       
+
        MidiRegionView* _region;
        Gnome::Canvas::CanvasNoteEvent* _primary;
        double _cumulative_dx;
@@ -512,7 +517,7 @@ public:
        }
 
        void setup_pointer_frame_offset ();
-       
+
 private:
 
        Operation _operation;
@@ -538,7 +543,7 @@ public:
        }
 
        void setup_pointer_frame_offset ();
-       
+
 private:
        MeterMarker* _marker;
        bool _copy;
@@ -564,7 +569,7 @@ public:
        }
 
        void setup_pointer_frame_offset ();
-       
+
 private:
        TempoMarker* _marker;
        bool _copy;
@@ -591,13 +596,14 @@ public:
        }
 
        bool y_movement_matters () const {
-               return false;
+               return true;
        }
-       
+
 private:
        void fake_locate (framepos_t);
-       
+
        bool _stop; ///< true to stop the transport on starting the drag, otherwise false
+       double _grab_zoom; ///< editor frames per unit when our grab started
 };
 
 /** Region fade-in drag */
@@ -657,7 +663,7 @@ public:
        }
 
        void setup_pointer_frame_offset ();
-       
+
 private:
        void update_item (ARDOUR::Location *);
 
@@ -686,7 +692,7 @@ private:
        double _fixed_grab_y;
        double _cumulative_x_drag;
        double _cumulative_y_drag;
-       static double const _zero_gain_fraction;
+       static double _zero_gain_fraction;
 };
 
 /** Gain or automation line drag */
@@ -731,13 +737,13 @@ public:
 
 private:
 
-       ArdourCanvas::SimpleLine* _line;
+       ArdourCanvas::Line* _line;
        AudioRegionView* _arv;
-       
+
        double _region_view_grab_x;
        double _cumulative_x_drag;
-       
-       uint32_t _before;
+
+       float _before;
        uint32_t _max_x;
 };
 
@@ -755,6 +761,43 @@ public:
        std::pair<ARDOUR::framecnt_t, int> move_threshold () const {
                return std::make_pair (8, 1);
        }
+
+       void do_select_things (GdkEvent *, bool);
+
+       /** Select some things within a rectangle.
+        *  @param button_state The button state from the GdkEvent.
+        *  @param x1 The left-hand side of the rectangle in session frames.
+        *  @param x2 The right-hand side of the rectangle in session frames.
+        *  @param y1 The top of the rectangle in trackview coordinates.
+        *  @param y2 The bottom of the rectangle in trackview coordinates.
+        *  @param drag_in_progress true if the drag is currently happening.
+        */
+       virtual void select_things (int button_state, framepos_t x1, framepos_t x2, double y1, double y2, bool drag_in_progress) = 0;
+       
+       virtual void deselect_things () = 0;
+};
+
+/** A general editor RubberbandSelectDrag (for regions, automation points etc.) */
+class EditorRubberbandSelectDrag : public RubberbandSelectDrag
+{
+public:
+       EditorRubberbandSelectDrag (Editor *, ArdourCanvas::Item *);
+
+       void select_things (int, framepos_t, framepos_t, double, double, bool);
+       void deselect_things ();
+};
+
+/** A RubberbandSelectDrag for selecting MIDI notes */
+class MidiRubberbandSelectDrag : public RubberbandSelectDrag
+{
+public:
+       MidiRubberbandSelectDrag (Editor *, MidiRegionView *);
+
+       void select_things (int, framepos_t, framepos_t, double, double, bool);
+       void deselect_things ();
+
+private:
+       MidiRegionView* _region_view;
 };
 
 /** Region drag in time-FX mode */
@@ -887,9 +930,9 @@ private:
                std::pair<ARDOUR::framepos_t, ARDOUR::framepos_t> range; ///< the range of all points on the line, in session frames
                XMLNode* state; ///< the XML state node before the drag
        };
-       
+
        std::list<Line> _lines;
-       
+
        bool _nothing_to_drag;
 };