This commit is contained in:
ws 2013-05-27 19:07:03 +02:00
parent 09e75ac98b
commit 8635098b75
3 changed files with 40 additions and 76 deletions

View file

@ -1492,20 +1492,20 @@ void Beam::layout2(QList<ChordRest*>crl, SpannerSegmentType, int frag)
int baseLevel = 0;
for (int beamLevel = 0; beamLevel < beamLevels; ++beamLevel) {
bool growDown = _up || cross;
for (int i = 0; i < n; ++i) {
for (int i = 0; i < n;) {
ChordRest* cr1 = crl[i];
int l = cr1->durationType().hooks() - 1;
if ((cr1->type() == REST) || l < beamLevel)
if ((cr1->type() == REST) || l < beamLevel) {
++i;
continue;
}
int c1 = i;
++i;
for (; i < n; ++i) {
ChordRest* c = crl[i];
int l = c->durationType().hooks() - 1;
BeamMode bm = c->beamMode();
if (bm == BeamMode::AUTO)
bm = Groups::endBeam(c);
BeamMode bm = Groups::endBeam(c);
bool b32 = (beamLevel >= 1) && (bm == BeamMode::BEGIN32);
bool b64 = (beamLevel >= 2) && (bm == BeamMode::BEGIN64);
if ((l >= beamLevel && (b32 || b64)) || (l < beamLevel))
@ -1611,7 +1611,6 @@ void Beam::layout2(QList<ChordRest*>crl, SpannerSegmentType, int frag)
else {
beamSegments.push_back(new QLineF(x2, ly1, x3, ly2));
}
--i;
}
}

View file

@ -46,19 +46,19 @@ static std::vector<NoteGroup> noteGroups {
BeamMode Groups::endBeam(ChordRest* cr)
{
if (cr->beamMode() != BeamMode::AUTO)
return cr->beamMode();
Q_ASSERT(cr->staff());
if (cr->tuplet() && !cr->tuplet()->elements().isEmpty()) {
if (cr->tuplet()->elements().front() == cr) // end beam at tuplet
if (cr->tuplet()->elements().front() == cr) // end beam at new tuplet
return BeamMode::BEGIN;
if (cr->tuplet()->elements().back() == cr) // end beam at tuplet end
return BeamMode::END;
return BeamMode::AUTO;
}
TDuration d = cr->durationType();
/* int type = int(d.type()) - int(TDuration::DurationType::V_EIGHT);
if (type < 0 || type > 3)
return BeamMode::AUTO;
*/
const Groups& g = cr->staff()->group(cr->tick());
return g.beamMode(cr->rtick(), d.type());
}

View file

@ -382,13 +382,14 @@ void Score::layoutStage2()
continue;
// set up for cross-measure values as soon as possible
// to have all computations (stems, hooks, ...) consistent with it
if(cr->type() == Element::CHORD && segment->segmentType() == Segment::SegChordRest)
if (cr->type() == Element::CHORD && segment->segmentType() == Segment::SegChordRest)
((Chord*)cr)->crossMeasureSetup(crossMeasure);
bm = cr->beamMode();
if (bm == BeamMode::AUTO)
bm = Groups::endBeam(cr);
bm = Groups::endBeam(cr);
// if chord has hooks and is 2nd element of a cross-measure value
// set beam mode to NONE (do not combine with following chord beam/hook, if any)
if (cr->durationType().hooks() > 0 && cr->crossMeasure() == CROSSMEASURE_SECOND)
bm = BeamMode::NONE;
if (cr->measure() != measure) {
@ -450,6 +451,7 @@ void Score::layoutStage2()
}
continue;
}
if ((cr->durationType().type() <= TDuration::V_QUARTER) || (bm == BeamMode::NONE)) {
if (beam) {
beam->layout1();
@ -462,85 +464,48 @@ void Score::layoutStage2()
cr->removeDeleteBeam();
continue;
}
bool beamEnd = false;
if (beam) {
ChordRest* le = beam->elements().back();
if ((!beamModeMid(bm) && (le->tuplet() != cr->tuplet())) || (bm == BeamMode::BEGIN)) {
beamEnd = true;
}
else if (!beamModeMid(bm)) {
if (le->tick() + le->actualTicks() < cr->tick())
beamEnd = true;
bool beamEnd = bm == BeamMode::BEGIN;
if (!beamEnd) {
cr->removeDeleteBeam();
beam->add(cr);
cr = 0;
beamEnd = (bm == BeamMode::END);
}
if (beamEnd) {
beam->layout1();
beam = 0;
}
else {
cr->removeDeleteBeam();
beam->add(cr);
cr = 0;
// is cr the last beam element?
if (bm == BeamMode::END) {
beam->layout1();
beam = 0;
}
}
}
if (cr && cr->tuplet() && (cr->tuplet()->elements().back() == cr)) {
if (beam) {
beam->layout1();
beam = 0;
cr->removeDeleteBeam();
if (!cr)
continue;
if (a1 == 0)
a1 = cr;
else {
if (!beamModeMid(bm)
&&
(bm == BeamMode::BEGIN
|| (a1->segment()->segmentType() != cr->segment()->segmentType())
|| (a1->tick() + a1->actualTicks() < cr->tick())
)
) {
a1->removeDeleteBeam();
a1 = cr;
}
else if (a1) {
else {
beam = a1->beam();
if (beam == 0 || beam->elements().front() != a1) {
beam = new Beam(this);
beam->setTrack(track);
beam->setGenerated(true);
beam->setTrack(track);
a1->removeDeleteBeam();
beam->add(a1);
}
cr->removeDeleteBeam();
beam->add(cr);
a1 = 0;
beam->layout1();
beam = 0;
}
else {
//cr->setBeam(0);
cr->removeDeleteBeam();
}
}
else if (cr) {
if (a1 == 0)
a1 = cr;
else {
if (!beamModeMid(bm)
&&
(bm == BeamMode::BEGIN
|| (a1->segment()->segmentType() != cr->segment()->segmentType())
|| (a1->tick() + a1->actualTicks() < cr->tick())
)
) {
a1->removeDeleteBeam();
a1 = cr;
}
else {
beam = a1->beam();
if (beam == 0 || beam->elements().front() != a1) {
beam = new Beam(this);
beam->setGenerated(true);
beam->setTrack(track);
a1->removeDeleteBeam();
beam->add(a1);
}
cr->removeDeleteBeam();
beam->add(cr);
a1 = 0;
}
}
}
}