fix #276126 Voltas are incorrectly positioned

This commit is contained in:
ws 2018-09-13 13:52:03 +02:00
parent 5d52ccf73e
commit eb1bf102d3
3 changed files with 24 additions and 13 deletions

View file

@ -3364,17 +3364,19 @@ System* Score::collectSystem(LayoutContext& lc)
// //
// vertical align volta segments // vertical align volta segments
// //
std::vector<SpannerSegment*> voltaSegments; for (int staffIdx = 0; staffIdx < nstaves(); ++staffIdx) {
for (SpannerSegment* ss : system->spannerSegments()) { std::vector<SpannerSegment*> voltaSegments;
if (ss->isVoltaSegment()) for (SpannerSegment* ss : system->spannerSegments()) {
voltaSegments.push_back(ss); if (ss->isVoltaSegment() && ss->staffIdx() == staffIdx)
} voltaSegments.push_back(ss);
if (voltaSegments.size() > 1) { }
qreal y = 0; if (voltaSegments.size() > 1) {
for (SpannerSegment* ss : voltaSegments) qreal y = 0;
y = qMin(y, ss->userOff().y()); for (SpannerSegment* ss : voltaSegments)
for (SpannerSegment* ss : voltaSegments) y = qMin(y, ss->userOff().y());
ss->setUserYoffset(y); for (SpannerSegment* ss : voltaSegments)
ss->setUserYoffset(y);
}
} }
for (Spanner* sp : _unmanagedSpanner) { for (Spanner* sp : _unmanagedSpanner) {
if (sp->tick() >= etick || sp->tick2() < stick) if (sp->tick() >= etick || sp->tick2() < stick)

View file

@ -47,6 +47,14 @@ static const ElementStyle voltaStyle {
{ Sid::voltaHook, Pid::END_HOOK_HEIGHT }, { Sid::voltaHook, Pid::END_HOOK_HEIGHT },
}; };
//---------------------------------------------------------
// VoltaSegment
//---------------------------------------------------------
VoltaSegment::VoltaSegment(Score* s) : TextLineBaseSegment(s, ElementFlag::MOVABLE | ElementFlag::ON_STAFF)
{
}
//--------------------------------------------------------- //---------------------------------------------------------
// layout // layout
//--------------------------------------------------------- //---------------------------------------------------------
@ -54,7 +62,7 @@ static const ElementStyle voltaStyle {
void VoltaSegment::layout() void VoltaSegment::layout()
{ {
TextLineBaseSegment::layout(); TextLineBaseSegment::layout();
autoplaceSpannerSegment(spatium() * .7, Sid::voltaY, Sid::voltaY); autoplaceSpannerSegment(spatium() * 1.0, Sid::voltaY, Sid::voltaY);
} }
//--------------------------------------------------------- //---------------------------------------------------------
@ -75,6 +83,7 @@ Element* VoltaSegment::propertyDelegate(Pid pid)
Volta::Volta(Score* s) Volta::Volta(Score* s)
: TextLineBase(s, ElementFlag::SYSTEM) : TextLineBase(s, ElementFlag::SYSTEM)
{ {
setPlacement(Placement::ABOVE);
initElementStyle(&voltaStyle); initElementStyle(&voltaStyle);
setBeginTextPlace(PlaceText::BELOW); setBeginTextPlace(PlaceText::BELOW);

View file

@ -31,7 +31,7 @@ extern LineSegment* voltaDebug;
class VoltaSegment final : public TextLineBaseSegment { class VoltaSegment final : public TextLineBaseSegment {
public: public:
VoltaSegment(Score* s) : TextLineBaseSegment(s, ElementFlag::MOVABLE | ElementFlag::ON_STAFF) {} VoltaSegment(Score* s);
virtual ElementType type() const override { return ElementType::VOLTA_SEGMENT; } virtual ElementType type() const override { return ElementType::VOLTA_SEGMENT; }
virtual VoltaSegment* clone() const override { return new VoltaSegment(*this); } virtual VoltaSegment* clone() const override { return new VoltaSegment(*this); }
Volta* volta() const { return (Volta*)spanner(); } Volta* volta() const { return (Volta*)spanner(); }