1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
//=============================================================================
// MuseScore
// Music Composition & Notation
//
// Copyright (C) 2012 Werner Schweer
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2
// as published by the Free Software Foundation and appearing in
// the file LICENCE.GPL
//=============================================================================
#ifndef __CURSOR_H__
#define __CURSOR_H__
namespace Ms {
class Element;
class Score;
class Chord;
class Rest;
class Note;
class Segment;
class RepeatSegment;
class ChordRest;
class StaffText;
class Measure;
enum class SegmentType;
namespace PluginAPI {
class Element;
class Measure;
class Segment;
class Score;
//---------------------------------------------------------
// @@ Cursor
/// Cursor can be used by plugins to manipulate the score
//---------------------------------------------------------
class Cursor : public QObject {
Q_OBJECT
/** Current track */
Q_PROPERTY(int track READ track WRITE setTrack)
/** Current staff (#track / 4) */
Q_PROPERTY(int staffIdx READ staffIdx WRITE setStaffIdx)
/** Current voice (#track % 4) */
Q_PROPERTY(int voice READ voice WRITE setVoice)
/**
* Segment type filter, a bitmask from
* PluginAPI::PluginAPI::Segment values.
* Determines which segments this cursor will move to
* on next() and nextMeasure() operations. The default
* value is Ms::SegmentType::ChordRest so only segments
* containing chords and rests are handled by default.
*/
Q_PROPERTY(int filter READ filter WRITE setFilter)
/** MIDI tick position, read only */
Q_PROPERTY(int tick READ tick) // FIXME: fraction transition
/** Time at tick position, read only */
Q_PROPERTY(double time READ time)
/** Tempo at current tick, read only */
Q_PROPERTY(qreal tempo READ tempo)
/** Key signature of current staff at tick pos. (read only) */
Q_PROPERTY(int keySignature READ qmlKeySignature)
/** Associated score */
Q_PROPERTY(Ms::PluginAPI::Score* score READ score WRITE setScore)
/** Current element at track, read only */
Q_PROPERTY(Ms::PluginAPI::Element* element READ element)
/** Current segment, read only */
Q_PROPERTY(Ms::PluginAPI::Segment* segment READ segment)
/** Current measure, read only */
Q_PROPERTY(Ms::PluginAPI::Measure* measure READ measure)
public:
enum RewindMode {
SCORE_START = 0, ///< Rewind to the start of a score
SELECTION_START = 1, ///< Rewind to the start of a selection
SELECTION_END = 2 ///< Rewind to the end of a selection
};
Q_ENUM(RewindMode);
private:
Ms::Score* _score = nullptr;
int _track = 0;
// bool _expandRepeats; // used?
//state
Ms::Segment* _segment = nullptr;
SegmentType _filter;
// utility methods
void nextInTrack();
void setScore(Ms::Score* s);
public:
/// \cond MS_INTERNAL
Cursor(Ms::Score* s = nullptr);
// Cursor(Score*, bool); // not implemented? what is bool?
Score* score() const;
void setScore(Score* s);
int track() const { return _track; }
void setTrack(int v);
int staffIdx() const;
void setStaffIdx(int v);
int voice() const;
void setVoice(int v);
int filter() const { return int(_filter); }
void setFilter(int f) { _filter = SegmentType(f); }
Element* element() const;
Segment* segment() const;
Measure* measure() const;
int tick();
double time();
qreal tempo();
int qmlKeySignature();
/// \endcond
Q_INVOKABLE void rewind(RewindMode mode);
Q_INVOKABLE bool next();
Q_INVOKABLE bool nextMeasure();
Q_INVOKABLE void add(Ms::PluginAPI::Element*);
Q_INVOKABLE void addNote(int pitch);
//@ set duration
//@ z: numerator
//@ n: denominator
//@ Quarter, if n == 0
Q_INVOKABLE void setDuration(int z, int n);
};
} // namespace PluginAPI
} // namespace Ms
#endif
|