MIDI metering.
[ardour.git] / gtk2_ardour / editor.h
index 2e4b81208b695cc6ed8b1f3f21ff53c6843a1334..5bb6ee44264f7ff93b7a9f0ee5f7ec4cac6afccd 100644 (file)
@@ -140,13 +140,15 @@ class Editor : public PublicEditor
 
        void set_mouse_mode (Editing::MouseMode, bool force=true);
        void step_mouse_mode (bool next);
-       Editing::MouseMode current_mouse_mode () { return mouse_mode; }
+       Editing::MouseMode current_mouse_mode () const { return mouse_mode; }
 
+#ifdef WITH_CMT
        void add_imageframe_time_axis(const std::string & track_name, void*) ;
        void add_imageframe_marker_time_axis(const std::string & track_name, TimeAxisView* marked_track, void*) ;
        void connect_to_image_compositor() ;
        void scroll_timeaxis_to_imageframe_item(const TimeAxisViewItem* item) ;
        TimeAxisView* get_named_time_axis(const std::string & name) ;
+#endif
 
        void consider_auditioning (boost::shared_ptr<ARDOUR::Region>);
        void hide_a_region (boost::shared_ptr<ARDOUR::Region>);
@@ -216,9 +218,9 @@ class Editor : public PublicEditor
        bool extend_selection_to_track (TimeAxisView&);
 
        void play_selection ();
-       void select_all_in_track (Selection::Operation op);
+       void select_all_in_selected_tracks (Selection::Operation op);
        void select_all (Selection::Operation op);
-       void invert_selection_in_track ();
+       void invert_selection_in_selected_tracks ();
        void invert_selection ();
 
        /* tempo */
@@ -264,6 +266,7 @@ class Editor : public PublicEditor
        TrackViewList* get_valid_views (TimeAxisView*, ARDOUR::RouteGroup* grp = 0);
 
        Width editor_mixer_strip_width;
+       void maybe_add_mixer_strip_width (XMLNode&);
        void show_editor_mixer (bool yn);
        void set_selected_mixer_strip (TimeAxisView&);
        void hide_track_in_display (TimeAxisView& tv);
@@ -305,6 +308,7 @@ class Editor : public PublicEditor
        void toggle_xfades_active ();
        void toggle_xfade_visibility ();
        bool xfade_visibility() const { return _xfade_visibility; }
+       void update_xfade_visibility ();
        void update_crossfade_model ();
        void set_crossfade_model (ARDOUR::CrossfadeModel);
 
@@ -344,7 +348,8 @@ class Editor : public PublicEditor
        void on_realize();
 
   private:
-       
+
+       /// The session that we are editing, or 0
        ARDOUR::Session     *session;
        bool                 constructed;
 
@@ -410,7 +415,12 @@ class Editor : public PublicEditor
 
        TimeAxisView*      clicked_axisview;
        RouteTimeAxisView* clicked_routeview;
+        /** The last RegionView that was clicked on, or 0 if the last click was not
+         * on a RegionView.  This is set up by the canvas event handlers in
+         * editor_canvas_events.cc
+         */
        RegionView*        clicked_regionview;
+       
        RegionView*        latest_regionview;
        uint32_t           clicked_selection;
        CrossfadeView*     clicked_crossfadeview;
@@ -444,32 +454,17 @@ class Editor : public PublicEditor
        bool set_selected_regionview_from_click (bool press, Selection::Operation op = Selection::Set, bool no_track_remove=false);
 
        void set_selected_regionview_from_region_list (boost::shared_ptr<ARDOUR::Region> region, Selection::Operation op = Selection::Set);
-       bool set_selected_regionview_from_map_event (GdkEventAny*, StreamView*, boost::weak_ptr<ARDOUR::Region>);
        void collect_new_region_view (RegionView *);
 
-       Gtk::Menu track_context_menu;
-       Gtk::Menu track_region_context_menu;
-       Gtk::Menu track_selection_context_menu;
-       Gtk::Menu track_crossfade_context_menu;
-
-       Gtk::MenuItem* region_edit_menu_split_item;
-       Gtk::MenuItem* region_edit_menu_split_multichannel_item;
-       Gtk::Menu * track_region_edit_playlist_menu;
-       Gtk::Menu * track_edit_playlist_submenu;
-       Gtk::Menu * track_selection_edit_playlist_submenu;
-       
-       void popup_track_context_menu (int, int, ItemType, bool, nframes_t);
+       void popup_track_context_menu (int, int, nframes_t);
        Gtk::Menu* build_track_context_menu (nframes_t);
-       Gtk::Menu* build_track_bus_context_menu (nframes_t);
-       Gtk::Menu* build_track_region_context_menu (nframes_t frame);
-       Gtk::Menu* build_track_crossfade_context_menu (nframes_t);
-       Gtk::Menu* build_track_selection_context_menu (nframes_t);
-       void add_dstream_context_items (Gtk::Menu_Helpers::MenuList&);
-       void add_bus_context_items (Gtk::Menu_Helpers::MenuList&);
-       void add_region_context_items (AudioStreamView*, boost::shared_ptr<ARDOUR::Region>, Gtk::Menu_Helpers::MenuList&);
+       void add_bus_or_audio_track_context_items (Gtk::Menu_Helpers::MenuList&);
+       void add_region_context_items (Gtk::Menu_Helpers::MenuList&);
        void add_crossfade_context_items (AudioStreamView*, boost::shared_ptr<ARDOUR::Crossfade>, Gtk::Menu_Helpers::MenuList&, bool many);
        void add_selection_context_items (Gtk::Menu_Helpers::MenuList&);
 
+       void add_item_with_sensitivity (Gtk::Menu_Helpers::MenuList&, Gtk::Menu_Helpers::MenuElem, bool) const;
+
        void handle_new_route (ARDOUR::Session::RouteList&);
        void remove_route (TimeAxisView *);
        bool route_removal;
@@ -501,6 +496,7 @@ class Editor : public PublicEditor
        Gtk::EventBox      time_canvas_event_box;
        Gtk::EventBox      track_canvas_event_box;
        Gtk::EventBox      time_button_event_box;
+       Gtk::Frame         time_button_frame;
 
        ArdourCanvas::Group      *minsec_group;
        ArdourCanvas::Group      *bbt_group;
@@ -557,6 +553,7 @@ class Editor : public PublicEditor
        gint metric_get_frames (GtkCustomRulerMark **, gdouble, gdouble, gint);
        gint metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint);
 
+       Gtk::Widget        *_ruler_separator;
        GtkWidget          *_smpte_ruler;
        GtkWidget          *_bbt_ruler;
        GtkWidget          *_frames_ruler;
@@ -577,13 +574,6 @@ class Editor : public PublicEditor
        ArdourCanvas::SimpleRect* range_marker_bar;
        ArdourCanvas::SimpleRect* transport_marker_bar;
 
-       
-       ArdourCanvas::SimpleLine* tempo_line;
-       ArdourCanvas::SimpleLine* meter_line;
-       ArdourCanvas::SimpleLine* marker_line;
-       ArdourCanvas::SimpleLine* range_marker_line;
-       ArdourCanvas::SimpleLine* transport_marker_line;
-
        Gtk::Label  minsec_label;
        Gtk::Label  bbt_label;
        Gtk::Label  smpte_label;
@@ -768,10 +758,12 @@ class Editor : public PublicEditor
        SnapshotDisplayModelColumns snapshot_display_columns;
        Glib::RefPtr<Gtk::ListStore> snapshot_display_model;
        Gtk::TreeView snapshot_display;
+       Gtk::Menu snapshot_context_menu;
 
        bool snapshot_display_button_press (GdkEventButton*);
        void snapshot_display_selection_changed ();
        void redisplay_snapshots();
+       void popup_snapshot_context_menu (int, int32_t, Glib::ustring);
 
        /* named selections */
 
@@ -793,6 +785,8 @@ class Editor : public PublicEditor
        void create_named_selection ();
        void paste_named_selection (float times);
        void remove_selected_named_selections ();
+       void remove_snapshot (Glib::ustring);
+       void rename_snapshot (Glib::ustring);
 
        void handle_new_named_selection ();
        void add_named_selection_to_named_selection_display (ARDOUR::NamedSelection&);
@@ -803,7 +797,6 @@ class Editor : public PublicEditor
        void named_selection_display_selection_changed ();
 
        /* track views */
-       int track_spacing;
        TrackViewList  track_views;
        TimeAxisView     *trackview_by_y_position (double ypos);
 
@@ -855,6 +848,7 @@ class Editor : public PublicEditor
        list<boost::shared_ptr<ARDOUR::Region> > tmp_region_list;
 
        void cut_copy (Editing::CutCopyOp);
+       bool can_cut_copy () const;
        void cut_copy_points (Editing::CutCopyOp);
        void cut_copy_regions (Editing::CutCopyOp);
        void cut_copy_ranges (Editing::CutCopyOp);
@@ -865,12 +859,11 @@ class Editor : public PublicEditor
        /* EDITING OPERATIONS */
        
        void reset_point_selection ();
-       void toggle_region_mute ();
-       void toggle_region_lock ();
-       void toggle_region_opaque ();
-       void raise_region ();
+       void set_region_mute (bool);
+       void set_region_lock (bool);
+       void set_region_position_lock (bool);
+       void set_region_opaque (bool);
        void raise_region_to_top ();
-       void lower_region ();
        void lower_region_to_bottom ();
        void split_region ();
        void split_region_at (nframes_t);
@@ -883,8 +876,8 @@ class Editor : public PublicEditor
        void align_selection_relative (ARDOUR::RegionPoint point, nframes_t position);
        void align_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, nframes_t position);
        void align_region_internal (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, nframes_t position);
+       void remove_selected_regions ();
        void remove_clicked_region ();
-       void destroy_clicked_region ();
        void edit_region ();
        void duplicate_some_regions (RegionSelection&, float times);
        void duplicate_selection (float times);
@@ -894,9 +887,9 @@ class Editor : public PublicEditor
        void audition_playlist_region_standalone (boost::shared_ptr<ARDOUR::Region>);
        void audition_playlist_region_via_route (boost::shared_ptr<ARDOUR::Region>, ARDOUR::Route&);
        void split_multichannel_region();
-       void reverse_region ();
-       void normalize_region ();
-       void denormalize_region ();
+       void reverse_regions ();
+       void normalize_regions ();
+       void denormalize_regions ();
 
        void audition_region_from_region_list ();
        void hide_region_from_region_list ();
@@ -1048,6 +1041,8 @@ class Editor : public PublicEditor
 
        Editing::SnapType snap_type;
        Editing::SnapMode snap_mode;
+
+       /// Snap threshold in pixels
        double snap_threshold;
 
        void handle_gui_changes (const string &, void *);
@@ -1166,9 +1161,13 @@ class Editor : public PublicEditor
 
        bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
        bool canvas_edit_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
-       bool track_canvas_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);
+
        Gtk::Allocation canvas_allocation;
        bool canvas_idle_queued;
        void track_canvas_allocate (Gtk::Allocation alloc);
@@ -1202,8 +1201,11 @@ class Editor : public PublicEditor
        /* 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
        bool _show_waveforms_recording;
        
        ARDOUR::TempoMap::BBTPointList *current_bbt_points;
@@ -1274,10 +1276,17 @@ class Editor : public PublicEditor
        void remove_metric_marks ();
        void draw_metric_marks (const ARDOUR::Metrics& metrics);
 
-       void tempo_map_changed (ARDOUR::Change, bool immediate_redraw);
-       void redisplay_tempo ();
+       void tempo_map_changed (ARDOUR::Change);
+       void redisplay_tempo (bool immediate_redraw);
        
-       void snap_to (nframes_t& first, int32_t direction = 0, bool for_mark = false);
+       void snap_to (nframes64_t& first, int32_t direction = 0, bool for_mark = false);
+       void snap_to (nframes_t& first, int32_t direction = 0, bool for_mark = false) {
+               /* XXX remove this function when everything moves to 64 bit frame counts */
+               nframes64_t first64 = first;
+               snap_to (first64, direction, for_mark);
+               first = (nframes_t) first64;
+       }
+
        uint32_t bbt_beat_subdivision;
 
        /* toolbar */
@@ -1426,7 +1435,7 @@ class Editor : public PublicEditor
        void drag_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event);
        void end_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event);
 
-       bool select_all_within (nframes_t start, nframes_t end, gdouble topy, gdouble boty, Selection::Operation op);
+       bool select_all_within (nframes_t start, nframes_t end, gdouble topy, gdouble boty, const TrackViewList&, Selection::Operation op);
        
        ArdourCanvas::SimpleRect   *rubberband_rect;
        
@@ -1659,8 +1668,8 @@ class Editor : public PublicEditor
        static void* _freeze_thread (void*);
        void* freeze_thread ();
 
-       void freeze_route ();
-       void unfreeze_route ();
+       void freeze_routes ();
+       void unfreeze_routes ();
 
        /* edit-group solo + mute */
 
@@ -1723,13 +1732,13 @@ class Editor : public PublicEditor
 
        /* nudging tracks */
 
-       void nudge_track (bool use_edit_cursor, bool forwards);
+       void nudge_selected_tracks (bool use_edit_cursor, bool forwards);
 
        /* xfades */
 
        bool _xfade_visibility;
        
-       /* <CMT Additions> */
+#ifdef WITH_CMT
        void handle_new_imageframe_time_axis_view(const string & track_name, void* src) ;
        void handle_new_imageframe_marker_time_axis_view(const string & track_name, TimeAxisView* marked_track) ;
 
@@ -1768,7 +1777,7 @@ class Editor : public PublicEditor
        void popup_marker_time_axis_edit_menu(int button, int32_t time, ArdourCanvas::Item* ifv, bool with_frame) ;
 
        ImageFrameSocketHandler* image_socket_listener ;
-       /* </CMT Additions> */
+#endif
 
        void toggle_xfade_active (boost::weak_ptr<ARDOUR::Crossfade>);
        void toggle_xfade_length (boost::weak_ptr<ARDOUR::Crossfade>);
@@ -1816,8 +1825,8 @@ class Editor : public PublicEditor
 
        bool _new_regionviews_show_envelope;
 
-       void toggle_gain_envelope_visibility ();
-       void toggle_gain_envelope_active ();
+       void set_gain_envelope_visibility (bool);
+       void set_gain_envelope_active (bool);
        void reset_region_gain_envelopes ();
 
        Gtk::CheckMenuItem* region_envelope_visible_item;