Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
arranger_object_selection_operator.h
1// SPDX-FileCopyrightText: © 2025 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include "commands/resize_arranger_objects_command.h"
7#include "structure/arrangement/arranger_object_factory.h"
8#include "undo/undo_stack.h"
9#include "utils/variant_helpers.h"
10
11#include <QItemSelectionModel>
12#include <QtQmlIntegration/qqmlintegration.h>
13
14namespace zrythm::actions
15{
16class ArrangerObjectSelectionOperator : public QObject
17{
18 Q_OBJECT
19 QML_ELEMENT
20 QML_UNCREATABLE ("")
21 QML_EXTENDED_NAMESPACE (zrythm::commands)
22
23public:
24 using SelectedObjectsVector =
25 std::vector<structure::arrangement::ArrangerObjectUuidReference>;
26 using ArrangerObjectOwnerPtrVariant = to_pointer_variant<wrap_variant_t<
27 structure::arrangement::ArrangerObjectVariant,
29 using ObjectOwnerProvider = std::function<ArrangerObjectOwnerPtrVariant (
30 structure::arrangement::ArrangerObjectPtrVariant)>;
31
32 explicit ArrangerObjectSelectionOperator (
33 undo::UndoStack &undoStack,
34 QItemSelectionModel &selectionModel,
35 ObjectOwnerProvider objectOwnerProvider,
37 QObject * parent = nullptr);
38
39 Q_INVOKABLE bool moveByTicks (double tick_delta);
40
41 Q_INVOKABLE bool moveNotesByPitch (int pitch_delta);
42
43 Q_INVOKABLE bool moveAutomationPointsByDelta (double delta);
44
45 Q_INVOKABLE bool resizeObjects (
46 commands::ResizeType type,
47 commands::ResizeDirection direction,
48 double delta);
49
50 Q_INVOKABLE bool deleteObjects ();
51
52 Q_INVOKABLE bool cloneObjects ();
53
54private:
55 auto extractSelectedObjects () const -> SelectedObjectsVector;
56
57 static bool validateHorizontalMovement (
58 const SelectedObjectsVector &objects,
59 double tick_delta);
60 static bool
61 validateVerticalMovement (const SelectedObjectsVector &objects, double delta);
62 static bool validateResize (
63 const SelectedObjectsVector &objects,
64 commands::ResizeType type,
65 commands::ResizeDirection direction,
66 double delta);
67 static bool validateBoundsResize (
68 structure::arrangement::ArrangerObjectPtrVariant obj_var,
69 commands::ResizeDirection direction,
70 double delta);
71 static bool validateFadesResize (
73 commands::ResizeDirection direction,
74 double delta);
75
76 bool process_vertical_move (double delta);
77
78private:
79 undo::UndoStack &undo_stack_;
80 QItemSelectionModel &selection_model_;
81 ObjectOwnerProvider object_owner_provider_;
83};
84
85} // namespace zrythm::actions
Base class for all objects in the arranger.