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__
30 #include <glibmm/ustring.h>
32 #include <boost/optional.hpp>
34 #include <libgnomecanvasmm/canvas.h>
35 #include <libgnomecanvasmm/group.h>
36 #include <libgnomecanvasmm/line.h>
37 #include <libgnomecanvasmm/pixbuf.h>
41 #include <gtkmm/layout.h>
42 #include <gtkmm/comboboxtext.h>
44 #include <gtkmm2ext/selector.h>
45 #include <gtkmm2ext/click_box.h>
46 #include <gtkmm2ext/dndtreeview.h>
48 #include <pbd/stateful.h>
49 #include <ardour/session.h>
50 #include <ardour/tempo.h>
51 #include <ardour/stretch.h>
52 #include <ardour/location.h>
53 #include <ardour/audioregion.h>
54 #include <ardour/track.h>
55 #include <ardour/types.h>
57 #include "audio_clock.h"
58 #include "gtk-custom-ruler.h"
59 #include "ardour_dialog.h"
60 #include "public_editor.h"
63 #include "editor_items.h"
64 #include "region_selection.h"
73 class AudioDiskstream;
92 class AudioTimeAxisView;
93 class AutomationTimeAxisView;
94 class AudioRegionView;
97 class PlaylistSelector;
100 class AutomationLine;
104 class TrackSelection;
105 class AutomationSelection;
108 class AudioStreamView;
110 class SoundFileOmega;
112 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 () const { return mouse_mode; }
157 void set_midi_edit_cursor (Editing::MidiEditMode);
158 void set_midi_edit_mode (Editing::MidiEditMode, bool force=true);
159 Editing::MidiEditMode current_midi_edit_mode () const { return midi_edit_mode; }
162 void add_imageframe_time_axis(const std::string & track_name, void*) ;
163 void add_imageframe_marker_time_axis(const std::string & track_name, TimeAxisView* marked_track, void*) ;
164 void connect_to_image_compositor() ;
165 void scroll_timeaxis_to_imageframe_item(const TimeAxisViewItem* item) ;
168 TimeAxisView* get_named_time_axis(const std::string & name) ;
169 void foreach_time_axis_view (sigc::slot<void,TimeAxisView&>);
170 void add_to_idle_resize (TimeAxisView*, uint32_t);
172 RouteTimeAxisView* get_route_view_by_id (PBD::ID& id);
174 void consider_auditioning (boost::shared_ptr<ARDOUR::Region>);
175 void hide_a_region (boost::shared_ptr<ARDOUR::Region>);
176 void remove_a_region (boost::shared_ptr<ARDOUR::Region>);
178 #ifdef USE_RUBBERBAND
179 std::vector<std::string> rb_opt_strings;
182 /* option editor-access */
184 void set_show_waveforms (bool yn);
185 bool show_waveforms() const { return _show_waveforms; }
187 void set_waveform_scale (Editing::WaveformScale);
189 void set_show_waveforms_recording (bool yn);
190 bool show_waveforms_recording() const { return _show_waveforms_recording; }
192 /* things that need to be public to be used in the main menubar */
194 void new_region_from_selection ();
195 void separate_regions_between (const TimeSelection&);
196 void separate_region_from_selection ();
197 void separate_region_from_punch ();
198 void separate_region_from_loop ();
199 void separate_regions_using_location (ARDOUR::Location&);
200 void toggle_playback (bool with_abort);
201 void transition_to_rolling (bool forward);
205 nframes64_t unit_to_frame (double unit) const {
206 return (nframes64_t) rint (unit * frames_per_unit);
209 double frame_to_unit (nframes64_t frame) const {
210 return rint ((double) frame / (double) frames_per_unit);
213 double frame_to_unit (double frame) const {
214 return rint (frame / frames_per_unit);
217 /* NOTE: these functions assume that the "pixel" coordinate is
218 the result of using the world->canvas affine transform on a
219 world coordinate. These coordinates already take into
220 account any scrolling carried out by adjusting the
224 nframes64_t pixel_to_frame (double pixel) const {
226 /* pixel can be less than zero when motion events
227 are processed. since we've already run the world->canvas
228 affine, that means that the location *really* is "off
229 to the right" and thus really is "before the start".
233 return (nframes64_t) rint (pixel * frames_per_unit * GNOME_CANVAS(track_canvas->gobj())->pixels_per_unit);
239 gulong frame_to_pixel (nframes64_t frame) const {
240 return (gulong) rint ((frame / (frames_per_unit * GNOME_CANVAS(track_canvas->gobj())->pixels_per_unit)));
243 void flush_canvas ();
247 Selection& get_selection() const { return *selection; }
248 Selection& get_cut_buffer() const { return *cut_buffer; }
250 bool extend_selection_to_track (TimeAxisView&);
252 void play_selection ();
253 void select_all_in_track (Selection::Operation op);
254 void select_all (Selection::Operation op);
255 void invert_selection_in_track ();
256 void invert_selection ();
257 void deselect_all ();
261 void set_show_measures (bool yn);
262 bool show_measures () const { return _show_measures; }
264 /* analysis window */
265 void analyze_region_selection();
266 void analyze_range_selection();
270 void export_audio ();
271 void export_selection ();
272 void export_range ();
273 void export_region ();
275 void add_toplevel_controls (Gtk::Container&);
276 Gtk::HBox& get_status_bar_packer() { return status_bar_hpacker; }
278 void set_zoom_focus (Editing::ZoomFocus);
279 Editing::ZoomFocus get_zoom_focus () const { return zoom_focus; }
280 double get_current_zoom () const { return frames_per_unit; }
282 void temporal_zoom_step (bool coarser);
284 /* stuff that AudioTimeAxisView and related classes use */
286 PlaylistSelector& playlist_selector() const;
287 void route_name_changed (TimeAxisView *);
288 void clear_playlist (boost::shared_ptr<ARDOUR::Playlist>);
290 void new_playlists (TimeAxisView* v);
291 void copy_playlists (TimeAxisView* v);
292 void clear_playlists (TimeAxisView* v);
294 TrackViewList* get_valid_views (TimeAxisView*, ARDOUR::RouteGroup* grp = 0);
296 Width editor_mixer_strip_width;
297 void maybe_add_mixer_strip_width (XMLNode&);
298 void show_editor_mixer (bool yn);
299 void create_editor_mixer ();
300 void show_editor_list (bool yn);
301 void set_selected_mixer_strip (TimeAxisView&);
302 void hide_track_in_display (TimeAxisView& tv, bool temporary = false);
303 void show_track_in_display (TimeAxisView& tv);
305 /* nudge is initiated by transport controls owned by ARDOUR_UI */
307 void nudge_forward (bool next, bool force_playhead);
308 void nudge_backward (bool next, bool force_playhead);
310 /* nudge initiated from context menu */
312 void nudge_forward_capture_offset ();
313 void nudge_backward_capture_offset ();
315 /* playhead/screen stuff */
317 void set_follow_playhead (bool yn);
318 void toggle_follow_playhead ();
319 bool follow_playhead() const { return _follow_playhead; }
320 bool dragging_playhead () const { return _dragging_playhead; }
322 void toggle_waveform_visibility ();
323 void toggle_zero_line_visibility ();
324 void toggle_waveforms_while_recording ();
325 void toggle_measure_visibility ();
326 void toggle_logo_visibility ();
328 double get_physical_screen_width () const { return physical_screen_width; };
329 double physical_screen_width;
330 double physical_screen_height;
332 /* SMPTE timecode & video sync */
334 void smpte_fps_chosen (ARDOUR::SmpteFormat format);
335 void video_pullup_chosen (ARDOUR::Session::PullupFormat pullup);
336 void subframes_per_frame_chosen (uint32_t);
338 void update_smpte_mode();
339 void update_video_pullup();
340 void update_subframes_per_frame ();
344 void toggle_region_fades ();
345 void toggle_region_fades_visible ();
346 void toggle_selected_region_fades (int dir);
347 void update_region_fade_visibility ();
348 void toggle_auto_xfade ();
349 void toggle_xfades_active ();
350 void toggle_xfade_visibility ();
351 bool xfade_visibility() const { return _xfade_visibility; }
352 void update_xfade_visibility ();
353 void update_crossfade_model ();
354 void set_crossfade_model (ARDOUR::CrossfadeModel);
357 void set_layer_model (ARDOUR::LayerModel);
358 void update_layering_model ();
360 void toggle_link_region_and_track_selection ();
361 void toggle_automation_follows_regions ();
363 /* redirect shared ops menu. caller must free returned menu */
365 Gtk::Menu* redirect_menu ();
367 /* floating windows/transient */
369 void ensure_float (Gtk::Window&);
373 void scroll_tracks_down_line ();
374 void scroll_tracks_up_line ();
376 void move_selected_tracks (bool up);
378 bool new_regionviews_display_gain () { return _new_regionviews_show_envelope; }
379 void prepare_for_cleanup ();
380 void finish_cleanup ();
382 void maximise_editing_space();
383 void restore_editing_space();
385 void reset_x_origin (nframes64_t);
386 void reset_zoom (double);
387 void reposition_and_zoom (nframes64_t, double);
389 nframes64_t get_preferred_edit_position (bool ignore_playhead = false);
391 bool update_mouse_speed ();
392 bool decelerate_mouse_speed ();
394 void toggle_meter_updating();
396 void show_rhythm_ferret();
398 void goto_visual_state (uint32_t);
399 void save_visual_state (uint32_t);
401 void queue_draw_resize_line (int at);
402 void start_resize_line_ops ();
403 void end_resize_line_ops ();
406 void map_transport_state ();
407 void map_position_change (nframes64_t);
410 bool on_expose_event (GdkEventExpose*);
414 /// The session that we are editing, or 0
415 void color_handler ();
416 ARDOUR::Session *session;
419 // to keep track of the playhead position for control_scroll
420 boost::optional<nframes64_t> _control_scroll_target;
422 PlaylistSelector* _playlist_selector;
424 typedef std::pair<TimeAxisView*,XMLNode*> TAVState;
428 double frames_per_unit;
429 nframes64_t leftmost_frame;
430 Editing::ZoomFocus zoom_focus;
431 bool zoomed_to_region;
432 std::list<TAVState> track_states;
435 std::list<VisualState*> undo_visual_stack;
436 std::list<VisualState*> redo_visual_stack;
437 VisualState* current_visual_state (bool with_tracks = true);
438 void undo_visual_state ();
439 void redo_visual_state ();
440 void use_visual_state (VisualState&);
442 void swap_visual_state ();
444 std::vector<VisualState*> visual_states;
445 sigc::connection visual_state_op_connection;
446 void start_visual_state_op (uint32_t n);
447 void cancel_visual_state_op (uint32_t n);
448 bool end_visual_state_op (uint32_t n);
450 nframes64_t leftmost_frame;
451 double frames_per_unit;
452 Editing::ZoomFocus zoom_focus;
454 void set_frames_per_unit (double);
457 Editing::MouseMode mouse_mode;
458 Editing::MidiEditMode midi_edit_mode;
460 int post_maximal_editor_width;
461 int post_maximal_pane_position;
462 int pre_maximal_pane_position;
463 int pre_maximal_editor_width;
464 void pane_allocation_handler (Gtk::Allocation&, Gtk::Paned*);
466 Gtk::Notebook the_notebook;
467 Gtk::HPaned edit_pane;
469 Gtk::EventBox meter_base;
471 Gtk::EventBox marker_base;
472 Gtk::HBox marker_box;
473 Gtk::VBox scrollers_rulers_markers_box;
475 void location_changed (ARDOUR::Location *);
476 void location_flags_changed (ARDOUR::Location *, void *);
477 void refresh_location_display ();
478 void refresh_location_display_s (ARDOUR::Change);
479 void refresh_location_display_internal (ARDOUR::Locations::LocationList&);
480 void add_new_location (ARDOUR::Location *);
481 void location_gone (ARDOUR::Location *);
482 void remove_marker (ArdourCanvas::Item&, GdkEvent*);
483 gint really_remove_marker (ARDOUR::Location* loc);
484 void goto_nth_marker (int nth);
486 uint32_t location_marker_color;
487 uint32_t location_range_color;
488 uint32_t location_loop_color;
489 uint32_t location_punch_color;
490 uint32_t location_cd_marker_color;
492 struct LocationMarkers {
497 LocationMarkers () : start(0), end(0), valid (true) {}
503 void set_name (const string&);
504 void set_position (nframes64_t start, nframes64_t end = 0);
505 void set_color_rgba (uint32_t);
508 LocationMarkers *find_location_markers (ARDOUR::Location *) const;
509 ARDOUR::Location* find_location_from_marker (Marker *, bool& is_start) const;
510 Marker* entered_marker;
512 typedef std::map<ARDOUR::Location*,LocationMarkers *> LocationMarkerMap;
513 LocationMarkerMap location_markers;
515 void hide_marker (ArdourCanvas::Item*, GdkEvent*);
516 void clear_marker_display ();
517 void mouse_add_new_marker (nframes64_t where, bool is_cd=false, bool is_xrun=false);
518 bool choose_new_marker_name(string &name);
519 void update_cd_marker_display ();
520 void ensure_cd_marker_updated (LocationMarkers * lam, ARDOUR::Location * location);
522 TimeAxisView* clicked_axisview;
523 RouteTimeAxisView* clicked_routeview;
524 /** The last RegionView that was clicked on, or 0 if the last click was not
525 * on a RegionView. This is set up by the canvas event handlers in
526 * editor_canvas_events.cc
528 RegionView* clicked_regionview;
529 RegionSelection latest_regionviews;
530 uint32_t clicked_selection;
531 CrossfadeView* clicked_crossfadeview;
532 ControlPoint* clicked_control_point;
534 void sort_track_selection (TrackSelection* sel = 0);
536 void get_relevant_tracks (std::set<RouteTimeAxisView*>& relevant_tracks);
537 void get_equivalent_regions (RegionView* rv, std::vector<RegionView*>&) const;
538 void mapover_tracks (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl, TimeAxisView*) const;
540 /* functions to be passed to mapover_tracks(), possibly with sigc::bind()-supplied arguments */
542 void mapped_get_equivalent_regions (RouteTimeAxisView&, uint32_t, RegionView*, vector<RegionView*>*) const;
543 void mapped_use_new_playlist (RouteTimeAxisView&, uint32_t, vector<boost::shared_ptr<ARDOUR::Playlist> > const &);
544 void mapped_use_copy_playlist (RouteTimeAxisView&, uint32_t, vector<boost::shared_ptr<ARDOUR::Playlist> > const &);
545 void mapped_clear_playlist (RouteTimeAxisView&, uint32_t);
549 void button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type);
550 bool button_release_can_deselect;
552 void catch_vanishing_regionview (RegionView *);
554 void set_selected_track (TimeAxisView&, Selection::Operation op = Selection::Set, bool no_remove=false);
555 void select_all_tracks ();
557 int get_regionview_count_from_region_list (boost::shared_ptr<ARDOUR::Region> region);
559 bool set_selected_control_point_from_click (Selection::Operation op = Selection::Set, bool no_remove=false);
560 void set_selected_track_from_click (bool press, Selection::Operation op = Selection::Set, bool no_remove=false);
561 void set_selected_track_as_side_effect (bool force = false);
562 bool set_selected_regionview_from_click (bool press, Selection::Operation op = Selection::Set, bool no_track_remove=false);
564 void set_selected_regionview_from_region_list (boost::shared_ptr<ARDOUR::Region> region, Selection::Operation op = Selection::Set);
565 bool set_selected_regionview_from_map_event (GdkEventAny*, StreamView*, boost::weak_ptr<ARDOUR::Region>);
566 void collect_new_region_view (RegionView *);
567 void collect_and_select_new_region_view (RegionView *);
569 Gtk::Menu track_context_menu;
570 Gtk::Menu track_region_context_menu;
571 Gtk::Menu track_selection_context_menu;
572 Gtk::Menu track_crossfade_context_menu;
574 Gtk::MenuItem* region_edit_menu_split_item;
575 Gtk::MenuItem* region_edit_menu_split_multichannel_item;
576 Gtk::Menu * track_region_edit_playlist_menu;
577 Gtk::Menu * track_edit_playlist_submenu;
578 Gtk::Menu * track_selection_edit_playlist_submenu;
580 void popup_track_context_menu (int, int, ItemType, bool, nframes64_t);
581 Gtk::Menu* build_track_context_menu (nframes64_t);
582 Gtk::Menu* build_track_bus_context_menu (nframes64_t);
583 Gtk::Menu* build_track_region_context_menu (nframes64_t frame);
584 Gtk::Menu* build_track_crossfade_context_menu (nframes64_t);
585 Gtk::Menu* build_track_selection_context_menu (nframes64_t);
586 void add_dstream_context_items (Gtk::Menu_Helpers::MenuList&);
587 void add_bus_context_items (Gtk::Menu_Helpers::MenuList&);
588 void add_region_context_items (StreamView*, boost::shared_ptr<ARDOUR::Region>, Gtk::Menu_Helpers::MenuList&);
589 void add_crossfade_context_items (AudioStreamView*, boost::shared_ptr<ARDOUR::Crossfade>, Gtk::Menu_Helpers::MenuList&, bool many);
590 void add_selection_context_items (Gtk::Menu_Helpers::MenuList&);
592 void add_item_with_sensitivity (Gtk::Menu_Helpers::MenuList&, Gtk::Menu_Helpers::MenuElem, bool) const;
594 void handle_new_route (ARDOUR::Session::RouteList&);
595 void remove_route (TimeAxisView *);
598 Gtk::HBox global_hpacker;
599 Gtk::VBox global_vpacker;
602 bool need_resize_line;
604 int old_resize_line_y;
606 Gdk::Cursor* current_canvas_cursor;
607 void set_canvas_cursor ();
608 Gdk::Cursor* which_grabber_cursor ();
610 ArdourCanvas::Canvas* track_canvas;
612 ArdourCanvas::Text* first_action_message;
613 ArdourCanvas::Text* verbose_canvas_cursor;
614 bool verbose_cursor_visible;
616 void parameter_changed (const char *);
618 bool track_canvas_motion (GdkEvent*);
620 void set_verbose_canvas_cursor (const string &, double x, double y);
621 void set_verbose_canvas_cursor_text (const string &);
622 void show_verbose_canvas_cursor();
623 void hide_verbose_canvas_cursor();
625 bool verbose_cursor_on; // so far unused
627 Gtk::EventBox time_canvas_event_box;
628 Gtk::EventBox track_canvas_event_box;
629 Gtk::EventBox time_button_event_box;
630 Gtk::EventBox ruler_label_event_box;
632 ArdourCanvas::Group *minsec_group;
633 ArdourCanvas::Pixbuf *logo_item;
634 ArdourCanvas::Group *bbt_group;
635 ArdourCanvas::Group *smpte_group;
636 ArdourCanvas::Group *frame_group;
637 ArdourCanvas::Group *tempo_group;
638 ArdourCanvas::Group *meter_group;
639 ArdourCanvas::Group *marker_group;
640 ArdourCanvas::Group *range_marker_group;
641 ArdourCanvas::Group *transport_marker_group;
642 ArdourCanvas::Group* cd_marker_group;
644 ArdourCanvas::Group* timebar_group;
646 /* These bars never need to be scrolled */
647 ArdourCanvas::Group* meter_bar_group;
648 ArdourCanvas::Group* tempo_bar_group;
649 ArdourCanvas::Group* marker_bar_group;
650 ArdourCanvas::Group* range_marker_bar_group;
651 ArdourCanvas::Group* transport_marker_bar_group;
652 ArdourCanvas::Group* cd_marker_bar_group;
654 /** The group containing all items that require horizontal scrolling. */
655 ArdourCanvas::Group* _background_group;
657 The _master_group is the group containing all items
658 that require horizontal scrolling..
659 It is primarily used to separate canvas items
660 that require horizontal scrolling from those that do not.
662 ArdourCanvas::Group* _master_group;
664 /* The group containing all trackviews. Only scrolled vertically. */
665 ArdourCanvas::Group* _trackview_group;
667 /* The group used for region motion. Sits on top of _trackview_group */
668 ArdourCanvas::Group* _region_motion_group;
671 ruler_metric_smpte = 0,
672 ruler_metric_bbt = 1,
673 ruler_metric_frames = 2,
674 ruler_metric_minsec = 3,
676 ruler_time_tempo = 4,
677 ruler_time_meter = 5,
678 ruler_time_marker = 6,
679 ruler_time_range_marker = 7,
680 ruler_time_transport_marker = 8,
681 ruler_time_cd_marker = 9,
684 static GtkCustomMetric ruler_metrics[4];
685 Glib::RefPtr<Gtk::ToggleAction> ruler_timecode_action;
686 Glib::RefPtr<Gtk::ToggleAction> ruler_bbt_action;
687 Glib::RefPtr<Gtk::ToggleAction> ruler_samples_action;
688 Glib::RefPtr<Gtk::ToggleAction> ruler_minsec_action;
689 Glib::RefPtr<Gtk::ToggleAction> ruler_tempo_action;
690 Glib::RefPtr<Gtk::ToggleAction> ruler_meter_action;
691 Glib::RefPtr<Gtk::ToggleAction> ruler_marker_action;
692 Glib::RefPtr<Gtk::ToggleAction> ruler_range_action;
693 Glib::RefPtr<Gtk::ToggleAction> ruler_loop_punch_action;
694 Glib::RefPtr<Gtk::ToggleAction> ruler_cd_marker_action;
695 bool no_ruler_shown_update;
697 gint ruler_button_press (GdkEventButton*);
698 gint ruler_button_release (GdkEventButton*);
699 gint ruler_mouse_motion (GdkEventMotion*);
700 bool ruler_scroll (GdkEventScroll* event);
702 gint ruler_pressed_button;
703 Gtk::Widget * ruler_grabbed_widget;
705 void initialize_rulers ();
706 void update_just_smpte ();
707 void compute_fixed_ruler_scale (); //calculates the RulerScale of the fixed rulers
708 void update_fixed_rulers ();
709 void update_tempo_based_rulers ();
710 void popup_ruler_menu (nframes64_t where = 0, ItemType type = RegionItem);
711 void update_ruler_visibility ();
712 void set_ruler_visible (RulerType, bool);
713 void toggle_ruler_visibility (RulerType rt);
714 void ruler_toggled (int);
715 gint ruler_label_button_release (GdkEventButton*);
716 void store_ruler_visibility ();
717 void restore_ruler_visibility ();
719 static gint _metric_get_smpte (GtkCustomRulerMark **, gdouble, gdouble, gint);
720 static gint _metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint);
721 static gint _metric_get_frames (GtkCustomRulerMark **, gdouble, gdouble, gint);
722 static gint _metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint);
724 enum MinsecRulerScale {
731 MinsecRulerScale minsec_ruler_scale;
733 nframes_t minsec_mark_interval;
734 gint minsec_mark_modulo;
736 void set_minsec_ruler_scale (gdouble lower, gdouble upper);
738 enum SMPTERulerScale {
746 SMPTERulerScale smpte_ruler_scale;
748 nframes_t smpte_mark_interval;
749 gint smpte_mark_modulo;
751 void set_smpte_ruler_scale (gdouble lower, gdouble upper);
761 bbt_show_ticks_detail,
762 bbt_show_ticks_super_detail
765 BBTRulerScale bbt_ruler_scale;
769 uint32_t bbt_bar_helper_on;
770 uint32_t bbt_accent_modulo;
771 void compute_bbt_ruler_scale (nframes64_t lower, nframes64_t upper);
773 gint metric_get_smpte (GtkCustomRulerMark **, gdouble, gdouble, gint);
774 gint metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint);
775 gint metric_get_frames (GtkCustomRulerMark **, gdouble, gdouble, gint);
776 gint metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint);
778 Gtk::Widget *_ruler_separator;
779 GtkWidget *_smpte_ruler;
780 GtkWidget *_bbt_ruler;
781 GtkWidget *_frames_ruler;
782 GtkWidget *_minsec_ruler;
783 Gtk::Widget *smpte_ruler;
784 Gtk::Widget *bbt_ruler;
785 Gtk::Widget *frames_ruler;
786 Gtk::Widget *minsec_ruler;
787 static Editor *ruler_editor;
789 static const double timebar_height;
790 guint32 visible_timebars;
791 gdouble canvas_timebars_vsize;
792 gdouble get_canvas_timebars_vsize () const { return canvas_timebars_vsize; }
793 Gtk::Menu *editor_ruler_menu;
795 ArdourCanvas::SimpleRect* tempo_bar;
796 ArdourCanvas::SimpleRect* meter_bar;
797 ArdourCanvas::SimpleRect* marker_bar;
798 ArdourCanvas::SimpleRect* range_marker_bar;
799 ArdourCanvas::SimpleRect* transport_marker_bar;
800 ArdourCanvas::SimpleRect* cd_marker_bar;
802 Gtk::Label minsec_label;
803 Gtk::Label bbt_label;
804 Gtk::Label smpte_label;
805 Gtk::Label frame_label;
806 Gtk::Label tempo_label;
807 Gtk::Label meter_label;
808 Gtk::Label mark_label;
809 Gtk::Label range_mark_label;
810 Gtk::Label transport_mark_label;
811 Gtk::Label cd_mark_label;
814 Gtk::VBox time_button_vbox;
815 Gtk::HBox time_button_hbox;
819 ArdourCanvas::Points points;
820 ArdourCanvas::Line canvas_item;
821 nframes64_t current_frame;
824 Cursor (Editor&, bool (Editor::*)(GdkEvent*,ArdourCanvas::Item*));
827 void set_position (nframes64_t);
828 void set_length (double units);
829 void set_y_axis (double position);
832 friend struct Cursor; /* it needs access to several private
836 Cursor* playhead_cursor;
837 ArdourCanvas::Group* cursor_group;
839 void cursor_to_region_boundary (Cursor*, int32_t dir);
840 void cursor_to_next_region_boundary (Cursor*);
841 void cursor_to_previous_region_boundary (Cursor*);
842 void cursor_to_next_region_point (Cursor*, ARDOUR::RegionPoint);
843 void cursor_to_previous_region_point (Cursor*, ARDOUR::RegionPoint);
844 void cursor_to_region_point (Cursor*, ARDOUR::RegionPoint, int32_t dir);
845 void cursor_to_selection_start (Cursor *);
846 void cursor_to_selection_end (Cursor *);
848 void selected_marker_to_region_boundary (int32_t dir);
849 void selected_marker_to_next_region_boundary ();
850 void selected_marker_to_previous_region_boundary ();
851 void selected_marker_to_next_region_point (ARDOUR::RegionPoint);
852 void selected_marker_to_previous_region_point (ARDOUR::RegionPoint);
853 void selected_marker_to_region_point (ARDOUR::RegionPoint, int32_t dir);
854 void selected_marker_to_selection_start ();
855 void selected_marker_to_selection_end ();
857 void select_all_selectables_using_cursor (Cursor *, bool);
858 void select_all_selectables_using_edit (bool);
859 void select_all_selectables_between (bool within);
860 void select_range_between ();
862 boost::shared_ptr<ARDOUR::Region> find_next_region (nframes64_t, ARDOUR::RegionPoint, int32_t dir, TrackViewList&, TimeAxisView ** = 0);
863 nframes64_t find_next_region_boundary (nframes64_t, int32_t dir, const TrackViewList&);
865 vector<nframes64_t> region_boundary_cache;
866 void build_region_boundary_cache ();
869 Gtk::HBox bottom_hbox;
871 Gtk::Table edit_packer;
872 Gtk::VScrollbar edit_vscrollbar;
874 Gtk::Adjustment vertical_adjustment;
875 Gtk::Adjustment horizontal_adjustment;
877 Gtk::Layout controls_layout;
878 bool control_layout_scroll (GdkEventScroll* ev);
879 void controls_layout_size_request (Gtk::Requisition*);
880 sigc::connection controls_layout_size_request_connection;
882 Gtk::HScrollbar edit_hscrollbar;
883 bool _dragging_hscrollbar;
885 void reset_hscrollbar_stepping ();
887 bool hscrollbar_button_press (GdkEventButton*);
888 bool hscrollbar_button_release (GdkEventButton*);
889 void hscrollbar_allocate (Gtk::Allocation &alloc);
892 double canvas_height;
893 double full_canvas_height;
895 bool track_canvas_map_handler (GdkEventAny*);
897 gint edit_controls_button_release (GdkEventButton*);
898 Gtk::Menu *edit_controls_left_menu;
899 Gtk::Menu *edit_controls_right_menu;
901 Gtk::VBox ruler_label_vbox;
902 Gtk::VBox track_canvas_vbox;
903 Gtk::VBox time_canvas_vbox;
904 Gtk::VBox edit_controls_vbox;
905 Gtk::HBox edit_controls_hbox;
907 void control_scroll (float);
908 void access_action (std::string,std::string);
909 bool deferred_control_scroll (nframes64_t);
910 sigc::connection control_scroll_connection;
912 gdouble get_trackview_group_vertical_offset () const { return vertical_adjustment.get_value () - canvas_timebars_vsize;}
914 ArdourCanvas::Group* get_background_group () const { return _background_group; }
915 ArdourCanvas::Group* get_trackview_group () const { return _trackview_group; }
916 double last_trackview_group_vertical_offset;
917 void tie_vertical_scrolling ();
918 void scroll_canvas_horizontally ();
919 void scroll_canvas_vertically ();
920 void canvas_horizontally_scrolled ();
921 void canvas_scroll_to (nframes64_t);
923 struct VisualChange {
930 nframes64_t time_origin;
931 double frames_per_unit;
935 VisualChange() : pending ((VisualChange::Type) 0), time_origin (0), frames_per_unit (0), idle_handler_id (-1) {}
939 VisualChange pending_visual_change;
941 static int _idle_visual_changer (void *arg);
942 int idle_visual_changer ();
944 void queue_visual_change (nframes64_t);
945 void queue_visual_change (double);
947 void end_location_changed (ARDOUR::Location*);
949 struct RegionListDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
950 RegionListDisplayModelColumns() {
967 Gtk::TreeModelColumn<Glib::ustring> name;
968 Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Region> > region;
969 Gtk::TreeModelColumn<Gdk::Color> color_;
970 Gtk::TreeModelColumn<Glib::ustring> start;
971 Gtk::TreeModelColumn<Glib::ustring> end;
972 Gtk::TreeModelColumn<Glib::ustring> length;
973 Gtk::TreeModelColumn<Glib::ustring> sync;
974 Gtk::TreeModelColumn<Glib::ustring> fadein;
975 Gtk::TreeModelColumn<Glib::ustring> fadeout;
976 Gtk::TreeModelColumn<bool> locked;
977 Gtk::TreeModelColumn<bool> glued;
978 Gtk::TreeModelColumn<bool> muted;
979 Gtk::TreeModelColumn<bool> opaque;
980 Gtk::TreeModelColumn<Glib::ustring> used;
981 Gtk::TreeModelColumn<Glib::ustring> path;
984 RegionListDisplayModelColumns region_list_columns;
985 Gtkmm2ext::DnDTreeView<boost::shared_ptr<ARDOUR::Region> > region_list_display;
987 Glib::RefPtr<Gtk::TreeStore> region_list_model;
988 Glib::RefPtr<Gtk::ToggleAction> toggle_full_region_list_action;
989 Glib::RefPtr<Gtk::ToggleAction> toggle_show_auto_regions_action;
991 void region_list_region_changed (ARDOUR::Change, boost::weak_ptr<ARDOUR::Region>);
992 void region_list_selection_changed ();
993 bool region_list_selection_filter (const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::Path& path, bool yn);
994 void region_name_edit (const Glib::ustring&, const Glib::ustring&);
995 void get_regions_corresponding_to (boost::shared_ptr<ARDOUR::Region> region, std::vector<RegionView*>& regions);
997 Gtk::Menu *region_list_menu;
998 Gtk::ScrolledWindow region_list_scroller;
999 Gtk::Frame region_list_frame;
1001 bool region_list_display_key_press (GdkEventKey *);
1002 bool region_list_display_key_release (GdkEventKey *);
1003 bool region_list_display_button_press (GdkEventButton *);
1004 bool region_list_display_button_release (GdkEventButton *);
1005 void region_list_clear ();
1006 void region_list_selection_mapover (sigc::slot<void,boost::shared_ptr<ARDOUR::Region> >);
1007 void build_region_list_menu ();
1008 void show_region_list_display_context_menu (int button, int time);
1010 bool show_automatic_regions_in_region_list;
1011 Editing::RegionListSortType region_list_sort_type;
1013 void reset_region_list_sort_direction (bool);
1014 void reset_region_list_sort_type (Editing::RegionListSortType);
1016 void toggle_full_region_list ();
1017 void toggle_show_auto_regions ();
1019 int region_list_sorter (Gtk::TreeModel::iterator, Gtk::TreeModel::iterator);
1023 Gtk::ScrolledWindow snapshot_display_scroller;
1024 struct SnapshotDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
1025 SnapshotDisplayModelColumns() {
1029 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1030 Gtk::TreeModelColumn<Glib::ustring> real_name;
1033 SnapshotDisplayModelColumns snapshot_display_columns;
1034 Glib::RefPtr<Gtk::ListStore> snapshot_display_model;
1035 Gtk::TreeView snapshot_display;
1036 Gtk::Menu snapshot_context_menu;
1038 bool snapshot_display_button_press (GdkEventButton*);
1039 void snapshot_display_selection_changed ();
1040 void redisplay_snapshots();
1041 void popup_snapshot_context_menu (int, int32_t, Glib::ustring);
1043 /* named selections */
1045 struct NamedSelectionDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
1046 NamedSelectionDisplayModelColumns() {
1050 Gtk::TreeModelColumn<Glib::ustring> text;
1051 Gtk::TreeModelColumn<ARDOUR::NamedSelection*> selection;
1054 NamedSelectionDisplayModelColumns named_selection_columns;
1055 Glib::RefPtr<Gtk::TreeStore> named_selection_model;
1057 Gtkmm2ext::DnDTreeView<ARDOUR::NamedSelection*> named_selection_display;
1058 Gtk::ScrolledWindow named_selection_scroller;
1060 void create_named_selection ();
1061 void paste_named_selection (float times);
1062 void remove_selected_named_selections ();
1063 void remove_snapshot (Glib::ustring);
1064 void rename_snapshot (Glib::ustring);
1066 void handle_new_named_selection ();
1067 void add_named_selection_to_named_selection_display (ARDOUR::NamedSelection&);
1068 void redisplay_named_selections ();
1070 bool named_selection_display_button_release (GdkEventButton *ev);
1071 bool named_selection_display_key_release (GdkEventKey *ev);
1072 void named_selection_display_selection_changed ();
1075 TrackViewList track_views;
1076 std::pair<TimeAxisView*, ARDOUR::layer_t> trackview_by_y_position (double);
1078 static Gdk::Cursor* cross_hair_cursor;
1079 static Gdk::Cursor* trimmer_cursor;
1080 static Gdk::Cursor* selector_cursor;
1081 static Gdk::Cursor* grabber_cursor;
1082 static Gdk::Cursor* grabber_edit_point_cursor;
1083 static Gdk::Cursor* zoom_cursor;
1084 static Gdk::Cursor* time_fx_cursor;
1085 static Gdk::Cursor* fader_cursor;
1086 static Gdk::Cursor* speaker_cursor;
1087 static Gdk::Cursor* midi_pencil_cursor;
1088 static Gdk::Cursor* midi_select_cursor;
1089 static Gdk::Cursor* midi_resize_cursor;
1090 static Gdk::Cursor* midi_erase_cursor;
1091 static Gdk::Cursor* wait_cursor;
1092 static Gdk::Cursor* timebar_cursor;
1093 static Gdk::Cursor* transparent_cursor;
1095 static void build_cursors ();
1097 sigc::connection scroll_connection;
1098 nframes64_t last_update_frame;
1099 void center_screen (nframes64_t);
1100 void center_screen_internal (nframes64_t, float);
1102 void update_current_screen ();
1104 void session_going_away ();
1106 nframes64_t cut_buffer_start;
1107 nframes64_t cut_buffer_length;
1109 bool typed_event (ArdourCanvas::Item*, GdkEvent*, ItemType);
1110 bool button_press_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
1111 bool button_release_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
1112 bool motion_handler (ArdourCanvas::Item*, GdkEvent*, ItemType, bool from_autoscroll = false);
1113 bool enter_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
1114 bool leave_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
1116 /* KEYMAP HANDLING */
1118 void register_actions ();
1120 int ensure_cursor (nframes64_t* pos);
1122 void handle_new_region (boost::weak_ptr<ARDOUR::Region>);
1123 void handle_new_regions (vector<boost::weak_ptr<ARDOUR::Region> >& );
1124 void handle_region_removed (boost::weak_ptr<ARDOUR::Region>);
1125 void add_region_to_region_display (boost::shared_ptr<ARDOUR::Region>);
1126 void add_regions_to_region_display (std::vector<boost::weak_ptr<ARDOUR::Region> > & );
1127 void region_hidden (boost::shared_ptr<ARDOUR::Region>);
1128 void redisplay_regions ();
1129 void populate_row (boost::shared_ptr<ARDOUR::Region>, Gtk::TreeModel::Row const &);
1130 void update_region_row (boost::shared_ptr<ARDOUR::Region>);
1131 bool update_region_subrows (boost::shared_ptr<ARDOUR::Region>, Gtk::TreeModel::Row const &, int);
1132 void update_all_region_rows ();
1133 void update_all_region_subrows (Gtk::TreeModel::Row const &, int);
1134 bool no_region_list_redisplay;
1135 void insert_into_tmp_regionlist(boost::shared_ptr<ARDOUR::Region>);
1137 list<boost::shared_ptr<ARDOUR::Region> > tmp_region_list;
1139 void cut_copy (Editing::CutCopyOp);
1140 bool can_cut_copy () const;
1141 void cut_copy_points (Editing::CutCopyOp);
1142 void cut_copy_regions (Editing::CutCopyOp, RegionSelection&);
1143 void cut_copy_ranges (Editing::CutCopyOp);
1145 void mouse_paste ();
1146 void paste_internal (nframes64_t position, float times);
1148 /* EDITING OPERATIONS */
1150 void reset_point_selection ();
1151 void toggle_region_mute ();
1152 void toggle_region_lock ();
1153 void toggle_region_opaque ();
1154 void toggle_record_enable ();
1155 void set_region_lock_style (ARDOUR::Region::PositionLockStyle);
1156 void raise_region ();
1157 void raise_region_to_top ();
1158 void lower_region ();
1159 void lower_region_to_bottom ();
1160 void split_region ();
1161 void split_region_at (nframes64_t);
1162 void split_regions_at (nframes64_t, RegionSelection&);
1163 void split_region_at_transients ();
1164 void split_region_at_points (boost::shared_ptr<ARDOUR::Region>, ARDOUR::AnalysisFeatureList&, bool can_ferret);
1165 void crop_region_to_selection ();
1166 void crop_region_to (nframes64_t start, nframes64_t end);
1167 void set_sync_point (nframes64_t, const RegionSelection&);
1168 void set_region_sync_from_edit_point ();
1169 void remove_region_sync();
1170 void align_selection (ARDOUR::RegionPoint, nframes64_t position, const RegionSelection&);
1171 void align_selection_relative (ARDOUR::RegionPoint point, nframes64_t position, const RegionSelection&);
1172 void align_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, nframes64_t position);
1173 void align_region_internal (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, nframes64_t position);
1174 void remove_selected_regions ();
1175 void remove_clicked_region ();
1176 void edit_region ();
1177 void rename_region ();
1178 void duplicate_some_regions (RegionSelection&, float times);
1179 void duplicate_selection (float times);
1180 void region_fill_selection ();
1182 void region_fill_track ();
1183 void audition_playlist_region_standalone (boost::shared_ptr<ARDOUR::Region>);
1184 void audition_playlist_region_via_route (boost::shared_ptr<ARDOUR::Region>, ARDOUR::Route&);
1185 void split_multichannel_region();
1186 void reverse_region ();
1187 void normalize_region ();
1188 void denormalize_region ();
1189 void adjust_region_scale_amplitude (bool up);
1190 void quantize_region ();
1192 void do_insert_time ();
1193 void insert_time (nframes64_t pos, nframes64_t distance, Editing::InsertTimeOption opt, bool ignore_music_glue, bool markers_too);
1195 void tab_to_transient (bool forward);
1197 void use_region_as_bar ();
1198 void use_range_as_bar ();
1200 void define_one_bar (nframes64_t start, nframes64_t end);
1202 void audition_region_from_region_list ();
1203 void hide_region_from_region_list ();
1204 void remove_region_from_region_list ();
1206 void align (ARDOUR::RegionPoint);
1207 void align_relative (ARDOUR::RegionPoint);
1210 void reset_focus ();
1216 void paste (float times);
1218 int get_prefix (float&, bool&);
1220 void keyboard_paste ();
1221 void keyboard_insert_region_list_selection ();
1223 void region_from_selection ();
1224 void create_region_from_selection (std::vector<boost::shared_ptr<ARDOUR::Region> >&);
1226 void play_from_start ();
1227 void play_from_edit_point ();
1228 void play_from_edit_point_and_return ();
1229 void play_selected_region ();
1230 void play_edit_range ();
1231 void loop_selected_region ();
1232 void play_location (ARDOUR::Location&);
1233 void loop_location (ARDOUR::Location&);
1235 void temporal_zoom_selection ();
1236 void temporal_zoom_region (bool both_axes);
1237 void toggle_zoom_region (bool both_axes);
1238 bool zoomed_to_region;
1239 void temporal_zoom_session ();
1240 void temporal_zoom (gdouble scale);
1241 void temporal_zoom_by_frame (nframes64_t start, nframes64_t end, const string & op);
1242 void temporal_zoom_to_frame (bool coarser, nframes64_t frame);
1244 void amplitude_zoom (gdouble scale);
1245 void amplitude_zoom_step (bool in);
1247 void insert_region_list_drag (boost::shared_ptr<ARDOUR::Region>, int x, int y);
1248 void insert_region_list_selection (float times);
1250 void insert_route_list_drag (boost::shared_ptr<ARDOUR::Route>, int x, int y);
1252 /* import & embed */
1254 void add_external_audio_action (Editing::ImportMode);
1255 void external_audio_dialog ();
1256 void session_import_dialog ();
1258 int check_whether_and_how_to_import(string, bool all_or_nothing = true);
1259 bool check_multichannel_status (const std::vector<Glib::ustring>& paths);
1261 SoundFileOmega* sfbrowser;
1263 void bring_in_external_audio (Editing::ImportMode mode, nframes64_t& pos);
1265 bool idle_drop_paths (std::vector<Glib::ustring> paths, nframes64_t frame, double ypos);
1266 void drop_paths_part_two (const std::vector<Glib::ustring>& paths, nframes64_t frame, double ypos);
1268 void do_import (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode, ARDOUR::SrcQuality, nframes64_t&);
1269 void do_embed (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode, nframes64_t&);
1271 int import_sndfiles (vector<Glib::ustring> paths, Editing::ImportMode mode, ARDOUR::SrcQuality, nframes64_t& pos,
1272 int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::Track>, bool, uint32_t total);
1273 int embed_sndfiles (vector<Glib::ustring> paths, bool multiple_files, bool& check_sample_rate, Editing::ImportMode mode,
1274 nframes64_t& pos, int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::Track>&);
1276 int add_sources (vector<Glib::ustring> paths, ARDOUR::SourceList& sources, nframes64_t& pos, Editing::ImportMode,
1277 int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::Track>&, bool add_channel_suffix);
1278 int finish_bringing_in_material (boost::shared_ptr<ARDOUR::Region> region, uint32_t, uint32_t, nframes64_t& pos, Editing::ImportMode mode,
1279 boost::shared_ptr<ARDOUR::Track>& existing_track);
1281 boost::shared_ptr<ARDOUR::AudioTrack> get_nth_selected_audio_track (int nth) const;
1282 boost::shared_ptr<ARDOUR::MidiTrack> get_nth_selected_midi_track (int nth) const;
1284 /* generic interthread progress window */
1286 ArdourDialog* interthread_progress_window;
1287 Gtk::Label interthread_progress_label;
1288 Gtk::VBox interthread_progress_vbox;
1289 Gtk::ProgressBar interthread_progress_bar;
1290 Gtk::Button interthread_cancel_button;
1291 Gtk::Label interthread_cancel_label;
1292 sigc::connection interthread_progress_connection;
1293 void interthread_cancel_clicked ();
1294 void build_interthread_progress_window ();
1295 ARDOUR::InterThreadInfo* current_interthread_info;
1297 AnalysisWindow* analysis_window;
1299 /* import specific info */
1301 struct EditorImportStatus : public ARDOUR::Session::import_status {
1302 Editing::ImportMode mode;
1306 boost::shared_ptr<ARDOUR::Track> track;
1310 EditorImportStatus import_status;
1311 gint import_progress_timeout (void *);
1312 static void *_import_thread (void *);
1313 void* import_thread ();
1314 void finish_import ();
1316 /* to support this ... */
1318 void import_audio (bool as_tracks);
1319 void do_import (vector<Glib::ustring> paths, bool split, bool as_tracks);
1321 void move_to_start ();
1322 void move_to_end ();
1324 void center_playhead ();
1325 void center_edit_point ();
1326 void edit_cursor_backward ();
1327 void edit_cursor_forward ();
1328 void playhead_forward_to_grid ();
1329 void playhead_backward_to_grid ();
1330 void playhead_backward ();
1331 void playhead_forward ();
1332 void scroll_playhead (bool forward);
1333 void scroll_backward (float pages=0.8f);
1334 void scroll_forward (float pages=0.8f);
1335 void scroll_tracks_down ();
1336 void scroll_tracks_up ();
1337 void delete_sample_forward ();
1338 void delete_sample_backward ();
1339 void delete_screen ();
1340 void search_backwards ();
1341 void search_forwards ();
1343 void clear_markers ();
1344 void clear_ranges ();
1345 void clear_locations ();
1346 void unhide_markers ();
1347 void unhide_ranges ();
1348 void jump_forward_to_mark ();
1349 void jump_backward_to_mark ();
1350 void cursor_align (bool playhead_to_edit);
1352 void remove_last_capture ();
1353 void select_all_selectables_using_time_selection ();
1354 void select_all_selectables_using_loop();
1355 void select_all_selectables_using_punch();
1356 void set_selection_from_range (ARDOUR::Location&);
1357 void set_selection_from_punch ();
1358 void set_selection_from_loop ();
1359 void set_selection_from_region ();
1361 void add_location_mark (nframes64_t where);
1362 void add_location_from_audio_region ();
1363 void add_locations_from_audio_region ();
1364 void add_location_from_selection ();
1365 void set_loop_from_selection (bool play);
1366 void set_punch_from_selection ();
1367 void set_punch_from_region ();
1369 void set_loop_from_edit_range (bool play);
1370 void set_loop_from_region (bool play);
1371 void set_punch_from_edit_range ();
1373 void set_loop_range (nframes64_t start, nframes64_t end, std::string cmd);
1374 void set_punch_range (nframes64_t start, nframes64_t end, std::string cmd);
1376 void add_location_from_playhead_cursor ();
1377 bool select_new_marker;
1379 void reverse_selection ();
1380 void edit_envelope ();
1382 void start_scrolling ();
1383 void stop_scrolling ();
1386 double last_scrub_x;
1387 int scrubbing_direction;
1388 int scrub_reversals;
1389 int scrub_reverse_distance;
1392 void keyboard_selection_begin ();
1393 void keyboard_selection_finish (bool add);
1394 bool have_pending_keyboard_selection;
1395 nframes64_t pending_keyboard_selection_start;
1397 boost::shared_ptr<ARDOUR::Region> select_region_for_operation (int dir, TimeAxisView **tv);
1398 void extend_selection_to_end_of_region (bool next);
1399 void extend_selection_to_start_of_region (bool previous);
1401 Editing::SnapType snap_type;
1402 Editing::SnapMode snap_mode;
1404 /// Snap threshold in pixels
1405 double snap_threshold;
1407 void handle_gui_changes (const string &, void *);
1408 bool ignore_gui_changes;
1410 void hide_all_tracks (bool with_select);
1413 LineDragInfo current_line_drag_info;
1415 void start_grab (GdkEvent*, Gdk::Cursor* cursor = 0);
1416 bool end_grab (ArdourCanvas::Item*, GdkEvent*);
1417 void swap_grab (ArdourCanvas::Item*, Gdk::Cursor* cursor, uint32_t time);
1419 void finalize_drag ();
1421 Gtk::Menu fade_context_menu;
1422 void popup_fade_context_menu (int, int, ArdourCanvas::Item*, ItemType);
1424 void region_gain_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1426 void start_fade_in_grab (ArdourCanvas::Item*, GdkEvent*);
1427 void start_fade_out_grab (ArdourCanvas::Item*, GdkEvent*);
1428 void fade_in_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1429 void fade_out_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1430 void fade_in_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1431 void fade_out_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1433 void set_fade_in_shape (ARDOUR::AudioRegion::FadeShape);
1434 void set_fade_out_shape (ARDOUR::AudioRegion::FadeShape);
1436 void set_fade_length (bool in);
1437 void toggle_fade_active (bool in);
1438 void set_fade_in_active (bool);
1439 void set_fade_out_active (bool);
1441 std::set<boost::shared_ptr<ARDOUR::Playlist> > motion_frozen_playlists;
1442 RegionSelection pre_drag_region_selection;
1443 void region_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1444 void region_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1445 void create_region_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1446 void create_region_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1447 bool check_region_drag_possible (RouteTimeAxisView**, ARDOUR::layer_t*);
1448 void possibly_copy_regions_during_grab (GdkEvent*);
1449 void region_drag_splice_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1450 void region_drag_splice_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1452 bool _dragging_playhead;
1453 bool _dragging_edit_point;
1455 void cursor_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1456 void cursor_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1457 void cursor_drag_finished_ensure_locate_callback (ArdourCanvas::Item*, GdkEvent*);
1458 void marker_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1459 void marker_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1460 void control_point_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1461 void control_point_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1462 void line_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1463 void line_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1465 void tempo_marker_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1466 void tempo_marker_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1467 void meter_marker_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1468 void meter_marker_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1470 gint mouse_rename_region (ArdourCanvas::Item*, GdkEvent*);
1472 void start_region_grab (ArdourCanvas::Item*, GdkEvent*);
1473 void start_create_region_grab (ArdourCanvas::Item*, GdkEvent*);
1474 void start_region_copy_grab (ArdourCanvas::Item*, GdkEvent*);
1475 void start_region_brush_grab (ArdourCanvas::Item*, GdkEvent*);
1476 void start_selection_grab (ArdourCanvas::Item*, GdkEvent*);
1477 void start_cursor_grab (ArdourCanvas::Item*, GdkEvent*);
1478 void start_cursor_grab_no_stop (ArdourCanvas::Item*, GdkEvent*);
1479 void start_marker_grab (ArdourCanvas::Item*, GdkEvent*);
1480 void start_control_point_grab (ArdourCanvas::Item*, GdkEvent*);
1481 void start_line_grab_from_regionview (ArdourCanvas::Item*, GdkEvent*);
1482 void start_line_grab_from_line (ArdourCanvas::Item*, GdkEvent*);
1483 void start_line_grab (AutomationLine *, GdkEvent*);
1484 void start_tempo_marker_grab (ArdourCanvas::Item*, GdkEvent*);
1485 void start_tempo_marker_copy_grab (ArdourCanvas::Item*, GdkEvent*);
1486 void start_meter_marker_grab (ArdourCanvas::Item*, GdkEvent*);
1487 void start_meter_marker_copy_grab (ArdourCanvas::Item*, GdkEvent*);
1489 void region_view_item_click (AudioRegionView&, GdkEventButton*);
1491 void remove_gain_control_point (ArdourCanvas::Item*, GdkEvent*);
1492 void remove_control_point (ArdourCanvas::Item*, GdkEvent*);
1494 void mouse_brush_insert_region (RegionView*, nframes64_t pos);
1495 void brush (nframes64_t);
1497 void show_verbose_time_cursor (nframes64_t frame, double offset = 0, double xpos=-1, double ypos=-1);
1498 void show_verbose_duration_cursor (nframes64_t start, nframes64_t end, double offset = 0, double xpos=-1, double ypos=-1);
1499 double clamp_verbose_cursor_x (double);
1500 double clamp_verbose_cursor_y (double);
1502 /* Canvas event handlers */
1504 bool canvas_control_point_event (GdkEvent* event,ArdourCanvas::Item*, ControlPoint*);
1505 bool canvas_line_event (GdkEvent* event,ArdourCanvas::Item*, AutomationLine*);
1506 bool canvas_selection_rect_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*);
1507 bool canvas_selection_start_trim_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*);
1508 bool canvas_selection_end_trim_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*);
1509 bool canvas_crossfade_view_event (GdkEvent* event,ArdourCanvas::Item*, CrossfadeView*);
1510 bool canvas_fade_in_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1511 bool canvas_fade_in_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1512 bool canvas_fade_out_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1513 bool canvas_fade_out_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1516 // These variables are used to detect a feedback loop and break it to avoid a gui hang
1518 ArdourCanvas::Item *last_item_entered;
1519 int last_item_entered_n;
1522 bool canvas_region_view_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
1523 bool canvas_region_view_name_highlight_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
1524 bool canvas_region_view_name_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
1525 bool canvas_stream_view_event (GdkEvent* event,ArdourCanvas::Item*, RouteTimeAxisView*);
1526 bool canvas_marker_event (GdkEvent* event,ArdourCanvas::Item*, Marker*);
1527 bool canvas_zoom_rect_event (GdkEvent* event,ArdourCanvas::Item*);
1528 bool canvas_tempo_marker_event (GdkEvent* event,ArdourCanvas::Item*, TempoMarker*);
1529 bool canvas_meter_marker_event (GdkEvent* event,ArdourCanvas::Item*, MeterMarker*);
1530 bool canvas_automation_track_event(GdkEvent* event, ArdourCanvas::Item*, AutomationTimeAxisView*) ;
1532 bool canvas_tempo_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1533 bool canvas_meter_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1534 bool canvas_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1535 bool canvas_range_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1536 bool canvas_transport_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1537 bool canvas_cd_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1539 bool canvas_imageframe_item_view_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*);
1540 bool canvas_imageframe_view_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameTimeAxis*);
1541 bool canvas_imageframe_start_handle_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*);
1542 bool canvas_imageframe_end_handle_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*);
1543 bool canvas_marker_time_axis_view_event(GdkEvent* event, ArdourCanvas::Item*,MarkerTimeAxis*);
1544 bool canvas_markerview_item_view_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*);
1545 bool canvas_markerview_start_handle_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*);
1546 bool canvas_markerview_end_handle_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*);
1548 /* non-public event handlers */
1550 bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
1551 bool track_canvas_scroll (GdkEventScroll* event);
1553 bool track_canvas_scroll_event (GdkEventScroll* event);
1554 bool track_canvas_button_press_event (GdkEventButton* event);
1555 bool track_canvas_button_release_event (GdkEventButton* event);
1556 bool track_canvas_motion_notify_event (GdkEventMotion* event);
1558 Gtk::Allocation canvas_allocation;
1559 void track_canvas_allocate (Gtk::Allocation alloc);
1560 bool track_canvas_size_allocated ();
1562 void set_playhead_cursor ();
1564 void kbd_driver (sigc::slot<void,GdkEvent*>, bool use_track_canvas = true, bool use_time_canvas = true, bool can_select = true);
1565 void kbd_mute_unmute_region ();
1568 void kbd_do_brush (GdkEvent*);
1569 void kbd_do_audition (GdkEvent*);
1571 void handle_new_duration ();
1572 void initialize_canvas ();
1574 /* display control */
1576 bool _show_measures;
1577 /// true to show waveforms, otherwise false
1578 bool _show_waveforms;
1579 /// true if the editor should follow the playhead, otherwise false
1580 bool _follow_playhead;
1581 /// true if waveforms should be shown while recording audio tracks, otherwise false
1582 bool _show_waveforms_recording;
1584 ARDOUR::TempoMap::BBTPointList *current_bbt_points;
1586 TempoLines* tempo_lines;
1588 ArdourCanvas::Group* time_line_group;
1590 void hide_measures ();
1591 void draw_measures ();
1592 bool redraw_measures ();
1594 void new_tempo_section ();
1596 void mouse_add_new_tempo_event (nframes64_t where);
1597 void mouse_add_new_meter_event (nframes64_t where);
1599 void remove_tempo_marker (ArdourCanvas::Item*);
1600 void remove_meter_marker (ArdourCanvas::Item*);
1601 gint real_remove_tempo_marker (ARDOUR::TempoSection*);
1602 gint real_remove_meter_marker (ARDOUR::MeterSection*);
1604 void edit_tempo_section (ARDOUR::TempoSection*);
1605 void edit_meter_section (ARDOUR::MeterSection*);
1606 void edit_tempo_marker (ArdourCanvas::Item*);
1607 void edit_meter_marker (ArdourCanvas::Item*);
1608 void edit_control_point (ArdourCanvas::Item*);
1610 void marker_menu_edit ();
1611 void marker_menu_remove ();
1612 void marker_menu_rename ();
1613 void marker_menu_lock (bool yn);
1614 void marker_menu_hide ();
1615 void marker_menu_loop_range ();
1616 void marker_menu_select_all_selectables_using_range ();
1617 void marker_menu_select_using_range ();
1618 void marker_menu_separate_regions_using_location ();
1619 void marker_menu_play_from ();
1620 void marker_menu_play_range ();
1621 void marker_menu_set_playhead ();
1622 void marker_menu_set_from_playhead ();
1623 void marker_menu_set_from_selection ();
1624 void marker_menu_range_to_next ();
1625 void new_transport_marker_menu_set_loop ();
1626 void new_transport_marker_menu_set_punch ();
1627 void update_loop_range_view (bool visibility=false);
1628 void update_punch_range_view (bool visibility=false);
1629 void new_transport_marker_menu_popdown ();
1630 void marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
1631 void tm_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
1632 void transport_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
1633 void new_transport_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
1634 void build_range_marker_menu (bool loop_or_punch);
1635 void build_marker_menu (bool start_or_end);
1636 void build_tm_marker_menu ();
1637 void build_new_transport_marker_menu ();
1639 Gtk::Menu* tm_marker_menu;
1640 Gtk::Menu* marker_menu;
1641 Gtk::Menu* start_end_marker_menu;
1642 Gtk::Menu* range_marker_menu;
1643 Gtk::Menu* transport_marker_menu;
1644 Gtk::Menu* new_transport_marker_menu;
1645 Gtk::Menu* cd_marker_menu;
1646 ArdourCanvas::Item* marker_menu_item;
1648 typedef list<Marker*> Marks;
1651 void remove_metric_marks ();
1652 void draw_metric_marks (const ARDOUR::Metrics& metrics);
1654 void compute_current_bbt_points (nframes_t left, nframes_t right);
1655 void tempo_map_changed (ARDOUR::Change);
1656 void redisplay_tempo (bool immediate_redraw);
1658 void snap_to (nframes64_t& first, int32_t direction = 0, bool for_mark = false);
1660 double snap_length_beats (nframes64_t start);
1662 uint32_t bbt_beat_subdivision;
1666 Gtk::ToggleButton editor_mixer_button;
1667 Gtk::ToggleButton editor_list_button;
1668 void editor_mixer_button_toggled ();
1669 void editor_list_button_toggled ();
1671 AudioClock edit_point_clock;
1672 AudioClock zoom_range_clock;
1673 Gtk::Button zoom_in_button;
1674 Gtk::Button zoom_out_button;
1675 Gtk::Button zoom_out_full_button;
1676 Gtk::Button zoom_onetoone_button;
1678 Gtk::VBox toolbar_clock_vbox;
1679 Gtk::VBox toolbar_selection_clock_vbox;
1680 Gtk::Table toolbar_selection_clock_table;
1681 Gtk::Label toolbar_selection_cursor_label;
1683 Gtk::HBox mouse_mode_button_box;
1684 Gtkmm2ext::TearOff* mouse_mode_tearoff;
1685 Gtk::ToggleButton mouse_select_button;
1686 Gtk::ToggleButton mouse_move_button;
1687 Gtk::ToggleButton mouse_gain_button;
1688 Gtk::ToggleButton mouse_zoom_button;
1689 Gtk::ToggleButton mouse_timefx_button;
1690 Gtk::ToggleButton mouse_audition_button;
1691 Gtk::ToggleButton mouse_note_button;
1692 GroupedButtons *mouse_mode_button_set;
1693 void mouse_mode_toggled (Editing::MouseMode m);
1694 bool ignore_mouse_mode_toggle;
1696 gint mouse_select_button_release (GdkEventButton*);
1698 Gtk::VBox automation_box;
1699 Gtk::Button automation_mode_button;
1700 Gtk::ToggleButton global_automation_button;
1702 Gtk::ComboBoxText edit_mode_selector;
1703 Gtk::VBox edit_mode_box;
1705 void set_edit_mode (ARDOUR::EditMode);
1706 void cycle_edit_mode ();
1707 void edit_mode_selection_done ();
1709 Gtk::ComboBoxText snap_type_selector;
1710 Gtk::ComboBoxText snap_mode_selector;
1713 std::vector<std::string> snap_type_strings;
1714 std::vector<std::string> snap_mode_strings;
1716 void snap_type_selection_done ();
1717 void snap_mode_selection_done ();
1718 void snap_mode_chosen (Editing::SnapMode);
1719 void snap_type_chosen (Editing::SnapType);
1721 Glib::RefPtr<Gtk::RadioAction> snap_type_action (Editing::SnapType);
1722 Glib::RefPtr<Gtk::RadioAction> snap_mode_action (Editing::SnapMode);
1724 Gtk::ComboBoxText zoom_focus_selector;
1725 Gtk::VBox zoom_focus_box;
1727 std::vector<std::string> zoom_focus_strings;
1729 void zoom_focus_selection_done ();
1730 void zoom_focus_chosen (Editing::ZoomFocus);
1732 Glib::RefPtr<Gtk::RadioAction> zoom_focus_action (Editing::ZoomFocus);
1736 void zoom_adjustment_changed();
1738 void edit_point_clock_changed();
1740 void setup_toolbar ();
1742 Gtkmm2ext::TearOff* tools_tearoff;
1743 Gtk::HBox toolbar_hbox;
1744 Gtk::EventBox toolbar_base;
1745 Gtk::Frame toolbar_frame;
1749 Gtk::HBox midi_tool_button_box;
1750 Gtk::ToggleButton midi_tool_pencil_button;
1751 Gtk::ToggleButton midi_tool_select_button;
1752 Gtk::ToggleButton midi_tool_resize_button;
1753 Gtk::ToggleButton midi_tool_erase_button;
1754 Gtk::Button midi_panic_button;
1755 Gtk::ToggleButton midi_sound_notes;
1756 GroupedButtons *midi_tool_button_set;
1757 void midi_edit_mode_toggled (Editing::MidiEditMode m);
1758 void midi_panic_button_pressed ();
1759 bool is_midi_sound_notes_active () const { return midi_sound_notes.get_active(); }
1761 bool ignore_midi_edit_mode_toggle;
1763 Gtkmm2ext::TearOff* midi_tools_tearoff;
1764 Gtk::HBox midi_toolbar_hbox;
1765 Gtk::EventBox midi_toolbar_base;
1766 Gtk::Frame midi_toolbar_frame;
1768 void setup_midi_toolbar ();
1770 /* selection process */
1772 Selection* selection;
1773 Selection* cut_buffer;
1775 void time_selection_changed ();
1776 void track_selection_changed ();
1777 void region_selection_changed ();
1778 void sensitize_the_right_region_actions (bool have_selected_regions);
1779 void point_selection_changed ();
1780 void marker_selection_changed ();
1789 void start_selection_op (ArdourCanvas::Item* item, GdkEvent* event, SelectionOp);
1790 void drag_selection (ArdourCanvas::Item* item, GdkEvent* event);
1791 void end_selection_op (ArdourCanvas::Item* item, GdkEvent* event);
1792 void cancel_selection ();
1794 void region_selection_op (void (ARDOUR::Region::*pmf)(void));
1795 void region_selection_op (void (ARDOUR::Region::*pmf)(void*), void*);
1796 void region_selection_op (void (ARDOUR::Region::*pmf)(bool), bool);
1798 bool audio_region_selection_covers (nframes64_t where);
1800 /* transport range select process */
1801 enum RangeMarkerOp {
1803 CreateTransportMarker,
1807 void start_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event, RangeMarkerOp);
1808 void drag_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event);
1809 void end_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event);
1811 ArdourCanvas::SimpleRect* cd_marker_bar_drag_rect;
1812 ArdourCanvas::SimpleRect* range_bar_drag_rect;
1813 ArdourCanvas::SimpleRect* transport_bar_drag_rect;
1814 ArdourCanvas::Line* marker_drag_line;
1815 ArdourCanvas::Points marker_drag_line_points;
1816 ArdourCanvas::SimpleRect* range_marker_drag_rect;
1818 void update_marker_drag_item (ARDOUR::Location *);
1820 ArdourCanvas::SimpleRect *bogus_background_rect;
1822 ArdourCanvas::SimpleRect *transport_bar_range_rect;
1823 ArdourCanvas::SimpleRect *transport_bar_preroll_rect;
1824 ArdourCanvas::SimpleRect *transport_bar_postroll_rect;
1825 ArdourCanvas::SimpleRect *transport_loop_range_rect;
1826 ArdourCanvas::SimpleRect *transport_punch_range_rect;
1827 ArdourCanvas::SimpleLine *transport_punchin_line;
1828 ArdourCanvas::SimpleLine *transport_punchout_line;
1829 ArdourCanvas::SimpleRect *transport_preroll_rect;
1830 ArdourCanvas::SimpleRect *transport_postroll_rect;
1832 ARDOUR::Location* transport_loop_location();
1833 ARDOUR::Location* transport_punch_location();
1835 ARDOUR::Location *temp_location;
1837 /* object rubberband select process */
1839 void start_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event);
1840 void drag_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event);
1841 void end_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event);
1843 bool select_all_within (nframes64_t start, nframes64_t end, gdouble topy, gdouble boty, const TrackViewList&, Selection::Operation op);
1845 ArdourCanvas::SimpleRect *rubberband_rect;
1847 /* mouse zoom process */
1849 void start_mouse_zoom (ArdourCanvas::Item* item, GdkEvent* event);
1850 void drag_mouse_zoom (ArdourCanvas::Item* item, GdkEvent* event);
1851 void end_mouse_zoom (ArdourCanvas::Item* item, GdkEvent* event);
1853 ArdourCanvas::SimpleRect *zoom_rect;
1854 void reposition_zoom_rect (nframes64_t start, nframes64_t end);
1856 /* diskstream/route display management */
1858 struct RouteDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
1859 RouteDisplayModelColumns() {
1862 add (temporary_visible);
1866 Gtk::TreeModelColumn<Glib::ustring> text;
1867 Gtk::TreeModelColumn<bool> visible;
1868 Gtk::TreeModelColumn<bool> temporary_visible;
1869 Gtk::TreeModelColumn<TimeAxisView*> tv;
1870 Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Route> > route;
1873 RouteDisplayModelColumns route_display_columns;
1874 Glib::RefPtr<Gtk::ListStore> route_display_model;
1875 Glib::RefPtr<Gtk::TreeSelection> route_display_selection;
1877 Gtkmm2ext::DnDTreeView<boost::shared_ptr<ARDOUR::Route> > route_list_display;
1878 Gtk::ScrolledWindow route_list_scroller;
1879 Gtk::Menu* route_list_menu;
1881 void update_route_visibility ();
1883 void sync_order_keys (const char*);
1884 bool route_redisplay_does_not_sync_order_keys;
1885 bool route_redisplay_does_not_reset_order_keys;
1887 bool route_list_display_button_press (GdkEventButton*);
1888 void route_list_display_drag_data_received (const Glib::RefPtr<Gdk::DragContext>& context,
1891 const Gtk::SelectionData& data,
1895 bool route_list_selection_filter (const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::Path& path, bool yn);
1897 void route_list_change (const Gtk::TreeModel::Path&,const Gtk::TreeModel::iterator&);
1898 void route_list_delete (const Gtk::TreeModel::Path&);
1899 void track_list_reorder (const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iter, int* new_order);
1901 void initial_route_list_display ();
1902 void redisplay_route_list();
1903 void route_list_reordered (const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iter, int* what);
1904 bool ignore_route_list_reorder;
1905 bool no_route_list_redisplay;
1907 void build_route_list_menu ();
1908 void show_route_list_menu ();
1910 void show_all_routes ();
1911 void hide_all_routes ();
1912 void show_all_audiotracks ();
1913 void hide_all_audiotracks ();
1914 void show_all_audiobus ();
1915 void hide_all_audiobus ();
1917 void set_all_tracks_visibility (bool yn);
1918 void set_all_audio_visibility (int type, bool yn);
1920 /* edit group management */
1922 struct GroupListModelColumns : public Gtk::TreeModel::ColumnRecord {
1923 GroupListModelColumns () {
1929 Gtk::TreeModelColumn<bool> is_active;
1930 Gtk::TreeModelColumn<bool> is_visible;
1931 Gtk::TreeModelColumn<std::string> text;
1932 Gtk::TreeModelColumn<ARDOUR::RouteGroup*> routegroup;
1935 GroupListModelColumns group_columns;
1936 Glib::RefPtr<Gtk::ListStore> group_model;
1937 Glib::RefPtr<Gtk::TreeSelection> group_selection;
1939 Gtk::TreeView edit_group_display;
1940 Gtk::ScrolledWindow edit_group_display_scroller;
1941 Gtk::Menu* edit_group_list_menu;
1943 void build_edit_group_list_menu ();
1944 void activate_all_edit_groups ();
1945 void disable_all_edit_groups ();
1947 bool in_edit_group_row_change;
1948 void edit_group_row_change (const Gtk::TreeModel::Path&,const Gtk::TreeModel::iterator&);
1949 void edit_group_name_edit (const Glib::ustring&, const Glib::ustring&);
1950 void new_edit_group ();
1951 void edit_group_list_button_clicked ();
1952 gint edit_group_list_button_press_event (GdkEventButton* ev);
1953 void add_edit_group (ARDOUR::RouteGroup* group);
1954 void remove_selected_edit_group ();
1955 void edit_groups_changed ();
1956 void group_flags_changed (void*, ARDOUR::RouteGroup*);
1958 Gtk::VBox list_vpacker;
1962 bool autoscroll_active;
1963 int autoscroll_timeout_tag;
1966 int last_autoscroll_x;
1967 int last_autoscroll_y;
1968 uint32_t autoscroll_cnt;
1969 nframes64_t autoscroll_x_distance;
1970 double autoscroll_y_distance;
1972 static gint _autoscroll_canvas (void *);
1973 bool autoscroll_canvas ();
1974 void start_canvas_autoscroll (int x, int y);
1975 void stop_canvas_autoscroll ();
1976 void maybe_autoscroll (GdkEventMotion*);
1977 void maybe_autoscroll_horizontally (GdkEventMotion*);
1978 bool allow_vertical_scroll;
1987 void start_trim (ArdourCanvas::Item*, GdkEvent*);
1988 void point_trim (GdkEvent*);
1989 void trim_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1990 void single_contents_trim (RegionView&, nframes64_t, bool, bool, bool);
1991 void single_start_trim (RegionView&, nframes64_t, bool, bool);
1992 void single_end_trim (RegionView&, nframes64_t, bool, bool);
1994 void trim_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1995 void thaw_region_after_trim (RegionView& rv);
1997 void trim_region_front();
1998 void trim_region_back();
1999 void trim_region (bool front);
2001 void trim_region_to_edit_point ();
2002 void trim_region_from_edit_point ();
2003 void trim_region_to_loop ();
2004 void trim_region_to_punch ();
2005 void trim_region_to_location (const ARDOUR::Location&, const char* cmd);
2007 bool show_gain_after_trim;
2011 int convert_drop_to_paths (std::vector<Glib::ustring>& paths,
2012 const Glib::RefPtr<Gdk::DragContext>& context,
2015 const Gtk::SelectionData& data,
2019 void track_canvas_drag_data_received (const Glib::RefPtr<Gdk::DragContext>& context,
2022 const Gtk::SelectionData& data,
2026 void region_list_display_drag_data_received (const Glib::RefPtr<Gdk::DragContext>& context,
2029 const Gtk::SelectionData& data,
2033 void drop_paths (const Glib::RefPtr<Gdk::DragContext>& context,
2036 const Gtk::SelectionData& data,
2040 void drop_regions (const Glib::RefPtr<Gdk::DragContext>& context,
2043 const Gtk::SelectionData& data,
2047 void drop_routes (const Glib::RefPtr<Gdk::DragContext>& context,
2050 const Gtk::SelectionData& data,
2056 int write_region_selection(RegionSelection&);
2057 bool write_region (string path, boost::shared_ptr<ARDOUR::AudioRegion>);
2058 void bounce_region_selection ();
2059 void bounce_range_selection (bool replace);
2060 void external_edit_region ();
2062 int write_audio_selection (TimeSelection&);
2063 bool write_audio_range (ARDOUR::AudioPlaylist&, const ARDOUR::ChanCount& channels, list<ARDOUR::AudioRange>&);
2065 void write_selection ();
2069 UndoAction get_memento() const;
2071 XMLNode *before; /* used in *_reversible_command */
2073 void begin_reversible_command (string cmd_name);
2074 void commit_reversible_command ();
2076 void update_title ();
2077 void update_title_s (const string & snapshot_name);
2080 Selection* selection;
2081 double frames_per_unit;
2083 State (PublicEditor const * e);
2087 void store_state (State&) const;
2088 void restore_state (State *);
2090 void instant_save ();
2092 boost::shared_ptr<ARDOUR::AudioRegion> last_audition_region;
2094 /* freeze operations */
2096 ARDOUR::InterThreadInfo freeze_status;
2097 gint freeze_progress_timeout (void *);
2098 static void* _freeze_thread (void*);
2099 void* freeze_thread ();
2101 void freeze_route ();
2102 void unfreeze_route ();
2104 /* edit-group solo + mute */
2106 void set_edit_group_solo (ARDOUR::Route&, bool);
2107 void set_edit_group_mute (ARDOUR::Route&, bool);
2111 void duplicate_dialog (bool with_dialog);
2113 nframes64_t event_frame (GdkEvent*, double* px = 0, double* py = 0) const;
2115 /* returns false if mouse pointer is not in track or marker canvas
2117 bool mouse_frame (nframes64_t&, bool& in_track_canvas) const;
2119 void time_fx_motion (ArdourCanvas::Item*, GdkEvent*);
2120 void start_time_fx (ArdourCanvas::Item*, GdkEvent*);
2121 void end_time_fx (ArdourCanvas::Item*, GdkEvent*);
2123 struct TimeFXDialog : public ArdourDialog {
2124 ARDOUR::TimeFXRequest request;
2127 Gtk::Adjustment pitch_octave_adjustment;
2128 Gtk::Adjustment pitch_semitone_adjustment;
2129 Gtk::Adjustment pitch_cent_adjustment;
2130 Gtk::SpinButton pitch_octave_spinner;
2131 Gtk::SpinButton pitch_semitone_spinner;
2132 Gtk::SpinButton pitch_cent_spinner;
2133 RegionSelection regions;
2134 Gtk::ProgressBar progress_bar;
2137 Gtk::ToggleButton quick_button;
2138 Gtk::ToggleButton antialias_button;
2139 Gtk::HBox upper_button_box;
2142 Gtk::ComboBoxText stretch_opts_selector;
2143 Gtk::Label stretch_opts_label;
2144 Gtk::ToggleButton precise_button;
2145 Gtk::ToggleButton preserve_formants_button;
2148 Gtk::Button* cancel_button;
2149 Gtk::Button* action_button;
2153 TimeFXDialog (Editor& e, bool for_pitch);
2155 gint update_progress ();
2156 sigc::connection first_cancel;
2157 sigc::connection first_delete;
2158 void cancel_in_progress ();
2159 gint delete_in_progress (GdkEventAny*);
2162 /* "whats mine is yours" */
2164 friend class TimeFXDialog;
2166 TimeFXDialog* current_timefx;
2168 static void* timefx_thread (void *arg);
2169 void do_timefx (TimeFXDialog&);
2171 int time_stretch (RegionSelection&, float fraction);
2172 int pitch_shift (RegionSelection&, float cents);
2173 void pitch_shift_regions ();
2174 int time_fx (RegionSelection&, float val, bool pitching);
2176 /* editor-mixer strip */
2178 MixerStrip *current_mixer_strip;
2179 bool show_editor_mixer_when_tracks_arrive;
2180 Gtk::VBox current_mixer_strip_vbox;
2181 void cms_new (boost::shared_ptr<ARDOUR::Route>);
2182 void cms_deleted ();
2183 void current_mixer_strip_hidden ();
2184 void current_mixer_strip_removed ();
2186 void detach_tearoff (Gtk::Box* b, Gtk::Window* w);
2187 void reattach_tearoff (Gtk::Box* b, Gtk::Window* w, int32_t n);
2189 void ensure_all_elements_drawn ();
2191 /* nudging tracks */
2193 void nudge_track (bool use_edit_point, bool forwards);
2197 bool _xfade_visibility;
2200 void handle_new_imageframe_time_axis_view(const string & track_name, void* src) ;
2201 void handle_new_imageframe_marker_time_axis_view(const string & track_name, TimeAxisView* marked_track) ;
2203 void start_imageframe_grab(ArdourCanvas::Item*, GdkEvent*) ;
2204 void start_markerview_grab(ArdourCanvas::Item*, GdkEvent*) ;
2206 void imageframe_drag_motion_callback(ArdourCanvas::Item*, GdkEvent*) ;
2207 void markerview_drag_motion_callback(ArdourCanvas::Item*, GdkEvent*) ;
2208 void timeaxis_item_drag_finished_callback(ArdourCanvas::Item*, GdkEvent*) ;
2210 gint canvas_imageframe_item_view_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameView* ifv);
2211 gint canvas_imageframe_view_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameTimeAxis* ifta);
2212 gint canvas_imageframe_start_handle_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameView* ifv);
2213 gint canvas_imageframe_end_handle_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameView* ifv);
2215 gint canvas_marker_time_axis_view_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerTimeAxis* mta);
2216 gint canvas_markerview_item_view_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerView* mv);
2217 gint canvas_markerview_start_handle_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerView* mv);
2218 gint canvas_markerview_end_handle_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerView* mv);
2220 void imageframe_start_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
2221 void imageframe_end_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
2222 void imageframe_start_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
2223 void imageframe_start_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
2224 void imageframe_end_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
2225 void imageframe_end_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
2227 void markerview_item_start_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
2228 void markerview_item_end_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
2229 void markerview_start_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
2230 void markerview_start_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
2231 void markerview_end_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
2232 void markerview_end_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
2234 void popup_imageframe_edit_menu(int button, int32_t time, ArdourCanvas::Item* ifv, bool with_frame) ;
2235 void popup_marker_time_axis_edit_menu(int button, int32_t time, ArdourCanvas::Item* ifv, bool with_frame) ;
2237 ImageFrameSocketHandler* image_socket_listener ;
2240 void toggle_xfade_active (boost::weak_ptr<ARDOUR::Crossfade>);
2241 void toggle_xfade_length (boost::weak_ptr<ARDOUR::Crossfade>);
2242 void edit_xfade (boost::weak_ptr<ARDOUR::Crossfade>);
2243 void xfade_edit_left_region ();
2244 void xfade_edit_right_region ();
2246 static const int32_t default_width = 995;
2247 static const int32_t default_height = 765;
2251 Gtk::Button nudge_forward_button;
2252 Gtk::Button nudge_backward_button;
2253 Gtk::HBox nudge_hbox;
2254 Gtk::VBox nudge_vbox;
2255 AudioClock nudge_clock;
2257 nframes64_t get_nudge_distance (nframes64_t pos, nframes64_t& next);
2259 bool nudge_forward_release (GdkEventButton*);
2260 bool nudge_backward_release (GdkEventButton*);
2264 void apply_filter (ARDOUR::Filter&, string cmd);
2266 /* handling cleanup */
2268 int playlist_deletion_dialog (boost::shared_ptr<ARDOUR::Playlist>);
2270 vector<sigc::connection> session_connections;
2272 /* tracking step changes of track height */
2274 TimeAxisView* current_stepping_trackview;
2275 ARDOUR::microseconds_t last_track_height_step_timestamp;
2276 gint track_height_step_timeout();
2277 sigc::connection step_timeout;
2279 TimeAxisView* entered_track;
2280 RegionView* entered_regionview;
2283 void ensure_entered_track_selected (bool op_acts_on_objects = false);
2284 bool clear_entered_track;
2285 bool left_track_canvas (GdkEventCrossing*);
2286 bool entered_track_canvas (GdkEventCrossing*);
2287 void set_entered_track (TimeAxisView*);
2288 void set_entered_regionview (RegionView*);
2289 void ensure_track_visible (TimeAxisView*);
2290 gint left_automation_track ();
2292 bool _new_regionviews_show_envelope;
2294 void reset_canvas_action_sensitivity (bool);
2295 void toggle_gain_envelope_visibility ();
2296 void toggle_gain_envelope_active ();
2297 void reset_region_gain_envelopes ();
2299 bool on_key_press_event (GdkEventKey*);
2300 bool on_key_release_event (GdkEventKey*);
2302 void session_state_saved (string);
2304 Glib::RefPtr<Gtk::Action> undo_action;
2305 Glib::RefPtr<Gtk::Action> redo_action;
2307 void history_changed ();
2309 Gtk::HBox status_bar_hpacker;
2311 Editing::EditPoint _edit_point;
2313 Gtk::ComboBoxText edit_point_selector;
2315 void set_edit_point_preference (Editing::EditPoint ep, bool force = false);
2316 void cycle_edit_point (bool with_marker);
2317 void set_edit_point ();
2318 void edit_point_selection_done ();
2319 void edit_point_chosen (Editing::EditPoint);
2320 Glib::RefPtr<Gtk::RadioAction> edit_point_action (Editing::EditPoint);
2321 std::vector<std::string> edit_point_strings;
2323 void selected_marker_moved (ARDOUR::Location*);
2324 sigc::connection edit_point_clock_connection_a;
2325 sigc::connection edit_point_clock_connection_b;
2327 bool get_edit_op_range (nframes64_t& start, nframes64_t& end) const;
2329 void get_regions_at (RegionSelection&, nframes64_t where, const TrackSelection& ts) const;
2330 void get_regions_after (RegionSelection&, nframes64_t where, const TrackSelection& ts) const;
2332 void get_regions_for_action (RegionSelection&, bool allowed_entered_regionview = false);
2334 sigc::connection fast_screen_update_connection;
2335 gint start_updating ();
2336 gint stop_updating ();
2337 void fast_update_strips ();
2338 bool meters_running;
2340 void select_next_route ();
2341 void select_prev_route ();
2343 void snap_to_internal (nframes64_t& first, int32_t direction = 0, bool for_mark = false);
2345 RhythmFerret* rhythm_ferret;
2348 void set_track_height (uint32_t h);
2349 void set_track_height_largest ();
2350 void set_track_height_large ();
2351 void set_track_height_larger ();
2352 void set_track_height_normal ();
2353 void set_track_height_smaller ();
2354 void set_track_height_small ();
2356 void remove_tracks ();
2357 void toggle_tracks_active ();
2358 void waveform_scale_chosen (Editing::WaveformScale);
2362 int32_t resize_idle_target;
2364 friend gboolean _idle_resize (gpointer);
2365 std::vector<TimeAxisView*> pending_resizes;
2367 void visible_order_range (int*, int*) const;
2368 bool y_movement_disallowed (int, int, int, int, int, std::bitset<512> const &, std::vector<int32_t> const &) const;
2371 #endif /* __ardour_editor_h__ */