File: cursor.h

package info (click to toggle)
musescore3 3.2.3%2Bdfsg2-19
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 218,192 kB
  • sloc: cpp: 291,369; xml: 200,226; sh: 3,779; ansic: 1,447; python: 393; makefile: 249; perl: 82; pascal: 79
file content (151 lines) | stat: -rw-r--r-- 4,358 bytes parent folder | download | duplicates (4)
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