Line data Source code
1 : /*
2 : * SPDX-License-Identifier: GPL-3.0-only
3 : * MuseScore-Studio-CLA-applies
4 : *
5 : * MuseScore Studio
6 : * Music Composition & Notation
7 : *
8 : * Copyright (C) 2021 MuseScore Limited and others
9 : *
10 : * This program is free software: you can redistribute it and/or modify
11 : * it under the terms of the GNU General Public License version 3 as
12 : * published by the Free Software Foundation.
13 : *
14 : * This program is distributed in the hope that it will be useful,
15 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : * GNU General Public License for more details.
18 : *
19 : * You should have received a copy of the GNU General Public License
20 : * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 : */
22 :
23 : #pragma once
24 :
25 : #include <functional>
26 :
27 : #include "async/notification.h"
28 :
29 : #include "inotation_fwd.h"
30 : #include "notationtypes.h"
31 : #include "types/noteinputtypes.h"
32 :
33 : class QKeyEvent;
34 : class QInputMethodEvent;
35 :
36 : namespace mu::engraving {
37 : class EngravingItem;
38 : class ShadowNote;
39 : class Staff;
40 :
41 : enum class HDuration : signed char;
42 : enum class Voicing : signed char;
43 : }
44 :
45 : namespace mu::notation {
46 : class INotationInteraction
47 : {
48 : public:
49 50 : virtual ~INotationInteraction() = default;
50 :
51 : // Put notes
52 : virtual INotationNoteInputPtr noteInput() const = 0;
53 :
54 : // Shadow note
55 : virtual mu::engraving::ShadowNote* shadowNote() const = 0;
56 : virtual void showShadowNoteForPosition(const muse::PointF& pos) = 0;
57 : virtual void showShadowNoteForMidiPitch(const uint8_t pitch) = 0;
58 : virtual void hideShadowNote() = 0;
59 : virtual muse::RectF shadowNoteRect() const = 0;
60 : virtual muse::RectF previewMeasureRect() const = 0;
61 : virtual muse::async::Channel</*visible*/ bool> shadowNoteChanged() const = 0;
62 :
63 : // Visibility
64 : virtual void toggleVisible() = 0;
65 : virtual void setSelectionVisible(bool visible) = 0;
66 :
67 : // Hit
68 : virtual EngravingItem* hitElement(const muse::PointF& pos, float width) const = 0;
69 : virtual std::vector<EngravingItem*> hitElements(const muse::PointF& pos, float width) const = 0;
70 : virtual engraving::Staff* hitStaff(const muse::PointF& pos) const = 0;
71 :
72 : struct HitElementContext
73 : {
74 : engraving::EngravingItem* element = nullptr;
75 : engraving::Staff* staff = nullptr;
76 :
77 13 : bool operator ==(const HitElementContext& other) const
78 : {
79 13 : return element == other.element && staff == other.staff;
80 : }
81 : };
82 :
83 : virtual const HitElementContext& hitElementContext() const = 0;
84 : virtual void setHitElementContext(const HitElementContext& context) = 0;
85 :
86 : // Select
87 : virtual INotationSelectionPtr selection() const = 0;
88 : virtual muse::async::Notification selectionChanged() const = 0;
89 : virtual void select(const std::vector<EngravingItem*>& elements, SelectType type = SelectType::REPLACE, staff_idx_t staffIndex = 0) = 0;
90 : virtual void select(SelectionTarget target) = 0;
91 : virtual void addToSelection(SelectionTarget target) = 0;
92 : virtual void expandSelection(ExpandSelectionMode mode) = 0;
93 : virtual void clearSelection() = 0;
94 :
95 : virtual void selectAndStartEditIfNeeded(EngravingItem* element) = 0;
96 : virtual void findAndSelectChordRest(const Fraction& tick) = 0;
97 :
98 : // Change selection
99 : virtual bool moveSelectionAvailable(MoveSelectionType type) const = 0;
100 : virtual void moveSelectionDeprecated(MoveDirection d, MoveSelectionType type) = 0;
101 :
102 : virtual void moveLyrics(MoveDirection d) = 0;
103 :
104 : virtual EngravingItem* contextItem() const = 0;
105 :
106 : // SelectionFilter
107 : virtual INotationSelectionFilterPtr selectionFilter() const = 0;
108 :
109 : // Drag
110 : using IsDraggable = std::function<bool (const EngravingItem*)>;
111 : virtual bool isDragStarted() const = 0;
112 : virtual void startDrag(const std::vector<EngravingItem*>& elems, const muse::PointF& eoffset, const IsDraggable& isDrag) = 0;
113 : virtual void drag(const muse::PointF& fromPos, const muse::PointF& toPos, DragMode mode) = 0;
114 : virtual void endDrag() = 0;
115 : virtual muse::async::Notification dragChanged() const = 0;
116 :
117 : virtual bool isOutgoingDragElementAllowed(const EngravingItem* element) const = 0;
118 : virtual void startOutgoingDragElement(const EngravingItem* element, QObject* dragSource, const muse::PointF& hotSpot) = 0;
119 : virtual void startOutgoingDragRange(QObject* dragSource) = 0;
120 : virtual bool isOutgoingDragStarted() const = 0;
121 : virtual void endOutgoingDrag() = 0;
122 :
123 : // Drop
124 : //! TODO Change KeyboardModifiers to modes
125 : virtual bool startDropSingle(const QByteArray& edata) = 0;
126 : virtual bool startDropRange(const QByteArray& data) = 0;
127 : virtual bool startDropRange(const Fraction& sourceTick, const Fraction& tickLength, engraving::staff_idx_t sourceStaffIdx,
128 : size_t numStaves, bool preserveMeasureAlignment) = 0;
129 : virtual bool startDropImage(const QUrl& url) = 0;
130 : virtual bool updateDropSingle(const muse::PointF& pos, Qt::KeyboardModifiers modifiers) = 0; //! NOTE Also may set drop target
131 0 : virtual bool updateDropRange(const muse::PointF& pos, std::optional<bool> preserveMeasureAlignment = std::nullopt) = 0;
132 : virtual bool dropSingle(const muse::PointF& pos, Qt::KeyboardModifiers modifiers) = 0;
133 : virtual bool dropRange(const QByteArray& data, const muse::PointF& pos, bool deleteSourceMaterial) = 0;
134 : virtual void setDropTarget(EngravingItem* item, bool notify = true) = 0;
135 : virtual void setDropRects(const std::vector<muse::RectF>& rects) = 0;
136 : virtual void endDrop() = 0;
137 : virtual muse::async::Notification dropChanged() const = 0;
138 :
139 : virtual bool applyPaletteElement(mu::engraving::EngravingItem* element, Qt::KeyboardModifiers modifiers = {}) = 0;
140 : virtual void undo() = 0;
141 : virtual void redo() = 0;
142 : virtual void undoRedoToIndex(size_t idx) = 0;
143 :
144 : // Move/nudge elements
145 : virtual void movePitch(MoveDirection d, PitchMode mode) = 0;
146 : virtual void nudge(MoveDirection d, bool quickly) = 0;
147 : virtual void nudgeAnchors(MoveDirection d) = 0;
148 : virtual void moveChordRestToStaff(MoveDirection d) = 0;
149 : virtual void swapChordRest(MoveDirection d) = 0;
150 : virtual void toggleSnapToPrevious() = 0;
151 : virtual void toggleSnapToNext() = 0;
152 :
153 : // Text edit
154 : virtual bool isTextSelected() const = 0;
155 : virtual bool isTextEditingStarted() const = 0;
156 : virtual bool textEditingAllowed(const EngravingItem* element) const = 0;
157 : virtual void startEditText(EngravingItem* element, const muse::PointF& elementPos = muse::PointF()) = 0;
158 : virtual void editText(QInputMethodEvent* event) = 0;
159 : virtual void endEditText() = 0;
160 : virtual void changeTextCursorPosition(const muse::PointF& newCursorPos) = 0;
161 : virtual void selectText(mu::engraving::SelectTextType type) = 0;
162 : virtual const TextBase* editedText() const = 0;
163 : virtual muse::async::Notification textEditingStarted() const = 0;
164 : virtual muse::async::Notification textEditingChanged() const = 0;
165 : virtual muse::async::Channel<TextBase*> textEditingEnded() const = 0;
166 :
167 : // Grip edit
168 : virtual bool isGripEditStarted() const = 0;
169 : virtual bool isHitGrip(const muse::PointF& pos) const = 0;
170 : virtual void startEditGrip(const muse::PointF& pos) = 0;
171 : virtual void startEditGrip(EngravingItem* element, mu::engraving::Grip grip) = 0;
172 : virtual void endEditGrip() = 0;
173 : virtual bool isStartEndGripSelected() const = 0;
174 :
175 : virtual bool isEditingElement() const = 0;
176 : virtual muse::async::Notification isEditingElementChanged() const = 0;
177 : virtual void startEditElement(EngravingItem* element) = 0;
178 : virtual void changeEditElement(EngravingItem* newElement) = 0;
179 : virtual bool isEditAllowed(QKeyEvent* event) = 0;
180 : virtual void editElement(QKeyEvent* event) = 0;
181 : virtual void endEditElement() = 0;
182 :
183 : // Anchors edit
184 : virtual void updateTimeTickAnchors(QKeyEvent* event) = 0;
185 : virtual void moveElementAnchors(QKeyEvent* event) = 0;
186 :
187 : virtual void splitSelectedMeasure() = 0;
188 : virtual void joinSelectedMeasures() = 0;
189 :
190 : virtual void addBoxes(BoxType boxType, int count, AddBoxesTarget target) = 0;
191 : virtual void addBoxes(BoxType boxType, int count, int beforeBoxIndex, bool insertAfter) = 0;
192 :
193 : virtual void copySelection() = 0;
194 : virtual void repeatSelection() = 0;
195 : virtual void copyLyrics() = 0;
196 : virtual void pasteSelection(const Fraction& scale = Fraction(1, 1)) = 0;
197 : virtual void swapSelection() = 0;
198 : virtual void deleteSelection() = 0;
199 : virtual void flipSelection() = 0;
200 : virtual void flipSelectionHorizontally() = 0;
201 : virtual void mirrorNotes() = 0;
202 : virtual void toggleTieForSelection() = 0;
203 : virtual void addLaissezVibToSelection() = 0;
204 : virtual void addSlurToSelection() = 0;
205 : virtual void addHammerOnPullOffToSelection() = 0;
206 : virtual void addOttavaToSelection(OttavaType type) = 0;
207 : virtual void addHairpinOnGripDrag(engraving::EditData& ed, bool isLeftGrip) = 0;
208 : virtual void addHairpinsToSelection(HairpinType type) = 0;
209 : virtual void putRestToSelection() = 0;
210 : virtual void putRest(Duration duration) = 0;
211 : virtual void addBracketsToSelection(BracketsType type) = 0;
212 : virtual void toggleAccidentalForSelection(AccidentalType type) = 0;
213 : virtual void toggleArticulationForSelection(SymbolId articulationSymbolId) = 0;
214 : virtual void toggleDotsForSelection(int dots) = 0;
215 : virtual void addGraceNotesToSelectedNotes(GraceNoteType type) = 0;
216 : virtual bool canAddTupletToSelectedChordRests() const = 0;
217 : virtual void addTupletToSelectedChordRests(const TupletOptions& options) = 0;
218 : virtual void addBeamToSelectedChordRests(BeamMode mode) = 0;
219 : virtual void beamSelectedRange() = 0;
220 :
221 : virtual void increaseDecreaseDuration(int steps, bool stepByDots) = 0;
222 : virtual void increaseDecreaseSelectedDynamicsValues(int delta) = 0;
223 :
224 : virtual void autoFlipHairpinsType(engraving::Dynamic* selDyn) = 0;
225 :
226 : virtual void toggleDynamicPopup() = 0;
227 : virtual bool toggleLayoutBreakAvailable() const = 0;
228 : virtual void toggleLayoutBreak(LayoutBreakType breakType) = 0;
229 : virtual void moveMeasureToPrevSystem() = 0;
230 : virtual void moveMeasureToNextSystem() = 0;
231 : virtual void toggleSystemLock() = 0;
232 : virtual void toggleScoreLock() = 0;
233 : virtual void makeIntoSystem() = 0;
234 : virtual void applySystemLock() = 0;
235 : virtual void moveSystemToPrevPage() = 0;
236 : virtual void moveSystemToNextPage() = 0;
237 : virtual void togglePageLock() = 0;
238 : virtual void makeIntoPage() = 0;
239 : virtual void applyPageLock() = 0;
240 :
241 : virtual void addRemoveSystemLocks(AddRemoveSystemLockType intervalType, int interval = 0) = 0;
242 : virtual bool transpose(const TransposeOptions& options) = 0;
243 : virtual void swapVoices(voice_idx_t voiceIndex1, voice_idx_t voiceIndex2) = 0;
244 : virtual void addIntervalToSelectedNotes(int interval) = 0;
245 : virtual void addFret(int fretIndex) = 0;
246 : virtual void changeSelectedElementsVoice(voice_idx_t voiceIndex) = 0;
247 : virtual void changeSelectedElementsVoiceAssignment(VoiceAssignment voiceAssignment) = 0;
248 : virtual void addAnchoredLineToSelectedNotes() = 0;
249 :
250 : virtual void addTextToTopFrame(TextStyleType type) = 0;
251 : virtual void addTextToItem(TextStyleType type, EngravingItem* item) = 0;
252 :
253 : virtual muse::Ret canAddImageToItem(const EngravingItem* item) const = 0;
254 : virtual void addImageToItem(const muse::io::path_t& imagePath, EngravingItem* item) = 0;
255 :
256 : virtual void addFiguredBass() = 0;
257 : virtual void addFretboardDiagram() = 0;
258 :
259 : virtual void addStretch(qreal value) = 0;
260 :
261 : virtual Measure* selectedMeasure() const = 0;
262 : virtual void addTimeSignature(Measure* measure, engraving::staff_idx_t staffIndex, TimeSignature* timeSignature) = 0;
263 :
264 : virtual void explodeSelectedStaff() = 0;
265 : virtual void implodeSelectedStaff() = 0;
266 :
267 : virtual void realizeSelectedChordSymbols(bool literal, engraving::Voicing voicing, engraving::HDuration durationType) = 0;
268 : virtual void extendToNextNote() = 0;
269 : virtual void removeSelectedMeasures() = 0;
270 : virtual void removeSelectedRange() = 0;
271 : virtual void removeEmptyTrailingMeasures() = 0;
272 :
273 : virtual void fillSelectionWithSlashes() = 0;
274 : virtual void replaceSelectedNotesWithSlashes() = 0;
275 :
276 : virtual void changeEnharmonicSpelling(bool both) = 0;
277 : virtual void spellPitches() = 0;
278 : virtual void spellPitchesWithSharps() = 0;
279 : virtual void spellPitchesWithFlats() = 0;
280 : virtual void regroupNotesAndRests() = 0;
281 : virtual void resequenceRehearsalMarks() = 0;
282 :
283 : virtual void resetStretch() = 0;
284 : virtual void resetTextStyleOverrides() = 0;
285 : virtual void resetBeamMode() = 0;
286 : virtual void resetShapesAndPosition() = 0;
287 : virtual void resetToDefaultLayout() = 0;
288 : virtual void freezeSelectionPosition() = 0;
289 :
290 : virtual ScoreConfig scoreConfig() const = 0;
291 : virtual void setScoreConfig(const ScoreConfig& config) = 0;
292 : virtual muse::async::Channel<ScoreConfigType> scoreConfigChanged() const = 0;
293 :
294 : virtual void addMelisma() = 0;
295 : virtual void addLyricsVerse() = 0;
296 :
297 : virtual void addGuitarBend(GuitarBendType bendType) = 0;
298 :
299 : // Text navigation
300 : virtual void navigateToLyrics(MoveDirection direction, bool moveOnly = false) = 0;
301 : virtual void navigateToLyricsVerse(MoveDirection direction) = 0;
302 :
303 : virtual void navigateToNextSyllable() = 0;
304 :
305 : virtual void navigateToNearHarmony(MoveDirection direction, bool nearNoteOrRest) = 0;
306 : virtual void navigateToHarmonyInNearMeasure(MoveDirection direction) = 0;
307 : virtual void navigateToHarmony(const Fraction& ticks) = 0;
308 :
309 : virtual void navigateToNearFiguredBass(MoveDirection direction) = 0;
310 : virtual void navigateToFiguredBassInNearMeasure(MoveDirection direction) = 0;
311 : virtual void navigateToFiguredBass(const Fraction& ticks) = 0;
312 :
313 : virtual void navigateToNearText(MoveDirection direction) = 0;
314 :
315 : // Text style
316 : virtual void toggleBold() = 0;
317 : virtual void toggleItalic() = 0;
318 : virtual void toggleUnderline() = 0;
319 : virtual void toggleStrike() = 0;
320 : virtual void toggleSubScript() = 0;
321 : virtual void toggleSuperScript() = 0;
322 :
323 : virtual bool canInsertClef(mu::engraving::ClefType) const = 0;
324 : virtual void insertClef(mu::engraving::ClefType) = 0;
325 :
326 : virtual void toggleArticulation(mu::engraving::SymId) = 0;
327 : virtual void toggleOrnament(mu::engraving::SymId) = 0;
328 : virtual void changeAccidental(mu::engraving::AccidentalType) = 0;
329 : virtual void transposeSemitone(int) = 0;
330 : virtual void transposeDiatonicAlterations(mu::engraving::TransposeDirection) = 0;
331 : virtual void toggleAutoplace(bool all) = 0;
332 : virtual void getLocation() = 0;
333 : virtual void execute(void (mu::engraving::Score::*)(), const muse::TranslatableString& actionName) = 0;
334 :
335 : struct ShowItemRequest {
336 : const EngravingItem* item = nullptr;
337 : muse::RectF showRect;
338 : };
339 :
340 : virtual void showItem(const mu::engraving::EngravingItem* item, int staffIndex = -1) = 0;
341 : virtual muse::async::Channel<ShowItemRequest> showItemRequested() const = 0;
342 :
343 : virtual void setGetViewRectFunc(const std::function<muse::RectF()>& func) = 0;
344 :
345 : virtual void checkAndShowError() = 0;
346 :
347 : virtual void toggleDebugShowGapRests() = 0;
348 : };
349 :
350 : using INotationInteractionPtr = std::shared_ptr<INotationInteraction>;
351 : }
|