/* * Copyright (C) 2023 Paul Davis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #pragma once #include "pbd/history_owner.h" #include "widgets/ardour_button.h" #include "widgets/eventboxext.h" #include "editing.h" #include "editing_context.h" namespace Gtk { class HScrollbar; } class CueEditor : public EditingContext, public PBD::HistoryOwner { public: CueEditor (std::string const & name, bool with_transport_controls); ~CueEditor (); virtual Gtk::Widget& viewport() = 0; virtual Gtk::Widget& contents () = 0; void get_regionviews_by_id (PBD::ID const id, RegionSelection & regions) const; StripableTimeAxisView* get_stripable_time_axis_by_id (const PBD::ID& id) const; TrackViewList axis_views_from_routes (std::shared_ptr) const; AxisView* axis_view_by_stripable (std::shared_ptr) const { return nullptr; } AxisView* axis_view_by_control (std::shared_ptr) const { return nullptr; } ARDOUR::Location* find_location_from_marker (ArdourMarker*, bool&) const; ArdourMarker* find_marker_from_location_id (PBD::ID const&, bool) const; TempoMarker* find_marker_for_tempo (Temporal::TempoPoint const &); MeterMarker* find_marker_for_meter (Temporal::MeterPoint const &); void maybe_autoscroll (bool, bool, bool from_headers); void stop_canvas_autoscroll (); bool autoscroll_active() const; void redisplay_grid (bool immediate_redraw); Temporal::timecnt_t get_nudge_distance (Temporal::timepos_t const & pos, Temporal::timecnt_t& next) const; std::list selectable_owners() { return std::list(); } void instant_save(); void begin_selection_op_history (); void begin_reversible_selection_op (std::string cmd_name); void commit_reversible_selection_op (); void abort_reversible_selection_op (); void undo_selection_op (); void redo_selection_op (); PBD::HistoryOwner& history() { return *this; } void history_changed (); PBD::ScopedConnection history_connection; void add_command (PBD::Command * cmd) { HistoryOwner::add_command (cmd); } void add_commands (std::vector cmds) { HistoryOwner::add_commands (cmds); } void begin_reversible_command (std::string cmd_name) { HistoryOwner::begin_reversible_command (cmd_name); } void begin_reversible_command (GQuark gq) { HistoryOwner::begin_reversible_command (gq); } void abort_reversible_command () { HistoryOwner::abort_reversible_command (); } void commit_reversible_command () { HistoryOwner::commit_reversible_command (); } double get_y_origin () const; void set_zoom_focus (Editing::ZoomFocus); samplecnt_t get_current_zoom () const; virtual void set_samples_per_pixel (samplecnt_t); void reposition_and_zoom (samplepos_t, double); void set_mouse_mode (Editing::MouseMode, bool force = false); /** Step the mouse mode onto the next or previous one. * @param next true to move to the next, otherwise move to the previous */ void step_mouse_mode (bool next); /** @return The current mouse mode (gain, object, range, timefx etc.) * (defined in editing_syms.inc.h) */ Editing::MouseMode current_mouse_mode () const; /** cue editors are *always* used for internal editing */ bool internal_editing() const { return true; } Gdk::Cursor* get_canvas_cursor () const; MouseCursors const* cursors () const { return _cursors; } void set_snapped_cursor_position (Temporal::timepos_t const & pos); std::vector filter_to_unique_midi_region_views (RegionSelection const & ms) const; std::shared_ptr start_local_tempo_map (std::shared_ptr); void end_local_tempo_map (std::shared_ptr); void scrolled (); bool canvas_pre_event (GdkEvent*); void catch_pending_show_region (); protected: ARDOUR::TriggerReference ref; std::shared_ptr _track; bool with_transport_controls; ArdourWidgets::EventBoxExt _contents; Gtk::VBox _toolbox; Gtk::HBox button_bar; Gtk::HScrollbar* _canvas_hscrollbar; /* The group containing all other groups that are scrolled vertically and horizontally. */ ArdourCanvas::ScrollGroup* hv_scroll_group; /* The group containing all other groups that are scrolled horizontally ONLY */ ArdourCanvas::ScrollGroup* h_scroll_group; ArdourCanvas::ScrollGroup* v_scroll_group; /* Scroll group for cursors, scrolled horizontally, above everything else */ ArdourCanvas::ScrollGroup* cursor_scroll_group; ArdourCanvas::Container* global_rect_group; ArdourCanvas::Container* no_scroll_group; ArdourCanvas::Container* data_group; Gtk::Label length_label; Gtk::HBox rec_box; Gtk::HBox play_box; virtual void pack_inner (Gtk::Box&) = 0; virtual void pack_outer (Gtk::Box&) = 0; void build_zoom_focus_menu (); virtual void update_rulers() {} virtual bool canvas_enter_leave (GdkEventCrossing* ev) = 0; void build_upper_toolbar (); void do_undo (uint32_t n); void do_redo (uint32_t n); Temporal::timepos_t _get_preferred_edit_position (Editing::EditIgnoreOption, bool use_context_click, bool from_outside_canvas); ArdourWidgets::ArdourButton rec_enable_button; ArdourWidgets::ArdourButton play_button; ArdourWidgets::ArdourButton solo_button; ArdourWidgets::ArdourButton loop_button; ArdourCanvas::Rectangle* transport_loop_range_rect; bool play_button_press (GdkEventButton*); bool solo_button_press (GdkEventButton*); bool bang_button_press (GdkEventButton*); bool loop_button_press (GdkEventButton*); ArdourWidgets::ArdourDropdown length_selector; Temporal::BBT_Offset rec_length; bool zoom_in_allocate; void set_recording_length (Temporal::BBT_Offset bars); virtual void set_region (std::shared_ptr) = 0; bool rec_button_press (GdkEventButton*); void rec_enable_change (); void blink_rec_enable (bool); sigc::connection rec_blink_connection; void trigger_arm_change (); double timebar_height; size_t n_timebars; /* autoscrolling */ bool autoscroll_canvas (); void start_canvas_autoscroll (bool allow_horiz, bool allow_vert, const ArdourCanvas::Rect& boundary); void visual_changer (const VisualChange&); std::shared_ptr _visible_pending_region; };