Ardour  9.5-34-g533997b920
cue_editor.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2023 Paul Davis <paul@linuxaudiosystems.com>
3  *
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.
8  *
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.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  */
18 
19 #pragma once
20 
21 #include "pbd/history_owner.h"
22 
23 #include "canvas/canvas.h"
24 
25 #include "widgets/ardour_button.h"
26 #include "widgets/eventboxext.h"
27 
28 #include "editing.h"
29 #include "editing_context.h"
30 #include "region_ui_settings.h"
31 
32 namespace Gtk {
33  class HScrollbar;
34 }
35 
37 {
38  public:
39  CueEditor (std::string const & name, bool with_transport_controls);
41 
42  virtual Gtk::Widget& contents () = 0;
43 
45 
50 
53  TrackViewList axis_views_from_routes (std::shared_ptr<ARDOUR::RouteList>) const;
54  AxisView* axis_view_by_stripable (std::shared_ptr<ARDOUR::Stripable>) const { return nullptr; }
55  AxisView* axis_view_by_control (std::shared_ptr<ARDOUR::AutomationControl>) const { return nullptr; }
56 
61 
62  void maybe_autoscroll (bool, bool, bool from_headers);
64  bool autoscroll_active() const;
65 
66  void redisplay_grid (bool immediate_redraw);
68  std::list<SelectableOwner*> selectable_owners() { return std::list<SelectableOwner*>(); }
69 
71  void begin_reversible_selection_op (std::string cmd_name);
76 
78 
79  PBD::HistoryOwner& history() { return *this; }
80  void history_changed ();
82 
83  void add_command (PBD::Command * cmd) { HistoryOwner::add_command (cmd); }
84  void add_commands (std::vector<PBD::Command *> cmds) { HistoryOwner::add_commands (cmds); }
85  void begin_reversible_command (std::string cmd_name) { HistoryOwner::begin_reversible_command (cmd_name); }
86  void begin_reversible_command (GQuark gq) { HistoryOwner::begin_reversible_command (gq); }
87  void abort_reversible_command () { HistoryOwner::abort_reversible_command (); }
88  void commit_reversible_command () { HistoryOwner::commit_reversible_command (); }
89 
90  double get_y_origin () const;
91 
96 
97  void set_mouse_mode (Editing::MouseMode, bool force = false);
101  void step_mouse_mode (bool next);
103  bool internal_editing() const { return true; }
105 
107  MouseCursors const* cursors () const {
108  return _cursors;
109  }
111 
112  std::vector<MidiRegionView*> filter_to_unique_midi_region_views (RegionSelection const & ms) const;
113 
114  void scrolled ();
117 
118  std::pair<Temporal::timepos_t,Temporal::timepos_t> max_zoom_extent() const;
119 
121  void zoom_to_show (std::pair<Temporal::timepos_t,Temporal::timepos_t> const &);
122 
124 
125  virtual void set_show_source (bool);
126  virtual void add_region (std::shared_ptr<ARDOUR::Region>, std::shared_ptr<ARDOUR::Track>) {}
127  virtual void remove_regions() {}
128  virtual void set_region (std::shared_ptr<ARDOUR::Region>);
129  virtual void set_track (std::shared_ptr<ARDOUR::Track>);
131 
132  virtual void set_inspector_visibility (bool) {}
133 
134  virtual void maybe_update () = 0;
135 
138 
139  int set_state (const XMLNode&, int version);
140  XMLNode& get_state () const;
141 
142  void set_start (Temporal::timepos_t const & p);
143  void set_end (Temporal::timepos_t const & p);
144  virtual void shift_contents (Temporal::timepos_t const &, bool model_too) {}
145  virtual Temporal::timepos_t source_to_timeline (Temporal::timepos_t const & source_pos) const { return source_pos; }
146 
147  void set_horizontal_position (double);
148 
149  protected:
153  std::shared_ptr<ARDOUR::Region> _region;
154  std::shared_ptr<ARDOUR::Track> _track;
162 
163  void load_bindings ();
165 
166  Gtk::Window* transient_parent () { return dynamic_cast<Gtk::Window*> (contents().get_toplevel ()); }
167 
168  /* The group containing all other groups that are scrolled vertically
169  and horizontally.
170  */
172 
173  /* The group containing all other groups that are scrolled horizontally ONLY
174  */
177 
178  /* Scroll group for cursors, scrolled horizontally, above everything else
179  */
181 
185 
189 
190  virtual void pack_inner (Gtk::Box&) = 0;
191  virtual void pack_outer (Gtk::Box&) = 0;
194 
195  virtual void update_rulers() {}
196  virtual bool canvas_enter_leave (GdkEventCrossing* ev) = 0;
197 
199  void do_undo (uint32_t n);
200  void do_redo (uint32_t n);
201 
202  Temporal::timepos_t _get_preferred_edit_position (Editing::EditIgnoreOption, bool use_context_click, bool from_outside_canvas);
203 
208 
210 
215 
217 
219 
221 
223  virtual void rec_enable_change ();
224  void blink_rec_enable (bool);
226  sigc::connection rec_blink_connection;
227 
228  sigc::connection _update_connection;
232 
235 
237  size_t n_timebars;
238 
239  /* autoscrolling */
240 
242  void start_canvas_autoscroll (bool allow_horiz, bool allow_vert, const ArdourCanvas::Rect& boundary);
244 
246 
247  std::shared_ptr<ARDOUR::Region> _visible_pending_region;
248 
250 
251  virtual void begin_write () = 0;
252  virtual void end_write () = 0;
253 
255 
256  sigc::connection count_in_connection;
258 
259  void count_in (Temporal::timepos_t, unsigned int);
261  virtual void show_count_in (std::string const &) = 0;
262  virtual void hide_count_in () = 0;
263 
265  virtual bool idle_data_captured () = 0;
266  std::atomic<int> idle_update_queued;
269 
270  virtual void unset_region ();
271  virtual void unset_trigger ();
272 
273  bool maybe_set_from_rsu (PBD::ID const &);
275 
276  void metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>&, samplepos_t, samplepos_t, gint);
277 
281 
282  virtual void region_prop_change (PBD::PropertyChange const & what_changed) {}
283  virtual void trigger_prop_change (PBD::PropertyChange const & what_changed) {}
284 
287 };
Declaration of the main canvas classes.
void mouse_mode_chosen(Editing::MouseMode)
void set_mouse_mode(Editing::MouseMode, bool force=false)
Gtk::HBox button_bar
Definition: cue_editor.h:160
ARDOUR::TriggerReference ref
Definition: cue_editor.h:152
void data_captured(samplecnt_t)
double get_y_origin() const
void do_undo(uint32_t n)
AxisView * axis_view_by_control(std::shared_ptr< ARDOUR::AutomationControl >) const
Definition: cue_editor.h:55
bool bang_button_press(GdkEventButton *)
void session_going_away()
PBD::ScopedConnectionList trigger_connections
Definition: cue_editor.h:230
StripableTimeAxisView * get_stripable_time_axis_by_id(const PBD::ID &id) const
bool rec_button_press(GdkEventButton *)
virtual Temporal::timepos_t source_to_timeline(Temporal::timepos_t const &source_pos) const
Definition: cue_editor.h:145
void set_zoom_focus(Editing::ZoomFocus)
void set_snapped_cursor_position(Temporal::timepos_t const &pos)
void reposition_and_zoom(samplepos_t, double)
virtual void set_region(std::shared_ptr< ARDOUR::Region >)
void set_horizontal_position(double)
void step_mouse_mode(bool next)
sigc::connection _update_connection
Definition: cue_editor.h:228
ArdourCanvas::Rectangle * transport_loop_range_rect
Definition: cue_editor.h:209
Temporal::Beats count_in_to
Definition: cue_editor.h:257
ArdourCanvas::Container * no_scroll_group
Definition: cue_editor.h:183
std::shared_ptr< ARDOUR::Region > _visible_pending_region
Definition: cue_editor.h:247
bool autoscroll_active() const
RegionSelection region_selection()
PBD::ScopedConnectionList track_connections
Definition: cue_editor.h:231
void set_start(Temporal::timepos_t const &p)
void setup_record_blink()
ArdourCanvas::ScrollGroup * cursor_scroll_group
Definition: cue_editor.h:180
void begin_reversible_selection_op(std::string cmd_name)
void set_recording_length(Temporal::BBT_Offset bars)
ArdourCanvas::GtkCanvasViewport * get_canvas_viewport() const
bool solo_button_press(GdkEventButton *)
Gtk::Window * transient_parent()
Definition: cue_editor.h:166
void redisplay_grid(bool immediate_redraw)
bool hscroll_press(GdkEventButton *)
virtual void set_trigger(ARDOUR::TriggerReference &)
Temporal::timepos_t _get_preferred_edit_position(Editing::EditIgnoreOption, bool use_context_click, bool from_outside_canvas)
std::shared_ptr< ARDOUR::Region > _region
Definition: cue_editor.h:153
bool autoscroll_canvas()
std::shared_ptr< ARDOUR::Track > _track
Definition: cue_editor.h:154
virtual Gtk::Box * pack_mouse_mode_box()
Gtk::HBox _hpacker
Definition: cue_editor.h:158
bool _scroll_drag
Definition: cue_editor.h:278
virtual void begin_write()=0
void commit_reversible_command()
Definition: cue_editor.h:88
void zoom_to_show(std::pair< Temporal::timepos_t, Temporal::timepos_t > const &)
TempoMarker * find_marker_for_tempo(Temporal::TempoPoint const &)
virtual void shift_contents(Temporal::timepos_t const &, bool model_too)
Definition: cue_editor.h:144
virtual void set_from_rsu(RegionUISettings &)
AxisView * axis_view_by_stripable(std::shared_ptr< ARDOUR::Stripable >) const
Definition: cue_editor.h:54
void full_zoom_clicked()
void begin_reversible_command(std::string cmd_name)
Definition: cue_editor.h:85
void add_region_ui_settings(PBD::ID const &, RegionUISettings &)
virtual void unset_region()
bool hscroll_release(GdkEventButton *)
sigc::connection rec_blink_connection
Definition: cue_editor.h:226
bool show_source
Definition: cue_editor.h:156
virtual bool idle_data_captured()=0
virtual void rec_enable_change()
virtual Gtk::Widget & contents()=0
std::pair< Temporal::timepos_t, Temporal::timepos_t > max_zoom_extent() const
std::vector< MidiRegionView * > filter_to_unique_midi_region_views(RegionSelection const &ms) const
virtual void end_write()=0
void abort_reversible_selection_op()
virtual bool canvas_enter_leave(GdkEventCrossing *ev)=0
void undo_selection_op()
ArdourCanvas::Container * global_rect_group
Definition: cue_editor.h:182
virtual void pack_outer(Gtk::Box &)=0
ArdourCanvas::Container * get_noscroll_group() const
Definition: cue_editor.h:47
CueEditor(std::string const &name, bool with_transport_controls)
ArdourMarker * find_marker_from_location_id(PBD::ID const &, bool) const
Gtk::HBox rec_box
Definition: cue_editor.h:187
PBD::ScopedConnectionList capture_connections
Definition: cue_editor.h:267
bool zoom_in_allocate
Definition: cue_editor.h:218
void add_commands(std::vector< PBD::Command * > cmds)
Definition: cue_editor.h:84
std::atomic< int > idle_update_queued
Definition: cue_editor.h:266
void history_changed()
size_t n_timebars
Definition: cue_editor.h:237
samplecnt_t data_capture_duration
Definition: cue_editor.h:268
virtual void add_region(std::shared_ptr< ARDOUR::Region >, std::shared_ptr< ARDOUR::Track >)
Definition: cue_editor.h:126
void count_in(Temporal::timepos_t, unsigned int)
virtual void set_inspector_visibility(bool)
Definition: cue_editor.h:132
MouseCursors const * cursors() const
Definition: cue_editor.h:107
void update_solo_display()
ArdourWidgets::ArdourButton loop_button
Definition: cue_editor.h:207
ArdourCanvas::Container * data_group
Definition: cue_editor.h:184
virtual void show_count_in(std::string const &)=0
bool ruler_event(GdkEvent *)
virtual void unset_trigger()
virtual void set_show_source(bool)
ArdourCanvas::GtkCanvas * get_canvas() const
virtual void region_prop_change(PBD::PropertyChange const &what_changed)
Definition: cue_editor.h:282
ArdourWidgets::EventBoxExt _contents
Definition: cue_editor.h:157
void begin_reversible_command(GQuark gq)
Definition: cue_editor.h:86
bool play_button_press(GdkEventButton *)
Gdk::Cursor * get_canvas_cursor() const
samplecnt_t get_current_zoom() const
virtual void update_rulers()
Definition: cue_editor.h:195
ARDOUR::Location * find_location_from_marker(ArdourMarker *, bool &) const
XMLNode & get_state() const
void set_end(Temporal::timepos_t const &p)
void commit_reversible_selection_op()
Temporal::timecnt_t get_nudge_distance(Temporal::timepos_t const &pos, Temporal::timecnt_t &next) const
void count_in_change(ARDOUR::Trigger const *)
ArdourCanvas::ScrollGroup * get_hscroll_group() const
Definition: cue_editor.h:48
virtual void pack_inner(Gtk::Box &)=0
ArdourWidgets::ArdourButton solo_button
Definition: cue_editor.h:206
void add_command(PBD::Command *cmd)
Definition: cue_editor.h:83
bool loop_button_press(GdkEventButton *)
TrackViewList axis_views_from_routes(std::shared_ptr< ARDOUR::RouteList >) const
ArdourCanvas::Container * get_trackview_group() const
Definition: cue_editor.h:46
virtual void trigger_prop_change(PBD::PropertyChange const &what_changed)
Definition: cue_editor.h:283
PBD::HistoryOwner & history()
Definition: cue_editor.h:79
bool internal_editing() const
Definition: cue_editor.h:103
ArdourCanvas::GtkCanvasViewport _canvas_viewport
Definition: cue_editor.h:150
double timebar_height
Definition: cue_editor.h:236
ArdourCanvas::ScrollGroup * hv_scroll_group
Definition: cue_editor.h:171
MeterMarker * find_marker_for_meter(Temporal::MeterPoint const &)
Gtk::VBox _toolbox
Definition: cue_editor.h:159
void start_canvas_autoscroll(bool allow_horiz, bool allow_vert, const ArdourCanvas::Rect &boundary)
ArdourWidgets::ArdourButton play_button
Definition: cue_editor.h:205
void load_bindings()
virtual void manage_possible_header(Gtk::Allocation &)
Definition: cue_editor.h:254
void initialize_region_ui_settings(RegionUISettings &)
void visual_changer(const VisualChange &)
void metric_get_bbt(std::vector< ArdourCanvas::Ruler::Mark > &, samplepos_t, samplepos_t, gint)
virtual void set_track(std::shared_ptr< ARDOUR::Track >)
bool canvas_pre_event(GdkEvent *)
void do_redo(uint32_t n)
void maybe_set_count_in()
std::list< SelectableOwner * > selectable_owners()
Definition: cue_editor.h:68
void build_upper_toolbar()
void register_actions()
void scrolled()
void trigger_arm_change()
void get_regionviews_by_id(PBD::ID const id, RegionSelection &regions) const
int set_state(const XMLNode &, int version)
PBD::ScopedConnection history_connection
Definition: cue_editor.h:81
Gtk::HScrollbar * _canvas_hscrollbar
Definition: cue_editor.h:161
bool with_transport_controls
Definition: cue_editor.h:155
virtual void hide_count_in()=0
virtual void remove_regions()
Definition: cue_editor.h:127
void build_zoom_focus_menu()
virtual void set_samples_per_pixel(samplecnt_t)
void catch_pending_show_region()
void begin_selection_op_history()
PBD::ScopedConnectionList region_connections
Definition: cue_editor.h:229
void blink_rec_enable(bool)
void ruler_locate(GdkEventButton *)
Gtk::Label length_label
Definition: cue_editor.h:186
ArdourWidgets::ArdourDropdown length_selector
Definition: cue_editor.h:216
ArdourCanvas::ScrollGroup * h_scroll_group
Definition: cue_editor.h:175
bool maybe_set_from_rsu(PBD::ID const &)
void maybe_autoscroll(bool, bool, bool from_headers)
Gtk::HBox play_box
Definition: cue_editor.h:188
void redo_selection_op()
sigc::connection count_in_connection
Definition: cue_editor.h:256
ArdourCanvas::ScrollGroup * get_cursor_scroll_group() const
Definition: cue_editor.h:49
ArdourWidgets::ArdourButton rec_enable_button
Definition: cue_editor.h:204
void stop_canvas_autoscroll()
ArdourCanvas::GtkCanvas & _canvas
Definition: cue_editor.h:151
virtual void maybe_update()=0
ArdourCanvas::ScrollGroup * v_scroll_group
Definition: cue_editor.h:176
void abort_reversible_command()
Definition: cue_editor.h:87
static MouseCursors * _cursors
Container * get_toplevel()
Definition: id.h:33
Definition: xml++.h:114
GtkImageIconNameData name
Definition: gtkimage.h:6
PBD::PropertyDescriptor< bool > regions
Temporal::samplecnt_t samplecnt_t
Temporal::samplepos_t samplepos_t
EditIgnoreOption
Definition: editing.h:254
ZoomFocus
Definition: editing.h:127
MouseMode
Definition: editing.h:99
Definition: ardour_ui.h:182