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())); }
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; }
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())); }
void InspectorClef::setElement() { otherClef = toClef(inspector->element())->otherClef(); InspectorElementBase::setElement(); }