#include <set>
#include <string>
#include <sys/time.h>
+#include <cmath>
#include <boost/optional.hpp>
-#include <libgnomecanvasmm/canvas.h>
-#include <libgnomecanvasmm/group.h>
-#include <libgnomecanvasmm/line.h>
-#include <libgnomecanvasmm/pixbuf.h>
-
-#include <cmath>
-
#include <gtkmm/comboboxtext.h>
#include <gtkmm/layout.h>
#include "ardour/location.h"
#include "ardour/types.h"
+#include "canvas/fwd.h"
+
#include "gtk-custom-ruler.h"
#include "ardour_button.h"
#include "ardour_dialog.h"
#include "enums.h"
#include "editor_items.h"
#include "region_selection.h"
-#include "canvas.h"
#include "window_proxy.h"
-namespace Gnome { namespace Canvas {
- class NoEventText;
-} }
-
namespace Gtkmm2ext {
class TearOff;
class Bindings;
class Region;
class Location;
class TempoSection;
- class NamedSelection;
class Session;
class Filter;
- class Crossfade;
class ChanCount;
class MidiOperator;
class Track;
class AutomationSelection;
class AutomationTimeAxisView;
class BundleManager;
+class ButtonJoiner;
class ControlPoint;
-class CrossfadeView;
class DragManager;
class GroupedButtons;
class GUIObjectState;
class Marker;
class MidiRegionView;
class MixerStrip;
+class NoteBase;
class PlaylistSelector;
class PluginSelector;
class RhythmFerret;
void first_idle ();
virtual bool have_idled () const { return _have_idled; }
- framepos_t leftmost_position() const { return leftmost_frame; }
+ framepos_t leftmost_sample() const { return leftmost_frame; }
- framecnt_t current_page_frames() const {
- return (framecnt_t) floor (_canvas_width * frames_per_unit);
+ framecnt_t current_page_samples() const {
+ return (framecnt_t) floor (_visible_canvas_width * samples_per_pixel);
}
- double canvas_height () const {
- return _canvas_height;
+ double visible_canvas_height () const {
+ return _visible_canvas_height;
}
void cycle_snap_mode ();
- void cycle_snap_choice ();
+ 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 set_snap_mode (Editing::SnapMode);
void set_snap_threshold (double pixel_distance) {snap_threshold = pixel_distance;}
void separate_regions_using_location (ARDOUR::Location&);
void transition_to_rolling (bool forward);
- /* undo related */
-
- framepos_t unit_to_frame (double unit) const {
- return (framepos_t) rint (unit * frames_per_unit);
- }
-
- double frame_to_unit (framepos_t frame) const {
- return rint ((double) frame / (double) frames_per_unit);
- }
-
- double frame_to_unit (double frame) const {
- return rint (frame / frames_per_unit);
- }
-
/* NOTE: these functions assume that the "pixel" coordinate is
- the result of using the world->canvas affine transform on a
- world coordinate. These coordinates already take into
- account any scrolling carried out by adjusting the
- xscroll_adjustment.
+ in canvas coordinates. These coordinates already take into
+ account any scrolling offsets.
*/
- framepos_t pixel_to_frame (double pixel) const {
+ framepos_t pixel_to_sample (double pixel) const {
/* pixel can be less than zero when motion events
are processed. since we've already run the world->canvas
*/
if (pixel >= 0) {
- return (framepos_t) rint (pixel * frames_per_unit * GNOME_CANVAS(track_canvas->gobj())->pixels_per_unit);
+ return (framepos_t) rint (pixel * samples_per_pixel);
} else {
return 0;
}
}
- gulong frame_to_pixel (framepos_t frame) const {
- return (gulong) rint ((frame / (frames_per_unit * GNOME_CANVAS(track_canvas->gobj())->pixels_per_unit)));
+ double sample_to_pixel (framepos_t sample) const {
+ return rint (sample / samples_per_pixel);
}
- void flush_canvas ();
+ double sample_to_pixel_unrounded (framepos_t sample) const {
+ return sample / samples_per_pixel;
+ }
/* selection */
bool extend_selection_to_track (TimeAxisView&);
void play_selection ();
+ framepos_t get_preroll ();
+ void maybe_locate_with_edit_preroll (framepos_t);
+ void play_with_preroll ();
void select_all_in_track (Selection::Operation op);
void select_all (Selection::Operation op);
void invert_selection_in_track ();
void set_zoom_focus (Editing::ZoomFocus);
Editing::ZoomFocus get_zoom_focus () const { return zoom_focus; }
- double get_current_zoom () const { return frames_per_unit; }
-
+ double get_current_zoom () const { return samples_per_pixel; }
+ void cycle_zoom_focus ();
void temporal_zoom_step (bool coarser);
void tav_zoom_step (bool coarser);
+ void tav_zoom_smooth (bool coarser, bool force_all);
/* stuff that AudioTimeAxisView and related classes use */
void toggle_measure_visibility ();
void toggle_logo_visibility ();
- /* fades/xfades */
+ /* fades */
void toggle_region_fades (int dir);
void update_region_fade_visibility ();
- bool xfade_visibility() const { return _xfade_visibility; }
- void update_xfade_visibility ();
/* redirect shared ops menu. caller must free returned menu */
void maximise_editing_space();
void restore_editing_space();
+ void update_tearoff_visibility();
+
void reset_x_origin (framepos_t);
void reset_x_origin_to_follow_playhead ();
void reset_y_origin (double);
void do_import (std::vector<std::string> paths, Editing::ImportDisposition, Editing::ImportMode mode, ARDOUR::SrcQuality, framepos_t&);
void do_embed (std::vector<std::string> paths, Editing::ImportDisposition, Editing::ImportMode mode, framepos_t&);
- void get_regions_corresponding_to (boost::shared_ptr<ARDOUR::Region> region, std::vector<RegionView*>& regions);
+ void get_regions_corresponding_to (boost::shared_ptr<ARDOUR::Region> region, std::vector<RegionView*>& regions, bool src_comparison);
void center_screen (framepos_t);
return _verbose_cursor;
}
+ double clamp_verbose_cursor_x (double);
+ double clamp_verbose_cursor_y (double);
+
void get_pointer_position (double &, double &) const;
+ TimeAxisView* stepping_axis_view () {
+ return _stepping_axis_view;
+ }
+
+ void set_stepping_axis_view (TimeAxisView* v) {
+ _stepping_axis_view = v;
+ }
+
+ void save_canvas_state ();
+
protected:
void map_transport_state ();
void map_position_change (framepos_t);
typedef std::pair<TimeAxisView*,XMLNode*> TAVState;
struct VisualState {
- VisualState();
+ VisualState (bool with_tracks);
~VisualState ();
double y_position;
- double frames_per_unit;
+ double samples_per_pixel;
framepos_t leftmost_frame;
Editing::ZoomFocus zoom_focus;
GUIObjectState* gui_state;
void swap_visual_state ();
std::vector<VisualState*> visual_states;
- sigc::connection visual_state_op_connection;
void start_visual_state_op (uint32_t n);
void cancel_visual_state_op (uint32_t n);
- bool end_visual_state_op (uint32_t n);
framepos_t leftmost_frame;
- double frames_per_unit;
+ double samples_per_pixel;
Editing::ZoomFocus zoom_focus;
- void set_frames_per_unit (double);
- void post_zoom ();
+ void set_samples_per_pixel (double);
+ bool clamp_samples_per_pixel (double &) const;
Editing::MouseMode mouse_mode;
Editing::MouseMode pre_internal_mouse_mode;
+ Editing::SnapType pre_internal_snap_type;
+ Editing::SnapMode pre_internal_snap_mode;
+ Editing::SnapType internal_snap_type;
+ Editing::SnapMode internal_snap_mode;
bool _internal_editing;
Editing::MouseMode effective_mouse_mode () const;
void hide_marker (ArdourCanvas::Item*, GdkEvent*);
void clear_marker_display ();
void mouse_add_new_marker (framepos_t where, bool is_cd=false, bool is_xrun=false);
+ void mouse_add_new_range (framepos_t);
bool choose_new_marker_name(std::string &name);
void update_cd_marker_display ();
void ensure_cd_marker_updated (LocationMarkers * lam, ARDOUR::Location * location);
RegionView* clicked_regionview;
RegionSelection latest_regionviews;
uint32_t clicked_selection;
- CrossfadeView* clicked_crossfadeview;
ControlPoint* clicked_control_point;
void sort_track_selection (TrackViewList&);
void mapover_tracks_with_unique_playlists (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl, TimeAxisView*, PBD::PropertyID) 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_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);
-
- /* end */
-
+
void button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type);
bool button_release_can_deselect;
void select_all_tracks ();
void select_all_internal_edit (Selection::Operation);
- bool set_selected_control_point_from_click (Selection::Operation op = Selection::Set, bool no_remove=false);
+ bool set_selected_control_point_from_click (bool press, Selection::Operation op = Selection::Set);
void set_selected_track_from_click (bool press, Selection::Operation op = Selection::Set, bool no_remove=false);
void set_selected_track_as_side_effect (Selection::Operation op);
bool set_selected_regionview_from_click (bool press, Selection::Operation op = Selection::Set);
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* build_track_context_menu ();
Gtk::Menu* build_track_bus_context_menu ();
Gtk::Menu* build_track_region_context_menu ();
- Gtk::Menu* build_track_crossfade_context_menu ();
Gtk::Menu* build_track_selection_context_menu ();
void add_dstream_context_items (Gtk::Menu_Helpers::MenuList&);
void add_bus_context_items (Gtk::Menu_Helpers::MenuList&);
void add_region_context_items (Gtk::Menu_Helpers::MenuList&, boost::shared_ptr<ARDOUR::Track>);
- 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&);
Gtk::MenuItem* _popup_region_menu_item;
void popup_control_point_context_menu (ArdourCanvas::Item *, GdkEvent *);
Gtk::Menu _control_point_context_menu;
- void handle_new_route (ARDOUR::RouteList&);
+ void add_routes (ARDOUR::RouteList&);
void timeaxisview_deleted (TimeAxisView *);
Gtk::HBox global_hpacker;
Gdk::Cursor* which_grabber_cursor ();
void set_canvas_cursor ();
- ArdourCanvas::Canvas* track_canvas;
+ ArdourCanvas::GtkCanvas* _track_canvas;
+ ArdourCanvas::GtkCanvasViewport* _track_canvas_viewport;
+
+ ArdourCanvas::GtkCanvas* _time_bars_canvas;
+ ArdourCanvas::GtkCanvasViewport* _time_bars_canvas_viewport;
+ Gtk::Adjustment* _time_bars_canvas_vadj;
+
+ bool within_track_canvas;
friend class VerboseCursor;
VerboseCursor* _verbose_cursor;
bool track_canvas_motion (GdkEvent*);
Gtk::EventBox time_canvas_event_box;
- Gtk::EventBox track_canvas_event_box;
- Gtk::EventBox time_button_event_box;
+ Gtk::EventBox time_bars_event_box;
Gtk::EventBox ruler_label_event_box;
ArdourCanvas::Group *minsec_group;
ArdourCanvas::Group *transport_marker_group;
ArdourCanvas::Group* cd_marker_group;
- ArdourCanvas::Group* timebar_group;
+ /* parent for groups which themselves contain time markers */
+ ArdourCanvas::Group* _time_markers_group;
- /* These bars never need to be scrolled */
ArdourCanvas::Group* meter_bar_group;
ArdourCanvas::Group* tempo_bar_group;
ArdourCanvas::Group* marker_bar_group;
ruler_time_range_marker = 7,
ruler_time_transport_marker = 8,
ruler_time_cd_marker = 9,
+ ruler_video_timeline = 10,
};
static GtkCustomMetric ruler_metrics[4];
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 ();
+ 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_ruler_visibility ();
void set_ruler_visible (RulerType, bool);
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);
+ 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);
gint metric_get_timecode (GtkCustomRulerMark **, gdouble, gdouble, gint);
gint metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint);
static const double timebar_height;
guint32 visible_timebars;
- gdouble canvas_timebars_vsize;
- gdouble get_canvas_timebars_vsize () const { return canvas_timebars_vsize; }
Gtk::Menu *editor_ruler_menu;
- ArdourCanvas::SimpleRect* tempo_bar;
- ArdourCanvas::SimpleRect* meter_bar;
- ArdourCanvas::SimpleRect* marker_bar;
- ArdourCanvas::SimpleRect* range_marker_bar;
- ArdourCanvas::SimpleRect* transport_marker_bar;
- ArdourCanvas::SimpleRect* cd_marker_bar;
+ ArdourCanvas::Rectangle* tempo_bar;
+ ArdourCanvas::Rectangle* meter_bar;
+ ArdourCanvas::Rectangle* marker_bar;
+ ArdourCanvas::Rectangle* range_marker_bar;
+ ArdourCanvas::Rectangle* transport_marker_bar;
+ ArdourCanvas::Rectangle* cd_marker_bar;
Gtk::Label minsec_label;
Gtk::Label bbt_label;
Gtk::Label transport_mark_label;
Gtk::Label cd_mark_label;
- Gtk::VBox time_button_vbox;
- Gtk::HBox time_button_hbox;
+ /* videtimline related actions */
+ ArdourCanvas::Rectangle* videotl_bar;
+ Gtk::Label videotl_label;
+ ArdourCanvas::Group* videotl_bar_group;
+ ArdourCanvas::Group* videotl_group;
+ Glib::RefPtr<Gtk::ToggleAction> ruler_video_action;
+ 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_osdbg_action;
+ Glib::RefPtr<Gtk::ToggleAction> xjadeo_fullscreen_action;
+ Glib::RefPtr<Gtk::ToggleAction> xjadeo_letterbox_action;
+ Glib::RefPtr<Gtk::Action> xjadeo_zoom_100;
+ void set_xjadeo_proc ();
+ void toggle_xjadeo_proc (int state=-1);
+ void set_xjadeo_sensitive (bool onoff);
+ void set_xjadeo_viewoption (int);
+ void toggle_xjadeo_viewoption (int what, int state=-1);
+ void toggle_ruler_video (bool onoff) {ruler_video_action->set_active(onoff);}
+ int videotl_bar_height; /* in units of timebar_height; default: 4 */
+ int get_videotl_bar_height () const { return videotl_bar_height; }
+ void export_video ();
+ void toggle_region_video_lock ();
+
+ Gtk::VBox time_bars_vbox;
friend class EditorCursor;
EditorCursor* playhead_cursor;
- ArdourCanvas::Group* cursor_group;
framepos_t get_region_boundary (framepos_t pos, int32_t dir, bool with_selection, bool only_onscreen);
Gtk::Table edit_packer;
+ /** the adjustment that controls the overall editor vertical scroll position */
Gtk::Adjustment vertical_adjustment;
+ Gtk::Adjustment horizontal_adjustment;
+ Gtk::Adjustment unused_adjustment; // yes, really; Gtk::Layout constructor requires refs
Gtk::Layout controls_layout;
bool control_layout_scroll (GdkEventScroll* ev);
void reset_controls_layout_width ();
sigc::connection _scroll_connection;
int _scroll_callbacks;
- double _canvas_width;
- double _canvas_height; ///< height of the visible area of the track canvas
- double full_canvas_height; ///< full height of the canvas
+ double _visible_canvas_width;
+ double _visible_canvas_height; ///< height of the visible area of the track canvas
+ double _full_canvas_height; ///< full height of the canvas
bool track_canvas_map_handler (GdkEventAny*);
Gtk::VBox edit_controls_vbox;
Gtk::HBox edit_controls_hbox;
+ void control_vertical_zoom_in_all ();
+ void control_vertical_zoom_out_all ();
+ void control_vertical_zoom_in_selected ();
+ void control_vertical_zoom_out_selected ();
+ void control_step_tracks_up ();
+ void control_step_tracks_down ();
+ void control_view (uint32_t);
void control_scroll (float);
- void control_select (uint32_t rid);
+ void control_select (uint32_t rid, Selection::Operation);
+ void control_unselect ();
void access_action (std::string,std::string);
bool deferred_control_scroll (framepos_t);
sigc::connection control_scroll_connection;
- gdouble get_trackview_group_vertical_offset () const { return vertical_adjustment.get_value () - canvas_timebars_vsize;}
+ gdouble get_trackview_group_vertical_offset () const { return vertical_adjustment.get_value (); }
ArdourCanvas::Group* get_background_group () const { return _background_group; }
ArdourCanvas::Group* get_trackview_group () const { return _trackview_group; }
- double last_trackview_group_vertical_offset;
void tie_vertical_scrolling ();
void set_horizontal_position (double);
double horizontal_position () const;
- void scroll_canvas_vertically ();
struct VisualChange {
enum Type {
Type pending;
framepos_t time_origin;
- double frames_per_unit;
+ double samples_per_pixel;
double y_origin;
int idle_handler_id;
+ /** true if we are currently in the idle handler */
+ bool being_handled;
- VisualChange() : pending ((VisualChange::Type) 0), time_origin (0), frames_per_unit (0), idle_handler_id (-1) {}
+ VisualChange() : pending ((VisualChange::Type) 0), time_origin (0), samples_per_pixel (0), idle_handler_id (-1), being_handled (false) {}
void add (Type t) {
pending = Type (pending | t);
}
};
-
VisualChange pending_visual_change;
static int _idle_visual_changer (void *arg);
int idle_visual_changer ();
-
- void queue_visual_change (framepos_t);
- void queue_visual_change (double);
- void queue_visual_change_y (double);
void ensure_visual_change_idle_handler ();
/* track views */
void temporal_zoom_region (bool both_axes);
void zoom_to_region (bool both_axes);
void temporal_zoom_session ();
- void temporal_zoom (gdouble scale);
- void temporal_zoom_by_frame (framepos_t start, framepos_t end, const std::string & op);
+ void temporal_zoom (double scale);
+ void temporal_zoom_by_frame (framepos_t start, framepos_t end);
void temporal_zoom_to_frame (bool coarser, framepos_t frame);
void insert_region_list_drag (boost::shared_ptr<ARDOUR::Region>, int x, int y);
void bring_in_external_audio (Editing::ImportMode mode, framepos_t& pos);
- bool idle_drop_paths (std::vector<std::string> paths, framepos_t frame, double ypos);
- void drop_paths_part_two (const std::vector<std::string>& paths, framepos_t frame, double ypos);
+ 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);
int import_sndfiles (std::vector<std::string> paths, Editing::ImportMode mode, ARDOUR::SrcQuality, framepos_t& pos,
int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::Track>&, bool);
boost::shared_ptr<ARDOUR::AudioTrack> get_nth_selected_audio_track (int nth) const;
boost::shared_ptr<ARDOUR::MidiTrack> get_nth_selected_midi_track (int nth) const;
+ void toggle_midi_input_active (bool flip_others);
+
ARDOUR::InterThreadInfo* current_interthread_info;
AnalysisWindow* analysis_window;
Gtk::Menu fade_context_menu;
void popup_fade_context_menu (int, int, ArdourCanvas::Item*, ItemType);
+ Gtk::Menu xfade_in_context_menu;
+ Gtk::Menu xfade_out_context_menu;
+ void popup_xfade_in_context_menu (int, int, ArdourCanvas::Item*, ItemType);
+ void popup_xfade_out_context_menu (int, int, ArdourCanvas::Item*, ItemType);
+ void fill_xfade_menu (Gtk::Menu_Helpers::MenuList& items, bool start);
+
void set_fade_in_shape (ARDOUR::FadeShape);
void set_fade_out_shape (ARDOUR::FadeShape);
bool canvas_selection_rect_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*);
bool canvas_selection_start_trim_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*);
bool canvas_selection_end_trim_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*);
- bool canvas_crossfade_view_event (GdkEvent* event,ArdourCanvas::Item*, CrossfadeView*);
+ bool canvas_start_xfade_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
+ bool canvas_end_xfade_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
bool canvas_fade_in_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
bool canvas_fade_in_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
bool canvas_fade_out_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
bool canvas_zoom_rect_event (GdkEvent* event,ArdourCanvas::Item*);
bool canvas_tempo_marker_event (GdkEvent* event,ArdourCanvas::Item*, TempoMarker*);
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*);
+ bool canvas_automation_track_event(GdkEvent* event, ArdourCanvas::Item*, AutomationTimeAxisView*);
+ bool canvas_note_event (GdkEvent* event, ArdourCanvas::Item *);
bool canvas_tempo_bar_event (GdkEvent* event, ArdourCanvas::Item*);
bool canvas_meter_bar_event (GdkEvent* event, ArdourCanvas::Item*);
bool canvas_transport_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
bool canvas_cd_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
+ bool canvas_videotl_bar_event (GdkEvent* event, ArdourCanvas::Item*);
+ void update_video_timeline (bool flush = false);
+ void set_video_timeline_height (const int);
+ bool is_video_timeline_locked ();
+ 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 canvas_imageframe_item_view_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*);
bool canvas_imageframe_view_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameTimeAxis*);
bool canvas_imageframe_start_handle_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*);
bool track_canvas_button_release_event (GdkEventButton* event);
bool track_canvas_motion_notify_event (GdkEventMotion* event);
- Gtk::Allocation canvas_allocation;
- void track_canvas_allocate (Gtk::Allocation alloc);
- bool track_canvas_size_allocated ();
+ Gtk::Allocation _canvas_viewport_allocation;
+ void track_canvas_viewport_allocate (Gtk::Allocation alloc);
+ bool track_canvas_viewport_size_allocated ();
bool track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const &, int, int, guint);
bool track_canvas_key_press (GdkEventKey *);
bool track_canvas_key_release (GdkEventKey *);
/// true if we are in fullscreen mode
bool _maximised;
- ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin;
- ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end;
-
TempoLines* tempo_lines;
ArdourCanvas::Group* time_line_group;
void hide_measures ();
- void draw_measures ();
+ void draw_measures (ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
+ ARDOUR::TempoMap::BBTPointList::const_iterator& end);
bool redraw_measures ();
void new_tempo_section ();
void edit_tempo_marker (ArdourCanvas::Item*);
void edit_meter_marker (ArdourCanvas::Item*);
void edit_control_point (ArdourCanvas::Item*);
- void edit_note (ArdourCanvas::Item *);
+ void edit_notes (std::set<NoteBase*> const & s);
void marker_menu_edit ();
void marker_menu_remove ();
void marker_menu_play_range ();
void marker_menu_set_playhead ();
void marker_menu_set_from_playhead ();
- void marker_menu_set_from_selection ();
+ void marker_menu_set_from_selection (bool force_regions);
void marker_menu_range_to_next ();
+ void marker_menu_zoom_to_range ();
void new_transport_marker_menu_set_loop ();
void new_transport_marker_menu_set_punch ();
void update_loop_range_view (bool visibility=false);
void remove_metric_marks ();
void draw_metric_marks (const ARDOUR::Metrics& metrics);
- void compute_current_bbt_points (framepos_t left, framepos_t right);
+ void compute_current_bbt_points (framepos_t left, framepos_t right,
+ ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
+ ARDOUR::TempoMap::BBTPointList::const_iterator& end);
+
void tempo_map_changed (const PBD::PropertyChange&);
void redisplay_tempo (bool immediate_redraw);
void editor_list_button_toggled ();
AudioClock* zoom_range_clock;
+
ArdourButton zoom_in_button;
ArdourButton zoom_out_button;
ArdourButton zoom_out_full_button;
- Gtk::Button tav_expand_button;
- Gtk::Button tav_shrink_button;
+ ArdourButton tav_expand_button;
+ ArdourButton tav_shrink_button;
Gtk::VBox toolbar_clock_vbox;
Gtk::VBox toolbar_selection_clock_vbox;
ArdourButton mouse_zoom_button;
ArdourButton mouse_timefx_button;
ArdourButton mouse_audition_button;
- ArdourButton join_object_range_button;
+
+ ArdourButton smart_mode_button;
+ Glib::RefPtr<Gtk::ToggleAction> smart_mode_action;
void mouse_mode_toggled (Editing::MouseMode m);
- void mouse_mode_object_range_toggled () {}
+ void mouse_mode_object_range_toggled ();
bool ignore_mouse_mode_toggle;
ArdourButton internal_edit_button;
void marker_selection_changed ();
void cancel_selection ();
+ void cancel_time_selection ();
+
+ bool get_smart_mode() const;
bool audio_region_selection_covers (framepos_t where);
/* transport range select process */
- ArdourCanvas::SimpleRect* cd_marker_bar_drag_rect;
- ArdourCanvas::SimpleRect* range_bar_drag_rect;
- ArdourCanvas::SimpleRect* transport_bar_drag_rect;
+ ArdourCanvas::Rectangle* cd_marker_bar_drag_rect;
+ ArdourCanvas::Rectangle* range_bar_drag_rect;
+ ArdourCanvas::Rectangle* transport_bar_drag_rect;
#ifdef GTKOSX
- ArdourCanvas::SimpleRect *bogus_background_rect;
+ ArdourCanvas::Rectangle *bogus_background_rect;
#endif
- ArdourCanvas::SimpleRect *transport_bar_range_rect;
- ArdourCanvas::SimpleRect *transport_bar_preroll_rect;
- ArdourCanvas::SimpleRect *transport_bar_postroll_rect;
- ArdourCanvas::SimpleRect *transport_loop_range_rect;
- ArdourCanvas::SimpleRect *transport_punch_range_rect;
- ArdourCanvas::SimpleLine *transport_punchin_line;
- ArdourCanvas::SimpleLine *transport_punchout_line;
- ArdourCanvas::SimpleRect *transport_preroll_rect;
- ArdourCanvas::SimpleRect *transport_postroll_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;
ARDOUR::Location* transport_loop_location();
ARDOUR::Location* transport_punch_location();
void select_all_within (framepos_t, framepos_t, double, double, TrackViewList const &, Selection::Operation, bool);
- ArdourCanvas::SimpleRect *rubberband_rect;
+ ArdourCanvas::Rectangle *rubberband_rect;
/* mouse zoom process */
- ArdourCanvas::SimpleRect *zoom_rect;
+ ArdourCanvas::Rectangle *zoom_rect;
void reposition_zoom_rect (framepos_t start, framepos_t end);
EditorRouteGroups* _route_groups;
void update_title ();
void update_title_s (const std::string & snapshot_name);
- struct State {
- Selection* selection;
- double frames_per_unit;
-
- State (PublicEditor const * e);
- ~State ();
- };
-
void instant_save ();
boost::shared_ptr<ARDOUR::AudioRegion> last_audition_region;
/* duplication */
- void duplicate_dialog (bool with_dialog);
+ void duplicate_range (bool with_dialog);
+
+ /** computes the timeline frame (sample) of an event whose coordinates
+ * are in canvas units (pixels, scroll offset included).
+ */
+ framepos_t canvas_event_frame (GdkEvent const *, double* px = 0, double* py = 0) const;
- framepos_t event_frame (GdkEvent const *, double* px = 0, double* py = 0) const;
+ /** computes the timeline frame (sample) of an event whose coordinates
+ * are in window units (pixels, no scroll offset).
+ */
+ framepos_t window_event_frame (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;
- /* "whats mine is yours" */
-
TimeFXDialog* current_timefx;
-
static void* timefx_thread (void *arg);
- void do_timefx (TimeFXDialog&);
+ void do_timefx ();
int time_stretch (RegionSelection&, float fraction);
int pitch_shift (RegionSelection&, float cents);
void nudge_track (bool use_edit_point, bool forwards);
- /* xfades */
-
- bool _xfade_visibility;
-
#ifdef WITH_CMT
void handle_new_imageframe_time_axis_view(const std::string & track_name, void* src) ;
void handle_new_imageframe_marker_time_axis_view(const std::string & track_name, TimeAxisView* marked_track) ;
ImageFrameSocketHandler* image_socket_listener ;
#endif
- void toggle_xfade_active (boost::weak_ptr<ARDOUR::Crossfade>);
- void toggle_xfade_length (boost::weak_ptr<ARDOUR::Crossfade>);
- void edit_xfade (boost::weak_ptr<ARDOUR::Crossfade>);
- void xfade_edit_left_region ();
- void xfade_edit_right_region ();
-
static const int32_t default_width = 995;
static const int32_t default_height = 765;
/* nudge */
- Gtk::Button nudge_forward_button;
- Gtk::Button nudge_backward_button;
+ ArdourButton nudge_forward_button;
+ ArdourButton nudge_backward_button;
Gtk::HBox nudge_hbox;
Gtk::VBox nudge_vbox;
AudioClock* nudge_clock;
*/
RegionView* entered_regionview;
-
- void ensure_entered_track_selected (bool op_acts_on_objects = false);
bool clear_entered_track;
bool left_track_canvas (GdkEventCrossing*);
bool entered_track_canvas (GdkEventCrossing*);
gint left_automation_track ();
void reset_canvas_action_sensitivity (bool);
- void toggle_gain_envelope_visibility ();
+ void set_gain_envelope_visibility ();
+ void set_region_gain_visibility (RegionView*);
void toggle_gain_envelope_active ();
void reset_region_gain_envelopes ();
void get_regions_at (RegionSelection&, framepos_t where, const TrackViewList& ts) const;
void get_regions_after (RegionSelection&, framepos_t where, const TrackViewList& ts) const;
- RegionSelection get_regions_from_selection ();
RegionSelection get_regions_from_selection_and_edit_point ();
RegionSelection get_regions_from_selection_and_entered ();
void region_view_added (RegionView *);
void region_view_removed ();
- void update_canvas_now ();
-
EditorGroupTabs* _group_tabs;
void fit_route_group (ARDOUR::RouteGroup *);
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;
Gtk::MenuItem& action_menu_item (std::string const &);
void action_pre_activated (Glib::RefPtr<Gtk::Action> const &);
int time_fx (ARDOUR::RegionList&, float val, bool pitching);
- bool doing_range_stuff() const {
- return (mouse_mode == Editing::MouseRange && (_join_object_range_state == JOIN_OBJECT_RANGE_NONE)) ||
- _join_object_range_state == JOIN_OBJECT_RANGE_RANGE;
- }
-
- bool doing_object_stuff() const {
- return (mouse_mode == Editing::MouseObject && (_join_object_range_state == JOIN_OBJECT_RANGE_NONE)) ||
- _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT;
- }
+ void toggle_sound_midi_notes ();
+
+ /** Flag for a bit of a hack wrt control point selection; see set_selected_control_point_from_click */
+ bool _control_point_toggled_on_press;
+
+ /** This is used by TimeAxisView to keep a track of the TimeAxisView that is currently being
+ stepped in height using Shift-Scrollwheel. When a scroll event occurs, we do the step on
+ this _stepping_axis_view if it is non-0 (and we set up this _stepping_axis_view with the
+ TimeAxisView underneath the mouse if it is 0). Then Editor resets _stepping_axis_view when
+ the shift key is released. In this (hacky) way, pushing shift and moving the scroll wheel
+ will operate on the same track until shift is released (rather than skipping about to whatever
+ happens to be underneath the mouse at the time).
+ */
+ TimeAxisView* _stepping_axis_view;
+ void shift_key_released ();
friend class Drag;
friend class RegionDrag;
friend class RegionCreateDrag;
friend class RegionMotionDrag;
friend class RegionInsertDrag;
+ friend class VideoTimeLineDrag;
friend class EditorSummary;
friend class EditorGroupTabs;