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
|
//=============================================================================
// 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 __LINE_H__
#define __LINE_H__
#include "spanner.h"
#include "mscore.h"
class QPainter;
namespace Ms {
class SLine;
class System;
class MuseScoreView;
//---------------------------------------------------------
// LineStyle
//---------------------------------------------------------
enum class LineStyle : char {
Solid = Qt::SolidLine,
Dash = Qt::DashLine,
Dot = Qt::DotLine,
DashDot = Qt::DashDotLine,
DashDotDot = Qt::DashDotDotLine
};
//---------------------------------------------------------
// @@ LineSegment
/// Virtual base class for segmented lines segments
/// (OttavaSegment, HairpinSegment, TrillSegment...)
///
/// This class describes one segment of an segmented
/// line object. Line objects can span multiple staves.
/// For every staff a segment is created.
//---------------------------------------------------------
class LineSegment : public SpannerSegment {
Q_OBJECT
protected:
// virtual bool isEditable() const override { return true; } // same as base class!
virtual void editDrag(const EditData&) override;
virtual bool edit(MuseScoreView*, Grip, int key, Qt::KeyboardModifiers, const QString& s) override;
virtual void updateGrips(Grip*, QVector<QRectF>&) const override;
virtual int grips() const override { return 3; }
virtual void setGrip(Grip, const QPointF& p) override;
virtual QPointF getGrip(Grip) const override;
virtual QPointF gripAnchor(Grip) const override;
public:
LineSegment(Score* s) : SpannerSegment(s) {}
LineSegment(const LineSegment&);
virtual void draw(QPainter*) const = 0;
SLine* line() const { return (SLine*)spanner(); }
virtual void spatiumChanged(qreal, qreal) override;
virtual void localSpatiumChanged(qreal, qreal) override;
friend class SLine;
virtual void read(XmlReader&) override;
bool readProperties(XmlReader&);
virtual QVariant getProperty(P_ID id) const override;
virtual bool setProperty(P_ID propertyId, const QVariant&) override;
virtual QVariant propertyDefault(P_ID id) const override;
virtual QLineF dragAnchor() const override;
};
//---------------------------------------------------------
// @@ SLine
/// virtual base class for Hairpin, Trill and TextLine
//---------------------------------------------------------
class SLine : public Spanner {
Q_OBJECT
Spatium _lineWidth;
QColor _lineColor;
Qt::PenStyle _lineStyle;
bool _diagonal;
protected:
virtual QPointF linePos(Grip, System** system) const;
public:
SLine(Score* s);
SLine(const SLine&);
virtual void layout() override;
bool readProperties(XmlReader& node);
void writeProperties(Xml& xml) const;
virtual LineSegment* createLineSegment() = 0;
void setLen(qreal l);
virtual const QRectF& bbox() const override;
virtual void write(Xml&) const override;
virtual void read(XmlReader&) override;
bool diagonal() const { return _diagonal; }
void setDiagonal(bool v) { _diagonal = v; }
Spatium lineWidth() const { return _lineWidth; }
QColor lineColor() const { return _lineColor; }
Qt::PenStyle lineStyle() const { return _lineStyle; }
void setLineWidth(const Spatium& v) { _lineWidth = v; }
void setLineColor(const QColor& v) { _lineColor = v; }
void setLineStyle(Qt::PenStyle v) { _lineStyle = v; }
LineSegment* frontSegment() const { return (LineSegment*)spannerSegments().front(); }
LineSegment* backSegment() const { return (LineSegment*)spannerSegments().back(); }
LineSegment* takeFirstSegment() { return (LineSegment*)spannerSegments().takeFirst(); }
LineSegment* takeLastSegment() { return (LineSegment*)spannerSegments().takeLast(); }
LineSegment* segmentAt(int n) const { return (LineSegment*)spannerSegments().at(n); }
virtual QVariant getProperty(P_ID id) const override;
virtual bool setProperty(P_ID propertyId, const QVariant&) override;
virtual QVariant propertyDefault(P_ID id) const override;
friend class LineSegment;
};
} // namespace Ms
#endif
|