void InspectorNote::beamClicked() { Note* note = toNote(inspector->element()); if (note == 0) return; Beam* beam = note->chord()->beam(); if (beam) { note->score()->select(beam); inspector->setElement(beam); note->score()->update(); } }
void InspectorNote::tupletClicked() { Note* note = toNote(inspector->element()); if (note == 0) return; Tuplet* tuplet = note->chord()->tuplet(); if (tuplet) { note->score()->select(tuplet); inspector->setElement(tuplet); note->score()->update(); } }
void InspectorNote::hookClicked() { Note* note = toNote(inspector->element()); if (note == 0) return; Hook* hook = note->chord()->hook(); if (hook) { note->score()->select(hook); inspector->setElement(hook); note->score()->update(); } }
void InspectorNote::stemClicked() { Note* note = toNote(inspector->element()); if (note == 0) return; Stem* stem = note->chord()->stem(); if (stem) { note->score()->select(stem); inspector->setElement(stem); note->score()->update(); } }
void InspectorNote::dot4Clicked() { Note* note = toNote(inspector->element()); if (note == 0) return; if (note->dots().size() > 3) { NoteDot* dot = note->dot(3); dot->score()->select(dot); inspector->setElement(dot); dot->score()->update(); } }
void InspectorNote::setElement() { Note* note = toNote(inspector->element()); int i = note->dots().size(); n.dot1->setEnabled(i > 0); n.dot2->setEnabled(i > 1); n.dot3->setEnabled(i > 2); n.dot4->setEnabled(i > 3); n.stem->setEnabled(note->chord()->stem()); n.hook->setEnabled(note->chord()->hook()); n.beam->setEnabled(note->chord()->beam()); n.tuplet->setEnabled(note->chord()->tuplet()); InspectorElementBase::setElement(); bool nograce = !note->chord()->isGrace(); s.leadingSpace->setEnabled(nograce); s.resetLeadingSpace->setEnabled(nograce && s.leadingSpace->value()); }
void Inspector::update(Score* s) { if (_inspectorEdit) // if within an inspector-originated edit return; _score = s; bool sameTypes = true; if (!el()) return; for (Element* ee : *el()) { if (((element()->type() != ee->type()) && // different and (!element()->isSystemText() || !ee->isStaffText()) && // neither system text nor (!element()->isStaffText() || !ee->isSystemText()) && // staff text either side and (!element()->isPedalSegment() || !ee->isTextLineSegment()) && // neither pedal nor (!element()->isTextLineSegment()|| !ee->isPedalSegment()) && // text line either side and (!element()->isSlurTieSegment() || !ee->isSlurTieSegment())) || // neither Slur nor Tie either side, or (ee->isNote() && toNote(ee)->chord()->isGrace() != toNote(element())->chord()->isGrace())) // HACK { sameTypes = false; break; } } if (oe != element() || oSameTypes != sameTypes) { delete ie; ie = 0; oe = element(); oSameTypes = sameTypes; if (!element()) ie = new InspectorEmpty(this); else if (!sameTypes) ie = new InspectorGroupElement(this); else { switch(element()->type()) { case ElementType::FBOX: case ElementType::VBOX: ie = new InspectorVBox(this); break; case ElementType::TBOX: ie = new InspectorTBox(this); break; case ElementType::HBOX: ie = new InspectorHBox(this); break; case ElementType::ARTICULATION: ie = new InspectorArticulation(this); break; case ElementType::FERMATA: ie = new InspectorFermata(this); break; case ElementType::SPACER: ie = new InspectorSpacer(this); break; case ElementType::NOTE: ie = new InspectorNote(this); break; case ElementType::ACCIDENTAL: ie = new InspectorAccidental(this); break; case ElementType::REST: ie = new InspectorRest(this); break; case ElementType::CLEF: ie = new InspectorClef(this); break; case ElementType::TIMESIG: ie = new InspectorTimeSig(this); break; case ElementType::KEYSIG: ie = new InspectorKeySig(this); break; case ElementType::TUPLET: ie = new InspectorTuplet(this); break; case ElementType::BEAM: ie = new InspectorBeam(this); break; case ElementType::IMAGE: ie = new InspectorImage(this); break; case ElementType::LASSO: ie = new InspectorLasso(this); break; case ElementType::VOLTA_SEGMENT: ie = new InspectorVolta(this); break; case ElementType::OTTAVA_SEGMENT: ie = new InspectorOttava(this); break; case ElementType::TRILL_SEGMENT: ie = new InspectorTrill(this); break; case ElementType::HAIRPIN_SEGMENT: ie = new InspectorHairpin(this); break; case ElementType::TEXTLINE_SEGMENT: ie = new InspectorTextLine(this); break; case ElementType::PEDAL_SEGMENT: ie = new InspectorPedal(this); break; case ElementType::LET_RING_SEGMENT: ie = new InspectorLetRing(this); break; case ElementType::PALM_MUTE_SEGMENT: ie = new InspectorPalmMute(this); break; case ElementType::SLUR_SEGMENT: case ElementType::TIE_SEGMENT: ie = new InspectorSlurTie(this); break; case ElementType::BAR_LINE: ie = new InspectorBarLine(this); break; case ElementType::JUMP: ie = new InspectorJump(this); break; case ElementType::MARKER: ie = new InspectorMarker(this); break; case ElementType::GLISSANDO: case ElementType::GLISSANDO_SEGMENT: ie = new InspectorGlissando(this); break; case ElementType::TEMPO_TEXT: ie = new InspectorTempoText(this); break; case ElementType::DYNAMIC: ie = new InspectorDynamic(this); break; case ElementType::AMBITUS: ie = new InspectorAmbitus(this); break; case ElementType::FRET_DIAGRAM: ie = new InspectorFretDiagram(this); break; case ElementType::LAYOUT_BREAK: ie = new InspectorBreak(this); break; case ElementType::BEND: ie = new InspectorBend(this); break; case ElementType::TREMOLOBAR: ie = new InspectorTremoloBar(this); break; case ElementType::ARPEGGIO: ie = new InspectorArpeggio(this); break; case ElementType::BREATH: ie = new InspectorCaesura(this); break; case ElementType::LYRICS: ie = new InspectorLyric(this); break; case ElementType::STAFF_TEXT: case ElementType::SYSTEM_TEXT: case ElementType::REHEARSAL_MARK: ie = new InspectorStaffText(this); break; case ElementType::STAFFTYPE_CHANGE: ie = new InspectorStaffTypeChange(this); break; case ElementType::BRACKET: ie = new InspectorBracket(this); break; case ElementType::INSTRUMENT_NAME: ie = new InspectorIname(this); break; case ElementType::FINGERING: ie = new InspectorFingering(this); break; case ElementType::STEM: ie = new InspectorStem(this); break; case ElementType::HARMONY: ie = new InspectorHarmony(this); break; case ElementType::VIBRATO_SEGMENT: ie = new InspectorVibrato(this); break; case ElementType::NOTEDOT: ie = new InspectorNoteDot(this); break; default: if (element()->isText()) ie = new InspectorText(this); else ie = new InspectorElement(this); break; } } sa->setWidget(ie); // will destroy previous set widget //focus policies were set by hand in each inspector_*.ui. this code just helps keeping them like they are //also fixes mac problem. on Mac Qt::TabFocus doesn't work, but Qt::StrongFocus works QList<QWidget*> widgets = ie->findChildren<QWidget*>(); for (int i = 0; i < widgets.size(); i++) { QWidget* currentWidget = widgets.at(i); switch (currentWidget->focusPolicy()) { case Qt::WheelFocus: case Qt::StrongFocus: if (currentWidget->inherits("QComboBox") || currentWidget->parent()->inherits("QAbstractSpinBox") || currentWidget->inherits("QAbstractSpinBox") || currentWidget->inherits("QLineEdit")) ; //leave it like it is else currentWidget->setFocusPolicy(Qt::TabFocus); break; case Qt::NoFocus: case Qt::ClickFocus: currentWidget->setFocusPolicy(Qt::NoFocus); break; case Qt::TabFocus: break; } } } if (ie) ie->setElement(); }
void Bend::layout() { // during mtest, there may be no score. If so, exit. if (!score()) return; qreal _spatium = spatium(); if (staff() && !staff()->isTabStaff(tick())) { if (!parent()) { noteWidth = -_spatium*2; notePos = QPointF(0.0, _spatium*3); } } qreal _lw = _lineWidth; Note* note = toNote(parent()); if (note == 0) { noteWidth = 0.0; notePos = QPointF(); } else { notePos = note->pos(); noteWidth = note->width(); } QRectF bb; QFontMetricsF fm(font(_spatium), MScore::paintDevice()); int n = _points.size(); qreal x = noteWidth; qreal y = -_spatium * .8; qreal x2, y2; qreal aw = _spatium * .5; QPolygonF arrowUp; arrowUp << QPointF(0, 0) << QPointF(aw*.5, aw) << QPointF(-aw*.5, aw); QPolygonF arrowDown; arrowDown << QPointF(0, 0) << QPointF(aw*.5, -aw) << QPointF(-aw*.5, -aw); for (int pt = 0; pt < n; ++pt) { if (pt == (n-1)) break; int pitch = _points[pt].pitch; if (pt == 0 && pitch) { y2 = -notePos.y() -_spatium * 2; x2 = x; bb |= QRectF(x, y, x2-x, y2-y); bb |= arrowUp.translated(x2, y2 + _spatium * .2).boundingRect(); int idx = (pitch + 12)/25; const char* l = label[idx]; bb |= fm.boundingRect(QRectF(x2, y2, 0, 0), Qt::AlignHCenter | Qt::AlignBottom | Qt::TextDontClip, QString(l)); y = y2; } if (pitch == _points[pt+1].pitch) { if (pt == (n-2)) break; x2 = x + _spatium; y2 = y; bb |= QRectF(x, y, x2-x, y2-y); } else if (pitch < _points[pt+1].pitch) { // up x2 = x + _spatium*.5; y2 = -notePos.y() -_spatium * 2; qreal dx = x2 - x; qreal dy = y2 - y; QPainterPath path; path.moveTo(x, y); path.cubicTo(x+dx/2, y, x2, y+dy/4, x2, y2); bb |= path.boundingRect(); bb |= arrowUp.translated(x2, y2 + _spatium * .2).boundingRect(); int idx = (_points[pt+1].pitch + 12)/25; const char* l = label[idx]; QRectF r; bb |= fm.boundingRect(QRectF(x2, y2, 0, 0), Qt::AlignHCenter | Qt::AlignBottom | Qt::TextDontClip, QString(l)); } else { // down x2 = x + _spatium*.5; y2 = y + _spatium * 3; qreal dx = x2 - x; qreal dy = y2 - y; QPainterPath path; path.moveTo(x, y); path.cubicTo(x+dx/2, y, x2, y+dy/4, x2, y2); bb |= path.boundingRect(); bb |= arrowDown.translated(x2, y2 - _spatium * .2).boundingRect(); } x = x2; y = y2; } bb.adjust(-_lw, -_lw, _lw, _lw); setbbox(bb); setPos(0.0, 0.0); }
void Inspector::setElements(const QList<Element*>& l) { if (_inspectorEdit) // if within an inspector-originated edit return; Element* e = l.isEmpty() ? 0 : l[0]; if (e == 0 || _element == 0 || (_el != l)) { _el = l; ie = 0; _element = e; if (_element == 0) ie = new InspectorEmpty(this); bool sameTypes = true; for (Element* ee : _el) { if (_element->type() != ee->type()) sameTypes = false; else { // HACK: if (ee->isNote() && toNote(ee)->chord()->isGrace() != toNote(_element)->chord()->isGrace()) sameTypes = false; } } if (!sameTypes) ie = new InspectorGroupElement(this); else if (_element) { switch(_element->type()) { case Element::Type::FBOX: case Element::Type::VBOX: ie = new InspectorVBox(this); break; case Element::Type::TBOX: ie = new InspectorTBox(this); break; case Element::Type::HBOX: ie = new InspectorHBox(this); break; case Element::Type::ARTICULATION: ie = new InspectorArticulation(this); break; case Element::Type::SPACER: ie = new InspectorSpacer(this); break; case Element::Type::NOTE: ie = new InspectorNote(this); break; case Element::Type::ACCIDENTAL: ie = new InspectorAccidental(this); break; case Element::Type::REST: ie = new InspectorRest(this); break; case Element::Type::CLEF: ie = new InspectorClef(this); break; case Element::Type::TIMESIG: ie = new InspectorTimeSig(this); break; case Element::Type::KEYSIG: ie = new InspectorKeySig(this); break; case Element::Type::TUPLET: ie = new InspectorTuplet(this); break; case Element::Type::BEAM: ie = new InspectorBeam(this); break; case Element::Type::IMAGE: ie = new InspectorImage(this); break; case Element::Type::LASSO: ie = new InspectorLasso(this); break; case Element::Type::VOLTA_SEGMENT: ie = new InspectorVolta(this); break; case Element::Type::OTTAVA_SEGMENT: ie = new InspectorOttava(this); break; case Element::Type::TRILL_SEGMENT: ie = new InspectorTrill(this); break; case Element::Type::HAIRPIN_SEGMENT: ie = new InspectorHairpin(this); break; case Element::Type::TEXTLINE_SEGMENT: case Element::Type::PEDAL_SEGMENT: ie = new InspectorTextLine(this); break; case Element::Type::SLUR_SEGMENT: case Element::Type::TIE_SEGMENT: ie = new InspectorSlurTie(this); break; case Element::Type::BAR_LINE: ie = new InspectorBarLine(this); break; case Element::Type::JUMP: ie = new InspectorJump(this); break; case Element::Type::MARKER: ie = new InspectorMarker(this); break; case Element::Type::GLISSANDO: case Element::Type::GLISSANDO_SEGMENT: ie = new InspectorGlissando(this); break; case Element::Type::TEMPO_TEXT: ie = new InspectorTempoText(this); break; case Element::Type::DYNAMIC: ie = new InspectorDynamic(this); break; case Element::Type::AMBITUS: ie = new InspectorAmbitus(this); break; case Element::Type::FRET_DIAGRAM: ie = new InspectorFretDiagram(this); break; case Element::Type::LAYOUT_BREAK: ie = new InspectorBreak(this); break; case Element::Type::BEND: ie = new InspectorBend(this); break; case Element::Type::TREMOLOBAR: ie = new InspectorTremoloBar(this); break; case Element::Type::ARPEGGIO: ie = new InspectorArpeggio(this); break; case Element::Type::BREATH: ie = new InspectorCaesura(this); break; case Element::Type::LYRICS: ie = new InspectorLyric(this); break; case Element::Type::STAFF_TEXT: ie = new InspectorStafftext(this); break; case Element::Type::STAFFTYPE_CHANGE: ie = new InspectorStaffTypeChange(this); break; case Element::Type::BRACKET: ie = new InspectorBracket(this); break; case Element::Type::INSTRUMENT_NAME: ie = new InspectorIname(this); break; default: if (_element->isText()) ie = new InspectorText(this); else ie = new InspectorElement(this); break; } } QWidget* ww = sa->takeWidget(); if (ww) ww->deleteLater(); sa->setWidget(ie); //focus policies were set by hand in each inspector_*.ui. this code just helps keeping them like they are //also fixes mac problem. on Mac Qt::TabFocus doesn't work, but Qt::StrongFocus works QList<QWidget*> widgets = ie->findChildren<QWidget*>(); for (int i = 0; i < widgets.size(); i++) { QWidget* currentWidget = widgets.at(i); switch (currentWidget->focusPolicy()) { case Qt::WheelFocus: case Qt::StrongFocus: if (currentWidget->inherits("QComboBox") || currentWidget->parent()->inherits("QAbstractSpinBox") || currentWidget->inherits("QAbstractSpinBox") || currentWidget->inherits("QLineEdit")) ; //leave it like it is else currentWidget->setFocusPolicy(Qt::TabFocus); break; case Qt::NoFocus: case Qt::ClickFocus: currentWidget->setFocusPolicy(Qt::NoFocus); break; case Qt::TabFocus: break; } } } _element = e; ie->setElement(); }