2012-05-26 14:26:10 +02:00
|
|
|
//=============================================================================
|
|
|
|
// MuseScore
|
|
|
|
// Music Composition & Notation
|
|
|
|
//
|
2016-12-29 15:11:28 +01:00
|
|
|
// Copyright (C) 2002-2016 Werner Schweer
|
2012-05-26 14:26:10 +02:00
|
|
|
//
|
|
|
|
// 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
|
|
|
|
//=============================================================================
|
|
|
|
|
|
|
|
#include "barline.h"
|
|
|
|
#include "score.h"
|
|
|
|
#include "sym.h"
|
|
|
|
#include "staff.h"
|
2016-12-23 12:05:18 +01:00
|
|
|
#include "part.h"
|
2012-05-26 14:26:10 +02:00
|
|
|
#include "system.h"
|
|
|
|
#include "measure.h"
|
|
|
|
#include "segment.h"
|
|
|
|
#include "articulation.h"
|
|
|
|
#include "stafftype.h"
|
2014-04-09 16:09:21 +02:00
|
|
|
#include "xml.h"
|
2014-07-10 14:13:37 +02:00
|
|
|
#include "marker.h"
|
2016-12-23 12:05:18 +01:00
|
|
|
#include "stafflines.h"
|
2012-05-26 14:26:10 +02:00
|
|
|
|
2013-05-13 18:49:17 +02:00
|
|
|
namespace Ms {
|
|
|
|
|
2012-10-14 00:35:11 +02:00
|
|
|
//---------------------------------------------------------
|
|
|
|
// static members init
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
2016-12-23 12:05:18 +01:00
|
|
|
qreal BarLine::yoff1;
|
|
|
|
qreal BarLine::yoff2;
|
|
|
|
bool BarLine::_origSpanStaff;
|
2016-02-09 13:51:19 +01:00
|
|
|
int BarLine::_origSpanFrom;
|
|
|
|
int BarLine::_origSpanTo;
|
2012-10-14 00:35:11 +02:00
|
|
|
|
2012-05-26 14:26:10 +02:00
|
|
|
//---------------------------------------------------------
|
2016-02-04 17:06:32 +01:00
|
|
|
// BarLineTable
|
|
|
|
//---------------------------------------------------------
|
2012-05-26 14:26:10 +02:00
|
|
|
|
2016-06-13 17:39:10 +02:00
|
|
|
const std::vector<BarLineTableItem> BarLine::barLineTable {
|
2016-02-04 17:06:32 +01:00
|
|
|
{ BarLineType::NORMAL, QT_TRANSLATE_NOOP("Palette", "Normal barline"), "normal" },
|
|
|
|
{ BarLineType::DOUBLE, QT_TRANSLATE_NOOP("Palette", "Double barline"), "double" },
|
|
|
|
{ BarLineType::START_REPEAT, QT_TRANSLATE_NOOP("Palette", "Start repeat"), "start-repeat" },
|
|
|
|
{ BarLineType::END_REPEAT, QT_TRANSLATE_NOOP("Palette", "End repeat"), "end-repeat" },
|
|
|
|
{ BarLineType::BROKEN, QT_TRANSLATE_NOOP("Palette", "Dashed barline"), "dashed" },
|
|
|
|
{ BarLineType::END, QT_TRANSLATE_NOOP("Palette", "Final barline"), "end" },
|
|
|
|
{ BarLineType::END_START_REPEAT, QT_TRANSLATE_NOOP("Palette", "End-start repeat"), "end-start-repeat" },
|
|
|
|
{ BarLineType::DOTTED, QT_TRANSLATE_NOOP("Palette", "Dotted barline"), "dotted" },
|
2015-02-25 11:54:31 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
2016-02-04 17:06:32 +01:00
|
|
|
// barLineTableItem
|
2015-02-25 11:54:31 +01:00
|
|
|
//---------------------------------------------------------
|
|
|
|
|
2016-02-04 17:06:32 +01:00
|
|
|
const BarLineTableItem* BarLine::barLineTableItem(unsigned i)
|
2014-07-10 14:13:37 +02:00
|
|
|
{
|
2016-06-13 17:39:10 +02:00
|
|
|
if (i >= barLineTable.size())
|
2016-02-04 17:06:32 +01:00
|
|
|
return 0;
|
|
|
|
return &barLineTable[i];
|
2014-07-10 14:13:37 +02:00
|
|
|
}
|
|
|
|
|
2014-03-24 11:50:26 +01:00
|
|
|
//---------------------------------------------------------
|
2016-02-04 17:06:32 +01:00
|
|
|
// userTypeName
|
2014-03-24 11:50:26 +01:00
|
|
|
//---------------------------------------------------------
|
|
|
|
|
2016-02-04 17:06:32 +01:00
|
|
|
QString BarLine::userTypeName(BarLineType t)
|
2014-03-24 11:50:26 +01:00
|
|
|
{
|
2016-02-04 17:06:32 +01:00
|
|
|
for (const auto& i : barLineTable) {
|
|
|
|
if (i.type == t)
|
|
|
|
return qApp->translate("Palette", i.userName);
|
|
|
|
}
|
|
|
|
return QString();
|
2014-03-24 11:50:26 +01:00
|
|
|
}
|
|
|
|
|
2014-12-18 13:21:29 +01:00
|
|
|
//---------------------------------------------------------
|
2016-02-04 17:06:32 +01:00
|
|
|
// barLineTypeName
|
|
|
|
//
|
|
|
|
// Instance form returning the name string of the bar line type and
|
|
|
|
// static form returning the name string for an arbitrary bar line type.
|
2014-12-18 13:21:29 +01:00
|
|
|
//---------------------------------------------------------
|
|
|
|
|
2016-02-04 17:06:32 +01:00
|
|
|
QString BarLine::barLineTypeName() const
|
|
|
|
{
|
|
|
|
return barLineTypeName(barLineType());
|
|
|
|
}
|
|
|
|
|
|
|
|
QString BarLine::barLineTypeName(BarLineType t)
|
2014-07-10 14:13:37 +02:00
|
|
|
{
|
2014-12-18 13:21:29 +01:00
|
|
|
for (const auto& i : barLineTable) {
|
|
|
|
if (i.type == t)
|
2016-02-04 17:06:32 +01:00
|
|
|
return i.name;
|
|
|
|
}
|
|
|
|
return QString("??");
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// setBarLineType
|
|
|
|
//
|
|
|
|
// Set the bar line type from the type name string.
|
|
|
|
// Does not update _customSubtype or _generated flags: to be used when reading from a score file
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
void BarLine::setBarLineType(const QString& s)
|
|
|
|
{
|
|
|
|
_barLineType = barLineType(s);
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// barLineType
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
BarLineType BarLine::barLineType(const QString& s)
|
|
|
|
{
|
|
|
|
for (const auto& i : barLineTable) {
|
|
|
|
if (i.name == s)
|
|
|
|
return i.type;
|
|
|
|
}
|
|
|
|
return BarLineType::NORMAL; // silent default
|
2014-07-10 14:13:37 +02:00
|
|
|
}
|
|
|
|
|
2012-05-26 14:26:10 +02:00
|
|
|
//---------------------------------------------------------
|
|
|
|
// BarLine
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
BarLine::BarLine(Score* s)
|
|
|
|
: Element(s)
|
|
|
|
{
|
2016-12-18 14:31:13 +01:00
|
|
|
setHeight(4 * spatium()); // for use in palettes
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
|
|
|
|
2016-12-28 16:23:10 +01:00
|
|
|
BarLine::BarLine(const BarLine& bl)
|
|
|
|
: Element(bl)
|
|
|
|
{
|
|
|
|
_spanStaff = bl._spanStaff;
|
|
|
|
_spanFrom = bl._spanFrom;
|
|
|
|
_spanTo = bl._spanTo;
|
|
|
|
_barLineType = bl._barLineType;
|
|
|
|
y1 = bl.y1;
|
|
|
|
y2 = bl.y2;
|
|
|
|
|
|
|
|
for (Element* e : bl._el)
|
|
|
|
_el.push_back(e->clone());
|
|
|
|
}
|
|
|
|
|
|
|
|
BarLine::~BarLine()
|
|
|
|
{
|
|
|
|
qDeleteAll(_el);
|
|
|
|
}
|
|
|
|
|
2012-05-26 14:26:10 +02:00
|
|
|
//---------------------------------------------------------
|
|
|
|
// pagePos
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
QPointF BarLine::pagePos() const
|
|
|
|
{
|
2016-02-04 17:06:32 +01:00
|
|
|
if (segment() == 0)
|
2012-05-26 14:26:10 +02:00
|
|
|
return pos();
|
2016-02-04 17:06:32 +01:00
|
|
|
System* system = segment()->measure()->system();
|
2012-10-11 11:14:45 +02:00
|
|
|
|
2012-05-26 14:26:10 +02:00
|
|
|
qreal yp = y();
|
2014-02-23 11:06:03 +01:00
|
|
|
if (system) {
|
|
|
|
// get first not hidden staff
|
2016-12-23 12:05:18 +01:00
|
|
|
int startIdx = staffIdx();
|
2016-12-30 14:37:27 +01:00
|
|
|
int endIdx = startIdx + (spanStaff() ? 1 : 0);
|
2016-12-23 12:05:18 +01:00
|
|
|
int staffIdx1 = startIdx;
|
|
|
|
Staff* staff1 = score()->staff(staffIdx1);
|
2014-02-23 11:06:03 +01:00
|
|
|
SysStaff* sysStaff1 = system->staff(staffIdx1);
|
2016-12-23 12:05:18 +01:00
|
|
|
|
2015-12-13 00:44:25 +01:00
|
|
|
while (staff1 && sysStaff1 && !(sysStaff1->show() && staff1->show())) {
|
|
|
|
if (++staffIdx1 >= endIdx) {
|
|
|
|
// no visible staves spanned; just use first
|
|
|
|
staffIdx1 = startIdx;
|
|
|
|
break;
|
|
|
|
}
|
2014-02-23 11:06:03 +01:00
|
|
|
staff1 = score()->staff(staffIdx1);
|
|
|
|
sysStaff1 = system->staff(staffIdx1);
|
|
|
|
}
|
|
|
|
yp += system->staffYpage(staffIdx1);
|
|
|
|
}
|
2012-05-26 14:26:10 +02:00
|
|
|
return QPointF(pageX(), yp);
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// getY
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
2016-12-23 12:05:18 +01:00
|
|
|
void BarLine::getY() const
|
2012-05-26 14:26:10 +02:00
|
|
|
{
|
2012-10-14 00:35:11 +02:00
|
|
|
qreal _spatium = spatium();
|
2016-12-18 14:31:13 +01:00
|
|
|
if (!parent()) {
|
|
|
|
// for use in palette
|
2016-12-23 12:05:18 +01:00
|
|
|
y1 = _spanFrom * _spatium * .5;
|
|
|
|
y2 = (8-_spanTo) * _spatium * .5;
|
2016-12-18 14:31:13 +01:00
|
|
|
return;
|
|
|
|
}
|
2016-12-23 12:05:18 +01:00
|
|
|
int staffIdx1 = staffIdx();
|
|
|
|
Staff* staff1 = score()->staff(staffIdx1);
|
|
|
|
int staffIdx2 = staffIdx1;
|
|
|
|
int nstaves = score()->nstaves();
|
|
|
|
bool spanStaves = false;
|
|
|
|
|
2016-12-28 16:23:10 +01:00
|
|
|
Measure* measure = segment()->measure();
|
2016-12-23 12:05:18 +01:00
|
|
|
if (_spanStaff) {
|
|
|
|
for (int i2 = staffIdx1 + 1; i2 < nstaves; ++i2) {
|
|
|
|
Staff* s = score()->staff(i2);
|
2016-12-28 16:23:10 +01:00
|
|
|
if (!s->invisible() && s->part()->show() && measure->visible(i2)) {
|
2016-12-23 12:05:18 +01:00
|
|
|
spanStaves = true;
|
|
|
|
staffIdx2 = i2;
|
2016-12-18 14:31:13 +01:00
|
|
|
break;
|
2015-01-05 17:55:06 +01:00
|
|
|
}
|
2016-12-23 12:05:18 +01:00
|
|
|
BarLine* nbl = toBarLine(segment()->element(i2 * VOICES));
|
|
|
|
if (!nbl || !nbl->spanStaff())
|
2016-12-18 14:31:13 +01:00
|
|
|
break;
|
2013-01-25 21:17:04 +01:00
|
|
|
}
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
2016-12-18 14:31:13 +01:00
|
|
|
|
2016-12-28 16:23:10 +01:00
|
|
|
System* system = measure->system();
|
2016-12-23 12:05:18 +01:00
|
|
|
if (!system)
|
2016-12-18 14:31:13 +01:00
|
|
|
return;
|
2016-12-23 12:05:18 +01:00
|
|
|
|
|
|
|
// test start and end staff visibility
|
|
|
|
|
2016-12-18 14:31:13 +01:00
|
|
|
|
|
|
|
// base y on top visible staff in barline span
|
|
|
|
// after skipping ones with hideSystemBarLine set
|
|
|
|
// and accounting for staves that are shown but have invisible measures
|
|
|
|
|
|
|
|
int tick = segment()->measure()->tick();
|
|
|
|
StaffType* st1 = staff1->staffType(tick);
|
|
|
|
|
2016-12-23 12:05:18 +01:00
|
|
|
int from = _spanFrom;
|
|
|
|
int to = _spanTo;
|
|
|
|
int oneLine = st1->lines() == 1;
|
|
|
|
if (oneLine && _spanFrom == 0)
|
2016-12-18 14:31:13 +01:00
|
|
|
from = BARLINE_SPAN_1LINESTAFF_FROM;
|
2016-12-23 12:05:18 +01:00
|
|
|
if (!_spanStaff) {
|
|
|
|
if (oneLine && _spanTo == 0)
|
|
|
|
to = -BARLINE_SPAN_1LINESTAFF_TO;
|
2012-10-18 23:34:03 +02:00
|
|
|
}
|
2016-12-23 12:05:18 +01:00
|
|
|
|
|
|
|
SysStaff* sysStaff1 = system->staff(staffIdx1);
|
|
|
|
qreal yp = sysStaff1->y();
|
|
|
|
qreal d = st1->lineDistance().val() * st1->spatium(score());
|
|
|
|
qreal yy = measure->staffLines(staffIdx1)->y1() - yp;
|
|
|
|
y1 = yy + from * d * .5 + yoff1;
|
|
|
|
if (spanStaves)
|
|
|
|
y2 = measure->staffLines(staffIdx2)->y1() - yp - to * d * .5 + yoff2;
|
|
|
|
else
|
|
|
|
y2 = yy + (st1->lines() * 2 - 2 + to) * d * .5 + yoff2;
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// drawDots
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
void BarLine::drawDots(QPainter* painter, qreal x) const
|
|
|
|
{
|
|
|
|
qreal _spatium = spatium();
|
|
|
|
|
2016-12-23 12:05:18 +01:00
|
|
|
qreal y1;
|
|
|
|
qreal y2;
|
2012-05-26 14:26:10 +02:00
|
|
|
if (parent() == 0) { // for use in palette
|
2016-12-23 12:05:18 +01:00
|
|
|
y1 = 2.0 * _spatium;
|
|
|
|
y2 = 3.0 * _spatium;
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
2016-02-04 17:06:32 +01:00
|
|
|
else {
|
2016-12-23 12:05:18 +01:00
|
|
|
Staff* staff = score()->staff(staffIdx());
|
|
|
|
StaffType* st = staff->staffType(tick());
|
|
|
|
y1 = (st->doty1() + .5) * _spatium;
|
|
|
|
y2 = (st->doty2() + .5) * _spatium;
|
|
|
|
}
|
|
|
|
drawSymbol(SymId::repeatDot, painter, QPointF(x, y1));
|
|
|
|
drawSymbol(SymId::repeatDot, painter, QPointF(x, y2));
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// drawTips
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
void BarLine::drawTips(QPainter* painter, bool reversed, qreal x) const
|
|
|
|
{
|
|
|
|
if (reversed) {
|
|
|
|
if (isTop())
|
|
|
|
drawSymbol(SymId::reversedBracketTop, painter, QPointF(x, y1));
|
|
|
|
if (isBottom())
|
|
|
|
drawSymbol(SymId::reversedBracketBottom, painter, QPointF(x, y2));
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if (isTop())
|
|
|
|
drawSymbol(SymId::bracketTop, painter, QPointF(x, y1));
|
|
|
|
if (isBottom())
|
|
|
|
drawSymbol(SymId::bracketBottom, painter, QPointF(x, y2));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// isTop
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
bool BarLine::isTop() const
|
|
|
|
{
|
|
|
|
bool val = true;
|
|
|
|
for (int i = staffIdx() - 1; i >= 0; --i) {
|
|
|
|
BarLine* bl = toBarLine(segment()->element(i * VOICES));
|
|
|
|
if (!bl)
|
|
|
|
return true;
|
|
|
|
Staff* staff = score()->staff(i);
|
|
|
|
if (!staff->invisible() && staff->part()->show())
|
|
|
|
return !bl->spanStaff();
|
|
|
|
else if (!bl->spanStaff())
|
|
|
|
return true;
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
2016-12-23 12:05:18 +01:00
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// isBottom
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
bool BarLine::isBottom() const
|
|
|
|
{
|
|
|
|
return !_spanStaff; // TODO
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// draw
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
void BarLine::draw(QPainter* painter) const
|
|
|
|
{
|
2016-12-23 12:05:18 +01:00
|
|
|
qreal _mag = score()->styleB(StyleIdx::scaleBarlines) && staff() ? staff()->mag(tick()) : 1.0;
|
|
|
|
qreal lw = score()->styleP(StyleIdx::barWidth) * _mag * .5;
|
2013-12-28 01:11:51 +01:00
|
|
|
|
2016-12-23 12:05:18 +01:00
|
|
|
QPen pen(curColor(), lw*2, Qt::SolidLine, Qt::FlatCap);
|
2012-05-26 14:26:10 +02:00
|
|
|
painter->setPen(pen);
|
|
|
|
|
2016-08-06 11:36:51 +02:00
|
|
|
switch (barLineType()) {
|
2016-12-28 17:20:02 +01:00
|
|
|
case BarLineType::NORMAL:
|
|
|
|
painter->drawLine(QLineF(lw, y1, lw, y2));
|
|
|
|
break;
|
|
|
|
|
2014-05-30 10:14:09 +02:00
|
|
|
case BarLineType::BROKEN:
|
2012-05-26 14:26:10 +02:00
|
|
|
pen.setStyle(Qt::DashLine);
|
|
|
|
painter->setPen(pen);
|
2016-12-23 12:05:18 +01:00
|
|
|
painter->drawLine(QLineF(lw, y1, lw, y2));
|
2012-11-06 00:19:54 +01:00
|
|
|
break;
|
|
|
|
|
2014-05-30 10:14:09 +02:00
|
|
|
case BarLineType::DOTTED:
|
2012-11-06 00:19:54 +01:00
|
|
|
pen.setStyle(Qt::DotLine);
|
|
|
|
painter->setPen(pen);
|
2016-12-29 15:11:28 +01:00
|
|
|
painter->drawLine(QLineF(lw, y1, lw, y2));
|
|
|
|
break;
|
2012-05-26 14:26:10 +02:00
|
|
|
|
2014-05-30 10:14:09 +02:00
|
|
|
case BarLineType::END:
|
2012-05-26 14:26:10 +02:00
|
|
|
{
|
2016-03-02 13:20:19 +01:00
|
|
|
qreal lw2 = score()->styleP(StyleIdx::endBarWidth) * _mag;
|
|
|
|
qreal d = score()->styleP(StyleIdx::endBarDistance) * _mag;
|
2012-05-26 14:26:10 +02:00
|
|
|
|
2016-12-23 12:05:18 +01:00
|
|
|
painter->drawLine(QLineF(lw, y1, lw, y2));
|
2012-05-26 14:26:10 +02:00
|
|
|
pen.setWidthF(lw2);
|
|
|
|
painter->setPen(pen);
|
2016-12-23 12:05:18 +01:00
|
|
|
qreal x = d + lw2 * .5 + lw * 2.0;
|
2012-05-26 14:26:10 +02:00
|
|
|
painter->drawLine(QLineF(x, y1, x, y2));
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2014-05-30 10:14:09 +02:00
|
|
|
case BarLineType::DOUBLE:
|
2012-05-26 14:26:10 +02:00
|
|
|
{
|
2016-12-23 12:05:18 +01:00
|
|
|
qreal lw2 = score()->styleP(StyleIdx::doubleBarWidth) * _mag;
|
2016-03-02 13:20:19 +01:00
|
|
|
qreal d = score()->styleP(StyleIdx::doubleBarDistance) * _mag;
|
2012-05-26 14:26:10 +02:00
|
|
|
|
2016-12-23 12:05:18 +01:00
|
|
|
pen.setWidthF(lw2);
|
2012-05-26 14:26:10 +02:00
|
|
|
painter->setPen(pen);
|
2016-12-23 12:05:18 +01:00
|
|
|
qreal x = lw2 * .5;
|
2012-05-26 14:26:10 +02:00
|
|
|
painter->drawLine(QLineF(x, y1, x, y2));
|
2016-12-23 12:05:18 +01:00
|
|
|
x += d + lw2;
|
2012-05-26 14:26:10 +02:00
|
|
|
painter->drawLine(QLineF(x, y1, x, y2));
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2014-05-30 10:14:09 +02:00
|
|
|
case BarLineType::START_REPEAT:
|
2012-05-26 14:26:10 +02:00
|
|
|
{
|
2016-03-02 13:20:19 +01:00
|
|
|
qreal lw2 = score()->styleP(StyleIdx::endBarWidth) * _mag;
|
|
|
|
qreal d1 = score()->styleP(StyleIdx::endBarDistance) * _mag;
|
2016-10-10 23:05:51 +02:00
|
|
|
qreal d2 = score()->styleP(StyleIdx::repeatBarlineDotSeparation) * _mag;
|
2016-12-23 12:05:18 +01:00
|
|
|
qreal x2 = lw2 * .5; // thick line (lw2)
|
|
|
|
qreal x1 = lw2 + d1 + lw ; // thin line (lw)
|
|
|
|
qreal x0 = lw2 + d2 + lw*2.0 + d1; // dot position
|
2012-05-26 14:26:10 +02:00
|
|
|
|
|
|
|
drawDots(painter, x0);
|
|
|
|
|
|
|
|
painter->drawLine(QLineF(x1, y1, x1, y2));
|
|
|
|
|
|
|
|
pen.setWidthF(lw2);
|
|
|
|
painter->setPen(pen);
|
|
|
|
painter->drawLine(QLineF(x2, y1, x2, y2));
|
|
|
|
|
2016-12-23 12:05:18 +01:00
|
|
|
if (score()->styleB(StyleIdx::repeatBarTips))
|
|
|
|
drawTips(painter, false, 0.0);
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2014-05-30 10:14:09 +02:00
|
|
|
case BarLineType::END_REPEAT:
|
2012-05-26 14:26:10 +02:00
|
|
|
{
|
2016-03-02 13:20:19 +01:00
|
|
|
qreal lw2 = score()->styleP(StyleIdx::endBarWidth) * _mag;
|
2016-10-10 23:05:51 +02:00
|
|
|
qreal d1 = score()->styleP(StyleIdx::repeatBarlineDotSeparation) * _mag;
|
|
|
|
qreal d2 = score()->styleP(StyleIdx::endBarDistance) * _mag;
|
2013-12-04 00:08:31 +01:00
|
|
|
qreal dotw = symWidth(SymId::repeatDot);
|
2016-12-23 12:05:18 +01:00
|
|
|
qreal x1 = dotw + d1 + lw;
|
|
|
|
qreal x2 = dotw + d2 + lw*2.0 + d1 + lw2 * .5;
|
2012-05-26 14:26:10 +02:00
|
|
|
|
|
|
|
drawDots(painter, 0.0);
|
|
|
|
painter->drawLine(QLineF(x1, y1, x1, y2));
|
|
|
|
pen.setWidthF(lw2);
|
|
|
|
painter->setPen(pen);
|
|
|
|
painter->drawLine(QLineF(x2, y1, x2, y2));
|
2012-09-19 19:32:15 +02:00
|
|
|
|
2014-05-26 15:31:36 +02:00
|
|
|
if (score()->styleB(StyleIdx::repeatBarTips)) {
|
2012-05-26 14:26:10 +02:00
|
|
|
qreal x = x2 + lw2 * .5;
|
2014-02-19 19:13:21 +01:00
|
|
|
qreal w1 = symBbox(SymId::reversedBracketTop).width();
|
2016-12-23 12:05:18 +01:00
|
|
|
drawTips(painter, true, x - w1);
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2014-05-30 10:14:09 +02:00
|
|
|
case BarLineType::END_START_REPEAT:
|
2012-05-26 14:26:10 +02:00
|
|
|
{
|
2016-03-02 13:20:19 +01:00
|
|
|
qreal lw2 = score()->styleP(StyleIdx::endBarWidth) * _mag;
|
|
|
|
qreal d1 = score()->styleP(StyleIdx::endBarDistance) * _mag;
|
2016-12-23 12:05:18 +01:00
|
|
|
qreal d2 = score()->styleP(StyleIdx::repeatBarlineDotSeparation) * _mag;
|
2013-12-04 00:08:31 +01:00
|
|
|
qreal dotw = symWidth(SymId::repeatDot);
|
2012-05-26 14:26:10 +02:00
|
|
|
|
2016-12-23 12:05:18 +01:00
|
|
|
qreal x1 = dotw + d2 + lw; // thin bar
|
2012-05-26 14:26:10 +02:00
|
|
|
|
|
|
|
drawDots(painter, .0);
|
|
|
|
painter->drawLine(QLineF(x1, y1, x1, y2));
|
|
|
|
|
2016-12-23 12:05:18 +01:00
|
|
|
qreal x2 = dotw + d1 + lw*2 + d1 + lw2 * .5; // thick bar
|
|
|
|
|
2012-05-26 14:26:10 +02:00
|
|
|
pen.setWidthF(lw2);
|
|
|
|
painter->setPen(pen);
|
|
|
|
painter->drawLine(QLineF(x2, y1, x2, y2));
|
|
|
|
|
2016-12-23 12:05:18 +01:00
|
|
|
qreal x3 = dotw + d1 + lw*2 + d1 + lw2 + d1 + lw; // thin bar
|
|
|
|
|
|
|
|
pen.setWidthF(lw*2);
|
2012-05-26 14:26:10 +02:00
|
|
|
painter->setPen(pen);
|
|
|
|
painter->drawLine(QLineF(x3, y1, x3, y2));
|
2012-09-19 19:32:15 +02:00
|
|
|
|
2016-12-23 12:05:18 +01:00
|
|
|
qreal x4 = dotw + d2 + lw*2 + d1 + lw2 + d1 + lw*2 + d1; // dot position
|
|
|
|
drawDots(painter, x4);
|
|
|
|
|
2014-05-26 15:31:36 +02:00
|
|
|
if (score()->styleB(StyleIdx::repeatBarTips)) {
|
2016-12-23 12:05:18 +01:00
|
|
|
qreal x = x2;
|
2014-02-19 19:13:21 +01:00
|
|
|
qreal w1 = symBbox(SymId::reversedBracketTop).width();
|
2016-12-23 12:05:18 +01:00
|
|
|
drawTips(painter, false, x);
|
|
|
|
drawTips(painter, true, x - w1);
|
2012-09-19 19:32:15 +02:00
|
|
|
}
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2016-08-06 11:36:51 +02:00
|
|
|
Segment* s = segment();
|
2016-09-03 18:48:00 +02:00
|
|
|
if (s && !score()->printing()) {
|
2016-08-06 11:36:51 +02:00
|
|
|
Measure* m = s->measure();
|
2016-08-06 15:56:33 +02:00
|
|
|
if (s && s->isEndBarLineType() && m->isIrregular() && score()->markIrregularMeasures() && !m->isMMRest()) {
|
2016-08-06 11:36:51 +02:00
|
|
|
painter->setPen(MScore::layoutBreakColor);
|
|
|
|
QFont f("FreeSerif");
|
2016-09-03 18:48:00 +02:00
|
|
|
f.setPointSizeF(12 * spatium() * MScore::pixelRatio / SPATIUM20);
|
2016-08-06 11:36:51 +02:00
|
|
|
f.setBold(true);
|
|
|
|
QString str = m->len() > m->timesig() ? "+" : "-";
|
2016-09-04 11:26:45 +02:00
|
|
|
QRectF r = QFontMetricsF(f, MScore::paintDevice()).boundingRect(str);
|
2016-08-06 11:36:51 +02:00
|
|
|
painter->setFont(f);
|
|
|
|
painter->drawText(-r.width(), 0.0, str);
|
|
|
|
}
|
|
|
|
}
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// write
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
2016-11-19 11:51:21 +01:00
|
|
|
void BarLine::write(XmlWriter& xml) const
|
2012-05-26 14:26:10 +02:00
|
|
|
{
|
|
|
|
xml.stag("BarLine");
|
2016-12-23 12:05:18 +01:00
|
|
|
writeProperty(xml, P_ID::BARLINE_TYPE);
|
|
|
|
writeProperty(xml, P_ID::BARLINE_SPAN);
|
|
|
|
writeProperty(xml, P_ID::BARLINE_SPAN_FROM);
|
|
|
|
writeProperty(xml, P_ID::BARLINE_SPAN_TO);
|
2016-02-09 13:51:19 +01:00
|
|
|
|
|
|
|
for (const Element* e : _el)
|
2012-05-26 14:26:10 +02:00
|
|
|
e->write(xml);
|
|
|
|
Element::writeProperties(xml);
|
|
|
|
xml.etag();
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// read
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
2013-01-11 18:10:18 +01:00
|
|
|
void BarLine::read(XmlReader& e)
|
2012-05-26 14:26:10 +02:00
|
|
|
{
|
2016-12-28 17:20:02 +01:00
|
|
|
// resetProperty(P_ID::BARLINE_TYPE);
|
2016-02-09 13:51:19 +01:00
|
|
|
resetProperty(P_ID::BARLINE_SPAN);
|
|
|
|
resetProperty(P_ID::BARLINE_SPAN_FROM);
|
|
|
|
resetProperty(P_ID::BARLINE_SPAN_TO);
|
|
|
|
|
2013-01-11 18:10:18 +01:00
|
|
|
while (e.readNextStartElement()) {
|
|
|
|
const QStringRef& tag(e.name());
|
2016-02-09 13:51:19 +01:00
|
|
|
if (tag == "subtype")
|
|
|
|
setBarLineType(e.readElementText());
|
2017-03-04 15:01:42 +01:00
|
|
|
else if (tag == "span")
|
2016-12-23 12:05:18 +01:00
|
|
|
_spanStaff = e.readBool();
|
|
|
|
else if (tag == "spanFromOffset")
|
|
|
|
_spanFrom = e.readInt();
|
|
|
|
else if (tag == "spanToOffset")
|
|
|
|
_spanTo = e.readInt();
|
2012-05-26 14:26:10 +02:00
|
|
|
else if (tag == "Articulation") {
|
|
|
|
Articulation* a = new Articulation(score());
|
|
|
|
a->read(e);
|
|
|
|
add(a);
|
|
|
|
}
|
|
|
|
else if (!Element::readProperties(e))
|
2013-01-11 18:10:18 +01:00
|
|
|
e.unknown();
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// acceptDrop
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
2014-08-13 21:01:21 +02:00
|
|
|
bool BarLine::acceptDrop(const DropData& data) const
|
2012-05-26 14:26:10 +02:00
|
|
|
{
|
2017-01-18 14:16:33 +01:00
|
|
|
ElementType type = data.element->type();
|
|
|
|
if (type == ElementType::BAR_LINE)
|
2016-02-04 17:06:32 +01:00
|
|
|
return true;
|
2013-03-05 20:23:59 +01:00
|
|
|
else {
|
2017-01-18 14:16:33 +01:00
|
|
|
return (type == ElementType::ARTICULATION
|
2016-02-04 17:06:32 +01:00
|
|
|
&& segment()
|
2016-03-02 13:20:19 +01:00
|
|
|
&& segment()->isEndBarLineType());
|
2012-10-22 14:46:35 +02:00
|
|
|
}
|
|
|
|
return false;
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// drop
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
Element* BarLine::drop(const DropData& data)
|
|
|
|
{
|
|
|
|
Element* e = data.element;
|
2016-02-04 11:27:47 +01:00
|
|
|
|
2017-03-07 18:01:56 +01:00
|
|
|
if (e->isBarLine()) {
|
2016-02-17 14:54:23 +01:00
|
|
|
BarLine* bl = toBarLine(e);
|
2013-03-05 20:23:59 +01:00
|
|
|
BarLineType st = bl->barLineType();
|
2016-02-04 11:27:47 +01:00
|
|
|
|
2012-11-06 14:57:04 +01:00
|
|
|
// if no change in subtype or no change in span, do nothing
|
2016-12-18 14:31:13 +01:00
|
|
|
if (st == barLineType() && !bl->spanFrom() && !bl->spanTo()) {
|
2012-05-26 14:26:10 +02:00
|
|
|
delete e;
|
|
|
|
return 0;
|
|
|
|
}
|
2017-03-08 10:51:19 +01:00
|
|
|
|
2012-11-06 14:57:04 +01:00
|
|
|
// check if the new property can apply to this single bar line
|
2016-02-04 17:06:32 +01:00
|
|
|
BarLineType bt = BarLineType::START_REPEAT | BarLineType::END_REPEAT | BarLineType::END_START_REPEAT;
|
2017-03-07 18:01:56 +01:00
|
|
|
bool oldRepeat = barLineType() & bt;
|
2016-02-04 17:06:32 +01:00
|
|
|
bool newRepeat = bl->barLineType() & bt;
|
2016-02-04 11:27:47 +01:00
|
|
|
|
2014-12-07 00:11:50 +01:00
|
|
|
// if ctrl was used and repeats are not involved,
|
|
|
|
// or if drop refers to span rather than subtype =>
|
2012-11-06 14:57:04 +01:00
|
|
|
// single bar line drop
|
2016-02-04 11:27:47 +01:00
|
|
|
|
2016-12-18 14:31:13 +01:00
|
|
|
if ((data.control() && !oldRepeat && !newRepeat) || (bl->spanFrom() || bl->spanTo()) ) {
|
2012-11-06 14:57:04 +01:00
|
|
|
// if drop refers to span, update this bar line span
|
2016-12-18 14:31:13 +01:00
|
|
|
if (bl->spanFrom() || bl->spanTo()) {
|
2012-11-06 14:57:04 +01:00
|
|
|
// if dropped spanFrom or spanTo are below the middle of standard staff (5 lines)
|
2016-12-23 12:05:18 +01:00
|
|
|
// adjust to the number of staff lines
|
2016-12-18 14:31:13 +01:00
|
|
|
// TODO:barlines
|
2016-12-23 12:05:18 +01:00
|
|
|
int spanFrom = bl->spanFrom();
|
|
|
|
int spanTo = bl->spanTo();
|
|
|
|
undoChangeProperty(P_ID::BARLINE_SPAN, false);
|
|
|
|
undoChangeProperty(P_ID::BARLINE_SPAN_FROM, spanFrom);
|
|
|
|
undoChangeProperty(P_ID::BARLINE_SPAN_FROM, spanTo);
|
2012-11-06 14:57:04 +01:00
|
|
|
}
|
2014-12-07 00:11:50 +01:00
|
|
|
// if drop refers to subtype, update this bar line subtype
|
2016-02-04 11:27:47 +01:00
|
|
|
else
|
2016-02-10 13:40:34 +01:00
|
|
|
undoChangeProperty(P_ID::BARLINE_TYPE, QVariant::fromValue(bl->barLineType()));
|
2012-11-06 14:57:04 +01:00
|
|
|
delete e;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2016-02-04 11:27:47 +01:00
|
|
|
//---------------------------------------------
|
2017-03-08 10:51:19 +01:00
|
|
|
// Update repeat flags
|
2016-02-04 11:27:47 +01:00
|
|
|
//---------------------------------------------
|
|
|
|
|
2016-10-18 15:41:00 +02:00
|
|
|
Measure* m = segment()->measure();
|
2017-03-08 10:51:19 +01:00
|
|
|
// drop on a end-start-repeat barline remove also the start repeat on next measure
|
|
|
|
if (segment()->isEndBarLineType()
|
|
|
|
&& barLineType() == BarLineType::END_START_REPEAT
|
|
|
|
&& (st & (BarLineType::END|BarLineType::NORMAL|BarLineType::DOUBLE|BarLineType::BROKEN|BarLineType::DOTTED))
|
|
|
|
&& m->nextMeasure()) {
|
|
|
|
m->nextMeasure()->undoChangeProperty(P_ID::REPEAT_START, false);
|
|
|
|
}
|
|
|
|
score()->undoChangeBarLine(m, st, segment()->segmentType());
|
2014-12-07 00:11:50 +01:00
|
|
|
delete e;
|
|
|
|
return 0;
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
2016-02-04 11:27:47 +01:00
|
|
|
|
2017-03-07 18:01:56 +01:00
|
|
|
else if (e->isArticulation()) {
|
2016-02-17 14:54:23 +01:00
|
|
|
Articulation* atr = toArticulation(e);
|
2012-05-26 14:26:10 +02:00
|
|
|
atr->setParent(this);
|
|
|
|
atr->setTrack(track());
|
|
|
|
score()->undoAddElement(atr);
|
|
|
|
return atr;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// updateGrips
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
2015-01-19 12:37:17 +01:00
|
|
|
void BarLine::updateGrips(Grip* defaultGrip, QVector<QRectF>& grip) const
|
2012-05-26 14:26:10 +02:00
|
|
|
{
|
2015-01-19 12:37:17 +01:00
|
|
|
*defaultGrip = Grip::END;
|
2016-12-23 12:05:18 +01:00
|
|
|
qreal lw = score()->styleP(StyleIdx::barWidth) * staff()->mag(tick());
|
|
|
|
getY();
|
2012-10-14 00:35:11 +02:00
|
|
|
grip[0].translate(QPointF(lw * .5, y1) + pagePos());
|
|
|
|
grip[1].translate(QPointF(lw * .5, y2) + pagePos());
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
|
|
|
|
2012-10-14 19:48:36 +02:00
|
|
|
//---------------------------------------------------------
|
|
|
|
// startEdit
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
void BarLine::startEdit(MuseScoreView*, const QPointF&)
|
2014-12-18 13:21:29 +01:00
|
|
|
{
|
2012-10-14 19:48:36 +02:00
|
|
|
// keep a copy of original span values
|
2016-12-23 12:05:18 +01:00
|
|
|
_origSpanStaff = _spanStaff;
|
|
|
|
_origSpanFrom = _spanFrom;
|
|
|
|
_origSpanTo = _spanTo;
|
2014-12-18 13:21:29 +01:00
|
|
|
}
|
2012-10-14 19:48:36 +02:00
|
|
|
|
2012-05-26 14:26:10 +02:00
|
|
|
//---------------------------------------------------------
|
|
|
|
// endEdit
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
void BarLine::endEdit()
|
|
|
|
{
|
2015-06-11 21:28:29 +02:00
|
|
|
// for mid-measure barlines, edit is local
|
2016-12-23 12:05:18 +01:00
|
|
|
// bool midMeasure = false;
|
2016-12-29 13:42:55 +01:00
|
|
|
// if (segment()->isBarLine()) {
|
|
|
|
// ctrlDrag = true;
|
2016-12-23 12:05:18 +01:00
|
|
|
// midMeasure = true;
|
2016-12-29 13:42:55 +01:00
|
|
|
// }
|
2016-12-23 12:05:18 +01:00
|
|
|
#if 0 // TODO
|
2016-03-08 09:46:33 +01:00
|
|
|
if (ctrlDrag) { // if single bar line edit
|
2016-12-23 12:05:18 +01:00
|
|
|
char newSpanStaff = _spanStaff; // copy edited span values
|
|
|
|
char newSpanFrom = _spanFrom;
|
|
|
|
char newSpanTo = _spanTo;
|
|
|
|
_spanStaff = _origSpanStaff; // restore original span values
|
2012-10-14 19:48:36 +02:00
|
|
|
_spanFrom = _origSpanFrom;
|
|
|
|
_spanTo = _origSpanTo;
|
2015-06-11 21:28:29 +02:00
|
|
|
// for mid-measure barline in root score, update parts
|
2016-03-10 10:41:31 +01:00
|
|
|
if (midMeasure && score()->isMaster() && score()->excerpts().size() > 0) {
|
2015-06-11 21:28:29 +02:00
|
|
|
int currIdx = staffIdx();
|
2016-02-04 17:06:32 +01:00
|
|
|
Measure* m = segment()->measure();
|
2015-06-11 21:28:29 +02:00
|
|
|
// change linked barlines as necessary
|
2016-12-23 12:05:18 +01:00
|
|
|
int lastIdx = currIdx + qMax(_span, newSpanStaff);
|
2015-06-11 21:28:29 +02:00
|
|
|
for (int idx = currIdx; idx < lastIdx; ++idx) {
|
|
|
|
Staff* staff = score()->staff(idx);
|
|
|
|
LinkedStaves* ls = staff->linkedStaves();
|
|
|
|
if (ls) {
|
|
|
|
for (Staff* lstaff : ls->staves()) {
|
|
|
|
Score* lscore = lstaff->score();
|
|
|
|
// don't change barlines in root score
|
|
|
|
if (lscore == staff->score())
|
|
|
|
continue;
|
|
|
|
// change barline only in top staff of part
|
|
|
|
if (lstaff != lscore->staff(0))
|
|
|
|
continue;
|
2016-12-23 12:05:18 +01:00
|
|
|
int spannedStaves = qMax(currIdx + newSpanStaff - idx, 0);
|
2015-06-11 21:28:29 +02:00
|
|
|
int lNewSpan = qMin(spannedStaves, lscore->nstaves());
|
|
|
|
Measure* lm = lscore->tick2measure(m->tick());
|
2017-03-08 13:12:26 +01:00
|
|
|
Segment* lseg = lm->undoGetSegmentR(SegmentType::BarLine, rtick());
|
2016-02-17 14:54:23 +01:00
|
|
|
BarLine* lbl = toBarLine(lseg->element(0));
|
2015-06-11 21:28:29 +02:00
|
|
|
if (lbl) {
|
|
|
|
// already a barline here
|
|
|
|
if (lNewSpan > 0) {
|
|
|
|
// keep barline, but update span if necessary
|
|
|
|
if (lbl->span() != lNewSpan)
|
|
|
|
lbl->undoChangeProperty(P_ID::BARLINE_SPAN, lNewSpan);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// remove barline
|
|
|
|
lbl->unlink();
|
|
|
|
lbl->score()->undoRemoveElement(lbl);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// new barline needed
|
2016-02-17 14:54:23 +01:00
|
|
|
lbl = toBarLine(linkedClone());
|
2015-06-11 21:28:29 +02:00
|
|
|
lbl->setSpan(lNewSpan);
|
|
|
|
lbl->setTrack(lstaff->idx() * VOICES);
|
|
|
|
lbl->setScore(lscore);
|
|
|
|
lbl->setParent(lseg);
|
|
|
|
lscore->undoAddElement(lbl);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-12-23 12:05:18 +01:00
|
|
|
undoChangeProperty(P_ID::BARLINE_SPAN, newSpanStaff);
|
|
|
|
undoChangeProperty(P_ID::BARLINE_SPAN_FROM, newSpanFrom);
|
|
|
|
undoChangeProperty(P_ID::BARLINE_SPAN_FROM, newSpanTo);
|
2012-10-14 13:46:04 +02:00
|
|
|
return;
|
|
|
|
}
|
2016-12-23 12:05:18 +01:00
|
|
|
#endif
|
2012-10-14 13:46:04 +02:00
|
|
|
|
2012-11-11 01:50:57 +01:00
|
|
|
// if same as staff settings, do nothing
|
2016-12-23 12:05:18 +01:00
|
|
|
if (staff()->barLineSpan() == _spanStaff && staff()->barLineFrom() == _spanFrom && staff()->barLineTo() == _spanTo)
|
2012-05-26 14:26:10 +02:00
|
|
|
return;
|
|
|
|
|
2016-12-23 12:05:18 +01:00
|
|
|
// int idx1 = staffIdx();
|
|
|
|
#if 0 // TODO
|
2014-12-18 13:21:29 +01:00
|
|
|
if (_span != staff()->barLineSpan()) {
|
2012-10-14 00:35:11 +02:00
|
|
|
// if now bar lines span more staves
|
|
|
|
if (_span > staff()->barLineSpan()) {
|
|
|
|
int idx2 = idx1 + _span;
|
|
|
|
// set span 0 to all additional staves
|
2016-01-04 14:48:58 +01:00
|
|
|
for (int idx = idx1 + 1; idx < idx2; ++idx) {
|
2015-07-15 04:45:33 +02:00
|
|
|
// Mensurstrich special case:
|
2012-11-02 10:03:07 +01:00
|
|
|
// if line spans to top line of a stave AND current staff is
|
|
|
|
// the last spanned staff BUT NOT the last score staff
|
|
|
|
// keep its bar lines
|
|
|
|
// otherwise remove them
|
2016-09-17 12:27:19 +02:00
|
|
|
if (_spanTo > 0 || !(idx == idx2-1 && idx != score()->nstaves()-1)) {
|
|
|
|
Staff* staff = score()->staff(idx);
|
2016-12-29 13:42:55 +01:00
|
|
|
staff->undoChangeProperty(P_ID::STAFF_BARLINE_SPAN, 0);
|
|
|
|
staff->undoChangeProperty(P_ID::STAFF_BARLINE_SPAN_FROM, 0);
|
|
|
|
staff->undoChangeProperty(P_ID::STAFF_BARLINE_SPAN_TO, (staff->lines(tick())-1)*2);
|
2016-09-17 12:27:19 +02:00
|
|
|
}
|
2016-01-04 14:48:58 +01:00
|
|
|
}
|
2012-10-14 00:35:11 +02:00
|
|
|
}
|
|
|
|
// if now bar lines span fewer staves
|
|
|
|
else {
|
|
|
|
int idx1 = staffIdx() + _span;
|
|
|
|
int idx2 = staffIdx() + staff()->barLineSpan();
|
2012-11-11 01:50:57 +01:00
|
|
|
// set standard span for each no-longer-spanned staff
|
2015-07-14 17:02:17 +02:00
|
|
|
for (int idx = idx1; idx < idx2; ++idx) {
|
2016-09-17 12:27:19 +02:00
|
|
|
Staff* staff = score()->staff(idx);
|
2016-12-13 13:16:17 +01:00
|
|
|
int lines = staff->lines(tick());
|
2016-12-23 12:05:18 +01:00
|
|
|
int spanFrom = 0;
|
|
|
|
int spanTo = 0;
|
2016-12-29 13:42:55 +01:00
|
|
|
staff->undoChangeProperty(P_ID::STAFF_BARLINE_SPAN, 1);
|
|
|
|
staff->undoChangeProperty(P_ID::STAFF_BARLINE_SPAN_FROM, spanFrom);
|
|
|
|
staff->undoChangeProperty(P_ID::STAFF_BARLINE_SPAN_TO, spanTo);
|
2015-07-14 17:02:17 +02:00
|
|
|
}
|
2012-10-14 00:35:11 +02:00
|
|
|
}
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
2016-12-23 12:05:18 +01:00
|
|
|
#endif
|
2012-05-26 14:26:10 +02:00
|
|
|
// update span for the staff the edited bar line belongs to
|
2016-12-29 13:42:55 +01:00
|
|
|
staff()->undoChangeProperty(P_ID::STAFF_BARLINE_SPAN, _spanStaff);
|
|
|
|
staff()->undoChangeProperty(P_ID::STAFF_BARLINE_SPAN_FROM, _spanFrom);
|
|
|
|
staff()->undoChangeProperty(P_ID::STAFF_BARLINE_SPAN_TO, _spanTo);
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// editDrag
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
void BarLine::editDrag(const EditData& ed)
|
|
|
|
{
|
2016-12-13 13:16:17 +01:00
|
|
|
qreal lineDist = staff()->lineDistance(tick()) * spatium();
|
2016-12-23 12:05:18 +01:00
|
|
|
qreal min, max, lastmax;
|
|
|
|
getY();
|
2012-10-14 00:35:11 +02:00
|
|
|
y1 -= yoff1; // current positions of barline ends, ignoring any in-process dragging
|
|
|
|
y2 -= yoff2;
|
2015-01-19 12:37:17 +01:00
|
|
|
if (ed.curGrip == Grip::START) {
|
2015-04-10 04:39:14 +02:00
|
|
|
// min offset for top grip is line -1 (-2 for 1-line staves)
|
2012-10-14 00:35:11 +02:00
|
|
|
// max offset is 1 line above bottom grip or 1 below last staff line, whichever comes first
|
2016-12-13 13:16:17 +01:00
|
|
|
int lines = staff()->lines(tick());
|
|
|
|
min = (-y1 - lines == 1) ? lineDist * 2 : lineDist;
|
2012-10-14 00:35:11 +02:00
|
|
|
max = y2 - y1 - lineDist; // 1 line above bottom grip
|
2016-12-13 13:16:17 +01:00
|
|
|
lastmax = (lines - _spanFrom/2) * lineDist; // 1 line below last staff line
|
2014-12-18 13:21:29 +01:00
|
|
|
if (lastmax < max)
|
2012-10-14 00:35:11 +02:00
|
|
|
max = lastmax;
|
|
|
|
// update yoff1 and bring it within limits
|
|
|
|
yoff1 += ed.delta.y();
|
2014-12-18 13:21:29 +01:00
|
|
|
if (yoff1 < min)
|
2012-10-14 00:35:11 +02:00
|
|
|
yoff1 = min;
|
2014-12-18 13:21:29 +01:00
|
|
|
if (yoff1 > max)
|
2012-10-14 00:35:11 +02:00
|
|
|
yoff1 = max;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// min for bottom grip is 1 line below top grip
|
|
|
|
// no max
|
|
|
|
min = y1 - y2 + lineDist;
|
|
|
|
// update yoff2 and bring it within limit
|
|
|
|
yoff2 += ed.delta.y();
|
2014-12-18 13:21:29 +01:00
|
|
|
if (yoff2 < min)
|
2012-10-14 00:35:11 +02:00
|
|
|
yoff2 = min;
|
|
|
|
}
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// endEditDrag
|
2012-10-14 00:35:11 +02:00
|
|
|
// snap to nearest staff / staff line
|
2012-05-26 14:26:10 +02:00
|
|
|
//---------------------------------------------------------
|
|
|
|
|
2016-12-29 13:42:55 +01:00
|
|
|
void BarLine::endEditDrag(const EditData&)
|
2012-05-26 14:26:10 +02:00
|
|
|
{
|
2014-04-14 19:42:12 +02:00
|
|
|
if (yoff1 == 0.0 && yoff2 == 0.0) // if no drag, do nothing
|
|
|
|
return;
|
|
|
|
|
2016-12-23 12:05:18 +01:00
|
|
|
getY();
|
2012-10-14 00:35:11 +02:00
|
|
|
qreal ay0 = pagePos().y();
|
|
|
|
qreal ay2 = ay0 + y2; // absolute (page-relative) bar line bottom coord
|
2012-05-26 14:26:10 +02:00
|
|
|
int staffIdx1 = staffIdx();
|
|
|
|
int staffIdx2;
|
2016-02-04 17:06:32 +01:00
|
|
|
System* syst = segment()->measure()->system();
|
2012-10-22 14:46:35 +02:00
|
|
|
qreal systTopY = syst->pagePos().y();
|
2012-10-14 00:35:11 +02:00
|
|
|
|
|
|
|
// determine new span value
|
|
|
|
int numOfStaves = syst->staves()->size();
|
|
|
|
if (staffIdx1 + 1 >= numOfStaves)
|
|
|
|
// if initial staff is last staff, ending staff must be the same
|
2012-05-26 14:26:10 +02:00
|
|
|
staffIdx2 = staffIdx1;
|
2012-10-14 00:35:11 +02:00
|
|
|
|
2012-05-26 14:26:10 +02:00
|
|
|
else {
|
2012-10-14 00:35:11 +02:00
|
|
|
// if there are other staves after it, look for staff nearest to bar line bottom coord
|
|
|
|
qreal staff1TopY = syst->staff(staffIdx1)->y() + systTopY;
|
|
|
|
|
|
|
|
for (staffIdx2 = staffIdx1 + 1; staffIdx2 < numOfStaves; ++staffIdx2) {
|
|
|
|
// compute 1st staff height, absolute top Y of 2nd staff and height of blank between the staves
|
|
|
|
Staff * staff1 = score()->staff(staffIdx2-1);
|
2016-12-13 13:16:17 +01:00
|
|
|
qreal staff1Hght = (staff1->lines(tick())-1) * staff1->lineDistance(tick()) * spatium();
|
2012-10-14 00:35:11 +02:00
|
|
|
qreal staff2TopY = systTopY + syst->staff(staffIdx2)->y();
|
|
|
|
qreal blnkBtwnStaff = staff2TopY - staff1TopY - staff1Hght;
|
|
|
|
// if bar line bottom coord is above than mid-way of blank between staves...
|
|
|
|
if (ay2 < (staff1TopY + staff1Hght + blnkBtwnStaff * .5))
|
|
|
|
break; // ...staff 1 is ending staff
|
|
|
|
// if bar line is below, advance to next staff
|
|
|
|
staff1TopY = staff2TopY;
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
|
|
|
staffIdx2 -= 1;
|
|
|
|
}
|
2016-12-23 12:05:18 +01:00
|
|
|
int newSpanStaff = staffIdx2 - staffIdx1 + 1;
|
2012-10-14 00:35:11 +02:00
|
|
|
|
2014-04-14 19:42:12 +02:00
|
|
|
// determine new spanFrom and spanTo values
|
|
|
|
int newSpanFrom, newSpanTo;
|
2016-12-23 12:05:18 +01:00
|
|
|
// Staff * staff2 = score()->staff(staffIdx2);
|
|
|
|
// int staff1lines = staff()->lines(tick());
|
|
|
|
// int staff2lines = staff2->lines(tick());
|
2014-04-14 19:42:12 +02:00
|
|
|
|
2016-12-23 12:05:18 +01:00
|
|
|
#if 0 // TODO
|
2014-04-14 19:42:12 +02:00
|
|
|
if (shiftDrag) { // if precision dragging
|
|
|
|
newSpanFrom = _spanFrom;
|
2014-12-18 13:21:29 +01:00
|
|
|
if (yoff1 != 0.0) {
|
2014-04-14 19:42:12 +02:00
|
|
|
// round bar line top coord to nearest line of 1st staff (in half line dist units)
|
2016-12-13 13:16:17 +01:00
|
|
|
newSpanFrom = ((int)floor(y1 / (staff()->lineDistance(tick()) * spatium()) + 0.5 )) * 2;
|
2014-04-14 19:42:12 +02:00
|
|
|
// min = 1 line dist above 1st staff line | max = 1 line dist below last staff line
|
2015-04-10 04:39:14 +02:00
|
|
|
// except for 1-line staves
|
2016-09-17 12:27:19 +02:00
|
|
|
int minFrom = staff1lines == 1 ? BARLINE_SPAN_1LINESTAFF_FROM : MIN_BARLINE_SPAN_FROMTO;
|
2015-04-10 04:39:14 +02:00
|
|
|
if (newSpanFrom < minFrom)
|
|
|
|
newSpanFrom = minFrom;
|
2016-09-17 12:27:19 +02:00
|
|
|
if (newSpanFrom > staff1lines * 2)
|
|
|
|
newSpanFrom = staff1lines * 2;
|
2014-04-14 19:42:12 +02:00
|
|
|
}
|
2012-10-14 00:35:11 +02:00
|
|
|
|
2014-04-14 19:42:12 +02:00
|
|
|
newSpanTo = _spanTo;
|
2014-12-18 13:21:29 +01:00
|
|
|
if (yoff2 != 0.0) {
|
2014-04-14 19:42:12 +02:00
|
|
|
// round bar line bottom coord to nearest line of 2nd staff (in half line dist units)
|
|
|
|
qreal staff2TopY = systTopY + syst->staff(staffIdx2)->y();
|
2016-12-13 13:16:17 +01:00
|
|
|
newSpanTo = ((int)floor( (ay2 - staff2TopY) / (staff2->lineDistance(tick()) * spatium()) + 0.5 )) * 2;
|
2014-04-14 19:42:12 +02:00
|
|
|
// min = 1 line dist above 1st staff line | max = 1 line dist below last staff line
|
2016-09-17 12:27:19 +02:00
|
|
|
int maxTo = staff2lines == 1 ? BARLINE_SPAN_1LINESTAFF_TO : staff2lines * 2;
|
2014-12-18 13:21:29 +01:00
|
|
|
if (newSpanTo < MIN_BARLINE_SPAN_FROMTO)
|
2014-04-14 19:42:12 +02:00
|
|
|
newSpanTo = MIN_BARLINE_SPAN_FROMTO;
|
2015-04-10 04:39:14 +02:00
|
|
|
if (newSpanTo > maxTo)
|
|
|
|
newSpanTo = maxTo;
|
2014-04-14 19:42:12 +02:00
|
|
|
}
|
2016-02-09 13:51:19 +01:00
|
|
|
}
|
2016-12-23 12:05:18 +01:00
|
|
|
#endif
|
|
|
|
// else { // if coarse dragging
|
|
|
|
{ // if coarse dragging
|
|
|
|
newSpanFrom = 0;
|
|
|
|
newSpanTo = 0;
|
2014-12-18 13:21:29 +01:00
|
|
|
}
|
2014-04-09 16:09:21 +02:00
|
|
|
|
2012-10-14 13:46:04 +02:00
|
|
|
// if any value changed, update
|
2016-12-23 12:05:18 +01:00
|
|
|
if (newSpanStaff != _spanStaff || newSpanFrom != _spanFrom || newSpanTo != _spanTo) {
|
|
|
|
_spanStaff = newSpanStaff;
|
2012-10-14 00:35:11 +02:00
|
|
|
_spanFrom = newSpanFrom;
|
|
|
|
_spanTo = newSpanTo;
|
|
|
|
}
|
2012-10-14 13:46:04 +02:00
|
|
|
|
2016-12-23 12:05:18 +01:00
|
|
|
yoff1 = 0.0;
|
|
|
|
yoff2 = 0.0;
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
2012-08-02 18:33:43 +02:00
|
|
|
// layoutWidth
|
2012-05-26 14:26:10 +02:00
|
|
|
//---------------------------------------------------------
|
|
|
|
|
2012-08-02 18:33:43 +02:00
|
|
|
qreal BarLine::layoutWidth(Score* score, BarLineType type, qreal mag)
|
2012-05-26 14:26:10 +02:00
|
|
|
{
|
2016-03-02 13:20:19 +01:00
|
|
|
if (!score->styleB(StyleIdx::scaleBarlines))
|
|
|
|
mag = 0.0;
|
|
|
|
qreal dw = score->styleP(StyleIdx::barWidth) * mag;
|
2012-05-26 14:26:10 +02:00
|
|
|
|
2013-12-04 00:08:31 +01:00
|
|
|
qreal dotwidth = score->scoreFont()->width(SymId::repeatDot, mag);
|
2016-04-27 18:02:42 +02:00
|
|
|
switch (type) {
|
2014-05-30 10:14:09 +02:00
|
|
|
case BarLineType::DOUBLE:
|
2016-03-02 13:20:19 +01:00
|
|
|
dw = (score->styleP(StyleIdx::doubleBarWidth) * 2
|
|
|
|
+ score->styleP(StyleIdx::doubleBarDistance)) * mag;
|
2012-05-26 14:26:10 +02:00
|
|
|
break;
|
2014-05-30 10:14:09 +02:00
|
|
|
case BarLineType::START_REPEAT:
|
2016-03-02 13:20:19 +01:00
|
|
|
dw += dotwidth + (score->styleP(StyleIdx::endBarWidth)
|
2016-10-10 23:05:51 +02:00
|
|
|
+ (score->styleP(StyleIdx::repeatBarlineDotSeparation) + score->styleP(StyleIdx::endBarDistance))) * mag;
|
2012-05-26 14:26:10 +02:00
|
|
|
break;
|
2014-05-30 10:14:09 +02:00
|
|
|
case BarLineType::END_REPEAT:
|
2016-03-02 13:20:19 +01:00
|
|
|
dw += dotwidth + (score->styleP(StyleIdx::endBarWidth)
|
2016-10-10 23:05:51 +02:00
|
|
|
+ (score->styleP(StyleIdx::repeatBarlineDotSeparation) + score->styleP(StyleIdx::endBarDistance))) * mag;
|
2012-05-26 14:26:10 +02:00
|
|
|
break;
|
2014-05-30 10:14:09 +02:00
|
|
|
case BarLineType::END:
|
2016-03-02 13:20:19 +01:00
|
|
|
dw += (score->styleP(StyleIdx::endBarWidth)
|
|
|
|
+ score->styleP(StyleIdx::endBarDistance)) * mag;
|
2012-05-26 14:26:10 +02:00
|
|
|
break;
|
2014-05-30 10:14:09 +02:00
|
|
|
case BarLineType::END_START_REPEAT:
|
2016-03-02 13:20:19 +01:00
|
|
|
dw += 2 * dotwidth + (score->styleP(StyleIdx::barWidth)
|
|
|
|
+ score->styleP(StyleIdx::endBarWidth)
|
2016-10-10 23:05:51 +02:00
|
|
|
+ 2 * (score->styleP(StyleIdx::repeatBarlineDotSeparation) + score->styleP(StyleIdx::endBarDistance))) * mag;
|
2012-05-26 14:26:10 +02:00
|
|
|
break;
|
2014-05-30 10:14:09 +02:00
|
|
|
case BarLineType::BROKEN:
|
|
|
|
case BarLineType::NORMAL:
|
|
|
|
case BarLineType::DOTTED:
|
2012-05-26 14:26:10 +02:00
|
|
|
break;
|
|
|
|
}
|
2012-08-02 18:33:43 +02:00
|
|
|
return dw;
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// layout
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
void BarLine::layout()
|
|
|
|
{
|
2016-12-29 13:42:55 +01:00
|
|
|
setMag(score()->styleB(StyleIdx::scaleBarlines) && staff() ? staff()->mag(tick()) : 1.0);
|
2016-12-29 15:11:28 +01:00
|
|
|
qreal _spatium = spatium();
|
|
|
|
y1 = _spatium * .5 * _spanFrom;
|
|
|
|
y2 = _spatium * .5 * (8.0 + _spanTo);
|
|
|
|
|
|
|
|
// bar lines not hidden
|
|
|
|
qreal dw = layoutWidth(score(), barLineType(), mag());
|
2017-03-07 18:01:56 +01:00
|
|
|
QRectF r(0.0, y1, dw, y2 - y1);
|
2016-12-29 15:11:28 +01:00
|
|
|
|
|
|
|
if (score()->styleB(StyleIdx::repeatBarTips)) {
|
|
|
|
switch (barLineType()) {
|
|
|
|
case BarLineType::START_REPEAT:
|
|
|
|
r |= symBbox(SymId::bracketTop).translated(0, y1);
|
|
|
|
r |= symBbox(SymId::bracketBottom).translated(0, y2);
|
|
|
|
break;
|
|
|
|
case BarLineType::END_REPEAT:
|
|
|
|
{
|
|
|
|
qreal w1 = symBbox(SymId::reversedBracketTop).width();
|
|
|
|
r |= symBbox(SymId::reversedBracketTop).translated(dw - w1, y1);
|
|
|
|
r |= symBbox(SymId::reversedBracketBottom).translated(dw - w1, y2);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BarLineType::END_START_REPEAT:
|
|
|
|
{
|
|
|
|
qreal lw = score()->styleP(StyleIdx::barWidth);
|
|
|
|
qreal lw2 = score()->styleP(StyleIdx::endBarWidth);
|
|
|
|
qreal d1 = score()->styleP(StyleIdx::endBarDistance);
|
|
|
|
qreal dotw = symWidth(SymId::repeatDot);
|
|
|
|
qreal x = dotw + 2 * d1 + lw + lw2 * .5; // thick bar
|
|
|
|
qreal w1 = symBbox(SymId::reversedBracketTop).width();
|
|
|
|
r |= symBbox(SymId::bracketTop).translated(x, y1);
|
|
|
|
r |= symBbox(SymId::bracketBottom).translated(x, y2);
|
|
|
|
r |= symBbox(SymId::reversedBracketTop).translated(x - w1 , y1);
|
|
|
|
r |= symBbox(SymId::reversedBracketBottom).translated(x - w1, y2);
|
2013-03-17 00:54:17 +01:00
|
|
|
}
|
2016-12-29 15:11:28 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
|
|
|
}
|
2016-12-29 15:11:28 +01:00
|
|
|
setbbox(r);
|
2013-03-17 00:54:17 +01:00
|
|
|
|
2016-01-04 14:48:58 +01:00
|
|
|
for (Element* e : _el) {
|
2012-05-26 14:26:10 +02:00
|
|
|
e->layout();
|
2016-02-17 14:54:23 +01:00
|
|
|
if (e->isArticulation()) {
|
2016-12-23 12:05:18 +01:00
|
|
|
Articulation* a = toArticulation(e);
|
|
|
|
Direction dir = a->direction();
|
|
|
|
qreal distance = 0.5 * spatium();
|
|
|
|
qreal x = width() * .5;
|
2016-03-02 13:20:19 +01:00
|
|
|
if (dir == Direction::DOWN) {
|
2012-05-26 14:26:10 +02:00
|
|
|
qreal botY = y2 + distance;
|
|
|
|
a->setPos(QPointF(x, botY));
|
|
|
|
}
|
2012-10-23 16:09:45 +02:00
|
|
|
else {
|
|
|
|
qreal topY = y1 - distance;
|
|
|
|
a->setPos(QPointF(x, topY));
|
|
|
|
}
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// shape
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
2016-12-23 12:05:18 +01:00
|
|
|
Shape BarLine::shape() const
|
|
|
|
{
|
|
|
|
Shape shape;
|
2016-12-29 13:42:55 +01:00
|
|
|
shape.add(QRectF(0.0, 0.0, width(), height()).translated(pos()));
|
2016-12-23 12:05:18 +01:00
|
|
|
return shape;
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// layout2
|
|
|
|
// called after system layout; set vertical dimensions
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
void BarLine::layout2()
|
|
|
|
{
|
2017-03-07 18:01:56 +01:00
|
|
|
//setPos(QPointF());
|
2016-12-23 12:05:18 +01:00
|
|
|
getY();
|
|
|
|
|
2016-12-29 15:11:28 +01:00
|
|
|
// bar lines not hidden
|
|
|
|
qreal dw = layoutWidth(score(), barLineType(), mag());
|
|
|
|
QRectF r(0.0, y1, dw, y2-y1);
|
2016-12-23 12:05:18 +01:00
|
|
|
|
2016-12-29 15:11:28 +01:00
|
|
|
if (score()->styleB(StyleIdx::repeatBarTips)) {
|
|
|
|
switch (barLineType()) {
|
|
|
|
case BarLineType::START_REPEAT:
|
|
|
|
r |= symBbox(SymId::bracketTop).translated(0, y1);
|
|
|
|
r |= symBbox(SymId::bracketBottom).translated(0, y2);
|
|
|
|
break;
|
|
|
|
case BarLineType::END_REPEAT:
|
|
|
|
{
|
|
|
|
qreal w1 = symBbox(SymId::reversedBracketTop).width();
|
|
|
|
r |= symBbox(SymId::reversedBracketTop).translated(dw - w1, y1);
|
|
|
|
r |= symBbox(SymId::reversedBracketBottom).translated(dw - w1, y2);
|
|
|
|
break;
|
|
|
|
}
|
2016-12-23 12:05:18 +01:00
|
|
|
|
2016-12-29 15:11:28 +01:00
|
|
|
case BarLineType::END_START_REPEAT:
|
|
|
|
{
|
|
|
|
qreal lw = score()->styleP(StyleIdx::barWidth);
|
|
|
|
qreal lw2 = score()->styleP(StyleIdx::endBarWidth);
|
|
|
|
qreal d1 = score()->styleP(StyleIdx::endBarDistance);
|
|
|
|
qreal dotw = symWidth(SymId::repeatDot);
|
|
|
|
qreal x = dotw + 2 * d1 + lw + lw2 * .5; // thick bar
|
|
|
|
qreal w1 = symBbox(SymId::reversedBracketTop).width();
|
|
|
|
r |= symBbox(SymId::bracketTop).translated(x, y1);
|
|
|
|
r |= symBbox(SymId::bracketBottom).translated(x, y2);
|
|
|
|
r |= symBbox(SymId::reversedBracketTop).translated(x - w1 , y1);
|
|
|
|
r |= symBbox(SymId::reversedBracketBottom).translated(x - w1, y2);
|
2016-12-23 12:05:18 +01:00
|
|
|
}
|
2016-12-29 15:11:28 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
2016-12-23 12:05:18 +01:00
|
|
|
}
|
|
|
|
}
|
2017-03-07 18:01:56 +01:00
|
|
|
bbox().setY(r.y());
|
|
|
|
bbox().setHeight(r.height());
|
2016-12-23 12:05:18 +01:00
|
|
|
}
|
|
|
|
|
2012-05-26 14:26:10 +02:00
|
|
|
//---------------------------------------------------------
|
|
|
|
// scanElements
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
void BarLine::scanElements(void* data, void (*func)(void*, Element*), bool all)
|
|
|
|
{
|
2013-03-25 23:35:36 +01:00
|
|
|
// if no width (staff has bar lines turned off) and not all requested, do nothing
|
|
|
|
if (width() == 0.0 && !all)
|
|
|
|
return;
|
2012-05-26 14:26:10 +02:00
|
|
|
func(data, this);
|
2016-02-04 17:06:32 +01:00
|
|
|
for (Element* e : _el)
|
2012-05-26 14:26:10 +02:00
|
|
|
e->scanElements(data, func, all);
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// add
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
void BarLine::add(Element* e)
|
|
|
|
{
|
2014-05-30 13:35:44 +02:00
|
|
|
e->setParent(this);
|
2016-02-04 17:06:32 +01:00
|
|
|
switch (e->type()) {
|
2017-01-18 14:16:33 +01:00
|
|
|
case ElementType::ARTICULATION:
|
2013-03-25 16:27:20 +01:00
|
|
|
_el.push_back(e);
|
2012-05-26 14:26:10 +02:00
|
|
|
setGenerated(false);
|
|
|
|
break;
|
|
|
|
default:
|
2012-12-08 00:16:38 +01:00
|
|
|
qDebug("BarLine::add() not impl. %s", e->name());
|
2012-10-11 11:14:45 +02:00
|
|
|
delete e;
|
2012-05-26 14:26:10 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// remove
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
void BarLine::remove(Element* e)
|
|
|
|
{
|
|
|
|
switch(e->type()) {
|
2017-01-18 14:16:33 +01:00
|
|
|
case ElementType::ARTICULATION:
|
2012-05-26 14:26:10 +02:00
|
|
|
if (!_el.remove(e))
|
2012-12-08 00:16:38 +01:00
|
|
|
qDebug("BarLine::remove(): cannot find %s", e->name());
|
2012-05-26 14:26:10 +02:00
|
|
|
break;
|
|
|
|
default:
|
2012-12-08 00:16:38 +01:00
|
|
|
qDebug("BarLine::remove() not impl. %s", e->name());
|
2012-05-26 14:26:10 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// getProperty
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
2012-08-10 17:01:35 +02:00
|
|
|
QVariant BarLine::getProperty(P_ID id) const
|
2012-05-26 14:26:10 +02:00
|
|
|
{
|
2013-03-07 20:01:22 +01:00
|
|
|
switch (id) {
|
2016-02-04 11:27:47 +01:00
|
|
|
case P_ID::BARLINE_TYPE:
|
2016-02-10 13:40:34 +01:00
|
|
|
return QVariant::fromValue(_barLineType);
|
2014-05-26 18:18:01 +02:00
|
|
|
case P_ID::BARLINE_SPAN:
|
2016-12-23 12:05:18 +01:00
|
|
|
return spanStaff();
|
2014-05-26 18:18:01 +02:00
|
|
|
case P_ID::BARLINE_SPAN_FROM:
|
2016-12-23 12:05:18 +01:00
|
|
|
return int(spanFrom());
|
2014-05-26 18:18:01 +02:00
|
|
|
case P_ID::BARLINE_SPAN_TO:
|
2016-12-23 12:05:18 +01:00
|
|
|
return int(spanTo());
|
2013-03-07 20:01:22 +01:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2012-08-10 17:01:35 +02:00
|
|
|
return Element::getProperty(id);
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// setProperty
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
2012-08-10 17:01:35 +02:00
|
|
|
bool BarLine::setProperty(P_ID id, const QVariant& v)
|
2012-05-26 14:26:10 +02:00
|
|
|
{
|
2016-02-04 17:06:32 +01:00
|
|
|
switch (id) {
|
2016-02-04 11:27:47 +01:00
|
|
|
case P_ID::BARLINE_TYPE:
|
2016-02-10 13:40:34 +01:00
|
|
|
setBarLineType(v.value<BarLineType>());
|
2013-03-07 20:01:22 +01:00
|
|
|
break;
|
2014-05-26 18:18:01 +02:00
|
|
|
case P_ID::BARLINE_SPAN:
|
2016-12-23 12:05:18 +01:00
|
|
|
setSpanStaff(v.toBool());
|
2013-03-07 20:01:22 +01:00
|
|
|
break;
|
2014-05-26 18:18:01 +02:00
|
|
|
case P_ID::BARLINE_SPAN_FROM:
|
2013-03-08 12:55:12 +01:00
|
|
|
setSpanFrom(v.toInt());
|
|
|
|
break;
|
2014-05-26 18:18:01 +02:00
|
|
|
case P_ID::BARLINE_SPAN_TO:
|
2013-03-08 12:55:12 +01:00
|
|
|
setSpanTo(v.toInt());
|
|
|
|
break;
|
2013-03-07 20:01:22 +01:00
|
|
|
default:
|
|
|
|
return Element::setProperty(id, v);
|
2012-11-18 00:28:38 +01:00
|
|
|
}
|
2016-02-09 13:51:19 +01:00
|
|
|
setGenerated(false);
|
2016-06-14 10:32:34 +02:00
|
|
|
triggerLayout();
|
2012-08-10 17:01:35 +02:00
|
|
|
return true;
|
2012-05-26 14:26:10 +02:00
|
|
|
}
|
2012-10-17 20:22:24 +02:00
|
|
|
|
2013-03-07 20:01:22 +01:00
|
|
|
//---------------------------------------------------------
|
|
|
|
// propertyDefault
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
QVariant BarLine::propertyDefault(P_ID propertyId) const
|
|
|
|
{
|
2016-01-04 14:48:58 +01:00
|
|
|
switch (propertyId) {
|
2016-02-04 11:27:47 +01:00
|
|
|
case P_ID::BARLINE_TYPE:
|
|
|
|
if (segment() && segment()->measure() && !segment()->measure()->nextMeasure())
|
2016-02-10 13:40:34 +01:00
|
|
|
return QVariant::fromValue(BarLineType::END);
|
2016-08-24 09:57:24 +02:00
|
|
|
return QVariant::fromValue(BarLineType::NORMAL);
|
2016-01-04 14:48:58 +01:00
|
|
|
|
2014-05-26 18:18:01 +02:00
|
|
|
case P_ID::BARLINE_SPAN:
|
2016-12-23 12:05:18 +01:00
|
|
|
return staff() ? staff()->barLineSpan() : false;
|
2016-02-09 13:51:19 +01:00
|
|
|
|
2014-05-26 18:18:01 +02:00
|
|
|
case P_ID::BARLINE_SPAN_FROM:
|
2016-12-18 14:31:13 +01:00
|
|
|
return staff() ? staff()->barLineFrom() : 0;
|
2016-02-09 13:51:19 +01:00
|
|
|
|
2014-05-26 18:18:01 +02:00
|
|
|
case P_ID::BARLINE_SPAN_TO:
|
2016-12-18 14:31:13 +01:00
|
|
|
return staff() ? staff()->barLineTo() : 0;
|
2016-02-09 13:51:19 +01:00
|
|
|
|
2013-03-07 20:01:22 +01:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return Element::propertyDefault(propertyId);
|
|
|
|
}
|
2013-05-13 18:49:17 +02:00
|
|
|
|
2014-06-20 22:48:34 +02:00
|
|
|
//---------------------------------------------------------
|
|
|
|
// nextElement
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
Element* BarLine::nextElement()
|
|
|
|
{
|
2016-02-04 17:06:32 +01:00
|
|
|
return segment()->firstInNextSegments(score()->inputState().prevTrack() / VOICES);
|
2014-06-20 22:48:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// prevElement
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
|
|
|
Element* BarLine::prevElement()
|
|
|
|
{
|
2016-02-04 17:06:32 +01:00
|
|
|
return segment()->lastInPrevSegments(score()->inputState().prevTrack() / VOICES);
|
2014-06-20 22:48:34 +02:00
|
|
|
}
|
|
|
|
|
2014-07-10 14:13:37 +02:00
|
|
|
//---------------------------------------------------------
|
|
|
|
// accessibleInfo
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
2016-02-04 17:06:32 +01:00
|
|
|
QString BarLine::accessibleInfo() const
|
2014-07-10 14:13:37 +02:00
|
|
|
{
|
2016-02-04 17:06:32 +01:00
|
|
|
return QString("%1: %2").arg(Element::accessibleInfo()).arg(BarLine::userTypeName(barLineType()));
|
2014-07-10 14:13:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// accessibleExtraInfo
|
|
|
|
//---------------------------------------------------------
|
|
|
|
|
2016-02-04 17:06:32 +01:00
|
|
|
QString BarLine::accessibleExtraInfo() const
|
2014-07-10 14:13:37 +02:00
|
|
|
{
|
2016-02-04 17:06:32 +01:00
|
|
|
Segment* seg = segment();
|
|
|
|
QString rez;
|
2014-07-10 14:13:37 +02:00
|
|
|
|
2016-02-04 17:06:32 +01:00
|
|
|
for (const Element* e : *el()) {
|
|
|
|
if (!score()->selectionFilter().canSelect(e))
|
|
|
|
continue;
|
|
|
|
rez = QString("%1 %2").arg(rez).arg(e->screenReaderInfo());
|
|
|
|
}
|
|
|
|
|
|
|
|
for (const Element* e : seg->annotations()) {
|
|
|
|
if (!score()->selectionFilter().canSelect(e))
|
|
|
|
continue;
|
|
|
|
if (e->track() == track())
|
2014-08-21 18:32:52 +02:00
|
|
|
rez = QString("%1 %2").arg(rez).arg(e->screenReaderInfo());
|
2016-02-04 17:06:32 +01:00
|
|
|
}
|
|
|
|
Measure* m = seg->measure();
|
2014-07-10 14:13:37 +02:00
|
|
|
|
2016-02-09 13:51:19 +01:00
|
|
|
if (m) { // always true?
|
2016-02-04 17:06:32 +01:00
|
|
|
//jumps
|
|
|
|
for (const Element* e : m->el()) {
|
2015-02-03 01:55:37 +01:00
|
|
|
if (!score()->selectionFilter().canSelect(e)) continue;
|
2017-01-18 14:16:33 +01:00
|
|
|
if (e->type() == ElementType::JUMP)
|
2016-02-04 17:06:32 +01:00
|
|
|
rez= QString("%1 %2").arg(rez).arg(e->screenReaderInfo());
|
2017-01-18 14:16:33 +01:00
|
|
|
if (e->type() == ElementType::MARKER) {
|
2016-02-17 14:54:23 +01:00
|
|
|
const Marker* m = toMarker(e);
|
2016-02-04 17:06:32 +01:00
|
|
|
if (m->markerType() == Marker::Type::FINE)
|
|
|
|
rez = QString("%1 %2").arg(rez).arg(e->screenReaderInfo());
|
2014-07-10 14:13:37 +02:00
|
|
|
}
|
|
|
|
|
2016-02-04 17:06:32 +01:00
|
|
|
}
|
|
|
|
//markers
|
|
|
|
Measure* nextM = m->nextMeasureMM();
|
|
|
|
if (nextM) {
|
|
|
|
for (const Element* e : nextM->el()) {
|
|
|
|
if (!score()->selectionFilter().canSelect(e))
|
|
|
|
continue;
|
2016-05-31 20:39:17 +02:00
|
|
|
if (e->isMarker()) {
|
2016-02-17 14:54:23 +01:00
|
|
|
if (toMarker(e)->markerType() == Marker::Type::FINE)
|
2016-02-04 17:06:32 +01:00
|
|
|
continue; //added above^
|
|
|
|
rez = QString("%1 %2").arg(rez).arg(e->screenReaderInfo());
|
2016-05-31 20:39:17 +02:00
|
|
|
}
|
2014-07-10 14:13:37 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-02-04 17:06:32 +01:00
|
|
|
int tick = seg->tick();
|
|
|
|
|
|
|
|
auto spanners = score()->spannerMap().findOverlapping(tick, tick);
|
|
|
|
for (auto interval : spanners) {
|
|
|
|
Spanner* s = interval.value;
|
|
|
|
if (!score()->selectionFilter().canSelect(s))
|
|
|
|
continue;
|
2017-01-18 14:16:33 +01:00
|
|
|
if (s->type() == ElementType::VOLTA) {
|
2016-02-04 17:06:32 +01:00
|
|
|
if (s->tick() == tick)
|
2017-02-17 15:09:28 +01:00
|
|
|
rez = QObject::tr("%1 Start of %2").arg(rez).arg(s->screenReaderInfo());
|
2016-02-04 17:06:32 +01:00
|
|
|
if (s->tick2() == tick)
|
2017-02-17 15:09:28 +01:00
|
|
|
rez = QObject::tr("%1 End of %2").arg(rez).arg(s->screenReaderInfo());
|
2016-02-04 17:06:32 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return rez;
|
2014-07-10 14:13:37 +02:00
|
|
|
}
|
|
|
|
|
2013-05-13 18:49:17 +02:00
|
|
|
}
|
|
|
|
|