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
|
//=============================================================================
// MuseScore
// Music Composition & Notation
//
// Copyright (C) 2002-2011 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 __TUPLET_H__
#define __TUPLET_H__
#include "duration.h"
#include "property.h"
namespace Ms {
class Text;
class Spanner;
enum class TupletNumberType : char;
enum class TupletBracketType : char;
//------------------------------------------------------------------------
// @@ Tuplet
//! Example of 1/8 triplet:
//! _baseLen = 1/8
//! _actualNotes = 3
//! _normalNotes = 2 (3 notes played in the time of 2/8)
//!
//! The tuplet has a len of _baseLen * _normalNotes.
//! A tuplet note has len of _baseLen * _normalNotes / _actualNotes.
//------------------------------------------------------------------------
class Tuplet final : public DurationElement {
std::vector<DurationElement*> _elements;
Direction _direction;
TupletNumberType _numberType;
TupletBracketType _bracketType;
Spatium _bracketWidth;
bool _hasBracket;
Fraction _ratio;
TDuration _baseLen; // 1/8 for a triplet of 1/8
bool _isUp;
Fraction _tick;
QPointF p1, p2;
QPointF _p1, _p2; // user offset
mutable int _id; // used during read/write
Text* _number;
QPointF bracketL[4];
QPointF bracketR[3];
Fraction addMissingElement(const Fraction& startTick, const Fraction& endTick);
public:
Tuplet(Score*);
Tuplet(const Tuplet&);
~Tuplet();
virtual Tuplet* clone() const override { return new Tuplet(*this); }
virtual ElementType type() const override { return ElementType::TUPLET; }
virtual void setTrack(int val) override;
virtual void add(Element*) override;
virtual void remove(Element*) override;
Text* number() const { return _number; }
void setNumber(Text* t) { _number = t; }
void resetNumberProperty();
virtual bool isEditable() const override;
virtual void startEdit(EditData&) override;
virtual void editDrag(EditData&) override;
virtual void updateGrips(EditData&) const override;
virtual void setSelected(bool f) override;
virtual Measure* measure() const override { return toMeasure(parent()); }
TupletNumberType numberType() const { return _numberType; }
TupletBracketType bracketType() const { return _bracketType; }
void setNumberType(TupletNumberType val) { _numberType = val; }
void setBracketType(TupletBracketType val) { _bracketType = val; }
bool hasBracket() const { return _hasBracket; }
void setHasBracket(bool b) { _hasBracket = b; }
Spatium bracketWidth() const { return _bracketWidth; }
void setBracketWidth(Spatium s) { _bracketWidth = s; }
Fraction ratio() const { return _ratio; }
void setRatio(const Fraction& r) { _ratio = r; }
const std::vector<DurationElement*>& elements() const { return _elements; }
void clear() { _elements.clear(); }
bool contains(const DurationElement* el) const { return std::find(_elements.begin(), _elements.end(), el) != _elements.end(); }
virtual void layout() override;
virtual void scanElements(void* data, void (*func)(void*, Element*), bool all=true) override;
virtual void read(XmlReader&) override;
virtual void write(XmlWriter&) const override;
virtual bool readProperties(XmlReader&) override;
virtual void reset() override;
virtual void draw(QPainter*) const override;
int id() const { return _id; }
void setId(int i) const { _id = i; }
TDuration baseLen() const { return _baseLen; }
void setBaseLen(const TDuration& d) { _baseLen = d; }
virtual void dump() const override;
void setDirection(Direction d) { _direction = d; }
Direction direction() const { return _direction; }
bool isUp() const { return _isUp; }
virtual Fraction tick() const override { return _tick; }
virtual Fraction rtick() const override;
void setTick(const Fraction& v) { _tick = v; }
Fraction elementsDuration();
void sortElements();
bool cross() const;
virtual void setVisible(bool f) override;
virtual QVariant getProperty(Pid propertyId) const override;
virtual bool setProperty(Pid propertyId, const QVariant& v) override;
virtual QVariant propertyDefault(Pid id) const override;
virtual Shape shape() const override;
void sanitizeTuplet();
void addMissingElements();
};
} // namespace Ms
#endif
|