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
|
//=============================================================================
// 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"
namespace Ms {
class SLine;
class System;
//---------------------------------------------------------
// @@ 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 {
protected:
virtual void startEdit(EditData&) override;
virtual void editDrag(EditData&) override;
virtual bool edit(EditData&) override;
virtual void updateGrips(EditData&) const override;
virtual QPointF gripAnchor(Grip) const override;
virtual void startEditDrag(EditData&) override;
public:
LineSegment(Spanner* sp, Score* s, ElementFlags f = ElementFlag::NOTHING) : SpannerSegment(sp, s, f) {}
LineSegment(Score* s, ElementFlags f = ElementFlag::NOTHING) : SpannerSegment(s, f) {}
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 Element* propertyDelegate(Pid) override;
virtual QLineF dragAnchor() const override;
};
//---------------------------------------------------------
// @@ SLine
/// virtual base class for Hairpin, Trill and TextLine
//---------------------------------------------------------
class SLine : public Spanner {
qreal _lineWidth;
QColor _lineColor { MScore::defaultColor };
Qt::PenStyle _lineStyle { Qt::SolidLine };
qreal _dashLineLen { 5.0 };
qreal _dashGapLen { 5.0 };
bool _diagonal { false };
PropertyFlags lineWidthStyle;
PropertyFlags lineStyleStyle;
PropertyFlags lineColorStyle;
protected:
virtual QPointF linePos(Grip, System** system) const;
public:
SLine(Score* s, ElementFlags = ElementFlag::NOTHING);
SLine(const SLine&);
virtual void layout() override;
virtual SpannerSegment* layoutSystem(System*) override;
bool readProperties(XmlReader& node);
void writeProperties(XmlWriter& xml) const;
virtual LineSegment* createLineSegment() = 0;
void setLen(qreal l);
using Element::bbox;
virtual const QRectF& bbox() const override;
virtual void write(XmlWriter&) const override;
virtual void read(XmlReader&) override;
bool diagonal() const { return _diagonal; }
void setDiagonal(bool v) { _diagonal = v; }
qreal lineWidth() const { return _lineWidth; }
QColor lineColor() const { return _lineColor; }
Qt::PenStyle lineStyle() const { return _lineStyle; }
void setLineWidth(const qreal& v) { _lineWidth = v; }
void setLineColor(const QColor& v) { _lineColor = v; }
void setLineStyle(Qt::PenStyle v) { _lineStyle = v; }
qreal dashLineLen() const { return _dashLineLen; }
void setDashLineLen(qreal val) { _dashLineLen = val; }
qreal dashGapLen() const { return _dashGapLen; }
void setDashGapLen(qreal val) { _dashGapLen = val; }
LineSegment* frontSegment() { return toLineSegment(Spanner::frontSegment()); }
const LineSegment* frontSegment() const { return toLineSegment(Spanner::frontSegment()); }
LineSegment* backSegment() { return toLineSegment(Spanner::backSegment()); }
const LineSegment* backSegment() const { return toLineSegment(Spanner::backSegment()); }
LineSegment* segmentAt(int n) { return toLineSegment(Spanner::segmentAt(n)); }
const LineSegment* segmentAt(int n) const { return toLineSegment(Spanner::segmentAt(n)); }
virtual QVariant getProperty(Pid id) const override;
virtual bool setProperty(Pid propertyId, const QVariant&) override;
virtual QVariant propertyDefault(Pid id) const override;
friend class LineSegment;
};
} // namespace Ms
#endif
|