#include <gtkmm/comboboxtext.h>
#include <gtkmm/layout.h>
-#include "gtkmm2ext/selector.h"
-#include "gtkmm2ext/click_box.h"
-#include "gtkmm2ext/dndtreeview.h"
-#include "gtkmm2ext/stateful_button.h"
#include "gtkmm2ext/bindings.h"
+#include "gtkmm2ext/dndtreeview.h"
#include "pbd/stateful.h"
#include "pbd/signals.h"
#include "canvas/fwd.h"
#include "canvas/ruler.h"
-#include "ardour_button.h"
+#include "widgets/ardour_button.h"
+#include "widgets/ardour_dropdown.h"
+#include "widgets/pane.h"
+
#include "ardour_dialog.h"
-#include "ardour_dropdown.h"
#include "public_editor.h"
#include "editing.h"
#include "enums.h"
#include "editor_items.h"
#include "region_selection.h"
#include "selection_memento.h"
+#include "tempo_curve.h"
+
+#include "ptformat/ptfformat.h"
namespace Gtkmm2ext {
- class TearOff;
class Bindings;
}
+namespace Evoral {
+ class SMF;
+}
+
namespace ARDOUR {
- class RouteGroup;
- class Playlist;
class AudioPlaylist;
class AudioRegion;
- class Region;
- class Location;
- class TempoSection;
- class Session;
- class Filter;
+ class AudioTrack;
class ChanCount;
+ class Filter;
+ class Location;
class MidiOperator;
- class Track;
+ class MidiRegion;
class MidiTrack;
- class AudioTrack;
+ class Playlist;
+ class Region;
+ class RouteGroup;
+ class Session;
+ class TempoSection;
+ class Track;
}
namespace LADSPA {
class AutomationSelection;
class AutomationTimeAxisView;
class BundleManager;
-class ButtonJoiner;
class ControlPoint;
class CursorContext;
class DragManager;
class EditorRouteGroups;
class EditorSnapshots;
class EditorSummary;
-class GroupedButtons;
class GUIObjectState;
-class Marker;
+class ArdourMarker;
class MidiRegionView;
+class MidiExportDialog;
class MixerStrip;
class MouseCursors;
class NoteBase;
class Selection;
class SoundFileOmega;
class StreamView;
+class GridLines;
class TempoLines;
class TimeAxisView;
+class TimeInfoBox;
class TimeFXDialog;
class TimeSelection;
class RegionLayeringOrderEditor;
class VerboseCursor;
-class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
+class Editor : public PublicEditor, public PBD::ScopedConnectionList
{
- public:
+public:
Editor ();
~Editor ();
void set_session (ARDOUR::Session *);
- ARDOUR::Session* session() const { return _session; }
+
+ Gtk::Window* use_own_window (bool and_fill_it);
void first_idle ();
virtual bool have_idled () const { return _have_idled; }
- framepos_t leftmost_sample() const { return leftmost_frame; }
+ samplepos_t leftmost_sample() const { return _leftmost_sample; }
- framecnt_t current_page_samples() const {
- return (framecnt_t) _visible_canvas_width * samples_per_pixel;
+ samplecnt_t current_page_samples() const {
+ return (samplecnt_t) _visible_canvas_width * samples_per_pixel;
}
double visible_canvas_height () const {
double trackviews_height () const;
void cycle_snap_mode ();
- void next_snap_choice ();
- void next_snap_choice_music_only ();
- void next_snap_choice_music_and_time ();
- void prev_snap_choice ();
- void prev_snap_choice_music_only ();
- void prev_snap_choice_music_and_time ();
- void set_snap_to (Editing::SnapType);
+ void next_grid_choice ();
+ void prev_grid_choice ();
+ void set_grid_to (Editing::GridType);
void set_snap_mode (Editing::SnapMode);
- void set_snap_threshold (double pixel_distance) {snap_threshold = pixel_distance;}
Editing::SnapMode snap_mode () const;
- Editing::SnapType snap_type () const;
+ Editing::GridType grid_type () const;
+ bool grid_musical () const;
+ bool grid_nonmusical () const;
void undo (uint32_t n = 1);
void redo (uint32_t n = 1);
XMLNode& get_state ();
int set_state (const XMLNode&, int version);
- void set_mouse_mode (Editing::MouseMode, bool force=true);
+ void set_mouse_mode (Editing::MouseMode, bool force = false);
void step_mouse_mode (bool next);
Editing::MouseMode current_mouse_mode () const { return mouse_mode; }
Editing::MidiEditMode current_midi_edit_mode () const;
void foreach_time_axis_view (sigc::slot<void,TimeAxisView&>);
void add_to_idle_resize (TimeAxisView*, int32_t);
- RouteTimeAxisView* get_route_view_by_route_id (const PBD::ID& id) const;
+ StripableTimeAxisView* get_stripable_time_axis_by_id (const PBD::ID& id) const;
void consider_auditioning (boost::shared_ptr<ARDOUR::Region>);
void hide_a_region (boost::shared_ptr<ARDOUR::Region>);
account any scrolling offsets.
*/
- framepos_t pixel_to_sample_from_event (double pixel) const {
+ samplepos_t pixel_to_sample_from_event (double pixel) const {
/* pixel can be less than zero when motion events
are processed. since we've already run the world->canvas
}
}
- framepos_t pixel_to_sample (double pixel) const {
+ samplepos_t pixel_to_sample (double pixel) const {
return pixel * samples_per_pixel;
}
- double sample_to_pixel (framepos_t sample) const {
- return round (sample / (double) samples_per_pixel);
+ double sample_to_pixel (samplepos_t sample) const {
+ return round (sample / (double) samples_per_pixel);
}
- double sample_to_pixel_unrounded (framepos_t sample) const {
+ double sample_to_pixel_unrounded (samplepos_t sample) const {
return sample / (double) samples_per_pixel;
}
/* selection */
Selection& get_selection() const { return *selection; }
- bool get_selection_extents ( framepos_t &start, framepos_t &end ); // the time extents of the current selection, whether Range, Region(s), Control Points, or Notes
+ bool get_selection_extents (samplepos_t &start, samplepos_t &end) const; // the time extents of the current selection, whether Range, Region(s), Control Points, or Notes
Selection& get_cut_buffer() const { return *cut_buffer; }
- void track_mixer_selection ();
+
+ void set_selection (std::list<Selectable*>, Selection::Operation);
bool extend_selection_to_track (TimeAxisView&);
void play_selection ();
- framepos_t get_preroll ();
- void maybe_locate_with_edit_preroll (framepos_t);
+ void maybe_locate_with_edit_preroll (samplepos_t);
void play_with_preroll ();
+ void rec_with_preroll ();
+ void rec_with_count_in ();
void select_all_in_track (Selection::Operation op);
void select_all_objects (Selection::Operation op);
void invert_selection_in_track ();
void invert_selection ();
void deselect_all ();
- long select_range (framepos_t, framepos_t);
+ long select_range (samplepos_t, samplepos_t);
void set_selected_regionview_from_region_list (boost::shared_ptr<ARDOUR::Region> region, Selection::Operation op = Selection::Set);
void remove_tracks ();
-
+
/* tempo */
- void set_show_measures (bool yn);
- bool show_measures () const { return _show_measures; }
+ void update_grid ();
/* analysis window */
- void analyze_region_selection();
- void analyze_range_selection();
+ void loudness_analyze_region_selection();
+ void loudness_analyze_range_selection();
+
+ void spectral_analyze_region_selection();
+ void spectral_analyze_range_selection();
/* export */
void export_range ();
void export_region ();
- void add_transport_frame (Gtk::Container&);
- void add_toplevel_menu (Gtk::Container&);
- Gtk::HBox& get_status_bar_packer() { return status_bar_hpacker; }
+ bool process_midi_export_dialog (MidiExportDialog& dialog, boost::shared_ptr<ARDOUR::MidiRegion> midi_region);
void set_zoom_focus (Editing::ZoomFocus);
Editing::ZoomFocus get_zoom_focus () const { return zoom_focus; }
- framecnt_t get_current_zoom () const { return samples_per_pixel; }
+ samplecnt_t get_current_zoom () const { return samples_per_pixel; }
void cycle_zoom_focus ();
- void temporal_zoom_step (bool coarser);
+ void temporal_zoom_step (bool zoom_out);
+ void temporal_zoom_step_scale (bool zoom_out, double scale);
+ void temporal_zoom_step_mouse_focus (bool zoom_out);
+ void temporal_zoom_step_mouse_focus_scale (bool zoom_out, double scale);
void ensure_time_axis_view_is_visible (TimeAxisView const & tav, bool at_top);
void tav_zoom_step (bool coarser);
void tav_zoom_smooth (bool coarser, bool force_all);
void set_selected_mixer_strip (TimeAxisView&);
void mixer_strip_width_changed ();
void hide_track_in_display (TimeAxisView* tv, bool apply_to_selection = false);
+ void show_track_in_display (TimeAxisView* tv, bool move_into_view = false);
+ void tempo_curve_selected (ARDOUR::TempoSection* ts, bool yn);
/* nudge is initiated by transport controls owned by ARDOUR_UI */
- framecnt_t get_nudge_distance (framepos_t pos, framecnt_t& next);
- framecnt_t get_paste_offset (framepos_t pos, unsigned paste_count, framecnt_t duration);
- unsigned get_grid_beat_divisions(framepos_t position);
- Evoral::Beats get_grid_type_as_beats (bool& success, framepos_t position);
+ samplecnt_t get_nudge_distance (samplepos_t pos, samplecnt_t& next);
+ samplecnt_t get_paste_offset (samplepos_t pos, unsigned paste_count, samplecnt_t duration);
+ unsigned get_grid_beat_divisions(samplepos_t position);
+ Temporal::Beats get_grid_type_as_beats (bool& success, samplepos_t position);
+
+ int32_t get_grid_music_divisions (uint32_t event_state);
void nudge_forward (bool next, bool force_playhead);
void nudge_backward (bool next, bool force_playhead);
void toggle_zero_line_visibility ();
void set_summary ();
void set_group_tabs ();
- void toggle_measure_visibility ();
- void toggle_logo_visibility ();
+
+ /* returns the left-most and right-most time that the gui should allow the user to scroll to */
+ std::pair <samplepos_t,samplepos_t> session_gui_extents (bool use_extra = true) const;
/* fades */
- void toggle_region_fades (int dir);
- void update_region_fade_visibility ();
+ void toggle_region_fades (int dir);
+ void update_region_fade_visibility ();
/* redirect shared ops menu. caller must free returned menu */
void ensure_float (Gtk::Window&);
- void show_window ();
-
void scroll_tracks_down_line ();
void scroll_tracks_up_line ();
-
+
bool scroll_up_one_track (bool skip_child_views = false);
bool scroll_down_one_track (bool skip_child_views = false);
+ void scroll_left_step ();
+ void scroll_right_step ();
+
+ void scroll_left_half_page ();
+ void scroll_right_half_page ();
+
+ void select_topmost_track ();
+
void prepare_for_cleanup ();
void finish_cleanup ();
void maximise_editing_space();
void restore_editing_space();
- void update_tearoff_visibility();
- void reattach_all_tearoffs ();
-
double get_y_origin () const;
- void reset_x_origin (framepos_t);
+ void reset_x_origin (samplepos_t);
void reset_x_origin_to_follow_playhead ();
void reset_y_origin (double);
- void reset_zoom (framecnt_t);
- void reposition_and_zoom (framepos_t, double);
+ void reset_zoom (samplecnt_t);
+ void reposition_and_zoom (samplepos_t, double);
- framepos_t get_preferred_edit_position (Editing::EditIgnoreOption = Editing::EDIT_IGNORE_NONE,
+ samplepos_t get_preferred_edit_position (Editing::EditIgnoreOption = Editing::EDIT_IGNORE_NONE,
bool use_context_click = false,
bool from_outside_canvas = false);
void start_resize_line_ops ();
void end_resize_line_ops ();
- TrackViewList const & get_track_views () {
+ TrackViewList const & get_track_views () const {
return track_views;
}
int get_regionview_count_from_region_list (boost::shared_ptr<ARDOUR::Region>);
+ void do_ptimport(std::string path, ARDOUR::SrcQuality quality);
+
void do_import (std::vector<std::string> paths,
Editing::ImportDisposition disposition,
Editing::ImportMode mode,
ARDOUR::SrcQuality quality,
- framepos_t& pos,
+ ARDOUR::MidiTrackNameSource mts,
+ ARDOUR::MidiTempoMapDisposition mtd,
+ samplepos_t& pos,
boost::shared_ptr<ARDOUR::PluginInfo> instrument = boost::shared_ptr<ARDOUR::PluginInfo>());
void do_embed (std::vector<std::string> paths,
Editing::ImportDisposition disposition,
Editing::ImportMode mode,
- framepos_t& pos,
+ samplepos_t& pos,
boost::shared_ptr<ARDOUR::PluginInfo> instrument = boost::shared_ptr<ARDOUR::PluginInfo>());
void get_regions_corresponding_to (boost::shared_ptr<ARDOUR::Region> region, std::vector<RegionView*>& regions, bool src_comparison);
void get_regionviews_by_id (PBD::ID const id, RegionSelection & regions) const;
- void get_per_region_note_selection (std::list<std::pair<PBD::ID, std::set<boost::shared_ptr<Evoral::Note<Evoral::Beats> > > > >&) const;
+ void get_per_region_note_selection (std::list<std::pair<PBD::ID, std::set<boost::shared_ptr<Evoral::Note<Temporal::Beats> > > > >&) const;
- void center_screen (framepos_t);
+ void center_screen (samplepos_t);
TrackViewList axis_views_from_routes (boost::shared_ptr<ARDOUR::RouteList>) const;
- Gtkmm2ext::TearOff* mouse_mode_tearoff () const { return _mouse_mode_tearoff; }
- Gtkmm2ext::TearOff* tools_tearoff () const { return _tools_tearoff; }
-
- void snap_to (framepos_t& first,
- ARDOUR::RoundMode direction = ARDOUR::RoundNearest,
- bool for_mark = false,
- bool ensure_snap = false);
+ void snap_to (ARDOUR::MusicSample& first,
+ ARDOUR::RoundMode direction = ARDOUR::RoundNearest,
+ ARDOUR::SnapPref pref = ARDOUR::SnapToAny_Visual,
+ bool ensure_snap = false);
- void snap_to_with_modifier (framepos_t& first,
- GdkEvent const * ev,
- ARDOUR::RoundMode direction = ARDOUR::RoundNearest,
- bool for_mark = false);
+ void snap_to_with_modifier (ARDOUR::MusicSample& first,
+ GdkEvent const * ev,
+ ARDOUR::RoundMode direction = ARDOUR::RoundNearest,
+ ARDOUR::SnapPref pref = ARDOUR::SnapToAny_Visual);
- void snap_to (framepos_t& first,
- framepos_t& last,
- ARDOUR::RoundMode direction = ARDOUR::RoundNearest,
- bool for_mark = false);
+ void set_snapped_cursor_position (samplepos_t pos);
void begin_selection_op_history ();
void begin_reversible_selection_op (std::string cmd_name);
TimeAxisView* stepping_axis_view () {
return _stepping_axis_view;
}
-
+
void set_stepping_axis_view (TimeAxisView* v) {
_stepping_axis_view = v;
}
ArdourCanvas::ScrollGroup* get_hscroll_group () const { return h_scroll_group; }
ArdourCanvas::ScrollGroup* get_hvscroll_group () const { return hv_scroll_group; }
ArdourCanvas::ScrollGroup* get_cursor_scroll_group () const { return cursor_scroll_group; }
+ ArdourCanvas::Container* get_drag_motion_group () const { return _drag_motion_group; }
ArdourCanvas::GtkCanvasViewport* get_track_canvas () const;
void metric_get_minsec (std::vector<ArdourCanvas::Ruler::Mark>&, gdouble, gdouble, gint);
/* editing operations that need to be public */
- void mouse_add_new_marker (framepos_t where, bool is_cd=false);
- void split_regions_at (framepos_t, RegionSelection&);
+ void mouse_add_new_marker (samplepos_t where, bool is_cd=false);
+ void split_regions_at (ARDOUR::MusicSample, RegionSelection&);
void split_region_at_points (boost::shared_ptr<ARDOUR::Region>, ARDOUR::AnalysisFeatureList&, bool can_ferret, bool select_new = false);
- RegionSelection get_regions_from_selection_and_mouse (framepos_t);
-
- void mouse_add_new_tempo_event (framepos_t where);
- void mouse_add_new_meter_event (framepos_t where);
+ RegionSelection get_regions_from_selection_and_mouse (samplepos_t);
+
+ void mouse_add_new_tempo_event (samplepos_t where);
+ void mouse_add_new_meter_event (samplepos_t where);
void edit_tempo_section (ARDOUR::TempoSection*);
void edit_meter_section (ARDOUR::MeterSection*);
- protected:
+protected:
void map_transport_state ();
- void map_position_change (framepos_t);
+ void map_position_change (samplepos_t);
+ void transport_looped ();
void on_realize();
void suspend_route_redisplay ();
void resume_route_redisplay ();
- private:
+private:
void color_handler ();
bool constructed;
// to keep track of the playhead position for control_scroll
- boost::optional<framepos_t> _control_scroll_target;
+ boost::optional<samplepos_t> _control_scroll_target;
PlaylistSelector* _playlist_selector;
+ TimeInfoBox* _time_info_box;
+
typedef std::pair<TimeAxisView*,XMLNode*> TAVState;
struct VisualState {
- VisualState (bool with_tracks);
- ~VisualState ();
- double y_position;
- framecnt_t samples_per_pixel;
- framepos_t leftmost_frame;
- Editing::ZoomFocus zoom_focus;
- GUIObjectState* gui_state;
+ VisualState (bool with_tracks);
+ ~VisualState ();
+ double y_position;
+ samplecnt_t samples_per_pixel;
+ samplepos_t _leftmost_sample;
+ Editing::ZoomFocus zoom_focus;
+ GUIObjectState* gui_state;
};
std::list<VisualState*> undo_visual_stack;
void start_visual_state_op (uint32_t n);
void cancel_visual_state_op (uint32_t n);
- framepos_t leftmost_frame;
- framecnt_t samples_per_pixel;
+ samplepos_t _leftmost_sample;
+ samplecnt_t samples_per_pixel;
Editing::ZoomFocus zoom_focus;
- void set_samples_per_pixel (framecnt_t);
+ void set_samples_per_pixel (samplecnt_t);
+ void on_samples_per_pixel_changed ();
Editing::MouseMode mouse_mode;
- Editing::SnapType pre_internal_snap_type;
+ Editing::GridType pre_internal_grid_type;
Editing::SnapMode pre_internal_snap_mode;
- Editing::SnapType internal_snap_type;
+ Editing::GridType internal_grid_type;
Editing::SnapMode internal_snap_mode;
Editing::MouseMode effective_mouse_mode () const;
void update_join_object_range_location (double);
- boost::optional<int> pre_notebook_shrink_pane_width;
-
- void pane_allocation_handler (Gtk::Allocation&, Gtk::Paned*);
+ boost::optional<float> pre_notebook_shrink_pane_width;
+ Gtk::VBox _editor_list_vbox;
Gtk::Notebook _the_notebook;
bool _notebook_shrunk;
void add_notebook_page (std::string const &, Gtk::Widget &);
bool notebook_tab_clicked (GdkEventButton *, Gtk::Widget *);
- Gtk::HPaned edit_pane;
- Gtk::VPaned editor_summary_pane;
+ ArdourWidgets::HPane edit_pane;
+ ArdourWidgets::VPane editor_summary_pane;
Gtk::EventBox meter_base;
- Gtk::HBox meter_box;
Gtk::EventBox marker_base;
Gtk::HBox marker_box;
Gtk::VBox scrollers_rulers_markers_box;
void remove_marker (ArdourCanvas::Item&, GdkEvent*);
gint really_remove_marker (ARDOUR::Location* loc);
void goto_nth_marker (int nth);
+ void trigger_script (int nth);
+ void trigger_script_by_name (const std::string script_name);
void toggle_marker_lines ();
void set_marker_line_visibility (bool);
+ void jump_forward_to_mark ();
+ void jump_backward_to_mark ();
+
uint32_t location_marker_color;
uint32_t location_range_color;
uint32_t location_loop_color;
uint32_t location_cd_marker_color;
struct LocationMarkers {
- Marker* start;
- Marker* end;
+ ArdourMarker* start;
+ ArdourMarker* end;
bool valid;
LocationMarkers () : start(0), end(0), valid (true) {}
void setup_lines ();
void set_name (const std::string&);
- void set_position (framepos_t start, framepos_t end = 0);
+ void set_position (samplepos_t start, samplepos_t end = 0);
void set_color_rgba (uint32_t);
};
LocationMarkers *find_location_markers (ARDOUR::Location *) const;
- ARDOUR::Location* find_location_from_marker (Marker *, bool& is_start) const;
- Marker* find_marker_from_location_id (PBD::ID const &, bool) const;
- Marker* entered_marker;
+ ARDOUR::Location* find_location_from_marker (ArdourMarker *, bool& is_start) const;
+ ArdourMarker* find_marker_from_location_id (PBD::ID const &, bool) const;
+ ArdourMarker* entered_marker;
bool _show_marker_lines;
typedef std::map<ARDOUR::Location*,LocationMarkers *> LocationMarkerMap;
void update_marker_labels ();
void update_marker_labels (ArdourCanvas::Container *);
- void check_marker_label (Marker *);
+ void check_marker_label (ArdourMarker *);
/** A set of lists of Markers that are in each of the canvas groups
* for the marker sections at the top of the editor. These lists
* 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::Container *, std::list<Marker *> > _sorted_marker_lists;
- void remove_sorted_marker (Marker *);
+ std::map<ArdourCanvas::Container *, std::list<ArdourMarker *> > _sorted_marker_lists;
+ void remove_sorted_marker (ArdourMarker *);
void hide_marker (ArdourCanvas::Item*, GdkEvent*);
void clear_marker_display ();
- void mouse_add_new_range (framepos_t);
- void mouse_add_new_loop (framepos_t);
- void mouse_add_new_punch (framepos_t);
+ void mouse_add_new_range (samplepos_t);
+ void mouse_add_new_loop (samplepos_t);
+ void mouse_add_new_punch (samplepos_t);
bool choose_new_marker_name(std::string &name);
void update_cd_marker_display ();
void ensure_cd_marker_updated (LocationMarkers * lam, ARDOUR::Location * location);
void get_equivalent_regions (RegionView* rv, std::vector<RegionView*> &, PBD::PropertyID) const;
RegionSelection get_equivalent_regions (RegionSelection &, PBD::PropertyID) const;
+ RegionView* regionview_from_region (boost::shared_ptr<ARDOUR::Region>) const;
+ RouteTimeAxisView* rtav_from_route (boost::shared_ptr<ARDOUR::Route>) const;
+
void mapover_tracks (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl, TimeAxisView*, PBD::PropertyID) const;
void mapover_tracks_with_unique_playlists (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl, TimeAxisView*, PBD::PropertyID) 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);
-
+
void button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type);
bool button_release_can_deselect;
bool _mouse_changed_selection;
void popup_note_context_menu (ArdourCanvas::Item *, GdkEvent *);
Gtk::Menu _note_context_menu;
+ void add_stripables (ARDOUR::StripableList&);
void add_routes (ARDOUR::RouteList&);
void timeaxisview_deleted (TimeAxisView *);
+ void add_vcas (ARDOUR::VCAList&);
- Gtk::HBox global_hpacker;
- Gtk::VBox global_vpacker;
- Gtk::VBox vpacker;
+ Gtk::HBox global_hpacker;
+ Gtk::VBox global_vpacker;
/* Cursor stuff. Do not use directly, use via CursorContext. */
friend class CursorContext;
size_t push_canvas_cursor (Gdk::Cursor*);
void pop_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;
Gtk::EventBox time_bars_event_box;
Gtk::VBox time_bars_vbox;
- ArdourCanvas::Pixbuf *logo_item;
-#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;
void update_just_timecode ();
void compute_fixed_ruler_scale (); //calculates the RulerScale of the fixed rulers
void update_fixed_rulers ();
- void update_tempo_based_rulers (ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
- ARDOUR::TempoMap::BBTPointList::const_iterator& end);
- void popup_ruler_menu (framepos_t where = 0, ItemType type = RegionItem);
+ void update_tempo_based_rulers ();
+ void popup_ruler_menu (samplepos_t where = 0, ItemType type = RegionItem);
void update_ruler_visibility ();
void set_ruler_visible (RulerType, bool);
void toggle_ruler_visibility (RulerType rt);
bool ruler_label_button_release (GdkEventButton*);
void store_ruler_visibility ();
void restore_ruler_visibility ();
+ void show_rulers_for_grid ();
-
-
- enum MinsecRulerScale {
+ enum MinsecRulerScale {
minsec_show_msecs,
minsec_show_seconds,
minsec_show_minutes,
MinsecRulerScale minsec_ruler_scale;
- framecnt_t minsec_mark_interval;
+ samplecnt_t minsec_mark_interval;
gint minsec_mark_modulo;
gint minsec_nmarks;
- void set_minsec_ruler_scale (framepos_t, framepos_t);
+ void set_minsec_ruler_scale (samplepos_t, samplepos_t);
enum TimecodeRulerScale {
timecode_show_bits,
- timecode_show_frames,
+ timecode_show_samples,
timecode_show_seconds,
timecode_show_minutes,
timecode_show_hours,
gint timecode_mark_modulo;
gint timecode_nmarks;
- void set_timecode_ruler_scale (framepos_t, framepos_t);
+ void set_timecode_ruler_scale (samplepos_t, samplepos_t);
- framecnt_t _samples_ruler_interval;
- void set_samples_ruler_scale (framepos_t, framepos_t);
+ samplecnt_t _samples_ruler_interval;
+ void set_samples_ruler_scale (samplepos_t, samplepos_t);
enum BBTRulerScale {
bbt_show_many,
bbt_show_16,
bbt_show_4,
bbt_show_1,
- bbt_show_beats,
- bbt_show_ticks,
- bbt_show_ticks_detail,
- bbt_show_ticks_super_detail
+ bbt_show_quarters,
+ bbt_show_eighths,
+ bbt_show_sixteenths,
+ bbt_show_thirtyseconds
};
BBTRulerScale bbt_ruler_scale;
gint bbt_nmarks;
uint32_t bbt_bar_helper_on;
uint32_t bbt_accent_modulo;
- void compute_bbt_ruler_scale (framepos_t lower, framepos_t upper,
- ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin,
- ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end);
+ void compute_bbt_ruler_scale (samplepos_t lower, samplepos_t upper);
ArdourCanvas::Ruler* timecode_ruler;
ArdourCanvas::Ruler* bbt_ruler;
Glib::RefPtr<Gtk::ToggleAction> xjadeo_proc_action;
Glib::RefPtr<Gtk::ToggleAction> xjadeo_ontop_action;
Glib::RefPtr<Gtk::ToggleAction> xjadeo_timecode_action;
- Glib::RefPtr<Gtk::ToggleAction> xjadeo_frame_action;
+ Glib::RefPtr<Gtk::ToggleAction> xjadeo_sample_action;
Glib::RefPtr<Gtk::ToggleAction> xjadeo_osdbg_action;
Glib::RefPtr<Gtk::ToggleAction> xjadeo_fullscreen_action;
Glib::RefPtr<Gtk::ToggleAction> xjadeo_letterbox_action;
friend class EditorCursor;
- EditorCursor* playhead_cursor;
+ EditorCursor* snapped_cursor;
- framepos_t get_region_boundary (framepos_t pos, int32_t dir, bool with_selection, bool only_onscreen);
+ EditorCursor* playhead_cursor;
+ samplepos_t playhead_cursor_sample () const;
+
+ samplepos_t get_region_boundary (samplepos_t pos, int32_t dir, bool with_selection, bool only_onscreen);
void cursor_to_region_boundary (bool with_selection, int32_t dir);
void cursor_to_next_region_boundary (bool with_selection);
void selected_marker_to_selection_end ();
void select_all_selectables_using_cursor (EditorCursor *, bool);
- void select_all_selectables_using_edit (bool);
+ void select_all_selectables_using_edit (bool, bool);
void select_all_selectables_between (bool within);
void select_range_between ();
- boost::shared_ptr<ARDOUR::Region> find_next_region (ARDOUR::framepos_t, ARDOUR::RegionPoint, int32_t dir, TrackViewList&, TimeAxisView ** = 0);
- ARDOUR::framepos_t find_next_region_boundary (ARDOUR::framepos_t, int32_t dir, const TrackViewList&);
+ boost::shared_ptr<ARDOUR::Region> find_next_region (ARDOUR::samplepos_t, ARDOUR::RegionPoint, int32_t dir, TrackViewList&, TimeAxisView ** = 0);
+ ARDOUR::samplepos_t find_next_region_boundary (ARDOUR::samplepos_t, int32_t dir, const TrackViewList&);
- std::vector<ARDOUR::framepos_t> region_boundary_cache;
+ std::vector<ARDOUR::samplepos_t> region_boundary_cache;
+ void mark_region_boundary_cache_dirty () { _region_boundary_cache_dirty = true; }
void build_region_boundary_cache ();
+ bool _region_boundary_cache_dirty;
Gtk::HBox toplevel_hpacker;
- Gtk::HBox top_hbox;
Gtk::HBox bottom_hbox;
Gtk::Table edit_packer;
void control_step_tracks_down ();
void control_view (uint32_t);
void control_scroll (float);
- void control_select (uint32_t rid, Selection::Operation);
+ void control_select (boost::shared_ptr<ARDOUR::Stripable>, Selection::Operation);
void control_unselect ();
- void access_action (std::string,std::string);
- bool deferred_control_scroll (framepos_t);
+ void access_action (const std::string&, const std::string&);
+ void set_toggleaction (const std::string&, const std::string&, bool);
+ bool deferred_control_scroll (samplepos_t);
sigc::connection control_scroll_connection;
void tie_vertical_scrolling ();
enum Type {
TimeOrigin = 0x1,
ZoomLevel = 0x2,
- YOrigin = 0x4
+ YOrigin = 0x4,
+ VideoTimeline = 0x8
};
Type pending;
- framepos_t time_origin;
- framecnt_t samples_per_pixel;
+ samplepos_t time_origin;
+ samplecnt_t samples_per_pixel;
double y_origin;
int idle_handler_id;
};
VisualChange pending_visual_change;
+ bool visual_change_queued;
+
+ void pre_render ();
static int _idle_visual_changer (void *arg);
int idle_visual_changer ();
/* track views */
TrackViewList track_views;
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;
+
+ AxisView* axis_view_by_stripable (boost::shared_ptr<ARDOUR::Stripable>) const;
+ AxisView* axis_view_by_control (boost::shared_ptr<ARDOUR::AutomationControl>) const;
+
+ TimeAxisView* time_axis_view_from_stripable (boost::shared_ptr<ARDOUR::Stripable> s) const {
+ return dynamic_cast<TimeAxisView*> (axis_view_by_stripable (s));
+ }
TrackViewList get_tracks_for_range_action () const;
sigc::connection super_rapid_screen_update_connection;
- framepos_t last_update_frame;
- void center_screen_internal (framepos_t, float);
+ void center_screen_internal (samplepos_t, float);
void super_rapid_screen_update ();
+ int64_t _last_update_time;
+ double _err_screen_engine;
+
void session_going_away ();
- framepos_t cut_buffer_start;
- framecnt_t cut_buffer_length;
+ samplepos_t cut_buffer_start;
+ samplecnt_t cut_buffer_length;
boost::shared_ptr<CursorContext> _press_cursor_ctx; ///< Button press cursor context
void register_region_actions ();
void load_bindings ();
- Gtkmm2ext::ActionMap editor_action_map;
- Gtkmm2ext::Bindings key_bindings;
/* CUT/COPY/PASTE */
- framepos_t last_paste_pos;
+ samplepos_t last_paste_pos;
unsigned paste_count;
void cut_copy (Editing::CutCopyOp);
bool can_cut_copy () const;
- void cut_copy_points (Editing::CutCopyOp, Evoral::Beats earliest=Evoral::Beats(), bool midi=false);
+ void cut_copy_points (Editing::CutCopyOp, Temporal::Beats earliest=Temporal::Beats(), bool midi=false);
void cut_copy_regions (Editing::CutCopyOp, RegionSelection&);
void cut_copy_ranges (Editing::CutCopyOp);
void cut_copy_midi (Editing::CutCopyOp);
void mouse_paste ();
- void paste_internal (framepos_t position, float times);
+ void paste_internal (samplepos_t position, float times, const int32_t sub_num);
/* EDITING OPERATIONS */
void toggle_mute ();
void toggle_region_lock_style ();
+ void play_solo_selection (bool restart);
+
enum LayerOperation {
Raise,
RaiseToTop,
void lower_region_to_bottom ();
void split_region_at_transients ();
void crop_region_to_selection ();
- void crop_region_to (framepos_t start, framepos_t end);
- void set_sync_point (framepos_t, const RegionSelection&);
+ void crop_region_to (samplepos_t start, samplepos_t end);
+ void set_sync_point (samplepos_t, const RegionSelection&);
void set_region_sync_position ();
void remove_region_sync();
void align_regions (ARDOUR::RegionPoint);
void align_regions_relative (ARDOUR::RegionPoint point);
- void align_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, framepos_t position);
- void align_region_internal (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, framepos_t position);
+ void align_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, samplepos_t position);
+ void align_region_internal (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, samplepos_t position);
void remove_selected_regions ();
void remove_clicked_region ();
void show_region_properties ();
void region_fill_track ();
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 strip_region_silence ();
void normalize_region ();
void reset_region_scale_amplitude ();
void adjust_region_gain (bool up);
+ void reset_region_gain ();
void quantize_region ();
void quantize_regions (const RegionSelection& rs);
void legatize_region (bool shrink_only);
void legatize_regions (const RegionSelection& rs, bool shrink_only);
void transform_region ();
void transform_regions (const RegionSelection& rs);
+ void transpose_region ();
+ void transpose_regions (const RegionSelection& rs);
void insert_patch_change (bool from_context);
void fork_region ();
void do_insert_time ();
- void insert_time (framepos_t, framecnt_t, Editing::InsertTimeOption, bool, bool, bool, bool, bool, bool);
+ void insert_time (samplepos_t, samplecnt_t, Editing::InsertTimeOption, bool, bool, bool, bool, bool, bool);
void do_remove_time ();
- void remove_time (framepos_t pos, framecnt_t distance, Editing::InsertTimeOption opt, bool ignore_music_glue, bool markers_too,
+ void remove_time (samplepos_t pos, samplecnt_t distance, Editing::InsertTimeOption opt, bool ignore_music_glue, bool markers_too,
bool glued_markers_too, bool locked_markers_too, bool tempo_too);
void tab_to_transient (bool forward);
void set_tempo_from_region ();
void use_range_as_bar ();
- void define_one_bar (framepos_t start, framepos_t end);
+ void define_one_bar (samplepos_t start, samplepos_t end);
void audition_region_from_region_list ();
void hide_region_from_region_list ();
void naturalize_region ();
- void reset_focus ();
-
void split_region ();
void delete_ ();
void cut ();
void copy ();
- void paste (float times, bool from_context_menu = false);
+ void paste (float times, bool from_context_menu);
void place_transient ();
void remove_transient (ArdourCanvas::Item* item);
void play_location (ARDOUR::Location&);
void loop_location (ARDOUR::Location&);
- void calc_extra_zoom_edges(framepos_t &start, framepos_t &end);
- void temporal_zoom_selection (bool both_axes = false);
- void temporal_zoom_region (bool both_axes);
+ void calc_extra_zoom_edges(samplepos_t &start, samplepos_t &end);
+ void temporal_zoom_selection (Editing::ZoomAxis);
void temporal_zoom_session ();
- void temporal_zoom (framecnt_t samples_per_pixel);
- void temporal_zoom_by_frame (framepos_t start, framepos_t end);
- void temporal_zoom_to_frame (bool coarser, framepos_t frame);
+ void temporal_zoom_extents ();
+ void temporal_zoom (samplecnt_t samples_per_pixel);
+ void temporal_zoom_by_sample (samplepos_t start, samplepos_t end);
+ void temporal_zoom_to_sample (bool coarser, samplepos_t sample);
void insert_region_list_selection (float times);
/* import & embed */
void add_external_audio_action (Editing::ImportMode);
- void external_audio_dialog ();
- void session_import_dialog ();
int check_whether_and_how_to_import(std::string, bool all_or_nothing = true);
bool check_multichannel_status (const std::vector<std::string>& paths);
SoundFileOmega* sfbrowser;
- void bring_in_external_audio (Editing::ImportMode mode, framepos_t& pos);
+ void bring_in_external_audio (Editing::ImportMode mode, samplepos_t& pos);
- bool idle_drop_paths (std::vector<std::string> paths, framepos_t frame, double ypos, bool copy);
- void drop_paths_part_two (const std::vector<std::string>& paths, framepos_t frame, double ypos, bool copy);
+ bool idle_drop_paths (std::vector<std::string> paths, samplepos_t sample, double ypos, bool copy);
+ void drop_paths_part_two (const std::vector<std::string>& paths, samplepos_t sample, double ypos, bool copy);
int import_sndfiles (std::vector<std::string> paths,
Editing::ImportDisposition disposition,
Editing::ImportMode mode,
ARDOUR::SrcQuality quality,
- framepos_t& pos,
+ samplepos_t& pos,
int target_regions,
int target_tracks,
boost::shared_ptr<ARDOUR::Track>& track,
bool& check_sample_rate,
Editing::ImportDisposition disposition,
Editing::ImportMode mode,
- framepos_t& pos,
+ samplepos_t& pos,
int target_regions,
int target_tracks,
boost::shared_ptr<ARDOUR::Track>& track,
int add_sources (std::vector<std::string> paths,
ARDOUR::SourceList& sources,
- framepos_t& pos,
+ samplepos_t& pos,
Editing::ImportDisposition disposition,
Editing::ImportMode mode,
int target_regions,
int finish_bringing_in_material (boost::shared_ptr<ARDOUR::Region> region,
uint32_t in_chans,
uint32_t out_chans,
- framepos_t& pos,
+ samplepos_t& pos,
Editing::ImportMode mode,
boost::shared_ptr<ARDOUR::Track>& existing_track,
const std::string& new_track_name,
AnalysisWindow* analysis_window;
+ /* import & embed */
+ void external_audio_dialog ();
+ void session_import_dialog ();
+
+ /* PT import specific */
+ void external_pt_dialog ();
+ ARDOUR::ImportStatus import_pt_status;
+ static void *_import_pt_thread (void *);
+ void* import_pt_thread ();
+ PTFFormat import_ptf;
+
/* import specific info */
struct EditorImportStatus : public ARDOUR::ImportStatus {
Editing::ImportMode mode;
- framepos_t pos;
+ samplepos_t pos;
int target_tracks;
int target_regions;
boost::shared_ptr<ARDOUR::Track> track;
void import_audio (bool as_tracks);
void do_import (std::vector<std::string> paths, bool split, bool as_tracks);
-
+ void import_smf_tempo_map (Evoral::SMF const &, samplepos_t pos);
void move_to_start ();
void move_to_end ();
void center_playhead ();
void clear_locations ();
void unhide_markers ();
void unhide_ranges ();
- void jump_forward_to_mark ();
- void jump_backward_to_mark ();
void cursor_align (bool playhead_to_edit);
void toggle_skip_playback ();
void set_selection_from_loop ();
void set_selection_from_region ();
- void add_location_mark (framepos_t where);
+ void add_location_mark (samplepos_t where);
void add_location_from_region ();
void add_locations_from_region ();
void add_location_from_selection ();
void set_loop_from_selection (bool play);
void set_punch_from_selection ();
void set_punch_from_region ();
+ void set_auto_punch_range();
void set_session_start_from_playhead ();
void set_session_end_from_playhead ();
void set_loop_from_region (bool play);
- void set_loop_range (framepos_t start, framepos_t end, std::string cmd);
- void set_punch_range (framepos_t start, framepos_t end, std::string cmd);
+ void set_loop_range (samplepos_t start, samplepos_t end, std::string cmd);
+ void set_punch_range (samplepos_t start, samplepos_t end, std::string cmd);
+ void toggle_location_at_playhead_cursor ();
void add_location_from_playhead_cursor ();
+ bool do_remove_location_at_playhead_cursor ();
void remove_location_at_playhead_cursor ();
bool select_new_marker;
int scrubbing_direction;
int scrub_reversals;
int scrub_reverse_distance;
- void scrub (framepos_t, double);
+ void scrub (samplepos_t, double);
+
+ void set_punch_start_from_edit_point ();
+ void set_punch_end_from_edit_point ();
+ void set_loop_start_from_edit_point ();
+ void set_loop_end_from_edit_point ();
- void keyboard_selection_begin ();
- void keyboard_selection_finish (bool add);
+ void keyboard_selection_begin (Editing::EditIgnoreOption = Editing::EDIT_IGNORE_NONE);
+ void keyboard_selection_finish (bool add, Editing::EditIgnoreOption = Editing::EDIT_IGNORE_NONE);
bool have_pending_keyboard_selection;
- framepos_t pending_keyboard_selection_start;
+ samplepos_t pending_keyboard_selection_start;
void move_range_selection_start_or_end_to_region_boundary (bool, bool);
- Editing::SnapType _snap_type;
+ Editing::GridType _grid_type;
Editing::SnapMode _snap_mode;
- /// Snap threshold in pixels
- double snap_threshold;
-
bool ignore_gui_changes;
DragManager* _drags;
bool can_remove_control_point (ArdourCanvas::Item *);
void remove_control_point (ArdourCanvas::Item *);
- void mouse_brush_insert_region (RegionView*, framepos_t pos);
+ void mouse_brush_insert_region (RegionView*, samplepos_t pos);
/* Canvas event handlers */
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_sample_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*);
bool canvas_feature_line_event (GdkEvent* event, ArdourCanvas::Item*, RegionView*);
bool canvas_stream_view_event (GdkEvent* event,ArdourCanvas::Item*, RouteTimeAxisView*);
- bool canvas_marker_event (GdkEvent* event,ArdourCanvas::Item*, Marker*);
+ bool canvas_marker_event (GdkEvent* event,ArdourCanvas::Item*, ArdourMarker*);
bool canvas_tempo_marker_event (GdkEvent* event,ArdourCanvas::Item*, TempoMarker*);
+ bool canvas_tempo_curve_event (GdkEvent* event,ArdourCanvas::Item*, TempoCurve*);
bool canvas_meter_marker_event (GdkEvent* event,ArdourCanvas::Item*, MeterMarker*);
bool canvas_automation_track_event(GdkEvent* event, ArdourCanvas::Item*, AutomationTimeAxisView*);
bool canvas_note_event (GdkEvent* event, ArdourCanvas::Item *);
void toggle_video_timeline_locked ();
void set_video_timeline_locked (const bool);
void queue_visual_videotimeline_update ();
- void embed_audio_from_video (std::string, framepos_t n = 0, bool lock_position_to_video = true);
+ void embed_audio_from_video (std::string, samplepos_t n = 0, bool lock_position_to_video = true);
+
+ bool track_selection_change_without_scroll () const {
+ return _track_selection_change_without_scroll;
+ }
PBD::Signal0<void> EditorFreeze;
PBD::Signal0<void> EditorThaw;
- private:
+private:
friend class DragManager;
friend class EditorRouteGroups;
friend class EditorRegions;
/* display control */
- bool _show_measures;
/// true if the editor should follow the playhead, otherwise false
bool _follow_playhead;
/// true if we scroll the tracks rather than the playhead
/// true if we are in fullscreen mode
bool _maximised;
- TempoLines* tempo_lines;
+ std::vector<ArdourCanvas::Ruler::Mark> grid_marks;
+ GridLines* grid_lines;
ArdourCanvas::Container* global_rect_group;
ArdourCanvas::Container* time_line_group;
- void hide_measures ();
- void draw_measures (ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
- ARDOUR::TempoMap::BBTPointList::const_iterator& end);
+ void hide_grid_lines ();
+ void maybe_draw_grid_lines ();
void new_tempo_section ();
-
void remove_tempo_marker (ArdourCanvas::Item*);
void remove_meter_marker (ArdourCanvas::Item*);
gint real_remove_tempo_marker (ARDOUR::TempoSection*);
void edit_meter_marker (MeterMarker&);
void edit_control_point (ArdourCanvas::Item*);
void edit_notes (MidiRegionView*);
+ void edit_region (RegionView*);
+
+ void edit_current_meter ();
+ void edit_current_tempo ();
void marker_menu_edit ();
void marker_menu_remove ();
void marker_menu_rename ();
- void rename_marker (Marker *marker);
+ void rename_marker (ArdourMarker *marker);
+ void toggle_marker_lock_style ();
+ void toggle_tempo_clamped ();
+ void toggle_tempo_type ();
+ void ramp_to_next_tempo ();
void toggle_marker_menu_lock ();
void toggle_marker_menu_glue ();
void marker_menu_hide ();
+ void marker_menu_set_origin ();
void marker_menu_loop_range ();
void marker_menu_select_all_selectables_using_range ();
void marker_menu_select_using_range ();
void marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
void tempo_or_meter_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
void new_transport_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
- void build_range_marker_menu (bool, bool);
+ void build_range_marker_menu (ARDOUR::Location *, bool, bool);
void build_marker_menu (ARDOUR::Location *);
- void build_tempo_or_meter_marker_menu (bool);
+ void build_tempo_marker_menu (TempoMarker *, bool);
+ void build_meter_marker_menu (MeterMarker *, bool);
void build_new_transport_marker_menu ();
void dynamic_cast_marker_object (void*, MeterMarker**, TempoMarker**) const;
- Gtk::Menu* tempo_or_meter_marker_menu;
+ Gtk::Menu* tempo_marker_menu;
+ Gtk::Menu* meter_marker_menu;
Gtk::Menu* marker_menu;
Gtk::Menu* range_marker_menu;
Gtk::Menu* transport_marker_menu;
Gtk::Menu* cd_marker_menu;
ArdourCanvas::Item* marker_menu_item;
- typedef std::list<Marker*> Marks;
+ typedef std::list<ArdourMarker*> Marks;
Marks metric_marks;
+ typedef std::list<TempoCurve*> Curves;
+ Curves tempo_curves;
+
void remove_metric_marks ();
void draw_metric_marks (const ARDOUR::Metrics& metrics);
- void compute_current_bbt_points (framepos_t left, framepos_t right,
- ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
- ARDOUR::TempoMap::BBTPointList::const_iterator& end);
+ void compute_current_bbt_points (std::vector<ARDOUR::TempoMap::BBTPoint>& grid, samplepos_t left, samplepos_t right);
void tempo_map_changed (const PBD::PropertyChange&);
- void redisplay_tempo (bool immediate_redraw);
+ void tempometric_position_changed (const PBD::PropertyChange&);
+
+ void redisplay_grid (bool immediate_redraw);
uint32_t bbt_beat_subdivision;
void editor_mixer_button_toggled ();
void editor_list_button_toggled ();
- ArdourButton zoom_in_button;
- ArdourButton zoom_out_button;
- ArdourButton zoom_out_full_button;
+ ArdourWidgets::ArdourButton zoom_in_button;
+ ArdourWidgets::ArdourButton zoom_out_button;
+ ArdourWidgets::ArdourButton zoom_out_full_button;
- ArdourButton tav_expand_button;
- ArdourButton tav_shrink_button;
- ArdourDropdown visible_tracks_selector;
- ArdourDropdown zoom_preset_selector;
+ ArdourWidgets::ArdourButton tav_expand_button;
+ ArdourWidgets::ArdourButton tav_shrink_button;
+ ArdourWidgets::ArdourDropdown visible_tracks_selector;
+ ArdourWidgets::ArdourDropdown zoom_preset_selector;
int32_t _visible_track_count;
void build_track_count_menu ();
Gtk::Table toolbar_selection_clock_table;
Gtk::Label toolbar_selection_cursor_label;
- Gtkmm2ext::TearOff* _mouse_mode_tearoff;
- ArdourButton mouse_select_button;
- ArdourButton mouse_draw_button;
- ArdourButton mouse_move_button;
- ArdourButton mouse_timefx_button;
- ArdourButton mouse_content_button;
- ArdourButton mouse_audition_button;
- ArdourButton mouse_cut_button;
+ ArdourWidgets::ArdourButton mouse_select_button;
+ ArdourWidgets::ArdourButton mouse_draw_button;
+ ArdourWidgets::ArdourButton mouse_move_button;
+ ArdourWidgets::ArdourButton mouse_timefx_button;
+ ArdourWidgets::ArdourButton mouse_content_button;
+ ArdourWidgets::ArdourButton mouse_audition_button;
+ ArdourWidgets::ArdourButton mouse_cut_button;
- ArdourButton smart_mode_button;
+ ArdourWidgets::ArdourButton smart_mode_button;
Glib::RefPtr<Gtk::ToggleAction> smart_mode_action;
void mouse_mode_toggled (Editing::MouseMode m);
bool mouse_select_button_release (GdkEventButton*);
+ Glib::RefPtr<Gtk::Action> get_mouse_mode_action (Editing::MouseMode m) const;
+
Gtk::VBox automation_box;
Gtk::Button automation_mode_button;
//edit mode menu stuff
- ArdourDropdown edit_mode_selector;
- void edit_mode_selection_done ( ARDOUR::EditMode m );
+ ArdourWidgets::ArdourDropdown edit_mode_selector;
+ void edit_mode_selection_done (ARDOUR::EditMode);
void build_edit_mode_menu ();
- Gtk::VBox edit_mode_box;
+ Gtk::VBox edit_mode_box;
void set_edit_mode (ARDOUR::EditMode);
void cycle_edit_mode ();
- ArdourDropdown snap_type_selector;
- void build_snap_type_menu ();
+ ArdourWidgets::ArdourDropdown grid_type_selector;
+ void build_grid_type_menu ();
+
+ ArdourWidgets::ArdourButton snap_mode_button;
+ bool snap_mode_button_clicked (GdkEventButton *);
+
+ Gtk::HBox snap_box;
- ArdourDropdown snap_mode_selector;
- void build_snap_mode_menu ();
- Gtk::HBox snap_box;
+ Gtk::HBox ebox_hpacker;
+ Gtk::VBox ebox_vpacker;
- std::vector<std::string> snap_type_strings;
+ Gtk::HBox _box;
+
+ std::vector<std::string> grid_type_strings;
std::vector<std::string> snap_mode_strings;
- void snap_type_selection_done (Editing::SnapType);
+ void grid_type_selection_done (Editing::GridType);
void snap_mode_selection_done (Editing::SnapMode);
void snap_mode_chosen (Editing::SnapMode);
- void snap_type_chosen (Editing::SnapType);
+ void grid_type_chosen (Editing::GridType);
- Glib::RefPtr<Gtk::RadioAction> snap_type_action (Editing::SnapType);
+ Glib::RefPtr<Gtk::RadioAction> grid_type_action (Editing::GridType);
Glib::RefPtr<Gtk::RadioAction> snap_mode_action (Editing::SnapMode);
//zoom focus meu stuff
- ArdourDropdown zoom_focus_selector;
- void zoom_focus_selection_done ( Editing::ZoomFocus f );
+ ArdourWidgets::ArdourDropdown zoom_focus_selector;
+ void zoom_focus_selection_done (Editing::ZoomFocus);
void build_zoom_focus_menu ();
std::vector<std::string> zoom_focus_strings;
Glib::RefPtr<Gtk::RadioAction> zoom_focus_action (Editing::ZoomFocus);
- Gtk::HBox _zoom_box;
- Gtkmm2ext::TearOff* _zoom_tearoff;
- void zoom_adjustment_changed();
+ Gtk::HBox _track_box;
+
+ Gtk::HBox _zoom_box;
+ void zoom_adjustment_changed();
void setup_toolbar ();
void setup_tooltips ();
- Gtkmm2ext::TearOff* _tools_tearoff;
- Gtk::HBox toolbar_hbox;
- Gtk::EventBox toolbar_base;
- Gtk::Frame toolbar_frame;
- Gtk::Viewport _toolbar_viewport;
-
- /* midi toolbar */
-
- Gtk::HBox panic_box;
+ Gtk::HBox toolbar_hbox;
void setup_midi_toolbar ();
SelectionMemento* _selection_memento;
void time_selection_changed ();
- void update_time_selection_display ();
void track_selection_changed ();
+ void update_time_selection_display ();
+ void presentation_info_changed (PBD::PropertyChange const &);
void region_selection_changed ();
sigc::connection editor_regions_selection_changed_connection;
void sensitize_all_region_actions (bool);
- void sensitize_the_right_region_actions ();
+ void sensitize_the_right_region_actions (bool because_canvas_crossing);
bool _all_region_actions_sensitized;
/** Flag to block region action handlers from doing what they normally do;
* I tried Gtk::Action::block_activate() but this doesn't work (ie it doesn't
void point_selection_changed ();
void marker_selection_changed ();
- bool _ignore_follow_edits;
+ bool _track_selection_change_without_scroll;
+ bool _editor_track_selection_change_without_scroll;
void cancel_selection ();
void cancel_time_selection ();
bool get_smart_mode() const;
- bool audio_region_selection_covers (framepos_t where);
+ bool audio_region_selection_covers (samplepos_t where);
/* transport range select process */
- ArdourCanvas::Rectangle* cd_marker_bar_drag_rect;
- ArdourCanvas::Rectangle* range_bar_drag_rect;
- ArdourCanvas::Rectangle* transport_bar_drag_rect;
+ ArdourCanvas::Rectangle* cd_marker_bar_drag_rect;
+ ArdourCanvas::Rectangle* range_bar_drag_rect;
+ ArdourCanvas::Rectangle* transport_bar_drag_rect;
+ ArdourCanvas::Rectangle* transport_bar_range_rect;
+ ArdourCanvas::Rectangle* transport_bar_preroll_rect;
+ ArdourCanvas::Rectangle* transport_bar_postroll_rect;
+ ArdourCanvas::Rectangle* transport_loop_range_rect;
+ ArdourCanvas::Rectangle* transport_punch_range_rect;
+ ArdourCanvas::Line* transport_punchin_line;
+ ArdourCanvas::Line* transport_punchout_line;
+ ArdourCanvas::Rectangle* transport_preroll_rect;
+ ArdourCanvas::Rectangle* transport_postroll_rect;
-#ifdef GTKOSX
- ArdourCanvas::Rectangle *bogus_background_rect;
-#endif
- ArdourCanvas::Rectangle *transport_bar_range_rect;
- ArdourCanvas::Rectangle *transport_bar_preroll_rect;
- ArdourCanvas::Rectangle *transport_bar_postroll_rect;
- ArdourCanvas::Rectangle *transport_loop_range_rect;
- ArdourCanvas::Rectangle *transport_punch_range_rect;
- ArdourCanvas::Line *transport_punchin_line;
- ArdourCanvas::Line *transport_punchout_line;
- ArdourCanvas::Rectangle *transport_preroll_rect;
- ArdourCanvas::Rectangle *transport_postroll_rect;
-
- ARDOUR::Location* transport_loop_location();
- ARDOUR::Location* transport_punch_location();
+ ARDOUR::Location* transport_loop_location();
+ ARDOUR::Location* transport_punch_location();
- ARDOUR::Location *temp_location;
+ ARDOUR::Location* temp_location;
/* object rubberband select process */
- void select_all_within (framepos_t, framepos_t, double, double, TrackViewList const &, Selection::Operation, bool);
+ void select_all_within (samplepos_t, samplepos_t, double, double, TrackViewList const &, Selection::Operation, bool);
- ArdourCanvas::Rectangle *rubberband_rect;
+ ArdourCanvas::Rectangle* rubberband_rect;
EditorRouteGroups* _route_groups;
- EditorRoutes* _routes;
- EditorRegions* _regions;
- EditorSnapshots* _snapshots;
- EditorLocations* _locations;
+ EditorRoutes* _routes;
+ EditorRegions* _regions;
+ EditorSnapshots* _snapshots;
+ EditorLocations* _locations;
/* diskstream/route display management */
Glib::RefPtr<Gdk::Pixbuf> rec_enabled_icon;
bool sync_track_view_list_and_routes ();
- Gtk::VBox list_vpacker;
+ Gtk::VBox list_vpacker;
/* autoscrolling */
void stop_canvas_autoscroll ();
/* trimming */
- void point_trim (GdkEvent *, framepos_t);
+ void point_trim (GdkEvent *, samplepos_t);
void trim_region_front();
void trim_region_back();
void update_title_s (const std::string & snapshot_name);
void instant_save ();
+ bool no_save_instant;
boost::shared_ptr<ARDOUR::AudioRegion> last_audition_region;
/* duplication */
void duplicate_range (bool with_dialog);
+ void duplicate_regions (float times);
- /** computes the timeline frame (sample) of an event whose coordinates
+ /** computes the timeline sample (sample) of an event whose coordinates
* are in canvas units (pixels, scroll offset included).
*/
- framepos_t canvas_event_sample (GdkEvent const *, double* px = 0, double* py = 0) const;
+ samplepos_t canvas_event_sample (GdkEvent const *, double* px = 0, double* py = 0) const;
- /** computes the timeline frame (sample) of an event whose coordinates
+ /** computes the timeline sample (sample) of an event whose coordinates
* are in window units (pixels, no scroll offset).
*/
- framepos_t window_event_sample (GdkEvent const *, double* px = 0, double* py = 0) const;
+ samplepos_t window_event_sample (GdkEvent const *, double* px = 0, double* py = 0) const;
/* returns false if mouse pointer is not in track or marker canvas
*/
- bool mouse_frame (framepos_t&, bool& in_track_canvas) const;
+ bool mouse_sample (samplepos_t&, bool& in_track_canvas) const;
TimeFXDialog* current_timefx;
static void* timefx_thread (void *arg);
int pitch_shift (RegionSelection&, float cents);
void pitch_shift_region ();
- void transpose_region ();
-
/* editor-mixer strip */
MixerStrip *current_mixer_strip;
void cms_new (boost::shared_ptr<ARDOUR::Route>);
void current_mixer_strip_hidden ();
- void detach_tearoff (Gtk::Box* b, Gtk::Window* w);
- void reattach_tearoff (Gtk::Box* b, Gtk::Window* w, int32_t n);
-#ifdef GTKOSX
+#ifdef __APPLE__
void ensure_all_elements_drawn ();
#endif
/* nudging tracks */
/* nudge */
- ArdourButton nudge_forward_button;
- ArdourButton nudge_backward_button;
+ ArdourWidgets::ArdourButton nudge_forward_button;
+ ArdourWidgets::ArdourButton nudge_backward_button;
Gtk::HBox nudge_hbox;
Gtk::VBox nudge_vbox;
AudioClock* nudge_clock;
void toggle_gain_envelope_active ();
void reset_region_gain_envelopes ();
- bool on_key_press_event (GdkEventKey*);
- bool on_key_release_event (GdkEventKey*);
-
void session_state_saved (std::string);
Glib::RefPtr<Gtk::Action> undo_action;
void history_changed ();
- Gtk::HBox status_bar_hpacker;
-
Editing::EditPoint _edit_point;
- ArdourDropdown edit_point_selector;
+ ArdourWidgets::ArdourDropdown edit_point_selector;
void build_edit_point_menu();
void set_edit_point_preference (Editing::EditPoint ep, bool force = false);
void selected_marker_moved (ARDOUR::Location*);
- bool get_edit_op_range (framepos_t& start, framepos_t& end) const;
+ bool get_edit_op_range (samplepos_t& start, samplepos_t& end) const;
- void get_regions_at (RegionSelection&, framepos_t where, const TrackViewList& ts) const;
- void get_regions_after (RegionSelection&, framepos_t where, const TrackViewList& ts) const;
+ void get_regions_at (RegionSelection&, samplepos_t where, const TrackViewList& ts) const;
+ void get_regions_after (RegionSelection&, samplepos_t where, const TrackViewList& ts) const;
- RegionSelection get_regions_from_selection_and_edit_point ();
- RegionSelection get_regions_from_selection_and_entered ();
+ RegionSelection get_regions_from_selection_and_edit_point (Editing::EditIgnoreOption = Editing::EDIT_IGNORE_NONE,
+ bool use_context_click = false,
+ bool from_outside_canvas = false);
+ RegionSelection get_regions_from_selection_and_entered () const;
void start_updating_meters ();
void stop_updating_meters ();
bool meters_running;
- void select_next_route ();
- void select_prev_route ();
+ void select_next_stripable (bool routes_only = true);
+ void select_prev_stripable (bool routes_only = true);
+
+ ARDOUR::MusicSample snap_to_minsec (ARDOUR::MusicSample start,
+ ARDOUR::RoundMode direction,
+ ARDOUR::SnapPref gpref);
+
+ ARDOUR::MusicSample snap_to_cd_frames (ARDOUR::MusicSample start,
+ ARDOUR::RoundMode direction,
+ ARDOUR::SnapPref gpref);
+
+ ARDOUR::MusicSample snap_to_bbt (ARDOUR::MusicSample start,
+ ARDOUR::RoundMode direction,
+ ARDOUR::SnapPref gpref);
- void snap_to_internal (framepos_t& first,
- ARDOUR::RoundMode direction = ARDOUR::RoundNearest,
- bool for_mark = false,
- bool ensure_snap = false);
+ ARDOUR::MusicSample snap_to_timecode (ARDOUR::MusicSample start,
+ ARDOUR::RoundMode direction,
+ ARDOUR::SnapPref gpref);
- void timecode_snap_to_internal (framepos_t& first,
- ARDOUR::RoundMode direction = ARDOUR::RoundNearest,
- bool for_mark = false);
+ ARDOUR::MusicSample snap_to_grid (ARDOUR::MusicSample start,
+ ARDOUR::RoundMode direction,
+ ARDOUR::SnapPref gpref);
+
+ void snap_to_internal (ARDOUR::MusicSample& first,
+ ARDOUR::RoundMode direction = ARDOUR::RoundNearest,
+ ARDOUR::SnapPref gpref = ARDOUR::SnapToAny_Visual,
+ bool ensure_snap = false);
+
+ samplepos_t snap_to_marker (samplepos_t presnap,
+ ARDOUR::RoundMode direction = ARDOUR::RoundNearest);
RhythmFerret* rhythm_ferret;
bool _region_selection_change_updates_region_list;
void setup_fade_images ();
- std::map<ARDOUR::FadeShape, Gtk::Image*> _fade_in_images;
- std::map<ARDOUR::FadeShape, Gtk::Image*> _fade_out_images;
std::map<ARDOUR::FadeShape, Gtk::Image*> _xfade_in_images;
std::map<ARDOUR::FadeShape, Gtk::Image*> _xfade_out_images;
void bring_all_sources_into_session ();
QuantizeDialog* quantize_dialog;
-
+ MainMenuDisabler* _main_menu_disabler;
+
+ /* private helper functions to help with registering region actions */
+
+ Glib::RefPtr<Gtk::Action> register_region_action (Glib::RefPtr<Gtk::ActionGroup> group, Editing::RegionActionTarget, char const * name, char const * label, sigc::slot<void> slot);
+ void register_toggle_region_action (Glib::RefPtr<Gtk::ActionGroup> group, Editing::RegionActionTarget, char const * name, char const * label, sigc::slot<void> slot);
+
+ Glib::RefPtr<Gtk::Action> reg_sens (Glib::RefPtr<Gtk::ActionGroup> group, char const * name, char const * label, sigc::slot<void> slot);
+ void toggle_reg_sens (Glib::RefPtr<Gtk::ActionGroup> group, char const * name, char const * label, sigc::slot<void> slot);
+ void radio_reg_sens (Glib::RefPtr<Gtk::ActionGroup> action_group, Gtk::RadioAction::Group& radio_group, char const * name, char const * label, sigc::slot<void> slot);
+
friend class Drag;
+ friend class RegionCutDrag;
friend class RegionDrag;
friend class RegionMoveDrag;
friend class RegionSpliceDrag;
friend class RegionRippleDrag;
friend class TrimDrag;
+ friend class BBTRulerDrag;
friend class MeterMarkerDrag;
friend class TempoMarkerDrag;
friend class CursorDrag;