lincoln's patch from mantis 2757 to add route group property checkboxes in the route...
[ardour.git] / gtk2_ardour / editor.h
index c8fc118efaec69f0225cdf47f16d2518a9f6002a..a05ff655d3d91e95338f70e336ba6127f7267200 100644 (file)
@@ -53,6 +53,7 @@
 #include "ardour/audioregion.h"
 #include "ardour/track.h"
 #include "ardour/types.h"
+#include "ardour/route_group.h"
 
 #include "audio_clock.h"
 #include "gtk-custom-ruler.h"
@@ -63,6 +64,7 @@
 #include "editor_items.h"
 #include "region_selection.h"
 #include "canvas.h"
+#include "editor_summary.h"
 
 namespace Gtkmm2ext {
        class TearOff;
@@ -113,6 +115,7 @@ class TimeAxisView;
 class TimeFXDialog;
 class TimeSelection;
 class TrackSelection;
+class EditorGroupTabs;
 
 /* <CMT Additions> */
 class ImageFrameView;
@@ -137,6 +140,8 @@ struct EditorCursor {
        void set_position (nframes64_t);
        void set_length (double units);
        void set_y_axis (double position);
+
+       sigc::signal<void, nframes64_t> PositionChanged;
 };
 
 class Editor : public PublicEditor
@@ -151,8 +156,13 @@ class Editor : public PublicEditor
        virtual bool     have_idled () const { return _have_idled; }
 
        nframes64_t leftmost_position() const { return leftmost_frame; }
+
        nframes64_t current_page_frames() const {
-               return (nframes64_t) floor (canvas_width * frames_per_unit);
+               return (nframes64_t) floor (_canvas_width * frames_per_unit);
+       }
+       
+       double canvas_height () const {
+               return _canvas_height;
        }
 
        void cycle_snap_mode ();
@@ -184,7 +194,7 @@ class Editor : public PublicEditor
 
        TimeAxisView* get_named_time_axis(const std::string & name) ;
        void foreach_time_axis_view (sigc::slot<void,TimeAxisView&>);
-       void add_to_idle_resize (TimeAxisView*, uint32_t);
+       void add_to_idle_resize (TimeAxisView*, int32_t);
 
        RouteTimeAxisView* get_route_view_by_id (PBD::ID& id);
 
@@ -198,11 +208,6 @@ class Editor : public PublicEditor
 
        /* option editor-access */
 
-       void set_show_waveforms (bool yn);
-       bool show_waveforms() const { return _show_waveforms; }
-
-       void set_waveform_scale (Editing::WaveformScale);
-
        void set_show_waveforms_recording (bool yn);
        bool show_waveforms_recording() const { return _show_waveforms_recording; }
        
@@ -338,9 +343,10 @@ class Editor : public PublicEditor
        bool follow_playhead() const { return _follow_playhead; }
        bool dragging_playhead () const { return _dragging_playhead; }
 
-       void toggle_waveform_visibility ();
        void toggle_zero_line_visibility ();
        void toggle_waveforms_while_recording ();
+       void set_summary ();
+       void set_group_tabs ();
        void toggle_measure_visibility ();
        void toggle_logo_visibility ();
 
@@ -378,6 +384,7 @@ class Editor : public PublicEditor
        void restore_editing_space();
 
        void reset_x_origin (nframes64_t);
+       void reset_y_origin (double);
        void reset_zoom (double);
        void reposition_and_zoom (nframes64_t, double);
 
@@ -395,16 +402,13 @@ class Editor : public PublicEditor
        void goto_visual_state (uint32_t);
        void save_visual_state (uint32_t);
 
-       void queue_draw_resize_line (int at);
-       void start_resize_line_ops ();
-       void end_resize_line_ops ();
+       void update_rec_display ();
 
   protected:
        void map_transport_state ();
        void map_position_change (nframes64_t);
 
        void on_realize();
-       bool on_expose_event (GdkEventExpose*);
 
   private:
 
@@ -530,13 +534,15 @@ class Editor : public PublicEditor
 
        void sort_track_selection (TrackSelection* sel = 0);
 
-       void get_relevant_tracks (std::set<RouteTimeAxisView*>& relevant_tracks);
-       void get_equivalent_regions (RegionView* rv, std::vector<RegionView*>&) const;
-       void mapover_tracks (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl, TimeAxisView*) const;
+       void get_relevant_tracks (std::set<RouteTimeAxisView*>& relevant_tracks) const;
+       void get_equivalent_tracks (RouteTimeAxisView*, std::set<RouteTimeAxisView*> &, ARDOUR::RouteGroup::Property) const;
+       void get_equivalent_regions (RegionView* rv, std::vector<RegionView*> &, ARDOUR::RouteGroup::Property) const;
+       RegionSelection get_equivalent_regions (RegionSelection &, ARDOUR::RouteGroup::Property) const;
+       void mapover_tracks (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl, TimeAxisView*, ARDOUR::RouteGroup::Property) const;
 
        /* functions to be passed to mapover_tracks(), possibly with sigc::bind()-supplied arguments */
 
-       void mapped_get_equivalent_regions (RouteTimeAxisView&, uint32_t, RegionView*, std::vector<RegionView*>*) const;
+       void mapped_get_equivalent_regions (RouteTimeAxisView&, uint32_t, RegionView *, std::vector<RegionView*>*) const;
        void mapped_use_new_playlist (RouteTimeAxisView&, uint32_t, std::vector<boost::shared_ptr<ARDOUR::Playlist> > const &);
        void mapped_use_copy_playlist (RouteTimeAxisView&, uint32_t, std::vector<boost::shared_ptr<ARDOUR::Playlist> > const &);
        void mapped_clear_playlist (RouteTimeAxisView&, uint32_t);
@@ -596,10 +602,6 @@ class Editor : public PublicEditor
        Gtk::VBox           global_vpacker;
        Gtk::VBox           vpacker;
 
-       bool need_resize_line;
-       int  resize_line_y;
-       int  old_resize_line_y;
-
        Gdk::Cursor*          current_canvas_cursor;
        void set_canvas_cursor ();
        Gdk::Cursor* which_grabber_cursor ();
@@ -695,7 +697,6 @@ class Editor : public PublicEditor
        gint ruler_mouse_motion (GdkEventMotion*);
        bool ruler_scroll (GdkEventScroll* event);
 
-       gint          ruler_pressed_button;
        Gtk::Widget * ruler_grabbed_widget;
        
        void initialize_rulers ();
@@ -868,8 +869,8 @@ class Editor : public PublicEditor
        bool hscrollbar_button_release (GdkEventButton*);
        void hscrollbar_allocate (Gtk::Allocation &alloc);
 
-       double canvas_width;
-       double canvas_height;
+       double _canvas_width;
+       double _canvas_height;
        double full_canvas_height;
 
        bool track_canvas_map_handler (GdkEventAny*);
@@ -899,18 +900,23 @@ class Editor : public PublicEditor
        void scroll_canvas_vertically ();
 
        struct VisualChange {
-           enum Type { 
-                   TimeOrigin = 0x1,
-                   ZoomLevel = 0x2
-           };
-
-           Type pending;
-           nframes64_t time_origin;
-           double frames_per_unit;
-
-           int idle_handler_id;
-
-           VisualChange() : pending ((VisualChange::Type) 0), time_origin (0), frames_per_unit (0), idle_handler_id (-1) {}
+               enum Type { 
+                       TimeOrigin = 0x1,
+                       ZoomLevel = 0x2,
+                       YOrigin = 0x4
+               };
+               
+               Type pending;
+               nframes64_t time_origin;
+               double frames_per_unit;
+               double y_origin;
+               
+               int idle_handler_id;
+               
+               VisualChange() : pending ((VisualChange::Type) 0), time_origin (0), frames_per_unit (0), idle_handler_id (-1) {}
+               void add (Type t) {
+                       pending = Type (pending | t);
+               }
        };
 
 
@@ -921,6 +927,8 @@ class Editor : public PublicEditor
 
        void queue_visual_change (nframes64_t);
        void queue_visual_change (double);
+       void queue_visual_change_y (double);
+       void ensure_visual_change_idle_handler ();
 
        void end_location_changed (ARDOUR::Location*);
 
@@ -1053,8 +1061,9 @@ class Editor : public PublicEditor
        void named_selection_display_selection_changed ();
 
        /* track views */
-       TrackViewList  track_views;
+       TrackViewList track_views;
        std::pair<TimeAxisView*, ARDOUR::layer_t> trackview_by_y_position (double);
+       TrackSelection axis_views_from_routes (std::list<ARDOUR::Route *>) const;
 
        static Gdk::Cursor* cross_hair_cursor;
        static Gdk::Cursor* trimmer_cursor;
@@ -1139,7 +1148,6 @@ class Editor : public PublicEditor
        void lower_region ();
        void lower_region_to_bottom ();
        void split_region ();
-       void split_region_at (nframes64_t);
        void split_regions_at (nframes64_t, RegionSelection&);
        void split_region_at_transients ();
        void split_region_at_points (boost::shared_ptr<ARDOUR::Region>, ARDOUR::AnalysisFeatureList&, bool can_ferret);
@@ -1167,12 +1175,13 @@ class Editor : public PublicEditor
        void reverse_region ();
        void strip_region_silence ();
        void normalize_region ();
+       double _last_normalization_value;
        void denormalize_region ();
        void adjust_region_scale_amplitude (bool up);
        void quantize_region ();
 
        void do_insert_time ();
-       void insert_time (nframes64_t pos, nframes64_t distance, Editing::InsertTimeOption opt, bool ignore_music_glue, bool markers_too);
+       void insert_time (nframes64_t, nframes64_t, Editing::InsertTimeOption, bool, bool, bool);
 
        void tab_to_transient (bool forward);
 
@@ -1364,7 +1373,6 @@ class Editor : public PublicEditor
        void start_scrolling ();
        void stop_scrolling ();
 
-       bool _scrubbing;
        double last_scrub_x;
        int scrubbing_direction;
        int scrub_reversals;
@@ -1495,6 +1503,7 @@ public:
        Gtk::Allocation canvas_allocation;
        void track_canvas_allocate (Gtk::Allocation alloc);
        bool track_canvas_size_allocated ();
+       bool track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const &, int, int, guint);
 
        void set_playhead_cursor ();
 
@@ -1511,8 +1520,6 @@ public:
        /* display control */
        
        bool _show_measures;
-       /// true to show waveforms, otherwise false
-       bool _show_waveforms;
        /// true if the editor should follow the playhead, otherwise false
        bool _follow_playhead;
        /// true if waveforms should be shown while recording audio tracks, otherwise false
@@ -1593,7 +1600,8 @@ public:
        void redisplay_tempo (bool immediate_redraw);
        
        void snap_to (nframes64_t& first, int32_t direction = 0, bool for_mark = false);
-       
+       void snap_to (nframes64_t& first, nframes64_t& last, int32_t direction = 0, bool for_mark = false);
+
        double snap_length_beats (nframes64_t start);
 
        uint32_t bbt_beat_subdivision;
@@ -1669,6 +1677,7 @@ public:
        Glib::RefPtr<Gtk::RadioAction> zoom_focus_action (Editing::ZoomFocus);
 
        Gtk::HBox           zoom_box;
+       Gtk::VBox           zoom_vbox;
 
        void                zoom_adjustment_changed();
 
@@ -1761,22 +1770,30 @@ public:
        void reposition_zoom_rect (nframes64_t start, nframes64_t end);
        
        /* diskstream/route display management */
+       Glib::RefPtr<Gdk::Pixbuf> rec_enabled_icon;
+       Glib::RefPtr<Gdk::Pixbuf> rec_disabled_icon;
 
        struct RouteDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
            RouteDisplayModelColumns() { 
                    add (text);
                    add (visible);
+                   add (rec_enabled);
                    add (temporary_visible);
+                   add (is_track);
                    add (tv);
                    add (route);
            }
            Gtk::TreeModelColumn<Glib::ustring>  text;
            Gtk::TreeModelColumn<bool>           visible;
+           Gtk::TreeModelColumn<bool>           rec_enabled;
            Gtk::TreeModelColumn<bool>           temporary_visible;
+           Gtk::TreeModelColumn<bool>           is_track;
            Gtk::TreeModelColumn<TimeAxisView*>  tv;
            Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Route> >  route;
        };
 
+       void on_tv_rec_enable_toggled(const Glib::ustring& path_string);
+
        RouteDisplayModelColumns         route_display_columns;
        Glib::RefPtr<Gtk::ListStore>     route_display_model;
        Glib::RefPtr<Gtk::TreeSelection> route_display_selection;
@@ -1828,39 +1845,59 @@ public:
        /* edit group management */
 
         struct GroupListModelColumns : public Gtk::TreeModel::ColumnRecord {
+
                 GroupListModelColumns () {
-                      add (is_active);
-                      add (is_visible);
-                       add (text);
-                      add (routegroup);
+                       add (is_visible);
+                       add (gain);
+                       add (record);
+                       add (mute);
+                       add (solo);
+                       add (select);
+                       add (edits);
+                       add (text);
+                       add (routegroup);
                 }
-               Gtk::TreeModelColumn<bool> is_active;
+
                Gtk::TreeModelColumn<bool> is_visible;
+               Gtk::TreeModelColumn<bool> gain;
+               Gtk::TreeModelColumn<bool> record;
+               Gtk::TreeModelColumn<bool> mute;
+               Gtk::TreeModelColumn<bool> solo;
+               Gtk::TreeModelColumn<bool> select;
+               Gtk::TreeModelColumn<bool> edits;
                Gtk::TreeModelColumn<std::string> text;
-               Gtk::TreeModelColumn<ARDOUR::RouteGroup*>   routegroup;
+               Gtk::TreeModelColumn<ARDOUR::RouteGroup*> routegroup;
        };
 
        GroupListModelColumns group_columns;
+
        Glib::RefPtr<Gtk::ListStore> group_model;
        Glib::RefPtr<Gtk::TreeSelection> group_selection;
 
-       Gtk::TreeView          edit_group_display;
-       Gtk::ScrolledWindow    edit_group_display_scroller;
-       Gtk::Menu*             edit_group_list_menu;
-
-       void build_edit_group_list_menu ();
-       void activate_all_edit_groups ();
-       void disable_all_edit_groups ();
-
-       bool in_edit_group_row_change;
-       void edit_group_row_change (const Gtk::TreeModel::Path&,const Gtk::TreeModel::iterator&);
-       void edit_group_name_edit (const Glib::ustring&, const Glib::ustring&);
-       void new_edit_group ();
-       void edit_group_list_button_clicked ();
-       gint edit_group_list_button_press_event (GdkEventButton* ev);
-       void add_edit_group (ARDOUR::RouteGroup* group);
-       void remove_selected_edit_group ();
-       void edit_groups_changed ();
+       Gtk::TreeView          route_group_display;
+       Gtk::ScrolledWindow    route_group_display_scroller;
+       Gtk::Menu*             route_group_menu;
+
+       void build_route_group_menu (ARDOUR::RouteGroup *);
+       void activate_all_route_groups ();
+       void disable_all_route_groups ();
+       void subgroup_route_group (ARDOUR::RouteGroup*);
+       void unsubgroup_route_group (ARDOUR::RouteGroup*);
+
+       bool in_route_group_row_change;
+       void route_group_row_change (const Gtk::TreeModel::Path&,const Gtk::TreeModel::iterator&);
+       void route_group_name_edit (const Glib::ustring&, const Glib::ustring&);
+       void new_route_group ();
+       void new_route_group_from_selection ();
+       void new_route_group_from_rec_enabled ();
+       void new_route_group_from_soloed ();
+       void edit_route_group (ARDOUR::RouteGroup *);
+       void fit_route_group (ARDOUR::RouteGroup *);
+       void route_group_list_button_clicked ();
+       gint route_group_list_button_press_event (GdkEventButton* ev);
+       void add_route_group (ARDOUR::RouteGroup* group);
+       void remove_selected_route_group ();
+       void route_groups_changed ();
        void group_flags_changed (void*, ARDOUR::RouteGroup*);
 
        Gtk::VBox           list_vpacker;
@@ -1881,7 +1918,7 @@ public:
        bool autoscroll_canvas ();
        void start_canvas_autoscroll (int x, int y);
        void stop_canvas_autoscroll ();
-       void maybe_autoscroll (GdkEventMotion*);
+       void maybe_autoscroll (GdkEventMotion*, bool);
        bool allow_vertical_scroll;
 
        /* trimming */
@@ -2005,16 +2042,16 @@ public:
        void freeze_route ();
        void unfreeze_route ();
 
-       /* edit-group solo + mute */
+       /* route-group solo + mute */
 
-       void set_edit_group_solo (ARDOUR::Route&, bool);
-       void set_edit_group_mute (ARDOUR::Route&, bool);
+       void set_route_group_solo (ARDOUR::Route&, bool);
+       void set_route_group_mute (ARDOUR::Route&, bool);
 
        /* duplication */
 
        void duplicate_dialog (bool with_dialog);
        
-       nframes64_t event_frame (GdkEvent*, double* px = 0, double* py = 0) const;
+       nframes64_t event_frame (GdkEvent const *, double* px = 0, double* py = 0) const;
 
        /* returns false if mouse pointer is not in track or marker canvas
         */
@@ -2205,25 +2242,35 @@ public:
        BundleManager* _bundle_manager;
        GlobalPortMatrixWindow* _global_port_matrix[ARDOUR::DataType::num_types];
 
-       void fit_tracks ();
+       void fit_tracks (TrackSelection &);
+       void fit_selected_tracks ();
        void set_track_height (uint32_t h);
 
        void remove_tracks ();
        void toggle_tracks_active ();
-       void waveform_scale_chosen (Editing::WaveformScale);
 
        bool _have_idled;
        int resize_idle_id;
-       int32_t resize_idle_target;
        bool idle_resize();
        friend gboolean _idle_resize (gpointer);
-       std::vector<TimeAxisView*> pending_resizes;
+       int32_t _pending_resize_amount;
+       TimeAxisView* _pending_resize_view;
 
        void visible_order_range (int*, int*) const;
 
        void located ();
        bool _pending_locate_request;
 
+       EditorSummary* _summary;
+       void region_view_added (RegionView *);
+
+       void update_canvas_now ();
+       void streamview_height_changed ();
+
+       EditorGroupTabs* _group_tabs;
+
+       void set_route_group_activation (ARDOUR::RouteGroup *, bool);
+
        friend class Drag;
        friend class RegionDrag;
        friend class RegionMoveDrag;
@@ -2240,10 +2287,16 @@ public:
        friend class LineDrag;
        friend class RubberbandSelectDrag;
         friend class TimeFXDrag;
+        friend class ScrubDrag;
        friend class SelectionDrag;
        friend class RangeMarkerBarDrag;
        friend class MouseZoomDrag;
        friend class RegionCreateDrag;
+       friend class RegionMotionDrag;
+       friend class RegionInsertDrag;
+
+       friend class EditorSummary;
+       friend class EditorGroupTabs;
 };
 
 #endif /* __ardour_editor_h__ */