#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"
#include "editor_items.h"
#include "region_selection.h"
#include "canvas.h"
+#include "editor_summary.h"
namespace Gtkmm2ext {
class TearOff;
class TimeFXDialog;
class TimeSelection;
class TrackSelection;
+class EditorGroupTabs;
/* <CMT Additions> */
class ImageFrameView;
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
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 ();
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);
/* 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; }
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 ();
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);
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:
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);
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 ();
gint ruler_mouse_motion (GdkEventMotion*);
bool ruler_scroll (GdkEventScroll* event);
- gint ruler_pressed_button;
Gtk::Widget * ruler_grabbed_widget;
void initialize_rulers ();
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*);
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);
+ }
};
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*);
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;
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);
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);
void start_scrolling ();
void stop_scrolling ();
- bool _scrubbing;
double last_scrub_x;
int scrubbing_direction;
int scrub_reversals;
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 ();
/* 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
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;
Glib::RefPtr<Gtk::RadioAction> zoom_focus_action (Editing::ZoomFocus);
Gtk::HBox zoom_box;
+ Gtk::VBox zoom_vbox;
void zoom_adjustment_changed();
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;
/* 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;
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 */
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
*/
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;
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__ */