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 152 153 154 155 156 157 158 159 160 161 162
|
//=============================================================================
// MuseScore
// Music Composition & Notation
//
// Copyright (C) 2002-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 __BEAM_H__
#define __BEAM_H__
#include "element.h"
#include "durationtype.h"
#include "property.h"
namespace Ms {
class ChordRest;
class MuseScoreView;
class Chord;
class System;
class Skyline;
enum class SpannerSegmentType;
struct BeamFragment;
//---------------------------------------------------------
// @@ Beam
//---------------------------------------------------------
class Beam final : public Element {
Q_GADGET
QVector<ChordRest*> _elements; // must be sorted by tick
QVector<QLineF*> beamSegments;
Direction _direction;
bool _up;
bool _distribute; // equal spacing of elements
bool _noSlope;
bool _userModified[2]; // 0: auto/down 1: up
bool _isGrace;
bool _cross;
qreal _grow1; // define "feather" beams
qreal _grow2;
qreal _beamDist;
QVector<BeamFragment*> fragments; // beam splits across systems
mutable int _id; // used in read()/write()
int minMove; // set in layout1()
int maxMove;
TDuration maxDuration;
qreal slope { 0.0 };
void layout2(std::vector<ChordRest*>, SpannerSegmentType, int frag);
bool twoBeamedNotes();
void computeStemLen(const std::vector<ChordRest*>& crl, qreal& py1, int beamLevels);
bool slopeZero(const std::vector<ChordRest*>& crl);
bool hasNoSlope();
void addChordRest(ChordRest* a);
void removeChordRest(ChordRest* a);
public:
enum class Mode : signed char {
///.\{
AUTO, BEGIN, MID, END, NONE, BEGIN32, BEGIN64, INVALID = -1
///\}
};
Q_ENUM(Mode)
Beam(Score* = 0);
Beam(const Beam&);
~Beam();
virtual Beam* clone() const override { return new Beam(*this); }
virtual ElementType type() const override { return ElementType::BEAM; }
virtual QPointF pagePos() const override; ///< position in page coordinates
virtual QPointF canvasPos() const override; ///< position in page coordinates
virtual bool isEditable() const override { return true; }
virtual void startEdit(EditData&) override;
virtual void endEdit(EditData&) override;
virtual void editDrag(EditData&) override;
virtual void updateGrips(EditData&) const override;
virtual Fraction tick() const override;
virtual Fraction rtick() const override;
virtual void write(XmlWriter& xml) const override;
virtual void read(XmlReader&) override;
virtual void spatiumChanged(qreal /*oldValue*/, qreal /*newValue*/) override;
virtual void reset() override;
System* system() const { return toSystem(parent()); }
void layout1();
void layoutGraceNotes();
void layout();
const QVector<ChordRest*>& elements() { return _elements; }
void clear() { _elements.clear(); }
bool empty() const { return _elements.empty(); }
bool contains(const ChordRest* cr) const { return std::find(_elements.begin(), _elements.end(), cr) != _elements.end(); }
virtual void add(Element*) override;
virtual void remove(Element*) override;
virtual void move(const QPointF&) override;
virtual void draw(QPainter*) const override;
bool up() const { return _up; }
void setUp(bool v) { _up = v; }
void setId(int i) const { _id = i; }
int id() const { return _id; }
bool noSlope() const { return _noSlope; }
void setNoSlope(bool val) { _noSlope = val; }
void setBeamDirection(Direction d);
Direction beamDirection() const { return _direction; }
virtual bool acceptDrop(EditData&) const override;
virtual Element* drop(EditData&) override;
qreal growLeft() const { return _grow1; }
qreal growRight() const { return _grow2; }
void setGrowLeft(qreal val) { _grow1 = val; }
void setGrowRight(qreal val) { _grow2 = val; }
bool distribute() const { return _distribute; }
void setDistribute(bool val) { _distribute = val; }
bool userModified() const;
void setUserModified(bool val);
QPointF beamPos() const;
void setBeamPos(const QPointF& bp);
qreal beamDist() const { return _beamDist; }
virtual QVariant getProperty(Pid propertyId) const override;
virtual bool setProperty(Pid propertyId, const QVariant&) override;
virtual QVariant propertyDefault(Pid id) const override;
bool isGrace() const { return _isGrace; } // for debugger
bool cross() const { return _cross; }
void addSkyline(Skyline&);
virtual void triggerLayout() const override;
};
} // namespace Ms
#endif
|