LCOV - code coverage report
Current view: top level - src/notation - inotationinteraction.h Coverage Total Hit
Test: filtered_coverage.info Lines: 75.0 % 4 3
Test Date: 2026-11-05 04:07:02

            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              : }
        

Generated by: LCOV version 2.0-1