2 Copyright (C) 2000-2003 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #ifndef __ardour_editor_h__
21 #define __ardour_editor_h__
28 #include <glibmm/ustring.h>
30 #include <boost/optional.hpp>
32 #include <libgnomecanvasmm/canvas.h>
33 #include <libgnomecanvasmm/group.h>
34 #include <libgnomecanvasmm/line.h>
35 #include <libgnomecanvasmm/pixbuf.h>
39 #include <gtkmm/layout.h>
40 #include <gtkmm/comboboxtext.h>
42 #include <gtkmm2ext/selector.h>
43 #include <gtkmm2ext/click_box.h>
44 #include <gtkmm2ext/dndtreeview.h>
46 #include <pbd/stateful.h>
47 #include <ardour/session.h>
48 #include <ardour/tempo.h>
49 #include <ardour/stretch.h>
50 #include <ardour/location.h>
51 #include <ardour/audioregion.h>
53 #include "audio_clock.h"
54 #include "gtk-custom-ruler.h"
55 #include "ardour_dialog.h"
56 #include "public_editor.h"
59 #include "editor_items.h"
60 #include "region_selection.h"
62 #include "time_axis_view.h"
70 class AudioDiskstream;
88 class RouteTimeAxisView;
89 class AudioTimeAxisView;
90 class AutomationTimeAxisView;
91 class AudioRegionView;
94 class PlaylistSelector;
98 class UIExportSpecification;
102 class TrackSelection;
103 class AutomationSelection;
106 class AudioStreamView;
108 class SoundFileOmega;
111 class AnalysisWindow;
114 /* <CMT Additions> */
115 class ImageFrameView;
116 class ImageFrameTimeAxisView;
117 class ImageFrameTimeAxis;
118 class MarkerTimeAxis ;
120 class ImageFrameSocketHandler ;
121 class TimeAxisViewItem ;
122 /* </CMT Additions> */
125 class Editor : public PublicEditor
131 void connect_to_session (ARDOUR::Session *);
132 ARDOUR::Session* current_session() const { return session; }
134 virtual bool have_idled() const { return _have_idled; }
136 nframes64_t leftmost_position() const { return leftmost_frame; }
137 nframes64_t current_page_frames() const {
138 return (nframes64_t) floor (canvas_width * frames_per_unit);
141 void cycle_snap_mode ();
142 void cycle_snap_choice ();
143 void set_snap_to (Editing::SnapType);
144 void set_snap_mode (Editing::SnapMode);
145 void set_snap_threshold (double pixel_distance) {snap_threshold = pixel_distance;}
147 void undo (uint32_t n = 1);
148 void redo (uint32_t n = 1);
150 XMLNode& get_state ();
151 int set_state (const XMLNode& );
153 void set_mouse_mode (Editing::MouseMode, bool force=true);
154 void step_mouse_mode (bool next);
155 Editing::MouseMode current_mouse_mode () { return mouse_mode; }
157 void add_imageframe_time_axis(const std::string & track_name, void*) ;
158 void add_imageframe_marker_time_axis(const std::string & track_name, TimeAxisView* marked_track, void*) ;
159 void connect_to_image_compositor() ;
160 void scroll_timeaxis_to_imageframe_item(const TimeAxisViewItem* item) ;
161 TimeAxisView* get_named_time_axis(const std::string & name) ;
162 void foreach_time_axis_view (sigc::slot<void,TimeAxisView&>);
163 void add_to_idle_resize (TimeAxisView*, uint32_t);
165 void consider_auditioning (boost::shared_ptr<ARDOUR::Region>);
166 void hide_a_region (boost::shared_ptr<ARDOUR::Region>);
167 void remove_a_region (boost::shared_ptr<ARDOUR::Region>);
169 #ifdef USE_RUBBERBAND
170 std::vector<std::string> rb_opt_strings;
173 /* option editor-access */
175 void set_show_waveforms (bool yn);
176 bool show_waveforms() const { return _show_waveforms; }
178 void set_waveform_scale (Editing::WaveformScale);
180 void set_show_waveforms_recording (bool yn);
181 bool show_waveforms_recording() const { return _show_waveforms_recording; }
183 /* things that need to be public to be used in the main menubar */
185 void new_region_from_selection ();
186 void separate_regions_between (const TimeSelection&);
187 void separate_region_from_selection ();
188 void separate_region_from_punch ();
189 void separate_region_from_loop ();
190 void separate_regions_using_location (ARDOUR::Location&);
191 void toggle_playback (bool with_abort);
192 void transition_to_rolling (bool forward);
196 nframes64_t unit_to_frame (double unit) const {
197 return (nframes64_t) rint (unit * frames_per_unit);
200 double frame_to_unit (nframes64_t frame) const {
201 return rint ((double) frame / (double) frames_per_unit);
204 double frame_to_unit (double frame) const {
205 return rint (frame / frames_per_unit);
208 /* NOTE: these functions assume that the "pixel" coordinate is
209 the result of using the world->canvas affine transform on a
210 world coordinate. These coordinates already take into
211 account any scrolling carried out by adjusting the
215 nframes64_t pixel_to_frame (double pixel) const {
217 /* pixel can be less than zero when motion events
218 are processed. since we've already run the world->canvas
219 affine, that means that the location *really* is "off
220 to the right" and thus really is "before the start".
224 return (nframes64_t) rint (pixel * frames_per_unit * GNOME_CANVAS(track_canvas->gobj())->pixels_per_unit);
230 gulong frame_to_pixel (nframes64_t frame) const {
231 return (gulong) rint ((frame / (frames_per_unit * GNOME_CANVAS(track_canvas->gobj())->pixels_per_unit)));
234 void flush_canvas ();
238 Selection& get_selection() const { return *selection; }
239 Selection& get_cut_buffer() const { return *cut_buffer; }
241 bool extend_selection_to_track (TimeAxisView&);
243 void play_selection ();
244 void select_all_in_track (Selection::Operation op);
245 void select_all (Selection::Operation op);
246 void invert_selection_in_track ();
247 void invert_selection ();
248 void deselect_all ();
252 void set_show_measures (bool yn);
253 bool show_measures () const { return _show_measures; }
256 /* analysis window */
257 void analyze_region_selection();
258 void analyze_range_selection();
263 /* these initiate export ... */
265 void export_session();
266 void export_selection();
268 void add_toplevel_controls (Gtk::Container&);
269 Gtk::HBox& get_status_bar_packer() { return status_bar_hpacker; }
271 void set_zoom_focus (Editing::ZoomFocus);
272 Editing::ZoomFocus get_zoom_focus () const { return zoom_focus; }
273 double get_current_zoom () const { return frames_per_unit; }
275 void temporal_zoom_step (bool coarser);
277 /* stuff that AudioTimeAxisView and related classes use */
279 PlaylistSelector& playlist_selector() const;
280 void route_name_changed (TimeAxisView *);
281 void clear_playlist (boost::shared_ptr<ARDOUR::Playlist>);
283 void new_playlists (TimeAxisView*);
284 void copy_playlists (TimeAxisView*);
285 void clear_playlists (TimeAxisView*);
287 TrackViewList* get_valid_views (TimeAxisView*, ARDOUR::RouteGroup* grp = 0);
289 Width editor_mixer_strip_width;
290 void maybe_add_mixer_strip_width (XMLNode&);
291 void show_editor_mixer (bool yn);
292 void set_selected_mixer_strip (TimeAxisView&);
293 void hide_track_in_display (TimeAxisView& tv, bool temporary = false);
294 void show_track_in_display (TimeAxisView& tv);
296 /* nudge is initiated by transport controls owned by ARDOUR_UI */
298 void nudge_forward (bool next, bool force_playhead);
299 void nudge_backward (bool next, bool force_playhead);
301 /* nudge initiated from context menu */
303 void nudge_forward_capture_offset ();
304 void nudge_backward_capture_offset ();
306 /* playhead/screen stuff */
308 void set_follow_playhead (bool yn);
309 void toggle_follow_playhead ();
310 bool follow_playhead() const { return _follow_playhead; }
311 bool dragging_playhead () const { return _dragging_playhead; }
313 void toggle_waveform_visibility ();
314 void toggle_waveforms_while_recording ();
315 void toggle_measure_visibility ();
316 void toggle_logo_visibility ();
318 /* SMPTE timecode & video sync */
320 void smpte_fps_chosen (ARDOUR::SmpteFormat format);
321 void video_pullup_chosen (ARDOUR::Session::PullupFormat pullup);
322 void subframes_per_frame_chosen (uint32_t);
324 void update_smpte_mode();
325 void update_video_pullup();
326 void update_subframes_per_frame ();
329 void toggle_auto_xfade ();
330 void toggle_xfades_active ();
331 void toggle_xfade_visibility ();
332 bool xfade_visibility() const { return _xfade_visibility; }
333 void update_xfade_visibility ();
334 void update_crossfade_model ();
335 void set_crossfade_model (ARDOUR::CrossfadeModel);
338 void set_layer_model (ARDOUR::LayerModel);
339 void update_layering_model ();
341 void toggle_link_region_and_track_selection ();
343 /* redirect shared ops menu. caller must free returned menu */
345 Gtk::Menu* redirect_menu ();
347 /* floating windows/transient */
349 void ensure_float (Gtk::Window&);
353 void scroll_tracks_down_line ();
354 void scroll_tracks_up_line ();
356 bool new_regionviews_display_gain () { return _new_regionviews_show_envelope; }
357 void prepare_for_cleanup ();
358 void finish_cleanup ();
360 void maximise_editing_space();
361 void restore_editing_space();
363 void reset_x_origin (nframes64_t);
364 void reset_zoom (double);
365 void reposition_and_zoom (nframes64_t, double);
367 nframes64_t get_preferred_edit_position (bool ignore_playhead = false);
369 bool update_mouse_speed ();
370 bool decelerate_mouse_speed ();
372 void toggle_meter_updating();
374 void show_rhythm_ferret();
376 void goto_visual_state (uint32_t);
377 void save_visual_state (uint32_t);
379 void queue_draw_resize_line (int at);
380 void start_resize_line_ops ();
381 void end_resize_line_ops ();
384 void map_transport_state ();
385 void map_position_change (nframes64_t);
388 bool on_expose_event (GdkEventExpose*);
392 ARDOUR::Session *session;
395 // to keep track of the playhead position for control_scroll
396 boost::optional<nframes64_t> _control_scroll_target;
398 PlaylistSelector* _playlist_selector;
400 typedef std::pair<TimeAxisView*,XMLNode*> TAVState;
404 double frames_per_unit;
405 nframes64_t leftmost_frame;
406 Editing::ZoomFocus zoom_focus;
407 bool zoomed_to_region;
408 std::list<TAVState> track_states;
411 std::list<VisualState*> undo_visual_stack;
412 std::list<VisualState*> redo_visual_stack;
413 VisualState* current_visual_state (bool with_tracks = true);
414 void undo_visual_state ();
415 void redo_visual_state ();
416 void use_visual_state (VisualState&);
418 void swap_visual_state ();
420 std::vector<VisualState*> visual_states;
421 sigc::connection visual_state_op_connection;
422 void start_visual_state_op (uint32_t n);
423 void cancel_visual_state_op (uint32_t n);
424 bool end_visual_state_op (uint32_t n);
426 nframes64_t leftmost_frame;
427 double frames_per_unit;
428 Editing::ZoomFocus zoom_focus;
430 void set_frames_per_unit (double);
433 Editing::MouseMode mouse_mode;
435 int post_maximal_editor_width;
436 int post_maximal_pane_position;
437 int pre_maximal_pane_position;
438 int pre_maximal_editor_width;
439 void pane_allocation_handler (Gtk::Allocation&, Gtk::Paned*);
441 Gtk::Notebook the_notebook;
442 Gtk::HPaned edit_pane;
444 Gtk::EventBox meter_base;
446 Gtk::EventBox marker_base;
447 Gtk::HBox marker_box;
448 Gtk::VBox scrollers_rulers_markers_box;
450 void location_changed (ARDOUR::Location *);
451 void location_flags_changed (ARDOUR::Location *, void *);
452 void refresh_location_display ();
453 void refresh_location_display_s (ARDOUR::Change);
454 void refresh_location_display_internal (ARDOUR::Locations::LocationList&);
455 void add_new_location (ARDOUR::Location *);
456 void location_gone (ARDOUR::Location *);
457 void remove_marker (ArdourCanvas::Item&, GdkEvent*);
458 gint really_remove_marker (ARDOUR::Location* loc);
459 void goto_nth_marker (int nth);
461 uint32_t location_marker_color;
462 uint32_t location_range_color;
463 uint32_t location_loop_color;
464 uint32_t location_punch_color;
465 uint32_t location_cd_marker_color;
467 struct LocationMarkers {
472 LocationMarkers () : start(0), end(0), valid (true) {}
478 void set_name (const string&);
479 void set_position (nframes64_t start, nframes64_t end = 0);
480 void set_color_rgba (uint32_t);
483 LocationMarkers *find_location_markers (ARDOUR::Location *) const;
484 ARDOUR::Location* find_location_from_marker (Marker *, bool& is_start) const;
485 Marker* entered_marker;
487 typedef std::map<ARDOUR::Location*,LocationMarkers *> LocationMarkerMap;
488 LocationMarkerMap location_markers;
490 void hide_marker (ArdourCanvas::Item*, GdkEvent*);
491 void clear_marker_display ();
492 void mouse_add_new_marker (nframes64_t where, bool is_cd=false, bool is_xrun=false);
493 bool choose_new_marker_name(string &name);
494 void update_cd_marker_display ();
495 void ensure_cd_marker_updated (LocationMarkers * lam, ARDOUR::Location * location);
497 TimeAxisView* clicked_trackview;
498 AudioTimeAxisView* clicked_audio_trackview;
499 RegionView* clicked_regionview;
500 RegionSelection latest_regionviews;
501 uint32_t clicked_selection;
502 CrossfadeView* clicked_crossfadeview;
503 ControlPoint* clicked_control_point;
505 void sort_track_selection (TrackSelection* sel = 0);
507 void get_relevant_audio_tracks (std::set<AudioTimeAxisView*>& relevant_tracks);
508 void get_equivalent_regions (RegionView* rv, std::vector<RegionView*>&);
509 void mapover_audio_tracks (sigc::slot<void,AudioTimeAxisView&,uint32_t> sl, TimeAxisView*);
511 /* functions to be passed to mapover_audio_tracks(), possibly with sigc::bind()-supplied arguments */
513 void mapped_get_equivalent_regions (RouteTimeAxisView&, uint32_t, RegionView*, vector<RegionView*>*);
514 void mapped_use_new_playlist (AudioTimeAxisView&, uint32_t);
515 void mapped_use_copy_playlist (AudioTimeAxisView&, uint32_t);
516 void mapped_clear_playlist (AudioTimeAxisView&, uint32_t);
520 void button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type);
521 bool button_release_can_deselect;
523 void catch_vanishing_regionview (RegionView *);
525 void set_selected_track (TimeAxisView&, Selection::Operation op = Selection::Set, bool no_remove=false);
526 void select_all_tracks ();
528 bool set_selected_control_point_from_click (Selection::Operation op = Selection::Set, bool no_remove=false);
529 void set_selected_track_from_click (bool press, Selection::Operation op = Selection::Set, bool no_remove=false);
530 void set_selected_track_as_side_effect (bool force = false);
531 bool set_selected_regionview_from_click (bool press, Selection::Operation op = Selection::Set, bool no_track_remove=false);
533 void set_selected_regionview_from_region_list (boost::shared_ptr<ARDOUR::Region> region, Selection::Operation op = Selection::Set);
534 bool set_selected_regionview_from_map_event (GdkEventAny*, StreamView*, boost::weak_ptr<ARDOUR::Region>);
535 void collect_new_region_view (RegionView *);
537 Gtk::Menu track_context_menu;
538 Gtk::Menu track_region_context_menu;
539 Gtk::Menu track_selection_context_menu;
540 Gtk::Menu track_crossfade_context_menu;
542 Gtk::MenuItem* region_edit_menu_split_item;
543 Gtk::MenuItem* region_edit_menu_split_multichannel_item;
544 Gtk::Menu * track_region_edit_playlist_menu;
545 Gtk::Menu * track_edit_playlist_submenu;
546 Gtk::Menu * track_selection_edit_playlist_submenu;
548 void popup_track_context_menu (int, int, ItemType, bool, nframes64_t);
549 Gtk::Menu* build_track_context_menu (nframes64_t);
550 Gtk::Menu* build_track_bus_context_menu (nframes64_t);
551 Gtk::Menu* build_track_region_context_menu (nframes64_t frame);
552 Gtk::Menu* build_track_crossfade_context_menu (nframes64_t);
553 Gtk::Menu* build_track_selection_context_menu (nframes64_t);
554 void add_dstream_context_items (Gtk::Menu_Helpers::MenuList&);
555 void add_bus_context_items (Gtk::Menu_Helpers::MenuList&);
556 void add_region_context_items (AudioStreamView*, boost::shared_ptr<ARDOUR::Region>, Gtk::Menu_Helpers::MenuList&);
557 void add_crossfade_context_items (AudioStreamView*, boost::shared_ptr<ARDOUR::Crossfade>, Gtk::Menu_Helpers::MenuList&, bool many);
558 void add_selection_context_items (Gtk::Menu_Helpers::MenuList&);
560 void handle_new_route (ARDOUR::Session::RouteList&);
561 void remove_route (TimeAxisView *);
564 Gtk::HBox global_hpacker;
565 Gtk::VBox global_vpacker;
568 bool need_resize_line;
570 int old_resize_line_y;
572 Gdk::Cursor* current_canvas_cursor;
573 void set_canvas_cursor ();
574 Gdk::Cursor* which_grabber_cursor ();
576 ArdourCanvas::Canvas* track_canvas;
578 ArdourCanvas::Text* first_action_message;
579 ArdourCanvas::Text* verbose_canvas_cursor;
580 bool verbose_cursor_visible;
582 void parameter_changed (const char *);
584 bool track_canvas_motion (GdkEvent*);
586 void set_verbose_canvas_cursor (const string &, double x, double y);
587 void set_verbose_canvas_cursor_text (const string &);
588 void show_verbose_canvas_cursor();
589 void hide_verbose_canvas_cursor();
591 bool verbose_cursor_on; // so far unused
593 Gtk::EventBox time_canvas_event_box;
594 Gtk::EventBox track_canvas_event_box;
595 Gtk::EventBox time_button_event_box;
596 Gtk::EventBox ruler_label_event_box;
598 ArdourCanvas::Pixbuf* logo_item;
599 ArdourCanvas::Group* minsec_group;
600 ArdourCanvas::Group* bbt_group;
601 ArdourCanvas::Group* smpte_group;
602 ArdourCanvas::Group* frame_group;
603 ArdourCanvas::Group* tempo_group;
604 ArdourCanvas::Group* meter_group;
605 ArdourCanvas::Group* marker_group;
606 ArdourCanvas::Group* range_marker_group;
607 ArdourCanvas::Group* transport_marker_group;
608 ArdourCanvas::Group* cd_marker_group;
610 ArdourCanvas::Group* timebar_group;
612 /* These bars never need to be scrolled */
613 ArdourCanvas::Group* meter_bar_group;
614 ArdourCanvas::Group* tempo_bar_group;
615 ArdourCanvas::Group* marker_bar_group;
616 ArdourCanvas::Group* range_marker_bar_group;
617 ArdourCanvas::Group* transport_marker_bar_group;
618 ArdourCanvas::Group* cd_marker_bar_group;
621 The _master_group is the group containing all items
622 that require horizontal scrolling..
623 It is primarily used to separate canvas items
624 that require horizontal scrolling from those that do not.
626 ArdourCanvas::Group* _master_group;
628 The _trackview_group is the group containing all trackviews.
629 It is only scrolled vertically.
631 ArdourCanvas::Group* _trackview_group;
633 This canvas group is used for region motion.
634 It sits on top of the _trackview_group
636 ArdourCanvas::Group* _region_motion_group;
639 ruler_metric_smpte = 0,
640 ruler_metric_bbt = 1,
641 ruler_metric_frames = 2,
642 ruler_metric_minsec = 3,
644 ruler_time_tempo = 4,
645 ruler_time_meter = 5,
646 ruler_time_marker = 6,
647 ruler_time_range_marker = 7,
648 ruler_time_transport_marker = 8,
649 ruler_time_cd_marker = 9,
652 static GtkCustomMetric ruler_metrics[4];
653 Glib::RefPtr<Gtk::ToggleAction> ruler_timecode_action;
654 Glib::RefPtr<Gtk::ToggleAction> ruler_bbt_action;
655 Glib::RefPtr<Gtk::ToggleAction> ruler_samples_action;
656 Glib::RefPtr<Gtk::ToggleAction> ruler_minsec_action;
657 Glib::RefPtr<Gtk::ToggleAction> ruler_tempo_action;
658 Glib::RefPtr<Gtk::ToggleAction> ruler_meter_action;
659 Glib::RefPtr<Gtk::ToggleAction> ruler_marker_action;
660 Glib::RefPtr<Gtk::ToggleAction> ruler_range_action;
661 Glib::RefPtr<Gtk::ToggleAction> ruler_loop_punch_action;
662 Glib::RefPtr<Gtk::ToggleAction> ruler_cd_marker_action;
663 bool no_ruler_shown_update;
665 gint ruler_button_press (GdkEventButton*);
666 gint ruler_button_release (GdkEventButton*);
667 gint ruler_mouse_motion (GdkEventMotion*);
668 bool ruler_scroll (GdkEventScroll* event);
670 gint ruler_pressed_button;
671 Gtk::Widget * ruler_grabbed_widget;
673 void initialize_rulers ();
674 void update_just_smpte ();
675 void update_fixed_rulers ();
676 void update_tempo_based_rulers ();
677 void popup_ruler_menu (nframes64_t where = 0, ItemType type = RegionItem);
678 void update_ruler_visibility ();
679 void set_ruler_visible (RulerType, bool);
680 void toggle_ruler_visibility (RulerType rt);
681 void ruler_toggled (int);
682 gint ruler_label_button_release (GdkEventButton*);
683 void store_ruler_visibility ();
684 void restore_ruler_visibility ();
686 static gint _metric_get_smpte (GtkCustomRulerMark **, gdouble, gdouble, gint);
687 static gint _metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint);
688 static gint _metric_get_frames (GtkCustomRulerMark **, gdouble, gdouble, gint);
689 static gint _metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint);
691 gint metric_get_smpte (GtkCustomRulerMark **, gdouble, gdouble, gint);
692 gint metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint);
693 gint metric_get_frames (GtkCustomRulerMark **, gdouble, gdouble, gint);
694 gint metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint);
696 Gtk::Widget *_ruler_separator;
697 GtkWidget *_smpte_ruler;
698 GtkWidget *_bbt_ruler;
699 GtkWidget *_frames_ruler;
700 GtkWidget *_minsec_ruler;
701 Gtk::Widget *smpte_ruler;
702 Gtk::Widget *bbt_ruler;
703 Gtk::Widget *frames_ruler;
704 Gtk::Widget *minsec_ruler;
705 static Editor *ruler_editor;
707 static const double timebar_height;
708 guint32 visible_timebars;
709 gdouble canvas_timebars_vsize;
710 Gtk::Menu *editor_ruler_menu;
712 ArdourCanvas::SimpleRect* tempo_bar;
713 ArdourCanvas::SimpleRect* meter_bar;
714 ArdourCanvas::SimpleRect* marker_bar;
715 ArdourCanvas::SimpleRect* range_marker_bar;
716 ArdourCanvas::SimpleRect* transport_marker_bar;
717 ArdourCanvas::SimpleRect* cd_marker_bar;
720 ArdourCanvas::SimpleLine* tempo_line;
721 ArdourCanvas::SimpleLine* meter_line;
722 ArdourCanvas::SimpleLine* marker_line;
723 ArdourCanvas::SimpleLine* range_marker_line;
724 ArdourCanvas::SimpleLine* transport_marker_line;
725 ArdourCanvas::SimpleLine* cd_marker_line;
727 Gtk::Label minsec_label;
728 Gtk::Label bbt_label;
729 Gtk::Label smpte_label;
730 Gtk::Label frame_label;
731 Gtk::Label tempo_label;
732 Gtk::Label meter_label;
733 Gtk::Label mark_label;
734 Gtk::Label range_mark_label;
735 Gtk::Label transport_mark_label;
736 Gtk::Label cd_mark_label;
739 Gtk::VBox time_button_vbox;
740 Gtk::HBox time_button_hbox;
744 ArdourCanvas::Points points;
745 ArdourCanvas::Line canvas_item;
746 nframes64_t current_frame;
749 Cursor (Editor&, bool (Editor::*)(GdkEvent*,ArdourCanvas::Item*));
752 void set_position (nframes64_t);
753 void set_length (double units);
754 void set_y_axis (double position);
757 friend struct Cursor; /* it needs access to several private
761 Cursor* playhead_cursor;
762 ArdourCanvas::Group* cursor_group;
764 void cursor_to_region_boundary (Cursor*, int32_t dir);
765 void cursor_to_next_region_boundary (Cursor*);
766 void cursor_to_previous_region_boundary (Cursor*);
767 void cursor_to_next_region_point (Cursor*, ARDOUR::RegionPoint);
768 void cursor_to_previous_region_point (Cursor*, ARDOUR::RegionPoint);
769 void cursor_to_region_point (Cursor*, ARDOUR::RegionPoint, int32_t dir);
770 void cursor_to_selection_start (Cursor *);
771 void cursor_to_selection_end (Cursor *);
773 void selected_marker_to_region_boundary (int32_t dir);
774 void selected_marker_to_next_region_boundary ();
775 void selected_marker_to_previous_region_boundary ();
776 void selected_marker_to_next_region_point (ARDOUR::RegionPoint);
777 void selected_marker_to_previous_region_point (ARDOUR::RegionPoint);
778 void selected_marker_to_region_point (ARDOUR::RegionPoint, int32_t dir);
779 void selected_marker_to_selection_start ();
780 void selected_marker_to_selection_end ();
782 void select_all_selectables_using_cursor (Cursor *, bool);
783 void select_all_selectables_using_edit (bool);
784 void select_all_selectables_between (bool within);
785 void select_range_between ();
787 boost::shared_ptr<ARDOUR::Region> find_next_region (nframes64_t, ARDOUR::RegionPoint, int32_t dir, TrackViewList&, TimeAxisView ** = 0);
788 nframes64_t find_next_region_boundary (nframes64_t, int32_t dir, const TrackViewList&);
790 vector<nframes64_t> region_boundary_cache;
791 void build_region_boundary_cache ();
794 Gtk::HBox bottom_hbox;
796 Gtk::Table edit_packer;
797 Gtk::VScrollbar edit_vscrollbar;
799 Gtk::Adjustment vertical_adjustment;
800 Gtk::Adjustment horizontal_adjustment;
802 Gtk::Layout controls_layout;
803 bool control_layout_scroll (GdkEventScroll* ev);
804 void controls_layout_size_request (Gtk::Requisition*);
806 Gtk::HScrollbar edit_hscrollbar;
807 bool _dragging_hscrollbar;
809 void reset_hscrollbar_stepping ();
811 bool hscrollbar_button_press (GdkEventButton*);
812 bool hscrollbar_button_release (GdkEventButton*);
813 void hscrollbar_allocate (Gtk::Allocation &alloc);
816 double canvas_height;
817 double full_canvas_height;
818 nframes64_t last_canvas_frame;
820 bool track_canvas_map_handler (GdkEventAny*);
822 gint edit_controls_button_release (GdkEventButton*);
823 Gtk::Menu *edit_controls_left_menu;
824 Gtk::Menu *edit_controls_right_menu;
826 Gtk::VBox ruler_label_vbox;
827 Gtk::VBox track_canvas_vbox;
828 Gtk::VBox time_canvas_vbox;
829 Gtk::VBox edit_controls_vbox;
830 Gtk::HBox edit_controls_hbox;
832 void control_scroll (float);
833 void access_action (std::string,std::string);
834 bool deferred_control_scroll (nframes64_t);
835 sigc::connection control_scroll_connection;
837 gdouble get_trackview_group_vertical_offset () const { return vertical_adjustment.get_value () - canvas_timebars_vsize;}
838 ArdourCanvas::Group* get_trackview_group () const { return _trackview_group; }
839 void tie_vertical_scrolling ();
840 void scroll_canvas_horizontally ();
841 void scroll_canvas_vertically ();
842 void canvas_horizontally_scrolled ();
843 void canvas_scroll_to (nframes64_t);
845 struct VisualChange {
852 nframes64_t time_origin;
853 double frames_per_unit;
857 VisualChange() : pending ((VisualChange::Type) 0), time_origin (0), frames_per_unit (0), idle_handler_id (-1) {}
861 VisualChange pending_visual_change;
863 static int _idle_visual_changer (void *arg);
864 int idle_visual_changer ();
866 void queue_visual_change (nframes64_t);
867 void queue_visual_change (double);
869 void end_location_changed (ARDOUR::Location*);
871 struct RegionListDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
872 RegionListDisplayModelColumns() {
877 Gtk::TreeModelColumn<Glib::ustring> name;
878 Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Region> > region;
879 Gtk::TreeModelColumn<Gdk::Color> color_;
882 RegionListDisplayModelColumns region_list_columns;
883 Gtkmm2ext::DnDTreeView<boost::shared_ptr<ARDOUR::Region> > region_list_display;
885 Glib::RefPtr<Gtk::TreeStore> region_list_model;
886 Glib::RefPtr<Gtk::ToggleAction> toggle_full_region_list_action;
887 Glib::RefPtr<Gtk::ToggleAction> toggle_show_auto_regions_action;
889 void region_list_selection_changed ();
890 bool region_list_selection_filter (const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::Path& path, bool yn);
891 void region_name_edit (const Glib::ustring&, const Glib::ustring&);
892 void get_regions_corresponding_to (boost::shared_ptr<ARDOUR::Region> region, std::vector<RegionView*>& regions);
894 Gtk::Menu *region_list_menu;
895 Gtk::ScrolledWindow region_list_scroller;
896 Gtk::Frame region_list_frame;
898 bool region_list_display_key_press (GdkEventKey *);
899 bool region_list_display_key_release (GdkEventKey *);
900 bool region_list_display_button_press (GdkEventButton *);
901 bool region_list_display_button_release (GdkEventButton *);
902 void region_list_clear ();
903 void region_list_selection_mapover (sigc::slot<void,boost::shared_ptr<ARDOUR::Region> >);
904 void build_region_list_menu ();
905 void show_region_list_display_context_menu (int button, int time);
907 bool show_automatic_regions_in_region_list;
908 Editing::RegionListSortType region_list_sort_type;
910 void reset_region_list_sort_direction (bool);
911 void reset_region_list_sort_type (Editing::RegionListSortType);
913 void toggle_full_region_list ();
914 void toggle_show_auto_regions ();
916 int region_list_sorter (Gtk::TreeModel::iterator, Gtk::TreeModel::iterator);
920 Gtk::ScrolledWindow snapshot_display_scroller;
921 struct SnapshotDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
922 SnapshotDisplayModelColumns() {
926 Gtk::TreeModelColumn<Glib::ustring> visible_name;
927 Gtk::TreeModelColumn<Glib::ustring> real_name;
930 SnapshotDisplayModelColumns snapshot_display_columns;
931 Glib::RefPtr<Gtk::ListStore> snapshot_display_model;
932 Gtk::TreeView snapshot_display;
933 Gtk::Menu snapshot_context_menu;
935 bool snapshot_display_button_press (GdkEventButton*);
936 void snapshot_display_selection_changed ();
937 void redisplay_snapshots();
938 void popup_snapshot_context_menu (int, int32_t, Glib::ustring);
940 /* named selections */
942 struct NamedSelectionDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
943 NamedSelectionDisplayModelColumns() {
947 Gtk::TreeModelColumn<Glib::ustring> text;
948 Gtk::TreeModelColumn<ARDOUR::NamedSelection*> selection;
951 NamedSelectionDisplayModelColumns named_selection_columns;
952 Glib::RefPtr<Gtk::TreeStore> named_selection_model;
954 Gtkmm2ext::DnDTreeView<ARDOUR::NamedSelection*> named_selection_display;
955 Gtk::ScrolledWindow named_selection_scroller;
957 void create_named_selection ();
958 void paste_named_selection (float times);
959 void remove_selected_named_selections ();
960 void remove_snapshot (Glib::ustring);
961 void rename_snapshot (Glib::ustring);
963 void handle_new_named_selection ();
964 void add_named_selection_to_named_selection_display (ARDOUR::NamedSelection&);
965 void redisplay_named_selections ();
967 bool named_selection_display_button_release (GdkEventButton *ev);
968 bool named_selection_display_key_release (GdkEventKey *ev);
969 void named_selection_display_selection_changed ();
972 TrackViewList track_views;
973 TimeAxisView *trackview_by_y_position (double ypos);
975 static Gdk::Cursor* cross_hair_cursor;
976 static Gdk::Cursor* trimmer_cursor;
977 static Gdk::Cursor* selector_cursor;
978 static Gdk::Cursor* grabber_cursor;
979 static Gdk::Cursor* grabber_edit_point_cursor;
980 static Gdk::Cursor* zoom_cursor;
981 static Gdk::Cursor* time_fx_cursor;
982 static Gdk::Cursor* fader_cursor;
983 static Gdk::Cursor* speaker_cursor;
984 static Gdk::Cursor* wait_cursor;
985 static Gdk::Cursor* timebar_cursor;
986 static Gdk::Cursor* transparent_cursor;
988 static void build_cursors ();
990 sigc::connection scroll_connection;
991 nframes64_t last_update_frame;
992 void center_screen (nframes64_t);
993 void center_screen_internal (nframes64_t, float);
995 void update_current_screen ();
997 void session_going_away ();
999 nframes64_t cut_buffer_start;
1000 nframes64_t cut_buffer_length;
1002 bool typed_event (ArdourCanvas::Item*, GdkEvent*, ItemType);
1003 bool button_press_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
1004 bool button_release_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
1005 bool motion_handler (ArdourCanvas::Item*, GdkEvent*, ItemType, bool from_autoscroll = false);
1006 bool enter_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
1007 bool leave_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
1009 /* KEYMAP HANDLING */
1011 void register_actions ();
1013 int ensure_cursor (nframes64_t* pos);
1015 void handle_new_audio_region (boost::weak_ptr<ARDOUR::AudioRegion>);
1016 void handle_new_audio_regions (vector<boost::weak_ptr<ARDOUR::AudioRegion> >& );
1017 void handle_audio_region_removed (boost::weak_ptr<ARDOUR::AudioRegion>);
1018 void add_audio_region_to_region_display (boost::shared_ptr<ARDOUR::AudioRegion>);
1019 void add_audio_regions_to_region_display (std::vector<boost::weak_ptr<ARDOUR::AudioRegion> > & );
1020 void region_hidden (boost::shared_ptr<ARDOUR::Region>);
1021 void redisplay_regions ();
1022 bool no_region_list_redisplay;
1023 void insert_into_tmp_audio_regionlist(boost::shared_ptr<ARDOUR::AudioRegion>);
1025 list<boost::shared_ptr<ARDOUR::AudioRegion> > tmp_audio_region_list;
1027 void cut_copy (Editing::CutCopyOp);
1028 void cut_copy_points (Editing::CutCopyOp);
1029 void cut_copy_regions (Editing::CutCopyOp, RegionSelection&);
1030 void cut_copy_ranges (Editing::CutCopyOp);
1032 void mouse_paste ();
1033 void paste_internal (nframes64_t position, float times);
1035 /* EDITING OPERATIONS */
1037 void reset_point_selection ();
1038 void toggle_region_mute ();
1039 void toggle_region_lock ();
1040 void toggle_region_opaque ();
1041 void set_region_lock_style (ARDOUR::Region::PositionLockStyle);
1042 void raise_region ();
1043 void raise_region_to_top ();
1044 void lower_region ();
1045 void lower_region_to_bottom ();
1046 void split_region ();
1047 void split_region_at (nframes64_t);
1048 void split_regions_at (nframes64_t, RegionSelection&);
1049 void split_region_at_transients ();
1050 void split_region_at_points (boost::shared_ptr<ARDOUR::Region>, ARDOUR::AnalysisFeatureList&, bool can_ferret);
1051 void crop_region_to_selection ();
1052 void crop_region_to (nframes64_t start, nframes64_t end);
1053 void set_sync_point (nframes64_t, const RegionSelection&);
1054 void set_region_sync_from_edit_point ();
1055 void remove_region_sync();
1056 void align_selection (ARDOUR::RegionPoint, nframes64_t position, const RegionSelection&);
1057 void align_selection_relative (ARDOUR::RegionPoint point, nframes64_t position, const RegionSelection&);
1058 void align_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, nframes64_t position);
1059 void align_region_internal (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, nframes64_t position);
1060 void remove_region ();
1061 void remove_clicked_region ();
1062 void edit_region ();
1063 void rename_region ();
1064 void duplicate_some_regions (RegionSelection&, float times);
1065 void duplicate_selection (float times);
1066 void region_fill_selection ();
1068 void region_fill_track ();
1069 void audition_playlist_region_standalone (boost::shared_ptr<ARDOUR::Region>);
1070 void audition_playlist_region_via_route (boost::shared_ptr<ARDOUR::Region>, ARDOUR::Route&);
1071 void split_multichannel_region();
1072 void reverse_region ();
1073 void normalize_region ();
1074 void denormalize_region ();
1075 void adjust_region_scale_amplitude (bool up);
1077 void do_insert_time ();
1078 void insert_time (nframes64_t pos, nframes64_t distance, Editing::InsertTimeOption opt, bool ignore_music_glue, bool markers_too);
1080 void tab_to_transient (bool forward);
1082 void use_region_as_bar ();
1083 void use_range_as_bar ();
1085 void define_one_bar (nframes64_t start, nframes64_t end);
1087 void audition_region_from_region_list ();
1088 void hide_region_from_region_list ();
1089 void remove_region_from_region_list ();
1091 void align (ARDOUR::RegionPoint);
1092 void align_relative (ARDOUR::RegionPoint);
1095 void reset_focus ();
1101 void paste (float times);
1103 int get_prefix (float&, bool&);
1105 void keyboard_paste ();
1106 void keyboard_insert_region_list_selection ();
1108 void region_from_selection ();
1109 void create_region_from_selection (std::vector<boost::shared_ptr<ARDOUR::AudioRegion> >&);
1111 void play_from_start ();
1112 void play_from_edit_point ();
1113 void play_from_edit_point_and_return ();
1114 void play_selected_region ();
1115 void play_edit_range ();
1116 void loop_selected_region ();
1117 void play_location (ARDOUR::Location&);
1118 void loop_location (ARDOUR::Location&);
1120 void temporal_zoom_selection ();
1121 void temporal_zoom_region (bool both_axes);
1122 void toggle_zoom_region (bool both_axes);
1123 bool zoomed_to_region;
1124 void temporal_zoom_session ();
1125 void temporal_zoom (gdouble scale);
1126 void temporal_zoom_by_frame (nframes64_t start, nframes64_t end, const string & op);
1127 void temporal_zoom_to_frame (bool coarser, nframes64_t frame);
1129 void amplitude_zoom (gdouble scale);
1130 void amplitude_zoom_step (bool in);
1132 void insert_region_list_drag (boost::shared_ptr<ARDOUR::AudioRegion>, int x, int y);
1133 void insert_region_list_selection (float times);
1135 void add_external_audio_action (Editing::ImportMode);
1136 void external_audio_dialog ();
1138 int check_whether_and_how_to_import(string, bool all_or_nothing = true);
1139 bool check_multichannel_status (const std::vector<Glib::ustring>& paths);
1141 SoundFileOmega* sfbrowser;
1143 void bring_in_external_audio (Editing::ImportMode mode, nframes64_t& pos);
1145 void _do_import (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode, ARDOUR::SrcQuality, nframes64_t&);
1146 void do_import (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode, ARDOUR::SrcQuality, nframes64_t&);
1147 bool idle_do_import (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode, ARDOUR::SrcQuality, nframes64_t&);
1149 void _do_embed (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode, nframes64_t&);
1150 void do_embed (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode, nframes64_t&);
1151 bool idle_do_embed (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode, nframes64_t&);
1153 int import_sndfiles (vector<Glib::ustring> paths, Editing::ImportMode mode, ARDOUR::SrcQuality, nframes64_t& pos,
1154 int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::AudioTrack>&, bool);
1155 int embed_sndfiles (vector<Glib::ustring> paths, bool multiple_files, bool& check_sample_rate, Editing::ImportMode mode,
1156 nframes64_t& pos, int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::AudioTrack>&);
1158 int add_sources (vector<Glib::ustring> paths, ARDOUR::SourceList& sources, nframes64_t& pos, Editing::ImportMode,
1159 int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::AudioTrack>&, bool add_channel_suffix);
1160 int finish_bringing_in_audio (boost::shared_ptr<ARDOUR::AudioRegion> region, uint32_t, uint32_t, nframes64_t& pos, Editing::ImportMode mode,
1161 boost::shared_ptr<ARDOUR::AudioTrack>& existing_track);
1163 boost::shared_ptr<ARDOUR::AudioTrack> get_nth_selected_audio_track (int nth) const;
1165 /* generic interthread progress window */
1167 ArdourDialog* interthread_progress_window;
1168 Gtk::Label interthread_progress_label;
1169 Gtk::VBox interthread_progress_vbox;
1170 Gtk::ProgressBar interthread_progress_bar;
1171 Gtk::Button interthread_cancel_button;
1172 Gtk::Label interthread_cancel_label;
1173 sigc::connection interthread_progress_connection;
1174 void interthread_cancel_clicked ();
1175 void build_interthread_progress_window ();
1176 ARDOUR::InterThreadInfo* current_interthread_info;
1179 AnalysisWindow* analysis_window;
1182 /* import specific info */
1184 ARDOUR::Session::import_status import_status;
1185 gint import_progress_timeout (void *);
1186 static void *_import_thread (void *);
1187 void* import_thread ();
1189 /* to support this ... */
1191 void import_audio (bool as_tracks);
1192 void do_import (vector<Glib::ustring> paths, bool split, bool as_tracks);
1194 void move_to_start ();
1195 void move_to_end ();
1197 void center_playhead ();
1198 void center_edit_point ();
1199 void edit_cursor_backward ();
1200 void edit_cursor_forward ();
1201 void playhead_forward_to_grid ();
1202 void playhead_backward_to_grid ();
1203 void playhead_backward ();
1204 void playhead_forward ();
1205 void scroll_playhead (bool forward);
1206 void scroll_backward (float pages=0.8f);
1207 void scroll_forward (float pages=0.8f);
1208 void scroll_tracks_down ();
1209 void scroll_tracks_up ();
1210 void delete_sample_forward ();
1211 void delete_sample_backward ();
1212 void delete_screen ();
1213 void search_backwards ();
1214 void search_forwards ();
1216 void clear_markers ();
1217 void clear_ranges ();
1218 void clear_locations ();
1219 void unhide_markers ();
1220 void unhide_ranges ();
1221 void jump_forward_to_mark ();
1222 void jump_backward_to_mark ();
1223 void cursor_align (bool playhead_to_edit);
1225 void remove_last_capture ();
1226 void select_all_selectables_using_time_selection ();
1227 void select_all_selectables_using_loop();
1228 void select_all_selectables_using_punch();
1229 void set_selection_from_range (ARDOUR::Location&);
1230 void set_selection_from_punch ();
1231 void set_selection_from_loop ();
1232 void set_selection_from_audio_region ();
1234 void add_location_mark (nframes64_t where);
1235 void add_location_from_audio_region ();
1236 void add_location_from_selection ();
1237 void set_loop_from_selection (bool play);
1238 void set_punch_from_selection ();
1239 void set_punch_from_region ();
1241 void set_loop_from_edit_range (bool play);
1242 void set_loop_from_region (bool play);
1243 void set_punch_from_edit_range ();
1245 void set_loop_range (nframes64_t start, nframes64_t end, std::string cmd);
1246 void set_punch_range (nframes64_t start, nframes64_t end, std::string cmd);
1248 void add_location_from_playhead_cursor ();
1249 bool select_new_marker;
1251 void reverse_selection ();
1252 void edit_envelope ();
1254 void start_scrolling ();
1255 void stop_scrolling ();
1258 double last_scrub_x;
1259 int scrubbing_direction;
1260 int scrub_reversals;
1261 int scrub_reverse_distance;
1264 void keyboard_selection_begin ();
1265 void keyboard_selection_finish (bool add);
1266 bool have_pending_keyboard_selection;
1267 nframes64_t pending_keyboard_selection_start;
1269 boost::shared_ptr<ARDOUR::Region> select_region_for_operation (int dir, TimeAxisView **tv);
1270 void extend_selection_to_end_of_region (bool next);
1271 void extend_selection_to_start_of_region (bool previous);
1273 Editing::SnapType snap_type;
1274 Editing::SnapMode snap_mode;
1275 double snap_threshold;
1277 void handle_gui_changes (const string &, void *);
1279 void hide_all_tracks (bool with_select);
1282 LineDragInfo current_line_drag_info;
1284 void start_grab (GdkEvent*, Gdk::Cursor* cursor = 0);
1285 bool end_grab (ArdourCanvas::Item*, GdkEvent*);
1286 void swap_grab (ArdourCanvas::Item*, Gdk::Cursor* cursor, uint32_t time);
1288 void finalize_drag ();
1290 Gtk::Menu fade_context_menu;
1291 void popup_fade_context_menu (int, int, ArdourCanvas::Item*, ItemType);
1293 void start_fade_in_grab (ArdourCanvas::Item*, GdkEvent*);
1294 void start_fade_out_grab (ArdourCanvas::Item*, GdkEvent*);
1295 void fade_in_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1296 void fade_out_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1297 void fade_in_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1298 void fade_out_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1300 void set_fade_in_shape (ARDOUR::AudioRegion::FadeShape);
1301 void set_fade_out_shape (ARDOUR::AudioRegion::FadeShape);
1303 void set_fade_length (bool in);
1304 void toggle_fade_active (bool in);
1305 void set_fade_in_active (bool);
1306 void set_fade_out_active (bool);
1308 std::set<boost::shared_ptr<ARDOUR::Playlist> > motion_frozen_playlists;
1309 RegionSelection pre_drag_region_selection;
1310 void region_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1311 void region_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1312 bool check_region_drag_possible (AudioTimeAxisView**);
1313 void possibly_copy_regions_during_grab (GdkEvent*);
1314 void region_drag_splice_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1315 void region_drag_splice_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1317 bool _dragging_playhead;
1318 bool _dragging_edit_point;
1320 void cursor_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1321 void cursor_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1322 void marker_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1323 void marker_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1324 void control_point_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1325 void control_point_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1326 void line_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1327 void line_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1329 void tempo_marker_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1330 void tempo_marker_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1331 void meter_marker_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1332 void meter_marker_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1334 gint mouse_rename_region (ArdourCanvas::Item*, GdkEvent*);
1336 void start_region_grab (ArdourCanvas::Item*, GdkEvent*);
1337 void start_region_copy_grab (ArdourCanvas::Item*, GdkEvent*);
1338 void start_region_brush_grab (ArdourCanvas::Item*, GdkEvent*);
1339 void start_selection_grab (ArdourCanvas::Item*, GdkEvent*);
1340 void start_cursor_grab (ArdourCanvas::Item*, GdkEvent*);
1341 void start_marker_grab (ArdourCanvas::Item*, GdkEvent*);
1342 void start_control_point_grab (ArdourCanvas::Item*, GdkEvent*);
1343 void start_line_grab_from_regionview (ArdourCanvas::Item*, GdkEvent*);
1344 void start_line_grab_from_line (ArdourCanvas::Item*, GdkEvent*);
1345 void start_line_grab (AutomationLine *, GdkEvent*);
1346 void start_tempo_marker_grab (ArdourCanvas::Item*, GdkEvent*);
1347 void start_tempo_marker_copy_grab (ArdourCanvas::Item*, GdkEvent*);
1348 void start_meter_marker_grab (ArdourCanvas::Item*, GdkEvent*);
1349 void start_meter_marker_copy_grab (ArdourCanvas::Item*, GdkEvent*);
1351 void region_view_item_click (AudioRegionView&, GdkEventButton*);
1353 void remove_gain_control_point (ArdourCanvas::Item*, GdkEvent*);
1354 void remove_control_point (ArdourCanvas::Item*, GdkEvent*);
1356 void mouse_brush_insert_region (RegionView*, nframes64_t pos);
1357 void brush (nframes64_t);
1359 void show_verbose_time_cursor (nframes64_t frame, double offset = 0, double xpos=-1, double ypos=-1);
1360 void show_verbose_duration_cursor (nframes64_t start, nframes64_t end, double offset = 0, double xpos=-1, double ypos=-1);
1361 double clamp_verbose_cursor_x (double);
1362 double clamp_verbose_cursor_y (double);
1364 /* Canvas event handlers */
1366 bool canvas_control_point_event (GdkEvent* event,ArdourCanvas::Item*, ControlPoint*);
1367 bool canvas_line_event (GdkEvent* event,ArdourCanvas::Item*, AutomationLine*);
1368 bool canvas_selection_rect_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*);
1369 bool canvas_selection_start_trim_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*);
1370 bool canvas_selection_end_trim_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*);
1371 bool canvas_crossfade_view_event (GdkEvent* event,ArdourCanvas::Item*, CrossfadeView*);
1372 bool canvas_fade_in_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1373 bool canvas_fade_in_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1374 bool canvas_fade_out_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1375 bool canvas_fade_out_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1378 // These variables are used to detect a feedback loop and break it to avoid a gui hang
1380 ArdourCanvas::Item *last_item_entered;
1381 int last_item_entered_n;
1384 bool canvas_region_view_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
1385 bool canvas_region_view_name_highlight_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
1386 bool canvas_region_view_name_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
1387 bool canvas_stream_view_event (GdkEvent* event,ArdourCanvas::Item*, RouteTimeAxisView*);
1388 bool canvas_marker_event (GdkEvent* event,ArdourCanvas::Item*, Marker*);
1389 bool canvas_zoom_rect_event (GdkEvent* event,ArdourCanvas::Item*);
1390 bool canvas_tempo_marker_event (GdkEvent* event,ArdourCanvas::Item*, TempoMarker*);
1391 bool canvas_meter_marker_event (GdkEvent* event,ArdourCanvas::Item*, MeterMarker*);
1392 bool canvas_automation_track_event(GdkEvent* event, ArdourCanvas::Item*, AutomationTimeAxisView*) ;
1394 bool canvas_tempo_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1395 bool canvas_meter_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1396 bool canvas_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1397 bool canvas_range_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1398 bool canvas_transport_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1399 bool canvas_cd_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1401 bool canvas_imageframe_item_view_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*);
1402 bool canvas_imageframe_view_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameTimeAxis*);
1403 bool canvas_imageframe_start_handle_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*);
1404 bool canvas_imageframe_end_handle_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*);
1405 bool canvas_marker_time_axis_view_event(GdkEvent* event, ArdourCanvas::Item*,MarkerTimeAxis*);
1406 bool canvas_markerview_item_view_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*);
1407 bool canvas_markerview_start_handle_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*);
1408 bool canvas_markerview_end_handle_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*);
1410 /* non-public event handlers */
1412 bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
1413 bool track_canvas_scroll (GdkEventScroll* event);
1415 bool track_canvas_scroll_event (GdkEventScroll* event);
1416 bool track_canvas_button_press_event (GdkEventButton* event);
1417 bool track_canvas_button_release_event (GdkEventButton* event);
1418 bool track_canvas_motion_notify_event (GdkEventMotion* event);
1420 Gtk::Allocation canvas_allocation;
1421 void track_canvas_allocate (Gtk::Allocation alloc);
1422 bool track_canvas_size_allocated ();
1424 void set_playhead_cursor ();
1426 void kbd_driver (sigc::slot<void,GdkEvent*>, bool use_track_canvas = true, bool use_time_canvas = true, bool can_select = true);
1427 void kbd_mute_unmute_region ();
1430 void kbd_do_brush (GdkEvent*);
1431 void kbd_do_audition (GdkEvent*);
1433 void handle_new_duration ();
1434 void initialize_canvas ();
1436 /* display control */
1438 bool _show_measures;
1439 bool _show_waveforms;
1440 bool _follow_playhead;
1441 bool _show_waveforms_recording;
1443 ARDOUR::TempoMap::BBTPointList *current_bbt_points;
1445 typedef vector<ArdourCanvas::SimpleLine*> TimeLineList;
1446 TimeLineList free_measure_lines;
1447 TimeLineList used_measure_lines;
1449 ArdourCanvas::Group* time_line_group;
1450 ArdourCanvas::SimpleLine* get_time_line ();
1451 void hide_measures ();
1452 void draw_measures ();
1453 bool lazy_hide_and_draw_measures ();
1455 void new_tempo_section ();
1457 void mouse_add_new_tempo_event (nframes64_t where);
1458 void mouse_add_new_meter_event (nframes64_t where);
1460 void remove_tempo_marker (ArdourCanvas::Item*);
1461 void remove_meter_marker (ArdourCanvas::Item*);
1462 gint real_remove_tempo_marker (ARDOUR::TempoSection*);
1463 gint real_remove_meter_marker (ARDOUR::MeterSection*);
1465 void edit_tempo_section (ARDOUR::TempoSection*);
1466 void edit_meter_section (ARDOUR::MeterSection*);
1467 void edit_tempo_marker (ArdourCanvas::Item*);
1468 void edit_meter_marker (ArdourCanvas::Item*);
1470 void marker_menu_edit ();
1471 void marker_menu_remove ();
1472 void marker_menu_rename ();
1473 void marker_menu_lock (bool yn);
1474 void marker_menu_hide ();
1475 void marker_menu_loop_range ();
1476 void marker_menu_select_all_selectables_using_range ();
1477 void marker_menu_select_using_range ();
1478 void marker_menu_separate_regions_using_location ();
1479 void marker_menu_play_from ();
1480 void marker_menu_play_range ();
1481 void marker_menu_set_playhead ();
1482 void marker_menu_set_from_playhead ();
1483 void marker_menu_set_from_selection ();
1484 void marker_menu_range_to_next ();
1485 void marker_menu_export_range ();
1486 void new_transport_marker_menu_set_loop ();
1487 void new_transport_marker_menu_set_punch ();
1488 void update_loop_range_view (bool visibility=false);
1489 void update_punch_range_view (bool visibility=false);
1490 gint new_transport_marker_menu_popdown (GdkEventAny*);
1491 void marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
1492 void tm_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
1493 void transport_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
1494 void new_transport_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
1495 void build_range_marker_menu (bool loop_or_punch);
1496 void build_marker_menu (bool start_or_end);
1497 void build_tm_marker_menu ();
1498 void build_new_transport_marker_menu ();
1500 Gtk::Menu* tm_marker_menu;
1501 Gtk::Menu* marker_menu;
1502 Gtk::Menu* start_end_marker_menu;
1503 Gtk::Menu* range_marker_menu;
1504 Gtk::Menu* transport_marker_menu;
1505 Gtk::Menu* new_transport_marker_menu;
1506 Gtk::Menu* cd_marker_menu;
1507 ArdourCanvas::Item* marker_menu_item;
1509 typedef list<Marker*> Marks;
1512 void remove_metric_marks ();
1513 void draw_metric_marks (const ARDOUR::Metrics& metrics);
1515 void tempo_map_changed (ARDOUR::Change);
1516 void redisplay_tempo (bool immediate_redraw);
1518 void snap_to (nframes64_t& first, int32_t direction = 0, bool for_mark = false);
1520 uint32_t bbt_beat_subdivision;
1524 void editor_mixer_button_toggled ();
1526 AudioClock edit_point_clock;
1527 AudioClock zoom_range_clock;
1528 Gtk::Button zoom_in_button;
1529 Gtk::Button zoom_out_button;
1530 Gtk::Button zoom_out_full_button;
1531 Gtk::Button zoom_onetoone_button;
1533 Gtk::VBox toolbar_clock_vbox;
1534 Gtk::VBox toolbar_selection_clock_vbox;
1535 Gtk::Table toolbar_selection_clock_table;
1536 Gtk::Label toolbar_selection_cursor_label;
1538 Gtk::HBox mouse_mode_button_box;
1539 Gtkmm2ext::TearOff* mouse_mode_tearoff;
1540 Gtk::ToggleButton mouse_select_button;
1541 Gtk::ToggleButton mouse_move_button;
1542 Gtk::ToggleButton mouse_gain_button;
1543 Gtk::ToggleButton mouse_zoom_button;
1544 Gtk::ToggleButton mouse_timefx_button;
1545 Gtk::ToggleButton mouse_audition_button;
1546 GroupedButtons *mouse_mode_button_set;
1547 void mouse_mode_toggled (Editing::MouseMode m);
1548 bool ignore_mouse_mode_toggle;
1550 gint mouse_select_button_release (GdkEventButton*);
1552 Gtk::VBox automation_box;
1553 Gtk::Button automation_mode_button;
1554 Gtk::ToggleButton global_automation_button;
1556 Gtk::ComboBoxText edit_mode_selector;
1557 Gtk::VBox edit_mode_box;
1559 void set_edit_mode (ARDOUR::EditMode);
1560 void cycle_edit_mode ();
1561 void edit_mode_selection_done ();
1563 Gtk::ComboBoxText snap_type_selector;
1564 Gtk::ComboBoxText snap_mode_selector;
1567 std::vector<std::string> snap_type_strings;
1568 std::vector<std::string> snap_mode_strings;
1570 void snap_type_selection_done ();
1571 void snap_mode_selection_done ();
1572 void snap_mode_chosen (Editing::SnapMode);
1573 void snap_type_chosen (Editing::SnapType);
1575 Glib::RefPtr<Gtk::RadioAction> snap_type_action (Editing::SnapType);
1576 Glib::RefPtr<Gtk::RadioAction> snap_mode_action (Editing::SnapMode);
1578 Gtk::ComboBoxText zoom_focus_selector;
1579 Gtk::VBox zoom_focus_box;
1581 std::vector<std::string> zoom_focus_strings;
1583 void zoom_focus_selection_done ();
1584 void zoom_focus_chosen (Editing::ZoomFocus);
1586 Glib::RefPtr<Gtk::RadioAction> zoom_focus_action (Editing::ZoomFocus);
1590 void zoom_adjustment_changed();
1592 void edit_point_clock_changed();
1594 void setup_toolbar ();
1596 Gtkmm2ext::TearOff* tools_tearoff;
1597 Gtk::HBox toolbar_hbox;
1598 Gtk::EventBox toolbar_base;
1599 Gtk::Frame toolbar_frame;
1601 /* selection process */
1603 Selection* selection;
1604 Selection* cut_buffer;
1606 void time_selection_changed ();
1607 void track_selection_changed ();
1608 void region_selection_changed ();
1609 void sensitize_the_right_region_actions (bool have_selected_regions);
1610 void point_selection_changed ();
1611 void marker_selection_changed ();
1620 void start_selection_op (ArdourCanvas::Item* item, GdkEvent* event, SelectionOp);
1621 void drag_selection (ArdourCanvas::Item* item, GdkEvent* event);
1622 void end_selection_op (ArdourCanvas::Item* item, GdkEvent* event);
1623 void cancel_selection ();
1625 void region_selection_op (void (ARDOUR::Region::*pmf)(void));
1626 void region_selection_op (void (ARDOUR::Region::*pmf)(void*), void*);
1627 void region_selection_op (void (ARDOUR::Region::*pmf)(bool), bool);
1629 bool audio_region_selection_covers (nframes64_t where);
1631 /* transport range select process */
1632 enum RangeMarkerOp {
1634 CreateTransportMarker,
1638 void start_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event, RangeMarkerOp);
1639 void drag_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event);
1640 void end_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event);
1642 ArdourCanvas::SimpleRect* cd_marker_bar_drag_rect;
1643 ArdourCanvas::SimpleRect* range_bar_drag_rect;
1644 ArdourCanvas::SimpleRect* transport_bar_drag_rect;
1645 ArdourCanvas::Line* marker_drag_line;
1646 ArdourCanvas::Points marker_drag_line_points;
1647 ArdourCanvas::SimpleRect* range_marker_drag_rect;
1649 void update_marker_drag_item (ARDOUR::Location *);
1651 ArdourCanvas::SimpleRect *transport_bar_range_rect;
1652 ArdourCanvas::SimpleRect *transport_bar_preroll_rect;
1653 ArdourCanvas::SimpleRect *transport_bar_postroll_rect;
1654 ArdourCanvas::SimpleRect *transport_loop_range_rect;
1655 ArdourCanvas::SimpleRect *transport_punch_range_rect;
1656 ArdourCanvas::SimpleLine *transport_punchin_line;
1657 ArdourCanvas::SimpleLine *transport_punchout_line;
1658 ArdourCanvas::SimpleRect *transport_preroll_rect;
1659 ArdourCanvas::SimpleRect *transport_postroll_rect;
1661 ARDOUR::Location* transport_loop_location();
1662 ARDOUR::Location* transport_punch_location();
1664 ARDOUR::Location *temp_location;
1666 /* object rubberband select process */
1668 void start_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event);
1669 void drag_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event);
1670 void end_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event);
1672 bool select_all_within (nframes64_t start, nframes64_t end, gdouble topy, gdouble boty, const TrackViewList&, Selection::Operation op);
1674 ArdourCanvas::SimpleRect *rubberband_rect;
1676 /* mouse zoom process */
1678 void start_mouse_zoom (ArdourCanvas::Item* item, GdkEvent* event);
1679 void drag_mouse_zoom (ArdourCanvas::Item* item, GdkEvent* event);
1680 void end_mouse_zoom (ArdourCanvas::Item* item, GdkEvent* event);
1682 ArdourCanvas::SimpleRect *zoom_rect;
1683 void reposition_zoom_rect (nframes64_t start, nframes64_t end);
1685 /* diskstream/route display management */
1687 struct RouteDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
1688 RouteDisplayModelColumns() {
1691 add (temporary_visible);
1695 Gtk::TreeModelColumn<Glib::ustring> text;
1696 Gtk::TreeModelColumn<bool> visible;
1697 Gtk::TreeModelColumn<bool> temporary_visible;
1698 Gtk::TreeModelColumn<TimeAxisView*> tv;
1699 Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Route> > route;
1702 RouteDisplayModelColumns route_display_columns;
1703 Glib::RefPtr<Gtk::ListStore> route_display_model;
1704 Glib::RefPtr<Gtk::TreeSelection> route_display_selection;
1706 Gtkmm2ext::DnDTreeView<boost::shared_ptr<ARDOUR::Route> > route_list_display;
1707 Gtk::ScrolledWindow route_list_scroller;
1708 Gtk::Menu* route_list_menu;
1710 void update_route_visibility ();
1712 void sync_order_keys ();
1713 bool ignore_route_order_sync;
1715 bool route_list_display_button_press (GdkEventButton*);
1716 void route_list_display_drag_data_received (const Glib::RefPtr<Gdk::DragContext>& context,
1719 const Gtk::SelectionData& data,
1723 bool route_list_selection_filter (const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::Path& path, bool yn);
1725 void route_list_change (const Gtk::TreeModel::Path&,const Gtk::TreeModel::iterator&);
1726 void route_list_delete (const Gtk::TreeModel::Path&);
1727 void track_list_reorder (const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iter, int* new_order);
1729 void initial_route_list_display ();
1730 void redisplay_route_list();
1731 bool ignore_route_list_reorder;
1732 bool no_route_list_redisplay;
1734 void build_route_list_menu ();
1735 void show_route_list_menu ();
1737 void show_all_routes ();
1738 void hide_all_routes ();
1739 void show_all_audiotracks ();
1740 void hide_all_audiotracks ();
1741 void show_all_audiobus ();
1742 void hide_all_audiobus ();
1744 void set_all_tracks_visibility (bool yn);
1745 void set_all_audio_visibility (int type, bool yn);
1747 /* edit group management */
1749 struct GroupListModelColumns : public Gtk::TreeModel::ColumnRecord {
1750 GroupListModelColumns () {
1756 Gtk::TreeModelColumn<bool> is_active;
1757 Gtk::TreeModelColumn<bool> is_visible;
1758 Gtk::TreeModelColumn<std::string> text;
1759 Gtk::TreeModelColumn<ARDOUR::RouteGroup*> routegroup;
1762 GroupListModelColumns group_columns;
1763 Glib::RefPtr<Gtk::ListStore> group_model;
1764 Glib::RefPtr<Gtk::TreeSelection> group_selection;
1766 Gtk::TreeView edit_group_display;
1767 Gtk::ScrolledWindow edit_group_display_scroller;
1768 Gtk::Menu* edit_group_list_menu;
1770 void build_edit_group_list_menu ();
1771 void activate_all_edit_groups ();
1772 void disable_all_edit_groups ();
1774 bool in_edit_group_row_change;
1775 void edit_group_row_change (const Gtk::TreeModel::Path&,const Gtk::TreeModel::iterator&);
1776 void edit_group_name_edit (const Glib::ustring&, const Glib::ustring&);
1777 void new_edit_group ();
1778 void edit_group_list_button_clicked ();
1779 gint edit_group_list_button_press_event (GdkEventButton* ev);
1780 void add_edit_group (ARDOUR::RouteGroup* group);
1781 void remove_selected_edit_group ();
1782 void edit_groups_changed ();
1783 void group_flags_changed (void*, ARDOUR::RouteGroup*);
1785 Gtk::VBox list_vpacker;
1789 bool autoscroll_active;
1790 int autoscroll_timeout_tag;
1793 int last_autoscroll_x;
1794 int last_autoscroll_y;
1795 uint32_t autoscroll_cnt;
1796 nframes64_t autoscroll_x_distance;
1797 double autoscroll_y_distance;
1799 static gint _autoscroll_canvas (void *);
1800 bool autoscroll_canvas ();
1801 void start_canvas_autoscroll (int x, int y);
1802 void stop_canvas_autoscroll ();
1803 void maybe_autoscroll (GdkEventMotion*);
1804 void maybe_autoscroll_horizontally (GdkEventMotion*);
1805 bool allow_vertical_scroll;
1814 void start_trim (ArdourCanvas::Item*, GdkEvent*);
1815 void point_trim (GdkEvent*);
1816 void trim_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1817 void single_contents_trim (RegionView&, nframes64_t, bool, bool, bool);
1818 void single_start_trim (RegionView&, nframes64_t, bool, bool);
1819 void single_end_trim (RegionView&, nframes64_t, bool, bool);
1821 void trim_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1822 void thaw_region_after_trim (RegionView& rv);
1824 void trim_region_front();
1825 void trim_region_back();
1826 void trim_region (bool front);
1828 void trim_region_to_edit_point ();
1829 void trim_region_from_edit_point ();
1830 void trim_region_to_loop ();
1831 void trim_region_to_punch ();
1832 void trim_region_to_location (const ARDOUR::Location&, const char* cmd);
1834 bool show_gain_after_trim;
1838 int convert_drop_to_paths (std::vector<Glib::ustring>& paths,
1839 const Glib::RefPtr<Gdk::DragContext>& context,
1842 const Gtk::SelectionData& data,
1846 void track_canvas_drag_data_received (const Glib::RefPtr<Gdk::DragContext>& context,
1849 const Gtk::SelectionData& data,
1853 void region_list_display_drag_data_received (const Glib::RefPtr<Gdk::DragContext>& context,
1856 const Gtk::SelectionData& data,
1861 void drop_paths (const Glib::RefPtr<Gdk::DragContext>& context,
1864 const Gtk::SelectionData& data,
1868 void drop_regions (const Glib::RefPtr<Gdk::DragContext>& context,
1871 const Gtk::SelectionData& data,
1877 ExportDialog *export_dialog;
1878 ExportDialog *export_range_markers_dialog;
1880 void export_range (nframes64_t start, nframes64_t end);
1881 void export_range_markers ();
1883 int write_region_selection(RegionSelection&);
1884 bool write_region (string path, boost::shared_ptr<ARDOUR::AudioRegion>);
1885 void export_region ();
1886 void bounce_region_selection ();
1887 void bounce_range_selection (bool replace);
1888 void external_edit_region ();
1890 int write_audio_selection (TimeSelection&);
1891 bool write_audio_range (ARDOUR::AudioPlaylist&, uint32_t channels, list<ARDOUR::AudioRange>&);
1893 void write_selection ();
1897 UndoAction get_memento() const;
1899 XMLNode *before; /* used in *_reversible_command */
1900 void begin_reversible_command (string cmd_name);
1901 void commit_reversible_command ();
1903 void update_title ();
1904 void update_title_s (const string & snapshot_name);
1907 Selection* selection;
1908 double frames_per_unit;
1914 void store_state (State&) const;
1915 void restore_state (State *);
1917 void instant_save ();
1919 boost::shared_ptr<ARDOUR::AudioRegion> last_audition_region;
1921 /* freeze operations */
1923 ARDOUR::InterThreadInfo freeze_status;
1924 gint freeze_progress_timeout (void *);
1925 static void* _freeze_thread (void*);
1926 void* freeze_thread ();
1928 void freeze_route ();
1929 void unfreeze_route ();
1931 /* edit-group solo + mute */
1933 void set_edit_group_solo (ARDOUR::Route&, bool);
1934 void set_edit_group_mute (ARDOUR::Route&, bool);
1938 void duplicate_dialog (bool with_dialog);
1940 nframes64_t event_frame (GdkEvent*, double* px = 0, double* py = 0) const;
1942 /* returns false if mouse pointer is not in track or marker canvas
1944 bool mouse_frame (nframes64_t&, bool& in_track_canvas) const;
1946 void time_fx_motion (ArdourCanvas::Item*, GdkEvent*);
1947 void start_time_fx (ArdourCanvas::Item*, GdkEvent*);
1948 void end_time_fx (ArdourCanvas::Item*, GdkEvent*);
1950 struct TimeFXDialog : public ArdourDialog {
1951 ARDOUR::TimeFXRequest request;
1954 Gtk::Adjustment pitch_octave_adjustment;
1955 Gtk::Adjustment pitch_semitone_adjustment;
1956 Gtk::Adjustment pitch_cent_adjustment;
1957 Gtk::SpinButton pitch_octave_spinner;
1958 Gtk::SpinButton pitch_semitone_spinner;
1959 Gtk::SpinButton pitch_cent_spinner;
1960 RegionSelection regions;
1961 Gtk::ProgressBar progress_bar;
1964 Gtk::ToggleButton quick_button;
1965 Gtk::ToggleButton antialias_button;
1966 Gtk::HBox upper_button_box;
1969 Gtk::ComboBoxText stretch_opts_selector;
1970 Gtk::Label stretch_opts_label;
1971 Gtk::ToggleButton precise_button;
1974 Gtk::Button* cancel_button;
1975 Gtk::Button* action_button;
1979 TimeFXDialog (Editor& e, bool for_pitch);
1981 gint update_progress ();
1982 sigc::connection first_cancel;
1983 sigc::connection first_delete;
1984 void cancel_in_progress ();
1985 gint delete_in_progress (GdkEventAny*);
1988 /* "whats mine is yours" */
1990 friend class TimeFXDialog;
1992 TimeFXDialog* current_timefx;
1994 static void* timefx_thread (void *arg);
1995 void do_timefx (TimeFXDialog&);
1997 int time_stretch (RegionSelection&, float fraction);
1998 int pitch_shift (RegionSelection&, float cents);
1999 void pitch_shift_regions ();
2000 int time_fx (RegionSelection&, float val, bool pitching);
2002 /* editor-mixer strip */
2004 MixerStrip *current_mixer_strip;
2005 bool show_editor_mixer_when_tracks_arrive;
2006 Gtk::VBox current_mixer_strip_vbox;
2007 void cms_deleted ();
2008 void current_mixer_strip_hidden ();
2009 void current_mixer_strip_removed ();
2011 void detach_tearoff (Gtk::Box* b, Gtk::Window* w);
2012 void reattach_tearoff (Gtk::Box* b, Gtk::Window* w, int32_t n);
2014 /* nudging tracks */
2016 void nudge_track (bool use_edit_point, bool forwards);
2020 bool _xfade_visibility;
2022 /* <CMT Additions> */
2023 void handle_new_imageframe_time_axis_view(const string & track_name, void* src) ;
2024 void handle_new_imageframe_marker_time_axis_view(const string & track_name, TimeAxisView* marked_track) ;
2026 void start_imageframe_grab(ArdourCanvas::Item*, GdkEvent*) ;
2027 void start_markerview_grab(ArdourCanvas::Item*, GdkEvent*) ;
2029 void imageframe_drag_motion_callback(ArdourCanvas::Item*, GdkEvent*) ;
2030 void markerview_drag_motion_callback(ArdourCanvas::Item*, GdkEvent*) ;
2031 void timeaxis_item_drag_finished_callback(ArdourCanvas::Item*, GdkEvent*) ;
2033 gint canvas_imageframe_item_view_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameView* ifv);
2034 gint canvas_imageframe_view_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameTimeAxis* ifta);
2035 gint canvas_imageframe_start_handle_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameView* ifv);
2036 gint canvas_imageframe_end_handle_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameView* ifv);
2038 gint canvas_marker_time_axis_view_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerTimeAxis* mta);
2039 gint canvas_markerview_item_view_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerView* mv);
2040 gint canvas_markerview_start_handle_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerView* mv);
2041 gint canvas_markerview_end_handle_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerView* mv);
2043 void imageframe_start_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
2044 void imageframe_end_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
2045 void imageframe_start_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
2046 void imageframe_start_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
2047 void imageframe_end_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
2048 void imageframe_end_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
2050 void markerview_item_start_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
2051 void markerview_item_end_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
2052 void markerview_start_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
2053 void markerview_start_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
2054 void markerview_end_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
2055 void markerview_end_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
2057 void popup_imageframe_edit_menu(int button, int32_t time, ArdourCanvas::Item* ifv, bool with_frame) ;
2058 void popup_marker_time_axis_edit_menu(int button, int32_t time, ArdourCanvas::Item* ifv, bool with_frame) ;
2060 ImageFrameSocketHandler* image_socket_listener ;
2061 /* </CMT Additions> */
2063 void toggle_xfade_active (boost::weak_ptr<ARDOUR::Crossfade>);
2064 void toggle_xfade_length (boost::weak_ptr<ARDOUR::Crossfade>);
2065 void edit_xfade (boost::weak_ptr<ARDOUR::Crossfade>);
2066 void xfade_edit_left_region ();
2067 void xfade_edit_right_region ();
2069 static const int32_t default_width = 995;
2070 static const int32_t default_height = 765;
2074 Gtk::Button nudge_forward_button;
2075 Gtk::Button nudge_backward_button;
2076 Gtk::HBox nudge_hbox;
2077 Gtk::VBox nudge_vbox;
2078 AudioClock nudge_clock;
2080 nframes64_t get_nudge_distance (nframes64_t pos, nframes64_t& next);
2082 bool nudge_forward_release (GdkEventButton*);
2083 bool nudge_backward_release (GdkEventButton*);
2087 void apply_filter (ARDOUR::AudioFilter&, string cmd);
2089 /* handling cleanup */
2091 int playlist_deletion_dialog (boost::shared_ptr<ARDOUR::Playlist>);
2093 vector<sigc::connection> session_connections;
2095 /* tracking step changes of track height */
2097 TimeAxisView* current_stepping_trackview;
2098 ARDOUR::microseconds_t last_track_height_step_timestamp;
2099 gint track_height_step_timeout();
2100 sigc::connection step_timeout;
2102 TimeAxisView* entered_track;
2103 RegionView* entered_regionview;
2106 void ensure_entered_track_selected (bool op_acts_on_objects = false);
2107 bool clear_entered_track;
2108 bool left_track_canvas (GdkEventCrossing*);
2109 bool entered_track_canvas (GdkEventCrossing*);
2110 void set_entered_track (TimeAxisView*);
2111 void set_entered_regionview (RegionView*);
2112 gint left_automation_track ();
2114 bool _new_regionviews_show_envelope;
2116 void reset_canvas_action_sensitivity (bool);
2117 void toggle_gain_envelope_visibility ();
2118 void toggle_gain_envelope_active ();
2119 void reset_region_gain_envelopes ();
2121 bool on_key_press_event (GdkEventKey*);
2122 bool on_key_release_event (GdkEventKey*);
2124 void session_state_saved (string);
2126 Glib::RefPtr<Gtk::Action> undo_action;
2127 Glib::RefPtr<Gtk::Action> redo_action;
2129 void history_changed ();
2130 void color_handler ();
2132 Gtk::HBox status_bar_hpacker;
2134 Editing::EditPoint _edit_point;
2136 Gtk::ComboBoxText edit_point_selector;
2138 void set_edit_point_preference (Editing::EditPoint ep, bool force = false);
2139 void cycle_edit_point (bool with_marker);
2140 void set_edit_point ();
2141 void edit_point_selection_done ();
2142 void edit_point_chosen (Editing::EditPoint);
2143 Glib::RefPtr<Gtk::RadioAction> edit_point_action (Editing::EditPoint);
2144 std::vector<std::string> edit_point_strings;
2146 void selected_marker_moved (ARDOUR::Location*);
2147 sigc::connection edit_point_clock_connection_a;
2148 sigc::connection edit_point_clock_connection_b;
2150 bool get_edit_op_range (nframes64_t& start, nframes64_t& end) const;
2152 void get_regions_at (RegionSelection&, nframes64_t where, const TrackSelection& ts) const;
2153 void get_regions_after (RegionSelection&, nframes64_t where, const TrackSelection& ts) const;
2155 void get_regions_for_action (RegionSelection&, bool allowed_entered_regionview = false);
2157 sigc::connection fast_screen_update_connection;
2158 gint start_updating ();
2159 gint stop_updating ();
2160 void fast_update_strips ();
2161 bool meters_running;
2163 void select_next_route ();
2164 void select_prev_route ();
2166 void snap_to_internal (nframes64_t& first, int32_t direction = 0, bool for_mark = false);
2168 RhythmFerret* rhythm_ferret;
2171 void set_track_height (uint32_t h);
2172 void set_track_height_largest ();
2173 void set_track_height_large ();
2174 void set_track_height_larger ();
2175 void set_track_height_normal ();
2176 void set_track_height_smaller ();
2177 void set_track_height_small ();
2179 void remove_tracks ();
2180 void toggle_tracks_active ();
2181 void waveform_scale_chosen (Editing::WaveformScale);
2185 int32_t resize_idle_target;
2187 friend gboolean _idle_resize (gpointer);
2188 std::vector<TimeAxisView*> pending_resizes;
2191 #endif /* __ardour_editor_h__ */