本文整理汇总了C++中Segment::element方法的典型用法代码示例。如果您正苦于以下问题:C++ Segment::element方法的具体用法?C++ Segment::element怎么用?C++ Segment::element使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Segment
的用法示例。
在下文中一共展示了Segment::element方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: checkMeasure
void TestMeasure::checkMeasure()
{
MasterScore* score = readScore(DIR + "checkMeasure.mscx");
Element* tst = 0;
Measure* m = score->firstMeasure()->nextMeasure();
Segment* s = m->undoGetSegment(Segment::Type::ChordRest, 2880);
tst = s->element(1);
Q_ASSERT(tst);
QVERIFY(tst->isRest() && toRest(tst)->isGap() && toRest(tst)->actualTicks() == 480/*&& toRest(tst)->durationType() == TDuration::DurationType::V_HALF*/);
m = m->nextMeasure();
// s = m->undoGetSegment(Segment::Type::ChordRest, 3840);
// tst = s->element(2);
// Q_ASSERT(tst);
// QVERIFY(tst->isRest() && toRest(tst)->isGap() && toRest(tst)->actualTicks() == 480/*&& toRest(tst)->durationType() == TDuration::DurationType::V_HALF*/);
m = m->nextMeasure();
s = m->undoGetSegment(Segment::Type::ChordRest, 6240);
tst = s->element(1);
Q_ASSERT(tst);
QVERIFY(tst->isRest() && toRest(tst)->isGap() && toRest(tst)->actualTicks() == 120/*&& toRest(tst)->durationType() == TDuration::DurationType::V_HALF*/);
s = m->undoGetSegment(Segment::Type::ChordRest, 6480);
tst = s->element(1);
Q_ASSERT(tst);
QVERIFY(tst->isRest() && toRest(tst)->isGap() && toRest(tst)->actualTicks() == 120/*&& toRest(tst)->durationType() == TDuration::DurationType::V_HALF*/);
delete score;
}
示例2: drop
Element* Clef::drop(const DropData& data)
{
Element* e = data.element;
Clef* c = 0;
if (e->isClef()) {
Clef* clef = toClef(e);
ClefType stype = clef->clefType();
if (clefType() != stype) {
score()->undoChangeClef(staff(), segment(), stype);
c = this;
}
}
else if (e->isAmbitus()) {
/*if (!generated())*/ {
Measure* meas = measure();
Segment* segm = meas->getSegment(Segment::Type::Ambitus, meas->tick());
if (segm->element(track()))
score()->undoRemoveElement(segm->element(track()));
Ambitus* r = new Ambitus(score());
r->setParent(segm);
r->setTrack(track());
score()->undoAddElement(r);
}
}
delete e;
return c;
}
示例3: readScore
void TestBarline::barline04()
{
Score* score = readScore(DIR + "barline04.mscx");
QVERIFY(score);
score->doLayout();
score->startCmd();
// 'go' to 5th measure
Measure* msr = score->firstMeasure();
for (int i=0; i < 4; i++)
msr = msr->nextMeasure();
// check span data of measure-initial start-repeat bar line
Segment* seg = msr->findSegment(SegmentType::StartRepeatBarLine, msr->tick());
QVERIFY2(seg != nullptr, "No SegStartRepeatBarLine segment in measure 5.");
BarLine* bar = static_cast<BarLine*>(seg->element(0));
QVERIFY2(bar != nullptr, "No start-repeat barline in measure 5.");
bar->undoChangeProperty(Pid::BARLINE_SPAN, 2);
bar->undoChangeProperty(Pid::BARLINE_SPAN_FROM, 2);
bar->undoChangeProperty(Pid::BARLINE_SPAN_TO, 6);
score->endCmd();
QVERIFY2(bar->spanStaff() && bar->spanFrom() == 2 && bar->spanTo() == 6,
"Wrong span data in start-repeat barline of measure 5.");
// check start-repeat bar ine in second staff is gone
QVERIFY2(seg->element(1) == nullptr, "Extra start-repeat barline in 2nd staff of measure 5.");
// QVERIFY(saveCompareScore(score, "barline04.mscx", DIR + "barline04-ref.mscx"));
delete score;
}
示例4: layout
void Glissando::layout()
{
Chord* chord = static_cast<Chord*>(parent());
if (chord == 0) {
return;
}
Note* anchor2 = chord->upNote();
Segment* s = chord->segment();
s = s->prev1();
while (s) {
if ((s->subtype() & (Segment::SegChordRestGrace)) && s->element(track()))
break;
s = s->prev1();
}
if (s == 0) {
qDebug("no segment for first note of glissando found\n");
return;
}
ChordRest* cr = static_cast<ChordRest*>(s->element(track()));
if (cr == 0 || cr->type() != CHORD) {
qDebug("no first note for glissando found, track %d\n", track());
return;
}
Note* anchor1 = static_cast<Chord*>(cr)->upNote();
setPos(0.0, 0.0);
QPointF cp1 = anchor1->pagePos();
QPointF cp2 = anchor2->pagePos();
// construct line from notehead to notehead
qreal x1 = (anchor1->headWidth()) - (cp2.x() - cp1.x());
qreal y1 = anchor1->pos().y();
qreal x2 = anchor2->pos().x();
qreal y2 = anchor2->pos().y();
// on TAB's, adjust lower end point from string line height to base of note height (= ca. half line spacing)
if (chord->staff()->isTabStaff()) {
qreal yOff = chord->staff()->lineDistance() * 0.5 * spatium();
if (anchor1->pitch() > anchor2->pitch()) // descending glissando:
y2 += yOff; // move ending point to base of note
else // ascending glissando:
y1 += yOff; // move starting point to base of note
}
QLineF fullLine(x1, y1, x2, y2);
// shorten line on each side by offsets
qreal xo = spatium() * .5;
qreal yo = xo; // spatium() * .5;
QPointF p1 = fullLine.pointAt(xo / fullLine.length());
QPointF p2 = fullLine.pointAt(1 - (yo / fullLine.length()));
line = QLineF(p1, p2);
qreal lw = spatium() * .15 * .5;
QRectF r = QRectF(line.p1(), line.p2()).normalized();
setbbox(r.adjusted(-lw, -lw, lw, lw));
}
示例5: readScore
void TestClefCourtesy::clef_courtesy02()
{
Score* score = readScore(DIR + "clef_courtesy02.mscx");
score->doLayout();
// 'go' to 4th measure
Measure* m1 = score->firstMeasure();
for (int i=0; i < 3; i++)
m1 = m1->nextMeasure();
// make a clef-drop object and drop it to the measure
Clef* clef = new Clef(score); // create a new element, as Measure::drop() will eventually delete it
clef->setClefType(ClefType::G1);
DropData dropData;
dropData.pos = m1->pagePos();
dropData.element = clef;
m1->drop(dropData);
// 'go' to 7th measure
Measure* m2 = m1;
for (int i=0; i < 3; i++)
m2 = m2->nextMeasure();
// make a clef-drop object and drop it to the measure
clef = new Clef(score); // create a new element, as Measure::drop() will eventually delete it
clef->setClefType(ClefType::G);
dropData.pos = m2->pagePos();
dropData.element = clef;
m2->drop(dropData);
score->doLayout();
// check both clef elements are there, but none is shown
Clef* clefCourt = nullptr;
Measure* m = m1->prevMeasure();
Segment* seg = m->findSegment(SegmentType::Clef, m1->tick());
QVERIFY2(seg != nullptr, "No SegClef in measure 3.");
clefCourt = static_cast<Clef*>(seg->element(0));
QVERIFY2(clefCourt != nullptr, "No courtesy clef element in measure 3.");
QVERIFY2(clefCourt->bbox().width() == 0, "Courtesy clef in measure 3 is NOT hidden.");
clefCourt = nullptr;
m = m2->prevMeasure();
seg = m->findSegment(SegmentType::Clef, m2->tick());
QVERIFY2(seg != nullptr, "No SegClef in measure 6.");
clefCourt = static_cast<Clef*>(seg->element(0));
QVERIFY2(clefCourt != nullptr, "No courtesy clef element in measure 6.");
QVERIFY2(clefCourt->bbox().width() == 0, "Courtesy clef in measure 3 is NOT hidden.");
QVERIFY(saveCompareScore(score, "clef_courtesy02.mscx", DIR + "clef_courtesy02-ref.mscx"));
delete score;
}
示例6: nextInputPos
Segment* InputState::nextInputPos() const
{
Measure* m = _segment->measure();
Segment* s = _segment->next1(Segment::Type::ChordRest);
for (; s; s = s->next1(Segment::Type::ChordRest)) {
if (s->element(_track) || s->measure() != m) {
if (s->element(_track)) {
if (s->element(_track)->isRest() && toRest(s->element(_track))->isGap())
continue;
}
return s;
}
}
return 0;
}
示例7: layout
void Glissando::layout()
{
Chord* chord = static_cast<Chord*>(parent());
if (chord == 0) {
return;
}
Note* anchor2 = chord->upNote();
Segment* s = chord->segment();
s = s->prev1();
while (s) {
if ((s->subtype() == SegChordRest || s->subtype() == SegGrace) && s->element(track()))
break;
s = s->prev1();
}
if (s == 0) {
qDebug("no segment for first note of glissando found\n");
return;
}
ChordRest* cr = static_cast<ChordRest*>(s->element(track()));
if (cr == 0 || cr->type() != CHORD) {
qDebug("no first note for glissando found, track %d\n", track());
return;
}
Note* anchor1 = static_cast<Chord*>(cr)->upNote();
setPos(0.0, 0.0);
QPointF cp1 = anchor1->pagePos();
QPointF cp2 = anchor2->pagePos();
// construct line from notehead to notehead
qreal x1 = (anchor1->headWidth()) - (cp2.x() - cp1.x());
qreal y1 = anchor1->pos().y();
qreal x2 = anchor2->pos().x();
qreal y2 = anchor2->pos().y();
QLineF fullLine(x1, y1, x2, y2);
// shorten line on each side by offsets
qreal xo = spatium() * .5;
qreal yo = xo; // spatium() * .5;
QPointF p1 = fullLine.pointAt(xo / fullLine.length());
QPointF p2 = fullLine.pointAt(1 - (yo / fullLine.length()));
line = QLineF(p1, p2);
qreal lw = spatium() * .15 * .5;
QRectF r = QRectF(line.p1(), line.p2()).normalized();
setbbox(r.adjusted(-lw, -lw, lw, lw));
}
示例8: otherClef
Clef* Clef::otherClef()
{
// if not in a clef-segment-measure hierarchy, do nothing
if (!parent() || !parent()->isSegment())
return nullptr;
Segment* segm = toSegment(parent());
int segmTick = segm->tick();
if (!segm->parent() || !segm->parent()->isMeasure())
return nullptr;
Measure* meas = toMeasure(segm->parent());
Measure* otherMeas = nullptr;
Segment* otherSegm = nullptr;
if (segmTick == meas->tick()) // if clef segm is measure-initial
otherMeas = meas->prevMeasure(); // look for a previous measure
else if (segmTick == meas->tick() + meas->ticks()) // if clef segm is measure-final
otherMeas = meas->nextMeasure(); // look for a next measure
if (!otherMeas)
return nullptr;
// look for a clef segment in the 'other' measure at the same tick of this clef segment
otherSegm = otherMeas->findSegment(SegmentType::Clef | SegmentType::HeaderClef, segmTick);
if (!otherSegm)
return nullptr;
// if any 'other' segment found, look for a clef in the same track as this
return toClef(otherSegm->element(track()));
}
示例9: upAlt
Note* Score::upAlt(Element* element)
{
Element* re = 0;
if (element->type() == Element::REST) {
if (_is.track() <= 0)
return 0;
_is.setTrack(_is.track() - 1);
re = searchNote(static_cast<Rest*>(element)->tick(), _is.track());
}
else if (element->type() == Element::NOTE) {
// find segment
Chord* chord = static_cast<Note*>(element)->chord();
Segment* segment = chord->segment();
// collect all notes for this segment in noteList:
QList<Note*> rnl;
int tracks = nstaves() * VOICES;
for (int track = 0; track < tracks; ++track) {
Element* el = segment->element(track);
if (!el || el->type() != Element::CHORD)
continue;
rnl.append(static_cast<Chord*>(el)->notes());
qSort(rnl.begin(), rnl.end(), noteLessThan);
int idx = rnl.indexOf(static_cast<Note*>(element));
if (idx < rnl.size()-1)
++idx;
re = rnl.value(idx);
}
}
if (re == 0)
return 0;
if (re->type() == Element::CHORD)
re = ((Chord*)re)->notes().front();
return (Note*)re;
}
示例10: haveTupletsEnoughElements
bool haveTupletsEnoughElements(const Staff *staff)
{
const int strack = staff->idx() * VOICES;
for (int voice = 0; voice < VOICES; ++voice) {
for (Segment *seg = staff->score()->firstSegment(); seg; seg = seg->next1()) {
if (seg->segmentType() == Segment::Type::ChordRest) {
const ChordRest *cr = static_cast<ChordRest *>(seg->element(strack + voice));
if (!cr)
continue;
const Tuplet *tuplet = cr->tuplet();
if (tuplet) {
if (tuplet->elements().size() <= 1) {
printInvalidTupletLocation(seg->measure()->no(), staff->idx());
return false;
}
int chordCount = 0;
for (const auto &e: tuplet->elements()) {
const ChordRest *cr = static_cast<ChordRest *>(e);
if (cr && cr->type() == Element::Type::CHORD)
++chordCount;
}
if (chordCount == 0) {
printInvalidTupletLocation(seg->measure()->no(), staff->idx());
return false;
}
}
}
}
}
return true;
}
示例11: layout
void Fermata::layout()
{
Segment* s = segment();
setPos(QPointF());
if (!s) { // for use in palette
setOffset(0.0, 0.0);
QRectF b(symBbox(_symId));
setbbox(b.translated(-0.5 * b.width(), 0.0));
return;
}
if (isStyled(Pid::OFFSET))
setOffset(propertyDefault(Pid::OFFSET).toPointF());
Element* e = s->element(track());
if (e) {
if (e->isChord())
rxpos() += score()->noteHeadWidth() * staff()->mag(Fraction(0, 1)) * .5;
else
rxpos() += e->x() + e->width() * staff()->mag(Fraction(0, 1)) * .5;
}
QString name = Sym::id2name(_symId);
if (placeAbove()) {
if (name.endsWith("Below"))
_symId = Sym::name2id(name.left(name.size() - 5) + "Above");
}
else {
rypos() += staff()->height();
if (name.endsWith("Above"))
_symId = Sym::name2id(name.left(name.size() - 5) + "Below");
}
QRectF b(symBbox(_symId));
setbbox(b.translated(-0.5 * b.width(), 0.0));
autoplaceSegmentElement(styleP(Sid::fermataMinDistance));
}
示例12: nextTrack
ChordRest* Score::nextTrack(ChordRest* cr)
{
if (!cr)
return 0;
ChordRest* el = 0;
Measure* measure = cr->measure();
int track = cr->track();
int tracks = nstaves() * VOICES;
while (!el) {
// find next non-empty track
while (++track < tracks){
if (measure->hasVoice(track))
break;
}
// no more tracks, return original element
if (track == tracks)
return cr;
// find element at same or previous segment within this track
for (Segment* segment = cr->segment(); segment; segment = segment->prev(Segment::Type::ChordRest)) {
el = static_cast<ChordRest*>(segment->element(track));
if (el)
break;
}
}
return el;
}
示例13: layout
void Fermata::layout()
{
Segment* s = segment();
if (!s) { // for use in palette
setPos(QPointF());
return;
}
qreal x = 0.0;
Element* e = s->element(track());
if (e) {
if (e->isChord())
x = score()->noteHeadWidth() * staff()->mag(0) * .5;
else
x = e->x() + e->width() * staff()->mag(0) * .5;
}
qreal y = placeAbove() ? styleP(Sid::fermataPosAbove) : styleP(Sid::fermataPosBelow) + staff()->height();
setPos(QPointF(x, y));
// check used symbol
QString name = Sym::id2name(_symId);
if (placeAbove()) {
if (name.endsWith("Below"))
_symId = Sym::name2id(name.left(name.size() - 5) + "Above");
}
else {
if (name.endsWith("Above"))
_symId = Sym::name2id(name.left(name.size() - 5) + "Below");
}
QRectF b(symBbox(_symId));
setbbox(b.translated(-0.5 * b.width(), 0.0));
autoplaceSegmentElement(styleP(Sid::fermataMinDistance));
}
示例14: setElement
void InspectorClef::setElement()
{
otherClef = nullptr; // no 'other clef' yet
InspectorElementBase::setElement();
// try to locate the 'other clef' of a courtesy / main pair
Clef* clef = toClef(inspector->element());
// if not in a clef-segment-measure hierarchy, do nothing
if (!clef->parent() || clef->parent()->type() != ElementType::SEGMENT)
return;
Segment* segm = toSegment(clef->parent());
int segmTick = segm->tick();
if (!segm->parent() || segm->parent()->type() != ElementType::MEASURE)
return;
Measure* meas = toMeasure(segm->parent());
Measure* otherMeas = nullptr;
Segment* otherSegm = nullptr;
if (segmTick == meas->tick()) // if clef segm is measure-initial
otherMeas = meas->prevMeasure(); // look for a previous measure
else if (segmTick == meas->tick()+meas->ticks()) // if clef segm is measure-final
otherMeas = meas->nextMeasure(); // look for a next measure
// look for a clef segment in the 'other' measure at the same tick of this clef segment
if (otherMeas)
otherSegm = otherMeas->findSegment(SegmentType::Clef, segmTick);
// if any 'other' segment found, look for a clef in the same track as this
if (otherSegm)
otherClef = toClef(otherSegm->element(clef->track()));
}
示例15: layout
void Dynamic::layout()
{
if (!readPos().isNull()) {
if (score()->mscVersion() < 118) {
setReadPos(QPointF());
// hack: 1.2 boundingBoxes are a bit wider which results
// in symbols moved right
setUserXoffset(userOff().x() - spatium() * .6);
}
}
Text::layout();
Segment* s = segment();
for (int voice = 0; voice < VOICES; ++voice) {
int t = (track() & ~0x3) + voice;
Chord* c = static_cast<Chord*>(s->element(t));
if (!c)
continue;
if (c->type() == CHORD) {
qreal noteHeadWidth = score()->noteHeadWidth() * c->mag();
if (c->stem() && !c->up()) // stem down
rxpos() += noteHeadWidth * .25; // center on stem + optical correction
else
rxpos() += noteHeadWidth * .5; // center on note head
}
else
rxpos() += c->width() * .5;
break;
}
}