Ardour  9.0-pre0-1467-gc8540a5ad6
editing_context.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2005-2007 Doug McLain <doug@nostar.net>
3  * Copyright (C) 2005-2018 Paul Davis <paul@linuxaudiosystems.com>
4  * Copyright (C) 2005 Karsten Wiese <fzuuzf@googlemail.com>
5  * Copyright (C) 2006-2009 Sampo Savolainen <v2@iki.fi>
6  * Copyright (C) 2006-2015 David Robillard <d@drobilla.net>
7  * Copyright (C) 2006-2017 Tim Mayberry <mojofunk@gmail.com>
8  * Copyright (C) 2007-2012 Carl Hetherington <carl@carlh.net>
9  * Copyright (C) 2008-2011 Sakari Bergen <sakari.bergen@beatwaves.net>
10  * Copyright (C) 2008 Hans Baier <hansfbaier@googlemail.com>
11  * Copyright (C) 2013-2015 Colin Fletcher <colin.m.fletcher@googlemail.com>
12  * Copyright (C) 2013-2019 Robin Gareus <robin@gareus.org>
13  * Copyright (C) 2014-2017 Nick Mainsbridge <mainsbridge@gmail.com>
14  * Copyright (C) 2014-2019 Ben Loftis <ben@harrisonconsoles.com>
15  * Copyright (C) 2015-2019 Damien Zammit <damien@zamaudio.com>
16  * Copyright (C) 2015 AndrĂ© Nusser <andre.nusser@googlemail.com>
17  *
18  * This program is free software; you can redistribute it and/or modify
19  * it under the terms of the GNU General Public License as published by
20  * the Free Software Foundation; either version 2 of the License, or
21  * (at your option) any later version.
22  *
23  * This program is distributed in the hope that it will be useful,
24  * but WITHOUT ANY WARRANTY; without even the implied warranty of
25  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26  * GNU General Public License for more details.
27  *
28  * You should have received a copy of the GNU General Public License along
29  * with this program; if not, write to the Free Software Foundation, Inc.,
30  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
31  */
32 
33 #pragma once
34 
35 #include "pbd/signals.h"
36 
37 #include "temporal/timeline.h"
38 
39 #include "ardour/midi_operator.h"
40 #include "ardour/session_handle.h"
41 #include "ardour/types.h"
42 
43 #include "canvas/ruler.h"
44 
45 #include "widgets/ardour_button.h"
47 #include "widgets/ardour_spacer.h"
48 
49 #include "axis_provider.h"
50 #include "editing.h"
51 #include "editor_items.h"
52 #include "selection.h"
53 
56 
57 namespace Temporal {
58  class TempoMap;
59 }
60 
61 class XMLNode;
62 
63 class ControlPoint;
64 class CursorContext;
65 class DragManager;
66 class EditorCursor;
67 class EditNoteDialog;
68 class GridLines;
69 class MidiRegionView;
70 class MidiView;
71 class MouseCursors;
72 class VerboseCursor;
73 class TrackViewList;
74 class Selection;
75 class SelectionMemento;
76 class SelectableOwner;
77 
78 class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider, public virtual sigc::trackable
79 {
80  public:
81  EditingContext (std::string const &);
83 
84  std::string editor_name() const { return _name; }
85 
87 
89 
90 
91  struct TempoMapScope {
92  TempoMapScope (EditingContext& context, std::shared_ptr<Temporal::TempoMap> map)
93  : ec (context)
94  {
96  }
99  }
101  std::shared_ptr<Temporal::TempoMap const> old_map;
102  };
103 
104  DragManager* drags () const {
105  return _drags;
106  }
107 
108  bool drag_active () const;
110 
111  virtual std::list<SelectableOwner*> selectable_owners() = 0;
112 
113  virtual ArdourCanvas::Duple upper_left() const { return ArdourCanvas::Duple (0, 0); }
114 
115  virtual void select_all_within (Temporal::timepos_t const &, Temporal::timepos_t const &, double, double, std::list<SelectableOwner*> const &, ARDOUR::SelectionOperation, bool) = 0;
116  virtual void get_per_region_note_selection (std::list<std::pair<PBD::ID, std::set<std::shared_ptr<Evoral::Note<Temporal::Beats> > > > >&) const = 0;
117  virtual void get_regionviews_by_id (PBD::ID const id, RegionSelection & regions) const = 0;
119  virtual TrackViewList axis_views_from_routes (std::shared_ptr<ARDOUR::RouteList>) const = 0;
120 
122  virtual ArdourMarker* find_marker_from_location_id (PBD::ID const&, bool) const = 0;
125 
126 
129 
130  virtual void maybe_autoscroll (bool, bool, bool from_headers) = 0;
131  virtual void stop_canvas_autoscroll () = 0;
132  virtual bool autoscroll_active() const = 0;
133 
134  virtual void redisplay_grid (bool immediate_redraw) = 0;
136 
139 
144  void set_follow_playhead (bool yn, bool catch_up = true);
145 
148 
150  bool follow_playhead () const;
151 
153  bool use_context_click = false,
154  bool from_outside_canvas = false) {
155  return _get_preferred_edit_position (eio, use_context_click, from_outside_canvas);
156  }
157 
158  virtual void instant_save() = 0;
159 
160  virtual void begin_selection_op_history () = 0;
161  virtual void begin_reversible_selection_op (std::string cmd_name) = 0;
162  virtual void commit_reversible_selection_op () = 0;
163  virtual void abort_reversible_selection_op () = 0;
164  virtual void undo_selection_op () = 0;
165  virtual void redo_selection_op () = 0;
166 
167  /* Some EditingContexts may defer to the Session, which IS-A
168  * HistoryOwner (Editor does this).
169  *
170  * Others may themselves have the IS-A HistoryOwner inheritance, and so
171  * they just proxy back to their base class (CueEditor does this).
172  */
173 
174  virtual PBD::HistoryOwner& history() = 0;
175 
176  virtual void add_command (PBD::Command *) = 0;
177  virtual void add_commands (std::vector<PBD::Command *>) = 0;
178  virtual void begin_reversible_command (std::string cmd_name) = 0;
179  virtual void begin_reversible_command (GQuark) = 0;
180  virtual void abort_reversible_command () = 0;
181  virtual void commit_reversible_command () = 0;
182 
184 
186 
187  void temporal_zoom_step (bool zoom_out);
188  void temporal_zoom_step_scale (bool zoom_out, double scale);
189  void temporal_zoom_step_mouse_focus (bool zoom_out);
190  void temporal_zoom_step_mouse_focus_scale (bool zoom_out, double scale);
191 
195  void temporal_zoom_to_sample (bool coarser, samplepos_t sample);
196 
197  double timeline_origin() const { return _timeline_origin; }
198 
199  /* NOTE: these functions assume that the "pixel" coordinate is
200  in canvas coordinates. These coordinates already take into
201  account any scrolling offsets.
202  */
203 
205 
206  /* pixel can be less than zero when motion events are
207  processed. Since the pixel value is in canvas units (since
208  it comes from an event delivered to the canvas), we've
209  already run the window->canvas transform, that means that
210  the location *really* is "off to the right" and thus really
211  is "before the start".
212  */
213 
214  if (pixel >= _timeline_origin) {
215  return (pixel - _timeline_origin) * samples_per_pixel;
216  } else {
217  return 0;
218  }
219  }
220 
221  /* It makes no sense to ever call these functions to convert to or from a
222  * non-timeline relative pixel position, so they all assume that is
223  * what they are being asked to do.
224  */
225 
226  samplepos_t pixel_to_sample (double pixel) const {
227  return pixel * samples_per_pixel;
228  }
229 
230  double sample_to_pixel (samplepos_t sample) const {
231  return round (sample / (double) samples_per_pixel);
232  }
233 
234  double sample_to_pixel_unrounded (samplepos_t sample) const {
235  return (sample / (double) samples_per_pixel);
236  }
237 
238  double time_to_pixel (Temporal::timepos_t const & pos) const;
239  double time_to_pixel_unrounded (Temporal::timepos_t const & pos) const;
240 
242 
243  /* deprecated, prefer time_delta_to_pixel
244  * first taking the duation and then rounding leads to different results:
245  * duration_to_pixels (start.distance(end)) != time_to_pixel (end) - time_to_pixel (start)
246  */
247  double duration_to_pixels (Temporal::timecnt_t const & pos) const;
249 
250  samplecnt_t pixel_duration_to_samples (double pixels) const {
251  return pixels * samples_per_pixel;
252  }
253 
254  /* These two convert between timeline-relative x-axis pixel positions and
255  * global canvas ones.
256  */
257 
258  double timeline_to_canvas (double p) const { return p + _timeline_origin; }
259  double canvas_to_timeline (double p) const { return p - _timeline_origin; }
260 
261  double visible_canvas_width () const { return _visible_canvas_width; }
262  double visible_canvas_height () const { return _visible_canvas_height; }
263 
269  Temporal::timepos_t canvas_event_time (GdkEvent const*, double* px = 0, double* py = 0) const;
270 
274  samplepos_t canvas_event_sample (GdkEvent const * event, double* pcx = nullptr, double* pcy = nullptr) const;
275 
276  virtual bool canvas_note_event (GdkEvent* event, ArdourCanvas::Item*) = 0;
278  virtual bool canvas_velocity_event (GdkEvent* event, ArdourCanvas::Item*) = 0;
280  virtual bool canvas_cue_start_event (GdkEvent* event, ArdourCanvas::Item*) { return true; }
281  virtual bool canvas_cue_end_event (GdkEvent* event, ArdourCanvas::Item*) { return true; }
282  virtual bool canvas_bg_event (GdkEvent* event, ArdourCanvas::Item*) = 0;
283 
286 
288  int32_t get_grid_music_divisions (Editing::GridType gt, uint32_t event_state) const;
289 
292  bool grid_musical () const;
293 
299 
301  void set_draw_velocity (int);
302  void set_draw_channel (int);
303 
305  int draw_velocity () const;
306  int draw_channel () const;
307 
309 
310  virtual void snap_to (Temporal::timepos_t & first,
313  bool ensure_snap = false) const;
314 
316  GdkEvent const* ev,
319  bool ensure_snap = false) const;
320 
322  Temporal::RoundMode direction,
323  ARDOUR::SnapPref gpref) const;
324 
325  virtual double get_y_origin () const = 0;
326 
328  void reset_y_origin (double);
330  virtual double max_extents_scale() const { return 1.0; }
331  virtual void set_samples_per_pixel (samplecnt_t) = 0;
332 
333  virtual void cycle_zoom_focus ();
334  virtual void set_zoom_focus (Editing::ZoomFocus) = 0;
336 
338 
339  virtual void reposition_and_zoom (samplepos_t, double) = 0;
340 
341  sigc::signal<void> ZoomChanged;
342 
343  virtual Selection& get_selection() const { return *selection; }
344  virtual Selection& get_cut_buffer () const { return *cut_buffer; }
345 
347 
348  virtual void point_selection_changed () = 0;
349 
355  virtual void set_mouse_mode (Editing::MouseMode, bool force = false);
359  virtual void step_mouse_mode (bool next) = 0;
366 
368  virtual bool internal_editing() const = 0;
369 
370  virtual bool get_smart_mode() const { return false; }
371 
374 
375  struct CursorRAII {
377  : ec (e), old_cursor (ec.get_canvas_cursor ()) { ec.set_canvas_cursor (new_cursor); }
379 
382  };
383 
384  virtual Gdk::Cursor* get_canvas_cursor () const;
385  static MouseCursors const* cursors () {
386  return _cursors;
387  }
388  virtual VerboseCursor* verbose_cursor () const {
389  return _verbose_cursor;
390  }
391 
392  virtual void set_snapped_cursor_position (Temporal::timepos_t const & pos) = 0;
393 
394  static sigc::signal<void> DropDownKeys;
395 
398 
399  typedef std::vector<MidiView*> MidiViews;
400 
401  /* MIDI actions, proxied to selected MidiRegionView(s) */
406  virtual void midi_action (void (MidiView::*method)());
407  std::vector<MidiView*> filter_to_unique_midi_region_views (RegionSelection const & rs) const;
408  std::vector<MidiView*> filter_to_unique_midi_region_views (MidiViews const & ms) const;
409 
412  void legatize_region (bool shrink_only);
414 
415  void quantize_regions (const MidiViews& rs);
416  void legatize_regions (const MidiViews& rs, bool shrink_only);
417  void transform_regions (const MidiViews& rs);
418  void transpose_regions (const MidiViews& rs);
419 
421 
422  static bool need_shared_actions;
423  void register_midi_actions (Gtkmm2ext::Bindings*, std::string const &);
424  void register_common_actions (Gtkmm2ext::Bindings*, std::string const &);
425  void register_automation_actions (Gtkmm2ext::Bindings*, std::string const &);
427 
429 
434  virtual bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*) { return false; }
435 
437 
438  void set_horizontal_position (double);
439  double horizontal_position () const;
440 
441  virtual samplecnt_t current_page_samples() const = 0;
442 
444  virtual ArdourCanvas::GtkCanvas* get_canvas() const = 0;
445 
447 
449  void pre_render ();
450 
452 
453  virtual Gdk::Cursor* which_track_cursor () const = 0;
454  virtual Gdk::Cursor* which_mode_cursor () const = 0;
455  virtual Gdk::Cursor* which_trim_cursor (bool left_side) const = 0;
456  virtual Gdk::Cursor* which_canvas_cursor (ItemType type) const = 0;
457 
461  void undo (uint32_t n = 1) { do_undo (n); }
462 
466  void redo (uint32_t n = 1) { do_redo (n); }
467 
468  virtual void history_changed() = 0;
470 
472 
476  samplepos_t window_event_sample (GdkEvent const*, double* px = 0, double* py = 0) const;
477 
478  /* returns false if mouse pointer is not in track or marker canvas
479  */
480  bool mouse_sample (samplepos_t&, bool& in_track_canvas) const;
481 
482  /* editing actions */
483 
484  virtual void delete_ () = 0;
485  virtual void paste (float times, bool from_context_menu) = 0;
486  virtual void keyboard_paste () = 0;
487  virtual void cut_copy (Editing::CutCopyOp) = 0;
488 
489  void cut ();
490  void copy ();
491  void alt_delete_ ();
492 
493  virtual void update_grid ();
494 
495  void set_loop_range (Temporal::timepos_t const & start, Temporal::timepos_t const & end, std::string cmd);
496 
497  virtual bool allow_trim_cursors () const;
498  virtual void make_a_region() {}
499 
502 
505 
506  protected:
507  std::string _name;
509 
510  Glib::RefPtr<Gtk::ActionGroup> _midi_actions;
511  Glib::RefPtr<Gtk::ActionGroup> _common_actions;
512  Glib::RefPtr<Gtk::ActionGroup> _automation_actions;
513  Glib::RefPtr<Gtk::ActionGroup> editor_actions;
514  Glib::RefPtr<Gtk::ActionGroup> snap_actions;
515  Glib::RefPtr<Gtk::ActionGroup> length_actions;
516  Glib::RefPtr<Gtk::ActionGroup> channel_actions;
517  Glib::RefPtr<Gtk::ActionGroup> velocity_actions;
518  Glib::RefPtr<Gtk::ActionGroup> zoom_actions;
519 
520  virtual void load_shared_bindings ();
521 
526 
527  static std::vector<std::string> grid_type_strings;
528 
529  std::map<Editing::GridType, Glib::RefPtr<Gtk::RadioAction> > grid_actions;
530  std::map<Editing::SnapMode, Glib::RefPtr<Gtk::RadioAction> > snap_mode_actions;
531  std::map<Editing::GridType, Glib::RefPtr<Gtk::RadioAction> > draw_length_actions;
532  std::map<Editing::MouseMode, Glib::RefPtr<Gtk::RadioAction> > mouse_mode_actions;
533  std::map<Editing::ZoomFocus, Glib::RefPtr<Gtk::RadioAction> > zoom_focus_actions;
534  std::map<int, Glib::RefPtr<Gtk::RadioAction> > draw_velocity_actions;
535  std::map<int, Glib::RefPtr<Gtk::RadioAction> > draw_channel_actions;
536 
540 
541  sigc::signal<void> DrawLengthChanged;
542  sigc::signal<void> DrawVelocityChanged;
543  sigc::signal<void> DrawChannelChanged;
544 
548 
550 
553 
558 
561 
566 
570 
573 
575  virtual void note_mode_clicked() {}
576  virtual void follow_playhead_clicked ();
577  virtual void full_zoom_clicked() {};
578  virtual void set_visible_channel (int) {}
579 
581 
584 
586  virtual void update_tempo_based_rulers () {};
587  virtual void show_rulers_for_grid () {};
588 
590 
591  /* playhead and edit cursor */
592 
595 
596  Glib::RefPtr<Gtk::ToggleAction> follow_playhead_action;
598 
599  /* selection process */
600 
604 
605  std::list<XMLNode*> before; /* used in *_reversible_command */
606 
608 
610 
612 
613  virtual Editing::ZoomFocus effective_zoom_focus() const { return zoom_focus(); }
614 
616  Temporal::RoundMode direction,
617  ARDOUR::SnapPref gpref,
619 
621  Temporal::RoundMode direction,
622  ARDOUR::SnapPref gpref) const = 0;
623 
624  virtual void snap_to_internal (Temporal::timepos_t& first,
627  bool ensure_snap = false) const = 0;
628 
630 
643  };
644 
646  uint32_t bbt_bars;
648 
649  uint32_t count_bars (Temporal::Beats const & start, Temporal::Beats const & end) const;
651 
655 
657 
658  friend struct TempoMapScope;
659  virtual std::shared_ptr<Temporal::TempoMap const> start_local_tempo_map (std::shared_ptr<Temporal::TempoMap>);
660  virtual void end_local_tempo_map (std::shared_ptr<Temporal::TempoMap const>) { /* no-op by default */ }
661 
668  virtual bool motion_handler (ArdourCanvas::Item*, GdkEvent*, bool from_autoscroll = false) = 0;
673 
676 
679 
681 
683 
685 
687  friend class EditorSummary;
690 
698 
699  virtual void register_actions() = 0;
701 
703 
707 
710 
711  void pack_draw_box (bool with_channel);
712  void pack_snap_box ();
713 
716 
717  void set_common_editing_state (XMLNode const & node);
718  void get_common_editing_state (XMLNode& node) const;
719 
720  struct VisualChange {
721  enum Type {
722  TimeOrigin = 0x1,
723  ZoomLevel = 0x2,
724  YOrigin = 0x4,
725  VideoTimeline = 0x8
726  };
727 
731  double y_origin;
732 
736 
738  void add (Type t) {
739  pending = Type (pending | t);
740  }
741  };
742 
745 
746  static int _idle_visual_changer (void* arg);
749  virtual void visual_changer (const VisualChange&) = 0;
750 
751  sigc::connection autoscroll_connection;
754  uint32_t autoscroll_cnt;
756 
758  virtual void parameter_changed (std::string);
759  virtual void ui_parameter_changed (std::string);
760 
762  std::vector<std::string> zoom_focus_strings;
763  virtual void build_zoom_focus_menu () = 0;
764 
772 
774 
776 
777  std::vector<ArdourCanvas::Ruler::Mark> grid_marks;
780 
781  void drop_grid ();
784 
785  virtual void metric_get_timecode (std::vector<ArdourCanvas::Ruler::Mark>&, int64_t, int64_t, gint) {}
786  virtual void metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>&, int64_t, int64_t, gint) {}
787  virtual void metric_get_samples (std::vector<ArdourCanvas::Ruler::Mark>&, int64_t, int64_t, gint) {}
788  virtual void metric_get_minsec (std::vector<ArdourCanvas::Ruler::Mark>&, int64_t, int64_t, gint) {}
789 
790  virtual void set_entered_track (TimeAxisView*) {};
791 
792  virtual std::pair<Temporal::timepos_t,Temporal::timepos_t> max_zoom_extent() const = 0;
793 
795  bool use_context_click,
796  bool from_outside_canvas) = 0;
797 
799  virtual void escape () {}
800 
801  virtual void do_undo (uint32_t n) = 0;
802  virtual void do_redo (uint32_t n) = 0;
803 
804  Glib::RefPtr<Gtk::Action> undo_action;
805  Glib::RefPtr<Gtk::Action> redo_action;
806  Glib::RefPtr<Gtk::Action> alternate_redo_action;
807  Glib::RefPtr<Gtk::Action> alternate_alternate_redo_action;
808 
809  /* protected helper functions to help with registering actions */
810 
811  static Glib::RefPtr<Gtk::Action> reg_sens (Glib::RefPtr<Gtk::ActionGroup> group, char const* name, char const* label, sigc::slot<void> slot);
812  static Glib::RefPtr<Gtk::ToggleAction> toggle_reg_sens (Glib::RefPtr<Gtk::ActionGroup> group, char const* name, char const* label, sigc::slot<void> slot);
813  static Glib::RefPtr<Gtk::RadioAction> radio_reg_sens (Glib::RefPtr<Gtk::ActionGroup> action_group, Gtk::RadioAction::Group& radio_group, char const* name, char const* label, sigc::slot<void> slot);
814 
816 
818  virtual void automation_raise_points () {}
819  virtual void automation_lower_points () {};
820  virtual void automation_move_points_later () {};
821  virtual void automation_move_points_earlier () {};
822 
824 };
virtual samplecnt_t current_page_samples() const =0
virtual void abort_reversible_command()=0
VisualChange pending_visual_change
virtual Gdk::Cursor * which_canvas_cursor(ItemType type) const =0
PBD::Signal< void()> MouseModeChanged
void zoom_focus_chosen(Editing::ZoomFocus)
ArdourWidgets::ArdourButton zoom_out_button
virtual std::list< SelectableOwner * > selectable_owners()=0
ArdourWidgets::ArdourDropdown grid_type_selector
void reset_point_selection()
void reset_zoom(samplecnt_t)
double visible_canvas_width() const
void calc_extra_zoom_edges(samplepos_t &start, samplepos_t &end)
double sample_to_pixel(samplepos_t sample) const
std::map< Editing::MouseMode, Glib::RefPtr< Gtk::RadioAction > > mouse_mode_actions
PBD::ScopedConnection escape_connection
void bind_mouse_mode_buttons()
virtual bool canvas_cue_end_event(GdkEvent *event, ArdourCanvas::Item *)
void toggle_follow_playhead()
void center_screen(samplepos_t)
Glib::RefPtr< Gtk::ToggleAction > follow_playhead_action
virtual Temporal::timepos_t snap_to_grid(Temporal::timepos_t const &start, Temporal::RoundMode direction, ARDOUR::SnapPref gpref) const =0
void maybe_draw_grid_lines(ArdourCanvas::Container *)
Glib::RefPtr< Gtk::Action > undo_action
virtual void metric_get_bbt(std::vector< ArdourCanvas::Ruler::Mark > &, int64_t, int64_t, gint)
virtual void begin_reversible_command(std::string cmd_name)=0
void register_common_actions(Gtkmm2ext::Bindings *, std::string const &)
virtual Temporal::timepos_t _get_preferred_edit_position(Editing::EditIgnoreOption, bool use_context_click, bool from_outside_canvas)=0
static bool need_shared_actions
virtual void set_visible_channel(int)
bool follow_playhead() const
virtual bool canvas_control_point_event(GdkEvent *event, ArdourCanvas::Item *, ControlPoint *)=0
void temporal_zoom_step_mouse_focus_scale(bool zoom_out, double scale)
static MouseCursors const * cursors()
virtual void undo_selection_op()=0
void transform_region()
virtual bool canvas_bg_event(GdkEvent *event, ArdourCanvas::Item *)=0
virtual bool enter_handler(ArdourCanvas::Item *, GdkEvent *, ItemType)=0
virtual void delete_()=0
static Glib::RefPtr< Gtk::ToggleAction > toggle_reg_sens(Glib::RefPtr< Gtk::ActionGroup > group, char const *name, char const *label, sigc::slot< void > slot)
std::map< Editing::GridType, Glib::RefPtr< Gtk::RadioAction > > grid_actions
QuantizeDialog * quantize_dialog
void enable_automation_bindings()
virtual bool canvas_velocity_event(GdkEvent *event, ArdourCanvas::Item *)=0
void undo(uint32_t n=1)
void temporal_zoom_step_mouse_focus(bool zoom_out)
void legatize_regions(const MidiViews &rs, bool shrink_only)
Gtk::Adjustment vertical_adjustment
static Glib::RefPtr< Gtk::Action > reg_sens(Glib::RefPtr< Gtk::ActionGroup > group, char const *name, char const *label, sigc::slot< void > slot)
virtual std::pair< Temporal::timepos_t, Temporal::timepos_t > max_zoom_extent() const =0
Glib::RefPtr< Gtk::ActionGroup > channel_actions
virtual void mouse_mode_chosen(Editing::MouseMode)=0
Gtk::Adjustment horizontal_adjustment
samplepos_t pixel_to_sample_from_event(double pixel) const
samplepos_t pixel_to_sample(double pixel) const
bool autoscroll_horizontal_allowed
virtual RegionSelection region_selection()=0
Editing::ZoomFocus zoom_focus() const
virtual Selection & get_selection() const
virtual bool autoscroll_active() const =0
virtual void get_regionviews_by_id(PBD::ID const id, RegionSelection &regions) const =0
virtual bool key_press_handler(ArdourCanvas::Item *, GdkEvent *, ItemType)=0
virtual ArdourCanvas::ScrollGroup * get_cursor_scroll_group() const =0
ArdourWidgets::ArdourButton follow_playhead_button
virtual bool button_press_dispatch(GdkEventButton *)=0
Glib::RefPtr< Gtk::ActionGroup > snap_actions
samplecnt_t get_current_zoom() const
virtual TrackViewList axis_views_from_routes(std::shared_ptr< ARDOUR::RouteList >) const =0
virtual void make_a_region()
virtual ArdourCanvas::GtkCanvas * get_canvas() const =0
Selection * selection
Glib::RefPtr< Gtk::ActionGroup > velocity_actions
virtual void begin_reversible_selection_op(std::string cmd_name)=0
bool mouse_sample(samplepos_t &, bool &in_track_canvas) const
double visible_canvas_height() const
void quantize_regions(const MidiViews &rs)
uint32_t autoscroll_cnt
std::vector< MidiView * > MidiViews
void set_grid_type(Editing::GridType)
std::vector< MidiView * > filter_to_unique_midi_region_views(MidiViews const &ms) const
bool _mouse_changed_selection
ArdourWidgets::ArdourButton note_mode_button
virtual void register_actions()=0
samplecnt_t samples_per_pixel
Editing::GridType pre_internal_grid_type
virtual bool leave_handler(ArdourCanvas::Item *, GdkEvent *, ItemType)=0
virtual bool canvas_cue_start_event(GdkEvent *event, ArdourCanvas::Item *)
virtual void do_redo(uint32_t n)=0
static std::vector< std::string > grid_type_strings
std::map< Editing::GridType, Glib::RefPtr< Gtk::RadioAction > > draw_length_actions
Glib::RefPtr< Gtk::ActionGroup > _midi_actions
static sigc::signal< void > DropDownKeys
void transpose_region()
void pack_draw_box(bool with_channel)
virtual ARDOUR::Location * find_location_from_marker(ArdourMarker *, bool &) const =0
double _track_canvas_width
void set_common_editing_state(XMLNode const &node)
ArdourWidgets::ArdourDropdown zoom_focus_selector
Glib::RefPtr< Gtk::ActionGroup > zoom_actions
void select_automation_line(GdkEventButton *, ArdourCanvas::Item *, ARDOUR::SelectionOperation)
virtual void set_selected_midi_region_view(MidiRegionView &)
Gtk::HBox snap_box
Gtk::HBox draw_box
virtual void snap_to_internal(Temporal::timepos_t &first, Temporal::RoundMode direction=Temporal::RoundNearest, ARDOUR::SnapPref gpref=ARDOUR::SnapToAny_Visual, bool ensure_snap=false) const =0
virtual ArdourCanvas::Container * get_noscroll_group() const =0
virtual void play_note_selection_clicked()
Gtkmm2ext::Bindings * own_bindings
GridLines * grid_lines
void draw_velocity_changed()
Gtk::Label visible_channel_label
std::vector< std::string > zoom_focus_strings
virtual double get_y_origin() const =0
SelectionMemento * _selection_memento
virtual PBD::HistoryOwner & history()=0
Temporal::timecnt_t snap_relative_time_to_relative_time(Temporal::timepos_t const &origin, Temporal::timecnt_t const &x, bool ensure_snap) const
void temporal_zoom_step_scale(bool zoom_out, double scale)
virtual bool canvas_playhead_cursor_event(GdkEvent *event, ArdourCanvas::Item *)
samplecnt_t pixel_duration_to_samples(double pixels) const
ArdourMarker * entered_marker
ArdourWidgets::ArdourButton mouse_cut_button
void set_draw_length(Editing::GridType)
virtual bool button_release_dispatch(GdkEventButton *)=0
Editing::GridType internal_grid_type
virtual void build_zoom_focus_menu()=0
EditorCursor * _playhead_cursor
virtual void point_selection_changed()=0
virtual void full_zoom_clicked()
virtual Gdk::Cursor * which_trim_cursor(bool left_side) const =0
EditorCursor * _snapped_cursor
void apply_midi_note_edit_op(ARDOUR::MidiOperator &op, const RegionSelection &rs)
ARDOUR::Quantize * get_quantize_op()
ArdourWidgets::ArdourButton mouse_select_button
virtual void automation_move_points_later()
virtual void step_mouse_mode(bool next)=0
void edit_notes(MidiView *)
virtual Gdk::Cursor * which_mode_cursor() const =0
double horizontal_position() const
void quantize_region()
double duration_to_pixels_unrounded(Temporal::timecnt_t const &pos) const
int32_t get_grid_music_divisions(Editing::GridType gt, uint32_t event_state) const
ArdourCanvas::Rectangle * rubberband_rect
Glib::RefPtr< Gtk::ActionGroup > length_actions
std::list< XMLNode * > before
virtual void ui_parameter_changed(std::string)
double time_to_pixel(Temporal::timepos_t const &pos) const
static Glib::RefPtr< Gtk::RadioAction > radio_reg_sens(Glib::RefPtr< Gtk::ActionGroup > action_group, Gtk::RadioAction::Group &radio_group, char const *name, char const *label, sigc::slot< void > slot)
std::vector< ArdourCanvas::Ruler::Mark > grid_marks
void set_action_defaults()
void next_grid_choice()
virtual void redisplay_grid(bool immediate_redraw)=0
bool snap_mode_button_clicked(GdkEventButton *)
sigc::connection autoscroll_connection
EditingContext(std::string const &)
Temporal::timepos_t canvas_event_time(GdkEvent const *, double *px=0, double *py=0) const
std::string _name
virtual bool button_press_handler(ArdourCanvas::Item *, GdkEvent *, ItemType)=0
virtual Gdk::Cursor * get_canvas_cursor() const
virtual ArdourCanvas::Duple upper_left() const
virtual void automation_lower_points()
virtual void mark_region_boundary_cache_dirty()
void temporal_zoom(samplecnt_t samples_per_pixel)
double time_to_pixel_unrounded(Temporal::timepos_t const &pos) const
void transpose_regions(const MidiViews &rs)
void register_automation_actions(Gtkmm2ext::Bindings *, std::string const &)
Gtkmm2ext::BindingSet bindings
virtual void set_entered_track(TimeAxisView *)
void legatize_region(bool shrink_only)
sigc::signal< void > DrawLengthChanged
VerboseCursor * _verbose_cursor
Gtk::HBox grid_box
virtual void begin_reversible_command(GQuark)=0
ArdourCanvas::Container * time_line_group
virtual double max_extents_scale() const
samplepos_t _leftmost_sample
virtual void select_all_within(Temporal::timepos_t const &, Temporal::timepos_t const &, double, double, std::list< SelectableOwner * > const &, ARDOUR::SelectionOperation, bool)=0
virtual Selection & get_cut_buffer() const
virtual void abort_reversible_selection_op()=0
virtual void automation_create_point_at_edit_point()
void prev_grid_choice()
ArdourWidgets::ArdourButton mouse_draw_button
ArdourWidgets::ArdourButton play_note_selection_button
PBD::ScopedConnectionList parameter_connections
ArdourWidgets::ArdourButton mouse_move_button
Temporal::timepos_t get_preferred_edit_position(Editing::EditIgnoreOption eio=Editing::EDIT_IGNORE_NONE, bool use_context_click=false, bool from_outside_canvas=false)
void choose_canvas_cursor_on_entry(ItemType)
void hide_grid_lines()
ArdourWidgets::ArdourButton mouse_grid_button
void follow_playhead_chosen()
ARDOUR::Location * transport_loop_location()
virtual bool canvas_note_event(GdkEvent *event, ArdourCanvas::Item *)=0
virtual bool key_release_handler(ArdourCanvas::Item *, GdkEvent *, ItemType)=0
samplepos_t window_event_sample(GdkEvent const *, double *px=0, double *py=0) const
bool grid_type_is_musical(Editing::GridType) const
Selection * cut_buffer
virtual void set_mouse_mode(Editing::MouseMode, bool force=false)
void register_grid_actions()
DragManager * _drags
sigc::signal< void > ZoomChanged
bool autoscroll_vertical_allowed
ArdourWidgets::ArdourButton zoom_in_button
virtual void begin_selection_op_history()=0
Glib::RefPtr< Gtk::ActionGroup > _automation_actions
virtual StripableTimeAxisView * get_stripable_time_axis_by_id(const PBD::ID &id) const =0
virtual bool button_release_handler(ArdourCanvas::Item *, GdkEvent *, ItemType)=0
void reset_x_origin(samplepos_t)
void alt_delete_()
std::map< int, Glib::RefPtr< Gtk::RadioAction > > draw_channel_actions
virtual void load_shared_bindings()
virtual void set_zoom_focus(Editing::ZoomFocus)=0
Editing::SnapMode pre_internal_snap_mode
virtual void cycle_zoom_focus()
void temporal_zoom_step(bool zoom_out)
virtual bool canvas_velocity_base_event(GdkEvent *event, ArdourCanvas::Item *)=0
virtual void snap_to(Temporal::timepos_t &first, Temporal::RoundMode direction=Temporal::RoundNearest, ARDOUR::SnapPref pref=ARDOUR::SnapToAny_Visual, bool ensure_snap=false) const
uint32_t count_bars(Temporal::Beats const &start, Temporal::Beats const &end) const
virtual ArdourCanvas::Container * get_trackview_group() const =0
virtual void add_command(PBD::Command *)=0
EditorCursor * snapped_cursor() const
int idle_visual_changer()
virtual Gdk::Cursor * which_track_cursor() const =0
double _visible_canvas_width
void check_best_snap(Temporal::timepos_t const &presnap, Temporal::timepos_t &test, Temporal::timepos_t &dist, Temporal::timepos_t &best) const
void draw_channel_changed()
PBD::Signal< void()> SnapChanged
virtual void instant_save()=0
virtual bool get_smart_mode() const
virtual void reposition_and_zoom(samplepos_t, double)=0
virtual void commit_reversible_command()=0
virtual Temporal::timepos_t snap_to_bbt(Temporal::timepos_t const &start, Temporal::RoundMode direction, ARDOUR::SnapPref gpref) const
virtual Temporal::timecnt_t get_nudge_distance(Temporal::timepos_t const &pos, Temporal::timecnt_t &next) const =0
std::map< Editing::ZoomFocus, Glib::RefPtr< Gtk::RadioAction > > zoom_focus_actions
virtual std::shared_ptr< Temporal::TempoMap const > start_local_tempo_map(std::shared_ptr< Temporal::TempoMap >)
ArdourWidgets::ArdourDropdown draw_length_selector
ArdourWidgets::ArdourButton mouse_content_button
virtual void update_tempo_based_rulers()
static int _idle_visual_changer(void *arg)
virtual void maybe_autoscroll(bool, bool, bool from_headers)=0
virtual void commit_reversible_selection_op()=0
void set_horizontal_position(double)
Editing::MouseMode current_mouse_mode() const
void transform_regions(const MidiViews &rs)
Editing::GridType grid_type() const
void register_midi_actions(Gtkmm2ext::Bindings *, std::string const &)
virtual void set_samples_per_pixel(samplecnt_t)=0
void draw_velocity_chosen(int)
virtual void automation_move_points_earlier()
void center_screen_internal(samplepos_t, float)
double timeline_to_canvas(double p) const
ArdourWidgets::ArdourVSpacer _grid_box_spacer
static Gtkmm2ext::Bindings * button_bindings
void disable_automation_bindings()
void build_draw_midi_menus()
virtual void midi_action(void(MidiView::*method)())
virtual bool allow_trim_cursors() const
virtual ArdourCanvas::ScrollGroup * get_hscroll_group() const =0
ArdourWidgets::ArdourButton follow_edits_button
void update_undo_redo_actions(PBD::UndoHistory const &)
void note_edit_done(int, EditNoteDialog *)
virtual bool internal_editing() const =0
MidiViews midiviews_from_region_selection(RegionSelection const &) const
virtual void redo_selection_op()=0
void draw_length_changed()
void cycle_snap_mode()
virtual Editing::ZoomFocus effective_zoom_focus() const
bool preview_video_drag_active() const
virtual ArdourCanvas::GtkCanvasViewport * get_canvas_viewport() const =0
void grid_type_chosen(Editing::GridType)
void snap_mode_chosen(Editing::SnapMode)
ArdourWidgets::ArdourDropdown draw_velocity_selector
virtual VerboseCursor * verbose_cursor() const
virtual void escape()
virtual void follow_playhead_clicked()
bool typed_event(ArdourCanvas::Item *, GdkEvent *, ItemType)
bool grid_musical() const
void compute_bbt_ruler_scale(samplepos_t lower, samplepos_t upper)
void temporal_zoom_by_sample(samplepos_t start, samplepos_t end)
virtual Editing::MouseMode effective_mouse_mode() const
ArdourWidgets::ArdourVSpacer _draw_box_spacer
Temporal::timecnt_t relative_distance(Temporal::timepos_t const &origin, Temporal::timecnt_t const &duration, Temporal::TimeDomain domain)
Temporal::timepos_t snap_to_bbt_via_grid(Temporal::timepos_t const &start, Temporal::RoundMode direction, ARDOUR::SnapPref gpref, Editing::GridType grid_type) const
ArdourWidgets::ArdourButton snap_mode_button
PBD::Command * apply_midi_note_edit_op_to_region(ARDOUR::MidiOperator &op, MidiView &mrv)
Gtk::Menu _note_context_menu
virtual void set_snapped_cursor_position(Temporal::timepos_t const &pos)=0
samplepos_t canvas_event_sample(GdkEvent const *event, double *pcx=nullptr, double *pcy=nullptr) const
void pack_snap_box()
DragManager * drags() const
double _visible_canvas_height
height of the visible area of the track canvas
virtual void metric_get_minsec(std::vector< ArdourCanvas::Ruler::Mark > &, int64_t, int64_t, gint)
Editing::SnapMode snap_mode() const
int32_t get_grid_beat_divisions(Editing::GridType gt) const
void draw_channel_chosen(int)
virtual void metric_get_timecode(std::vector< ArdourCanvas::Ruler::Mark > &, int64_t, int64_t, gint)
double duration_to_pixels(Temporal::timecnt_t const &pos) const
Glib::RefPtr< Gtk::ActionGroup > _common_actions
double time_delta_to_pixel(Temporal::timepos_t const &start, Temporal::timepos_t const &end) const
ArdourWidgets::ArdourDropdown draw_channel_selector
std::map< Editing::SnapMode, Glib::RefPtr< Gtk::RadioAction > > snap_mode_actions
bool temporary_zoom_focus_change
Temporal::Beats get_grid_type_as_beats(bool &success, Temporal::timepos_t const &position) const
virtual void parameter_changed(std::string)
XMLNode * button_settings() const
virtual void add_commands(std::vector< PBD::Command * >)=0
virtual void metric_get_samples(std::vector< ArdourCanvas::Ruler::Mark > &, int64_t, int64_t, gint)
void reset_x_origin_to_follow_playhead()
double sample_to_pixel_unrounded(samplepos_t sample) const
virtual void get_per_region_note_selection(std::list< std::pair< PBD::ID, std::set< std::shared_ptr< Evoral::Note< Temporal::Beats > > > > > &) const =0
void popup_note_context_menu(ArdourCanvas::Item *, GdkEvent *)
virtual void note_mode_clicked()
virtual ArdourMarker * find_marker_from_location_id(PBD::ID const &, bool) const =0
std::string editor_name() const
virtual void use_appropriate_mouse_mode_for_sections()
Temporal::Beats get_draw_length_as_beats(bool &success, Temporal::timepos_t const &position) const
virtual bool button_press_handler_2(ArdourCanvas::Item *, GdkEvent *, ItemType)=0
virtual void cut_copy(Editing::CutCopyOp)=0
Glib::RefPtr< Gtk::ActionGroup > editor_actions
BBTRulerScale bbt_ruler_scale
virtual void keyboard_paste()=0
virtual void do_undo(uint32_t n)=0
ArdourWidgets::ArdourButton mouse_timefx_button
RegionView * entered_regionview
virtual void snap_to_with_modifier(Temporal::timepos_t &first, GdkEvent const *ev, Temporal::RoundMode direction=Temporal::RoundNearest, ARDOUR::SnapPref gpref=ARDOUR::SnapToAny_Visual, bool ensure_snap=false) const
sigc::signal< void > DrawChannelChanged
std::vector< MidiView * > filter_to_unique_midi_region_views(RegionSelection const &rs) const
virtual void set_canvas_cursor(Gdk::Cursor *)
bool on_velocity_scroll_event(GdkEventScroll *)
ArdourWidgets::ArdourButton full_zoom_button
void set_session(ARDOUR::Session *)
int draw_channel() const
void ensure_visual_change_idle_handler()
ArdourCanvas::Rect autoscroll_boundary
EditorCursor * playhead_cursor() const
virtual void automation_raise_points()
ArdourWidgets::ArdourDropdown visible_channel_selector
TimeAxisView * entered_track
void set_draw_velocity(int)
double timeline_origin() const
void reset_y_origin(double)
void set_draw_channel(int)
virtual MeterMarker * find_marker_for_meter(Temporal::MeterPoint const &)=0
void get_common_editing_state(XMLNode &node) const
virtual void end_local_tempo_map(std::shared_ptr< Temporal::TempoMap const >)
Editing::GridType draw_length() const
Temporal::TimeDomain time_domain() const
std::map< int, Glib::RefPtr< Gtk::RadioAction > > draw_velocity_actions
Editing::SnapMode internal_snap_mode
uint32_t bbt_bar_helper_on
Glib::RefPtr< Gtk::Action > redo_action
virtual void paste(float times, bool from_context_menu)=0
void redo(uint32_t n=1)
virtual void visual_changer(const VisualChange &)=0
virtual void history_changed()=0
Glib::RefPtr< Gtk::Action > alternate_redo_action
void set_loop_range(Temporal::timepos_t const &start, Temporal::timepos_t const &end, std::string cmd)
void set_snap_mode(Editing::SnapMode)
static MouseCursors * _cursors
bool drag_active() const
virtual void update_grid()
void set_follow_playhead(bool yn, bool catch_up=true)
virtual void show_rulers_for_grid()
void build_grid_type_menu()
double canvas_to_timeline(double p) const
virtual bool button_press_handler_1(ArdourCanvas::Item *, GdkEvent *, ItemType)=0
int draw_velocity() const
void temporal_zoom_to_sample(bool coarser, samplepos_t sample)
virtual bool motion_handler(ArdourCanvas::Item *, GdkEvent *, bool from_autoscroll=false)=0
sigc::signal< void > DrawVelocityChanged
void apply_midi_note_edit_op(ARDOUR::MidiOperator &op, const MidiViews &rs)
void draw_length_chosen(Editing::GridType)
virtual void stop_canvas_autoscroll()=0
Glib::RefPtr< Gtk::Action > alternate_alternate_redo_action
virtual TempoMarker * find_marker_for_tempo(Temporal::TempoPoint const &)=0
Definition: id.h:34
Lists of selected things.
Definition: xml++.h:114
ItemType
Definition: editor_items.h:24
GtkImageIconNameData name
Definition: gtkimage.h:6
PBD::PropertyDescriptor< bool > regions
PBD::PropertyDescriptor< timepos_t > start
Temporal::samplecnt_t samplecnt_t
Temporal::samplepos_t samplepos_t
CutCopyOp
Definition: editing.h:228
SnapMode
Definition: editing.h:70
GridType
Definition: editing.h:52
EditIgnoreOption
Definition: editing.h:241
@ EDIT_IGNORE_NONE
Definition: editing.h:242
ZoomFocus
Definition: editing.h:126
MouseMode
Definition: editing.h:98
std::vector< Bindings * > BindingSet
Definition: bindings.h:224
@ RoundNearest
Round to nearest.
CursorRAII(EditingContext &e, Gdk::Cursor *new_cursor)
std::shared_ptr< Temporal::TempoMap const > old_map
TempoMapScope(EditingContext &context, std::shared_ptr< Temporal::TempoMap > map)