6#include "gui/backend/backend/actions/undoable_action.h"
7#include "gui/dsp/quantize_options.h"
8#include "structure/arrangement/arranger_object_span.h"
9#include "structure/arrangement/audio_function.h"
10#include "structure/arrangement/automation_function.h"
11#include "structure/arrangement/midi_function.h"
13namespace zrythm::gui::actions
29class ArrangerSelectionsAction :
public QObject,
public UndoableAction
33 DEFINE_UNDOABLE_ACTION_QML_PROPERTIES (ArrangerSelectionsAction)
35 using ArrangerObjectRegistry = structure::arrangement::ArrangerObjectRegistry;
36 using ArrangerObjectPtrVariant =
37 structure::arrangement::ArrangerObjectPtrVariant;
122 class MoveOrDuplicateAction;
123 class MoveOrDuplicateTimelineAction;
124 class MoveOrDuplicateMidiAction;
125 class MoveOrDuplicateAutomationAction;
126 class MoveOrDuplicateChordAction;
128 class MoveMidiAction;
129 class MoveChordAction;
131 class AutomationFillAction;
135 class QuantizeAction;
137 ArrangerObjectRegistry &get_arranger_object_registry ()
const;
139 friend void init_from (
162 ArrangerSelectionsAction (ArrangerObjectSpan before_sel, Type type)
163 : UndoableAction (UndoableAction::Type::ArrangerSelections),
type_ (type),
185 void do_or_undo (
bool do_it);
187 void do_or_undo_duplicate_or_link (
bool link,
bool do_it);
188 void do_or_undo_move (
bool do_it);
189 void do_or_undo_create_or_delete (
bool do_it,
bool create);
190 void do_or_undo_record (
bool do_it);
191 void do_or_undo_edit (
bool do_it);
192 void do_or_undo_automation_fill (
bool do_it);
193 void do_or_undo_split (
bool do_it);
194 void do_or_undo_merge (
bool do_it);
195 void do_or_undo_resize (
bool do_it);
196 void do_or_undo_quantize (
bool do_it);
202 void update_region_link_groups (
const auto &objects);
213 void move_obj_by_tracks_and_lanes (
214 ArrangerObjectPtrVariant obj_var,
217 bool use_index_in_prev_lane,
218 int index_in_prev_lane);
220 std::vector<ArrangerObjectPtrVariant> get_project_arranger_objects ()
const;
222 void init_loaded_impl () final;
223 void perform_impl () final;
224 void undo_impl () final;
231 std::optional<std::vector<ArrangerObjectPtrVariant>>
sel_;
237 std::optional<std::vector<ArrangerObjectPtrVariant>>
sel_after_;
260 std::optional<std::pair<Position, Position>>
261 selected_positions_in_audio_editor_;
278 std::vector<ArrangerObject::Uuid>
r1_;
279 std::vector<ArrangerObject::Uuid> r2_;
292 std::unique_ptr<gui::old_dsp::QuantizeOptions>
opts_{};
298 std::optional<ArrangerObjectPtrVariant> region_after_;
317 ArrangerObjectSpan sel_var,
321class CreateArrangerSelectionsAction final
325 CreateArrangerSelectionsAction (ArrangerObjectSpan sel)
329class DeleteArrangerSelectionsAction final
333 DeleteArrangerSelectionsAction (ArrangerObjectSpan sel)
348 ArrangerObjectSpan sel_before,
349 ArrangerObjectSpan sel_after,
350 bool already_recorded);
354 :
public ArrangerSelectionsAction
365 ArrangerObjectSpan sel_var,
372 double delta_normalized_amount,
373 std::optional<dsp::PortUuid> tgt_port_id,
381 MoveOrDuplicateTimelineAction (
382 ArrangerObjectSpan sel,
387 std::optional<dsp::PortUuid> tgt_port_id,
406 MoveOrDuplicateMidiAction (
407 ArrangerObjectSpan sel,
429 MoveOrDuplicateChordAction (
430 ArrangerObjectSpan sel,
452 MoveOrDuplicateAutomationAction (
453 ArrangerObjectSpan sel,
456 int delta_normalized_amount,
466 delta_normalized_amount,
472class ArrangerSelectionsAction::MoveByTicksAction
476 template <FinalArrangerSelectionsSub
class T>
477 MoveByTicksAction (
const T &sel,
double ticks,
bool already_moved)
489 ArrangerObjectSpan sel,
503 ArrangerObjectSpan sel,
523 ArrangerObjectSpan sel_before,
524 ArrangerObjectSpan sel_after,
542 ArrangerObjectSpan sel_before,
543 std::optional<ArrangerObjectSpan> sel_after,
545 bool already_edited);
550 static std::unique_ptr<EditArrangerSelectionsAction>
create (
551 ArrangerObjectSpan sel_before,
552 ArrangerObjectSpan sel_after,
554 bool already_edited);
560 ArrangerObjectSpan sel_before,
561 MidiFunction::Type midi_func_type,
568 ArrangerObjectSpan sel_before,
569 AutomationFunction::Type automation_func_type);
578 structure::arrangement::AudioFunctionType audio_func_type,
580 std::optional<utils::Utf8String> uri);
584 :
public ArrangerSelectionsAction
594 template <structure::arrangement::RegionObject RegionT>
596 const RegionT ®ion_before,
597 const RegionT ®ion_after,
598 bool already_changed);
619 : ArrangerSelectionsAction (sel, Type::Merge)
634 ArrangerObjectSpan sel_before,
635 std::optional<ArrangerObjectSpan> sel_after,
649 : ArrangerSelectionsAction (sel, Type::Quantize)
651 opts_ = std::make_unique<old_dsp::QuantizeOptions> (opts);
657DEFINE_ENUM_FORMATTER (
659 ArrangerSelectionsAction_ResizeType,
Represents the position of an object.
AutomationFillAction(const RegionT ®ion_before, const RegionT ®ion_after, bool already_changed)
Creates a new action for automation autofill.
LinkAction(ArrangerObjectSpan sel_before, ArrangerObjectSpan sel_after, double ticks, int delta_tracks, int delta_lanes, bool already_moved)
Creates a new action for linking regions.
MergeAction(ArrangerObjectSpan sel)
Creates a new action for merging objects.
MoveOrDuplicateAction(ArrangerObjectSpan sel_var, bool move, double ticks, int delta_chords, int delta_pitch, int delta_tracks, int delta_lanes, double delta_normalized_amount, std::optional< dsp::PortUuid > tgt_port_id, bool already_moved)
Creates a new action for moving or duplicating objects.
QuantizeAction(ArrangerObjectSpan sel, const old_dsp::QuantizeOptions &opts)
Creates a new action for quantizing ArrangerObject's.
RecordAction(ArrangerObjectSpan sel_before, ArrangerObjectSpan sel_after, bool already_recorded)
Construct a new action for recording.
ResizeAction(ArrangerObjectSpan sel_before, std::optional< ArrangerObjectSpan > sel_after, ResizeType type, double ticks)
Creates a new action for resizing ArrangerObject's.
SplitAction(ArrangerObjectSpan sel, Position pos)
Creates a new action for splitting regions.
An action that performs changes to the arranger selections.
QString to_string() const final
Stringizes the action to be used in Undo/Redo buttons.
EditType edit_type_
Type of edit action, if an Edit action.
std::optional< std::vector< ArrangerObjectPtrVariant > > sel_
A clone of the ArrangerSelections before the change.
std::optional< std::vector< ArrangerObjectPtrVariant > > sel_after_
A clone of the ArrangerSelections after the change (used in the EDIT action and quantize).
std::unique_ptr< gui::old_dsp::QuantizeOptions > opts_
QuantizeOptions clone, if quantizing.
bool first_run_
Number of split objects.
ResizeType
Type used when the action is a RESIZE action.
ResizeType resize_type_
Used by the resize action.
int delta_lanes_
Lanes moved.
Position pos_
Position, when changing a Position.
void set_before_selections(ArrangerObjectSpan src_var)
Sets sel_ to a clone of src.
std::optional< ArrangerObjectPtrVariant > region_before_
Used for automation autofill action.
utils::Utf8String str_
String, when changing a string.
double delta_normalized_amount_
Difference in a normalized amount, such as automation point normalized value.
void set_after_selections(ArrangerObjectSpan src_var)
Sets sel_after_ to a clone of src.
int delta_pitch_
Delta of MidiNote pitch.
std::optional< dsp::PortUuid > target_port_
Target port (used to find corresponding automation track when moving/copying automation regions to an...
int delta_chords_
Chords moved (up/down in the Chord editor).
EditType
Type used when the action is an EDIT action.
@ Mute
Change mute status.
@ Primitive
Edit a primitive (int, etc) member of objects in the selection.
@ Name
Edit the name of objects in the selection.
@ Scale
For editing the MusicalScale inside ScaleObjects.
@ Fades
Editing fade positions or curve options.
@ EditorFunction
For ramping MidiNote velocities or AutomationPoint values.
std::optional< ArrangerObject::Uuid > clip_editor_region_id_
Clip editor region ID (for non-timeline actions).
std::vector< ArrangerObject::Uuid > r1_
Used when splitting - these are the split BoundedObject's.
bool needs_transport_total_bar_update(bool perform) const override
Returns whether the total transport bars need to be recalculated.
bool needs_pause() const override
Returns whether the action requires pausing the engine.
int delta_tracks_
Tracks moved.
int delta_vel_
Delta of MidiNote velocity.
CreateOrDeleteArrangerSelectionsAction(ArrangerObjectSpan sel_var, bool create)
Creates a new action for creating/deleting objects.
static std::unique_ptr< EditArrangerSelectionsAction > create(ArrangerObjectSpan sel_before, ArrangerObjectSpan sel_after, EditType type, bool already_edited)
Wrapper for a single object.
EditArrangerSelectionsAction(ArrangerObjectSpan sel_before, AutomationFunction::Type automation_func_type)
Wrapper for automation functions.
EditArrangerSelectionsAction(ArrangerObject::Uuid region_id, const dsp::Position &sel_start, const dsp::Position &sel_end, structure::arrangement::AudioFunctionType audio_func_type, structure::arrangement::AudioFunctionOpts opts, std::optional< utils::Utf8String > uri)
Wrapper for audio functions.
EditArrangerSelectionsAction(ArrangerObjectSpan sel_before, MidiFunction::Type midi_func_type, MidiFunction::Options opts)
Wrapper for MIDI functions.
EditArrangerSelectionsAction(ArrangerObjectSpan sel_before, std::optional< ArrangerObjectSpan > sel_after, EditType type, bool already_edited)
Creates a new action for editing properties of an object.
void perform()
Performs the action.
Track span that offers helper methods on a range of tracks.
Base class for all objects in the arranger.
Lightweight UTF-8 string wrapper with safe conversions.