diff --git a/src/engraving/compat/engravingcompat.cpp b/src/engraving/compat/engravingcompat.cpp index 96d2ee1a65ab5..c07cd84f01c9f 100644 --- a/src/engraving/compat/engravingcompat.cpp +++ b/src/engraving/compat/engravingcompat.cpp @@ -41,6 +41,10 @@ void EngravingCompat::doPreLayoutCompatIfNeeded(MasterScore* score) { int mscVersion = score->mscVersion(); + if (mscVersion < 470) { + adjustTextOffset(score); + } + if (mscVersion < 460) { resetMarkerLeftFontSize(score); resetRestVerticalOffsets(score); @@ -233,6 +237,39 @@ void EngravingCompat::adjustVBoxDistances(MasterScore* masterScore) } } +void EngravingCompat::adjustTextOffset(MasterScore* masterScore) +{ + auto doAdjustTextOffset = [](EngravingItem* item) { + if (!item->isTextBase()) { + return; + } + + TextBase* text = toTextBase(item); + + // Staff text, system text, and harp pedal diagrams are the only types which are attached to notes and weren't already + // placed with their left edges / centres / right edges aligned to the left / centre / right of the notehead + if (text->positionRelativeToNoteheadRest() && (text->isStaffText() || text->isSystemText() || text->isHarpPedalDiagram())) { + double mag = item->staff() ? item->staff()->staffMag(item) : 1.0; + double xAdj = item->symWidth(SymId::noteheadBlack) * mag; + + switch (text->position()) { + case AlignH::HCENTER: + text->setProperty(Pid::OFFSET, PointF(text->offset().x() - xAdj / 2, text->offset().y())); + break; + case AlignH::RIGHT: + text->setProperty(Pid::OFFSET, PointF(text->offset().x() - xAdj, text->offset().y())); + break; + default: + break; + } + } + }; + + for (Score* score : masterScore->scoreList()) { + score->scanElements(doAdjustTextOffset); + } +} + void EngravingCompat::doPostLayoutCompatIfNeeded(MasterScore* score) { bool needRelayout = false; diff --git a/src/engraving/compat/engravingcompat.h b/src/engraving/compat/engravingcompat.h index e4166b2afe3ab..1eaed5b90c578 100644 --- a/src/engraving/compat/engravingcompat.h +++ b/src/engraving/compat/engravingcompat.h @@ -40,6 +40,7 @@ class EngravingCompat static void resetMarkerLeftFontSize(MasterScore* masterScore); static void resetRestVerticalOffsets(MasterScore* masterScore); static void adjustVBoxDistances(MasterScore* masterScore); + static void adjustTextOffset(MasterScore* masterScore); static bool relayoutUserModifiedCrossStaffBeams(MasterScore* score); static bool resetHookHeightSign(MasterScore* masterScore); diff --git a/src/engraving/dom/textbase.cpp b/src/engraving/dom/textbase.cpp index 49ba81301e977..6105ab9b31be2 100644 --- a/src/engraving/dom/textbase.cpp +++ b/src/engraving/dom/textbase.cpp @@ -1868,6 +1868,21 @@ void TextBase::layoutFrame(LayoutData* ldata) const ldata->setBbox(ldata->frame.adjusted(-w, -w, w, w)); } +bool TextBase::positionRelativeToNoteheadRest() const +{ + if (!parent()) { + return false; + } + + bool useBl = isMarker() || isJump() || isRehearsalMark() || isMeasureNumber() || isPlayCountText(); + bool harmonyUseBl = isHarmony() && parent()->isFretDiagram(); + bool textUseBl = isText() && (parent()->isBox() || parent()->isVoltaSegment()); + bool noPositionControl = isInstrumentName() || parent()->isTuplet() || isFingering() || isHammerOnPullOffText() + || parent()->isSpannerSegment(); + + return !useBl && !harmonyUseBl && !textUseBl && !noPositionControl; +} + //--------------------------------------------------------- // lineSpacing //--------------------------------------------------------- diff --git a/src/engraving/dom/textbase.h b/src/engraving/dom/textbase.h index 44c404e4965ac..3d1241bef1471 100644 --- a/src/engraving/dom/textbase.h +++ b/src/engraving/dom/textbase.h @@ -488,6 +488,8 @@ class TextBase : public EngravingItem //! At the moment it's: Text, Jump, Marker bool layoutToParentWidth() const { return m_layoutToParentWidth; } + bool positionRelativeToNoteheadRest() const; + void setVoiceAssignment(VoiceAssignment v) { m_voiceAssignment = v; } VoiceAssignment voiceAssignment() const { return m_voiceAssignment; } void setDirection(DirectionV v) { m_direction = v; } diff --git a/src/engraving/rendering/score/dynamicslayout.cpp b/src/engraving/rendering/score/dynamicslayout.cpp index b775ee6bd0fd1..53420907e542c 100644 --- a/src/engraving/rendering/score/dynamicslayout.cpp +++ b/src/engraving/rendering/score/dynamicslayout.cpp @@ -80,12 +80,6 @@ void DynamicsLayout::doLayoutDynamic(Dynamic* item, Dynamic::LayoutData* ldata, return; } - bool centerOnNote = item->centerOnNotehead() || (!item->centerOnNotehead() && item->position() == AlignH::HCENTER); - double mag = item->staff()->staffMag(item); - double noteHeadWidth = item->score()->noteHeadWidth() * mag; - - ldata->moveX(noteHeadWidth * (centerOnNote ? 0.5 : 1)); - if (!item->centerOnNotehead()) { return; } diff --git a/src/engraving/rendering/score/lyricslayout.cpp b/src/engraving/rendering/score/lyricslayout.cpp index 9f5cd546f65ae..178abb2542619 100644 --- a/src/engraving/rendering/score/lyricslayout.cpp +++ b/src/engraving/rendering/score/lyricslayout.cpp @@ -174,19 +174,16 @@ void LyricsLayout::layout(Lyrics* item, LayoutContext& ctx) } } - double nominalWidth = item->symWidth(SymId::noteheadBlack); if (item->position() == AlignH::HCENTER) { // // center under notehead, not origin // however, lyrics that are melismas or have verse numbers will be forced to left alignment // // center under note head - x += nominalWidth * .5 - centerAdjust * 0.5; + x += -centerAdjust * 0.5; } else if (item->position() == AlignH::LEFT) { // even for left aligned syllables, ignore leading verse numbers and/or punctuation x -= leftAdjust; - } else if (item->position() == AlignH::RIGHT) { - x += nominalWidth; } ldata->setPosX(x); diff --git a/src/engraving/rendering/score/textlayout.cpp b/src/engraving/rendering/score/textlayout.cpp index b811e84e572cf..70e2153c8c53e 100644 --- a/src/engraving/rendering/score/textlayout.cpp +++ b/src/engraving/rendering/score/textlayout.cpp @@ -192,6 +192,10 @@ void TextLayout::textHorizontalLayout(const TextBase* item, Shape& shape, double default: ASSERT_X("Lay out to parent width only valid for items with page or frame as parent"); } + } else if (item->positionRelativeToNoteheadRest()) { + // For items aligned to notehead/rests + double mag = item->staff() ? item->staff()->staffMag(item) : 1.0; + layoutWidth = item->symWidth(SymId::noteheadBlack) * mag; } // Position and alignment @@ -217,6 +221,7 @@ void TextLayout::textHorizontalLayout(const TextBase* item, Shape& shape, double shape.add(textBlock.shape().translated(PointF(0.0, textBlock.y()))); continue; } + // Align relative to the longest line AlignH alignH = item->align().horizontal; if (alignH == AlignH::HCENTER) { diff --git a/src/engraving/rendering/score/tlayout.cpp b/src/engraving/rendering/score/tlayout.cpp index dbc5005dfa142..53cce1c987433 100644 --- a/src/engraving/rendering/score/tlayout.cpp +++ b/src/engraving/rendering/score/tlayout.cpp @@ -5323,27 +5323,6 @@ void TLayout::layoutSticking(const Sticking* item, Sticking::LayoutData* ldata) LAYOUT_CALL_ITEM(item); TextLayout::layoutBaseTextBase(item, ldata); - AlignH itemPosition = item->position(); - if (itemPosition != AlignH::LEFT) { - const Segment* seg = item->segment(); - const Chord* chord = nullptr; - track_idx_t sTrack = trackZeroVoice(item->track()); - track_idx_t eTrack = sTrack + VOICES; - for (track_idx_t track = sTrack; track < eTrack; ++track) { - EngravingItem* el = seg->element(track); - if (el && el->isChord()) { - chord = toChord(el); - break; - } - } - - if (chord) { - const Note* refNote = item->placeAbove() ? chord->upNote() : chord->downNote(); - double noteWidth = refNote->ldata()->bbox().width(); - ldata->moveX(itemPosition == AlignH::HCENTER ? 0.5 * noteWidth : noteWidth); - } - } - if (item->autoplace() && item->explicitParent()) { const Segment* s = toSegment(item->explicitParent()); const Measure* m = s->measure(); diff --git a/src/inspector/models/text/textsettingsmodel.cpp b/src/inspector/models/text/textsettingsmodel.cpp index 41d8dc8b5507f..45a4412be5f9d 100644 --- a/src/inspector/models/text/textsettingsmodel.cpp +++ b/src/inspector/models/text/textsettingsmodel.cpp @@ -272,6 +272,9 @@ void TextSettingsModel::loadProperties(const PropertyIdSet& propertyIdSet) updateIsLineSpacingAvailable(); updateIsPositionAvailable(); updateUsePositionRelativeToLine(); + updateLeftPositionText(); + updateCenterPositionText(); + updateRightPositionText(); } bool TextSettingsModel::isTextLineText() const @@ -498,6 +501,21 @@ bool TextSettingsModel::usePositionRelativeToLine() const return m_usePositionRelativeToLine; } +QString TextSettingsModel::leftPositionText() const +{ + return m_leftPositionText; +} + +QString TextSettingsModel::centerPositionText() const +{ + return m_centerPositionText; +} + +QString TextSettingsModel::rightPositionText() const +{ + return m_rightPositionText; +} + void TextSettingsModel::setAreTextPropertiesAvailable(bool areTextPropertiesAvailable) { if (m_areTextPropertiesAvailable == areTextPropertiesAvailable) { @@ -598,6 +616,36 @@ void TextSettingsModel::setUsePositionRelativeToLineChanged(bool usePositionRela emit usePositionRelativeToLineChanged(m_usePositionRelativeToLine); } +void TextSettingsModel::setLeftPositionText(QString leftPositionText) +{ + if (leftPositionText == m_leftPositionText) { + return; + } + + m_leftPositionText = leftPositionText; + emit leftPositionTextChanged(m_leftPositionText); +} + +void TextSettingsModel::setCenterPositionText(QString centerPositionText) +{ + if (centerPositionText == m_centerPositionText) { + return; + } + + m_centerPositionText = centerPositionText; + emit centerPositionTextChanged(m_centerPositionText); +} + +void TextSettingsModel::setRightPositionText(QString rightPositionText) +{ + if (rightPositionText == m_rightPositionText) { + return; + } + + m_rightPositionText = rightPositionText; + emit rightPositionTextChanged(m_rightPositionText); +} + void TextSettingsModel::updateFramePropertiesAvailability() { bool isFrameVisible = static_cast(m_frameType->value().toInt()) @@ -703,11 +751,7 @@ void TextSettingsModel::updateUsePositionRelativeToLine() { bool useBarlineIcon = false; for (EngravingItem* item : m_elementList) { - bool useBl = item->isMarker() || item->isJump() || item->isRehearsalMark() || item->isMeasureNumber(); - bool harmonyUseBl = item->isHarmony() && item->parent()->isFretDiagram(); - bool textUseBl = item->isText() && (item->parent()->isBox() || item->parent()->isVoltaSegment()); - - if (useBl || harmonyUseBl || textUseBl) { + if (!toTextBase(item)->positionRelativeToNoteheadRest()) { useBarlineIcon = true; } } @@ -715,6 +759,60 @@ void TextSettingsModel::updateUsePositionRelativeToLine() setUsePositionRelativeToLineChanged(useBarlineIcon); } +void TextSettingsModel::updateLeftPositionText() +{ + for (EngravingItem* item : m_elementList) { + if (!item->parent()) { + continue; + } + + if (item->parent()->isBox()) { + setLeftPositionText(muse::qtrc("inspector", "Left-align text box within frame")); + } else if (toTextBase(item)->positionRelativeToNoteheadRest()) { + setLeftPositionText(muse::qtrc("inspector", "Left-align text box to note/rest")); + } else { + setLeftPositionText(muse::qtrc("inspector", "Left-align text box to barline")); + } + return; + } +} + +void TextSettingsModel::updateCenterPositionText() +{ + for (EngravingItem* item : m_elementList) { + if (!item->parent()) { + continue; + } + + if (item->parent()->isBox()) { + setCenterPositionText(muse::qtrc("inspector", "Horizontally center text box within frame")); + } else if (toTextBase(item)->positionRelativeToNoteheadRest()) { + setCenterPositionText(muse::qtrc("inspector", "Horizontally center text box to note/rest")); + } else { + setCenterPositionText(muse::qtrc("inspector", "Horizontally center text box to barline")); + } + return; + } +} + +void TextSettingsModel::updateRightPositionText() +{ + for (EngravingItem* item : m_elementList) { + if (!item->parent()) { + continue; + } + + if (item->parent()->isBox()) { + setRightPositionText(muse::qtrc("inspector", "Right-align text box within frame")); + } else if (toTextBase(item)->positionRelativeToNoteheadRest()) { + setRightPositionText(muse::qtrc("inspector", "Right-align text box to note/rest")); + } else { + setRightPositionText(muse::qtrc("inspector", "Right-align text box to barline")); + } + return; + } +} + void TextSettingsModel::propertyChangedCallback(const engraving::Pid propertyId, const QVariant& newValue) { setPropertyValue(m_elementList, propertyId, newValue); diff --git a/src/inspector/models/text/textsettingsmodel.h b/src/inspector/models/text/textsettingsmodel.h index 9ec5c3cacca70..1c7296301a6db 100644 --- a/src/inspector/models/text/textsettingsmodel.h +++ b/src/inspector/models/text/textsettingsmodel.h @@ -71,6 +71,9 @@ class TextSettingsModel : public AbstractInspectorModel Q_PROPERTY(bool isPositionAvailable READ isPositionAvailable NOTIFY isPositionAvailableChanged) Q_PROPERTY(bool usePositionRelativeToLine READ usePositionRelativeToLine NOTIFY usePositionRelativeToLineChanged) + Q_PROPERTY(QString leftPositionText READ leftPositionText NOTIFY leftPositionTextChanged) + Q_PROPERTY(QString centerPositionText READ centerPositionText NOTIFY centerPositionTextChanged) + Q_PROPERTY(QString rightPositionText READ rightPositionText NOTIFY rightPositionTextChanged) public: explicit TextSettingsModel(QObject* parent, IElementRepositoryService* repository, bool isTextLineText); @@ -120,6 +123,9 @@ class TextSettingsModel : public AbstractInspectorModel bool isLineSpacingAvailable() const; bool isPositionAvailable() const; bool usePositionRelativeToLine() const; + QString leftPositionText() const; + QString centerPositionText() const; + QString rightPositionText() const; public slots: void setAreTextPropertiesAvailable(bool areTextPropertiesAvailable); @@ -132,6 +138,9 @@ public slots: void setIsLineSpacingAvailable(bool isLineSpacingAvailable); void setIsPositionAvailableChanged(bool isPositionAvailable); void setUsePositionRelativeToLineChanged(bool usePositionRelativeToLine); + void setLeftPositionText(QString leftPositionText); + void setCenterPositionText(QString centerPositionText); + void setRightPositionText(QString rightPositionText); signals: void textStylesChanged(); @@ -146,6 +155,9 @@ public slots: void isLineSpacingAvailableChanged(bool isLineSpacingAvailable); void isPositionAvailableChanged(bool isPositionAvailable); void usePositionRelativeToLineChanged(bool positionRelativeToLine); + void leftPositionTextChanged(QString leftPositionText); + void centerPositionTextChanged(QString centerPositionText); + void rightPositionTextChanged(QString rightPositionText); private: bool isTextEditingStarted() const; @@ -161,6 +173,9 @@ public slots: void updateIsLineSpacingAvailable(); void updateIsPositionAvailable(); void updateUsePositionRelativeToLine(); + void updateLeftPositionText(); + void updateCenterPositionText(); + void updateRightPositionText(); void propertyChangedCallback(const mu::engraving::Pid propertyId, const QVariant& newValue); void propertyResetCallback(const mu::engraving::Pid propertyId); @@ -204,6 +219,10 @@ public slots: bool m_isPositionAvailable = false; bool m_usePositionRelativeToLine = false; + + QString m_leftPositionText; + QString m_centerPositionText; + QString m_rightPositionText; }; } diff --git a/src/inspector/view/qml/MuseScore/Inspector/text/TextInspectorView.qml b/src/inspector/view/qml/MuseScore/Inspector/text/TextInspectorView.qml index b3689d7ea8df7..2663e88badb91 100644 --- a/src/inspector/view/qml/MuseScore/Inspector/text/TextInspectorView.qml +++ b/src/inspector/view/qml/MuseScore/Inspector/text/TextInspectorView.qml @@ -157,212 +157,218 @@ InspectorSectionView { } } - InspectorPropertyView { - id: alignmentSection - titleText: qsTrc("inspector", "Alignment") - propertyItem: root.model ? root.model.horizontalAlignment : null - - navigationName: "AlignmentMenu" - navigationPanel: root.navigationPanel - navigationRowStart: sizeSection.navigationRowEnd + 1 - navigationRowEnd: verticalAlignmentButtonList.navigationRowEnd - - isModified: root.model ? (root.model.horizontalAlignment.isModified - || root.model.verticalAlignment.isModified) : false - - onRequestResetToDefault: { - if (root.model) { - root.model.horizontalAlignment.resetToDefault() - root.model.verticalAlignment.resetToDefault() - } - } + Column { + height: implicitHeight + width: parent.width - onRequestApplyToStyle: { - if (root.model) { - root.model.horizontalAlignment.applyToStyle() - root.model.verticalAlignment.applyToStyle() - } - } + spacing: 8 - Item { - height: childrenRect.height - width: parent.width + InspectorPropertyView { + id: alignmentSection + titleText: qsTrc("inspector", "Alignment") + propertyItem: root.model ? root.model.horizontalAlignment : null - RadioButtonGroup { - enabled: root.model ? root.model.isHorizontalAlignmentAvailable : false - id: horizontalAlignmentButtonList + navigationName: "AlignmentMenu" + navigationPanel: root.navigationPanel + navigationRowStart: sizeSection.navigationRowEnd + 1 + navigationRowEnd: verticalAlignmentButtonList.navigationRowEnd - property int navigationRowStart: alignmentSection.navigationRowStart + 1 - property int navigationRowEnd: navigationRowStart + count + isModified: root.model ? (root.model.horizontalAlignment.isModified + || root.model.verticalAlignment.isModified) : false - anchors.left: parent.left - anchors.right: parent.horizontalCenter - anchors.rightMargin: 2 + onRequestResetToDefault: { + if (root.model) { + root.model.horizontalAlignment.resetToDefault() + root.model.verticalAlignment.resetToDefault() + } + } - height: 30 + onRequestApplyToStyle: { + if (root.model) { + root.model.horizontalAlignment.applyToStyle() + root.model.verticalAlignment.applyToStyle() + } + } - model: [ - { - iconRole: IconCode.TEXT_ALIGN_LEFT, - typeRole: TextTypes.FONT_ALIGN_H_LEFT, - title: qsTrc("inspector", "Align left"), - description: qsTrc("inspector", "Align left edge of text to reference point") - }, - { - iconRole: IconCode.TEXT_ALIGN_CENTER, - typeRole: TextTypes.FONT_ALIGN_H_CENTER, - title: qsTrc("inspector", "Align center"), - description: qsTrc("inspector", "Align horizontal center of text to reference point") - }, - { - iconRole: IconCode.TEXT_ALIGN_RIGHT, - typeRole: TextTypes.FONT_ALIGN_H_RIGHT, - title: qsTrc("inspector", "Align right"), - description: qsTrc("inspector", "Align right edge of text to reference point") - }, - { - iconRole: IconCode.TEXT_ALIGN_JUSTIFY, - typeRole: TextTypes.FONT_ALIGN_H_JUSTIFY, - title: qsTrc("inspector", "Justify"), - description: qsTrc("inspector", "Justify text to fill the available width") + Item { + height: childrenRect.height + width: parent.width + + RadioButtonGroup { + enabled: root.model ? root.model.isHorizontalAlignmentAvailable : false + id: horizontalAlignmentButtonList + + property int navigationRowStart: alignmentSection.navigationRowStart + 1 + property int navigationRowEnd: navigationRowStart + count + + anchors.left: parent.left + anchors.right: parent.horizontalCenter + anchors.rightMargin: 2 + + height: 30 + + model: [ + { + iconRole: IconCode.TEXT_ALIGN_LEFT, + typeRole: TextTypes.FONT_ALIGN_H_LEFT, + title: qsTrc("inspector", "Align left"), + description: qsTrc("inspector", "Left-align text within its bounding box") + }, + { + iconRole: IconCode.TEXT_ALIGN_CENTER, + typeRole: TextTypes.FONT_ALIGN_H_CENTER, + title: qsTrc("inspector", "Align center"), + description: qsTrc("inspector", "Horizontally center text within its bounding box") + }, + { + iconRole: IconCode.TEXT_ALIGN_RIGHT, + typeRole: TextTypes.FONT_ALIGN_H_RIGHT, + title: qsTrc("inspector", "Align right"), + description: qsTrc("inspector", "Right-align text within its bounding box") + }, + { + iconRole: IconCode.TEXT_ALIGN_JUSTIFY, + typeRole: TextTypes.FONT_ALIGN_H_JUSTIFY, + title: qsTrc("inspector", "Justify"), + description: qsTrc("inspector", "Justify text to fill the available width") + } + ] + + delegate: FlatRadioButton { + navigation.panel: root.navigationPanel + navigation.name: "HAlign" + model.index + navigation.row: horizontalAlignmentButtonList.navigationRowStart + model.index + navigation.accessible.name: modelData.title + navigation.accessible.description: modelData.description + + toolTipTitle: modelData.title + toolTipDescription: modelData.description + + width: 30 + transparent: true + + iconCode: modelData.iconRole + checked: root.model && !root.model.horizontalAlignment.isUndefined && (root.model.horizontalAlignment.value === modelData.typeRole) + onToggled: { + root.model.horizontalAlignment.value = modelData.typeRole + } } - ] - - delegate: FlatRadioButton { - navigation.panel: root.navigationPanel - navigation.name: "HAlign" + model.index - navigation.row: horizontalAlignmentButtonList.navigationRowStart + model.index - navigation.accessible.name: modelData.title - navigation.accessible.description: modelData.description - - toolTipTitle: modelData.title - toolTipDescription: modelData.description - - width: 30 - transparent: true + } - iconCode: modelData.iconRole - checked: root.model && !root.model.horizontalAlignment.isUndefined && (root.model.horizontalAlignment.value === modelData.typeRole) - onToggled: { - root.model.horizontalAlignment.value = modelData.typeRole + RadioButtonGroup { + enabled: root.model ? root.model.isHorizontalAlignmentAvailable : false + id: positionButtonList + + property int navigationRowStart: horizontalAlignmentButtonList.navigationRowEnd + 1 + property int navigationRowEnd: navigationRowStart + count + + anchors.leftMargin: 2 + anchors.right: parent.right + + height: 30 + + model: [ + { + iconRole: root.model && root.model.usePositionRelativeToLine ? IconCode.ALIGN_LEFT : IconCode.NOTE_ALIGN_LEFT, + typeRole: CommonTypes.LEFT, + title: root.model ? root.model.leftPositionText : "", + description: "" + }, + { + iconRole: root.model && root.model.usePositionRelativeToLine ? IconCode.ALIGN_HORIZONTAL_CENTER : IconCode.NOTE_ALIGN_CENTER, + typeRole: + CommonTypes.HCENTER, + title: root.model ? root.model.centerPositionText : "", + description: "" + }, + { + iconRole: root.model && root.model.usePositionRelativeToLine ? IconCode.ALIGN_RIGHT : IconCode.NOTE_ALIGN_RIGHT, + typeRole: CommonTypes.RIGHT, + title: root.model ? root.model.rightPositionText : "", + description: "" + } + ] + + delegate: FlatRadioButton { + navigation.panel: root.navigationPanel + navigation.name: "HAlign" + model.index + navigation.row: positionButtonList.navigationRowStart + model.index + navigation.accessible.name: modelData.title + navigation.accessible.description: modelData.description + + toolTipTitle: modelData.title + toolTipDescription: modelData.description + + width: 30 + transparent: true + + iconCode: modelData.iconRole + checked: root.model && !root.model.horizontalPosition.isUndefined && (root.model.horizontalPosition.value === modelData.typeRole) + onToggled: { + root.model.horizontalPosition.value = modelData.typeRole + } } } } + } - RadioButtonGroup { - id: verticalAlignmentButtonList - - property int navigationRowStart: horizontalAlignmentButtonList.navigationRowEnd + 1 - property int navigationRowEnd: navigationRowStart + count - - anchors.left: parent.horizontalCenter - anchors.leftMargin: 2 - anchors.right: parent.right - - height: 30 - - model: [ - { - iconRole: IconCode.TEXT_ALIGN_TOP, - typeRole: TextTypes.FONT_ALIGN_V_TOP, - title: qsTrc("inspector", "Align top"), - description: qsTrc("inspector", "Align top edge of text to reference point") - }, - { - iconRole: IconCode.TEXT_ALIGN_MIDDLE, - typeRole: TextTypes.FONT_ALIGN_V_CENTER, - title: qsTrc("inspector", "Align middle"), - description: qsTrc("inspector", "Align vertical center of text to reference point") - }, - { - iconRole: IconCode.TEXT_ALIGN_BOTTOM, - typeRole: TextTypes.FONT_ALIGN_V_BOTTOM, - title:qsTrc("inspector", "Align bottom"), - description: qsTrc("inspector", "Align bottom edge of text to reference point") - }, - { - iconRole: IconCode.TEXT_ALIGN_BASELINE, - typeRole: TextTypes.FONT_ALIGN_V_BASELINE, - title: qsTrc("inspector", "Align baseline"), - description: qsTrc("inspector", "Align baseline of text to reference point") - } - ] - - delegate: FlatRadioButton { - navigation.panel: root.navigationPanel - navigation.name: "VAlign" + model.index - navigation.row: verticalAlignmentButtonList.navigationRowStart + model.index - navigation.accessible.name: modelData.title - navigation.accessible.description: modelData.description + RadioButtonGroup { + id: verticalAlignmentButtonList - toolTipTitle: modelData.title - toolTipDescription: modelData.description + property int navigationRowStart: positionButtonList.navigationRowEnd + 1 + property int navigationRowEnd: navigationRowStart + count - width: 30 - transparent: true + anchors.left: parent.left + anchors.right: parent.horizontalCenter + anchors.rightMargin: 2 - iconCode: modelData.iconRole - checked: root.model && !root.model.verticalAlignment.isUndefined && (root.model.verticalAlignment.value === modelData.typeRole) - onToggled: { - root.model.verticalAlignment.value = modelData.typeRole - } + height: 30 + + model: [ + { + iconRole: IconCode.TEXT_ALIGN_TOP, + typeRole: TextTypes.FONT_ALIGN_V_TOP, + title: qsTrc("inspector", "Align top"), + description: qsTrc("inspector", "Align top edge of text to reference point") + }, + { + iconRole: IconCode.TEXT_ALIGN_MIDDLE, + typeRole: TextTypes.FONT_ALIGN_V_CENTER, + title: qsTrc("inspector", "Align middle"), + description: qsTrc("inspector", "Align vertical center of text to reference point") + }, + { + iconRole: IconCode.TEXT_ALIGN_BOTTOM, + typeRole: TextTypes.FONT_ALIGN_V_BOTTOM, + title:qsTrc("inspector", "Align bottom"), + description: qsTrc("inspector", "Align bottom edge of text to reference point") + }, + { + iconRole: IconCode.TEXT_ALIGN_BASELINE, + typeRole: TextTypes.FONT_ALIGN_V_BASELINE, + title: qsTrc("inspector", "Align baseline"), + description: qsTrc("inspector", "Align baseline of text to reference point") } - } - } - } - - RadioButtonGroup { - enabled: root.model ? root.model.isHorizontalAlignmentAvailable : false - id: positionButtonList - - property int navigationRowStart: alignmentSection.navigationRowEnd + 1 - property int navigationRowEnd: navigationRowStart + count - - anchors.left: parent.left - anchors.right: parent.horizontalCenter - anchors.rightMargin: 2 - - height: 30 - - model: [ - { - iconRole: root.model && root.model.usePositionRelativeToLine ? IconCode.ALIGN_LEFT : IconCode.NOTE_ALIGN_LEFT, - typeRole: CommonTypes.LEFT, - title: qsTrc("inspector", "Align left"), - description: qsTrc("inspector", "Align left edge of text to reference point") - }, - { - iconRole: root.model && root.model.usePositionRelativeToLine ? IconCode.ALIGN_HORIZONTAL_CENTER : IconCode.NOTE_ALIGN_CENTER, - typeRole: - CommonTypes.HCENTER, - title: qsTrc("inspector", "Align center"), - description: qsTrc("inspector", "Align horizontal center of text to reference point") - }, - { - iconRole: root.model && root.model.usePositionRelativeToLine ? IconCode.ALIGN_RIGHT : IconCode.NOTE_ALIGN_RIGHT, - typeRole: CommonTypes.RIGHT, - title: qsTrc("inspector", "Align right"), - description: qsTrc("inspector", "Align right edge of text to reference point") - } - ] + ] - delegate: FlatRadioButton { - navigation.panel: root.navigationPanel - navigation.name: "HAlign" + model.index - navigation.row: positionButtonList.navigationRowStart + model.index - navigation.accessible.name: modelData.title - navigation.accessible.description: modelData.description + delegate: FlatRadioButton { + navigation.panel: root.navigationPanel + navigation.name: "VAlign" + model.index + navigation.row: verticalAlignmentButtonList.navigationRowStart + model.index + navigation.accessible.name: modelData.title + navigation.accessible.description: modelData.description - toolTipTitle: modelData.title - toolTipDescription: modelData.description + toolTipTitle: modelData.title + toolTipDescription: modelData.description - width: 30 - transparent: true + width: 30 + transparent: true - iconCode: modelData.iconRole - checked: root.model && !root.model.horizontalPosition.isUndefined && (root.model.horizontalPosition.value === modelData.typeRole) - onToggled: { - root.model.horizontalPosition.value = modelData.typeRole + iconCode: modelData.iconRole + checked: root.model && !root.model.verticalAlignment.isUndefined && (root.model.verticalAlignment.value === modelData.typeRole) + onToggled: { + root.model.verticalAlignment.value = modelData.typeRole + } } } } @@ -373,7 +379,7 @@ InspectorSectionView { navigation.panel: root.navigationPanel navigation.name: "Insert special characters" - navigation.row: positionButtonList.navigationRowEnd + 1 + navigation.row: verticalAlignmentButtonList.navigationRowEnd + 1 text: qsTrc("inspector", "Insert special characters") diff --git a/src/notation/view/widgets/alignSelect.cpp b/src/notation/view/widgets/alignSelect.cpp index 76b0424cac9fe..e43ddd81bf62a 100644 --- a/src/notation/view/widgets/alignSelect.cpp +++ b/src/notation/view/widgets/alignSelect.cpp @@ -34,17 +34,22 @@ AlignSelect::AlignSelect(QWidget* parent) { setupUi(this); - g1 = new QButtonGroup(this); - g1->addButton(alignLeft); - g1->addButton(alignHCenter); - g1->addButton(alignRight); - g1->addButton(alignJustify); - - g2 = new QButtonGroup(this); - g2->addButton(alignTop); - g2->addButton(alignVCenter); - g2->addButton(alignBaseline); - g2->addButton(alignBottom); + horizontalAlignButtons = new QButtonGroup(this); + horizontalAlignButtons->addButton(alignLeft); + horizontalAlignButtons->addButton(alignHCenter); + horizontalAlignButtons->addButton(alignRight); + horizontalAlignButtons->addButton(alignJustify); + + verticalAlignButtons = new QButtonGroup(this); + verticalAlignButtons->addButton(alignTop); + verticalAlignButtons->addButton(alignVCenter); + verticalAlignButtons->addButton(alignBaseline); + verticalAlignButtons->addButton(alignBottom); + + positionButtons = new QButtonGroup(this); + positionButtons->addButton(positionLeft); + positionButtons->addButton(positionHCenter); + positionButtons->addButton(positionRight); WidgetUtils::setWidgetIcon(alignLeft, IconCode::Code::TEXT_ALIGN_LEFT); WidgetUtils::setWidgetIcon(alignRight, IconCode::Code::TEXT_ALIGN_RIGHT); @@ -54,9 +59,13 @@ AlignSelect::AlignSelect(QWidget* parent) WidgetUtils::setWidgetIcon(alignTop, IconCode::Code::TEXT_ALIGN_TOP); WidgetUtils::setWidgetIcon(alignBaseline, IconCode::Code::TEXT_ALIGN_BASELINE); WidgetUtils::setWidgetIcon(alignBottom, IconCode::Code::TEXT_ALIGN_BOTTOM); + WidgetUtils::setWidgetIcon(positionLeft, IconCode::Code::ALIGN_LEFT); + WidgetUtils::setWidgetIcon(positionRight, IconCode::Code::ALIGN_RIGHT); + WidgetUtils::setWidgetIcon(positionHCenter, IconCode::Code::ALIGN_HORIZONTAL_CENTER); - connect(g1, &QButtonGroup::buttonToggled, this, &AlignSelect::_alignChanged); - connect(g2, &QButtonGroup::buttonToggled, this, &AlignSelect::_alignChanged); + connect(horizontalAlignButtons, &QButtonGroup::buttonToggled, this, &AlignSelect::_alignChanged); + connect(verticalAlignButtons, &QButtonGroup::buttonToggled, this, &AlignSelect::_alignChanged); + connect(positionButtons, &QButtonGroup::buttonToggled, this, &AlignSelect::_positionChanged); } void AlignSelect::_alignChanged() @@ -64,6 +73,11 @@ void AlignSelect::_alignChanged() emit alignChanged(align()); } +void AlignSelect::_positionChanged() +{ + emit positionChanged(position()); +} + mu::engraving::Align AlignSelect::align() const { mu::engraving::Align a = { mu::engraving::AlignH::LEFT, mu::engraving::AlignV::TOP }; @@ -84,6 +98,17 @@ mu::engraving::Align AlignSelect::align() const return a; } +mu::engraving::AlignH AlignSelect::position() const +{ + mu::engraving::AlignH position = mu::engraving::AlignH::LEFT; + if (positionHCenter->isChecked()) { + position = mu::engraving::AlignH::HCENTER; + } else if (positionRight->isChecked()) { + position = mu::engraving::AlignH::RIGHT; + } + return position; +} + void AlignSelect::setAlign(mu::engraving::Align a) { blockAlign(true); @@ -108,8 +133,26 @@ void AlignSelect::setAlign(mu::engraving::Align a) blockAlign(false); } +void AlignSelect::setPosition(mu::engraving::AlignH a) +{ + blockPosition(true); + if (a == mu::engraving::AlignH::HCENTER) { + positionHCenter->setChecked(true); + } else if (a == mu::engraving::AlignH::RIGHT) { + positionRight->setChecked(true); + } else { + positionLeft->setChecked(true); + } + blockPosition(false); +} + void AlignSelect::blockAlign(bool val) { - g1->blockSignals(val); - g2->blockSignals(val); + horizontalAlignButtons->blockSignals(val); + verticalAlignButtons->blockSignals(val); +} + +void AlignSelect::blockPosition(bool val) +{ + positionButtons->blockSignals(val); } diff --git a/src/notation/view/widgets/alignSelect.h b/src/notation/view/widgets/alignSelect.h index 732b4e36cab1c..beb228e3c1418 100644 --- a/src/notation/view/widgets/alignSelect.h +++ b/src/notation/view/widgets/alignSelect.h @@ -34,19 +34,26 @@ class AlignSelect : public QWidget, public Ui::AlignSelect, public muse::Injecta public: AlignSelect(QWidget* parent); mu::engraving::Align align() const; + mu::engraving::AlignH position() const; + void setAlign(mu::engraving::Align); + void setPosition(mu::engraving::AlignH); signals: void alignChanged(mu::engraving::Align); + void positionChanged(mu::engraving::AlignH); private: - QButtonGroup* g1; - QButtonGroup* g2; + QButtonGroup* horizontalAlignButtons; + QButtonGroup* verticalAlignButtons; + QButtonGroup* positionButtons; void blockAlign(bool val); + void blockPosition(bool val); private slots: void _alignChanged(); + void _positionChanged(); }; } diff --git a/src/notation/view/widgets/align_select.ui b/src/notation/view/widgets/align_select.ui index 42b4483b20acd..ff3b519ebf63b 100644 --- a/src/notation/view/widgets/align_select.ui +++ b/src/notation/view/widgets/align_select.ui @@ -6,8 +6,8 @@ 0 0 - 200 - 32 + 300 + 64 @@ -33,6 +33,19 @@ 0 + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + @@ -48,7 +61,7 @@ - Align left edge of text to reference point + Left-align text within its bounding box true @@ -73,7 +86,7 @@ - Center text on reference point + Horizontally center text within its bounding box true @@ -98,7 +111,7 @@ - Align right edge of text to reference point + Right align text within its bounding box true @@ -108,7 +121,7 @@ - + @@ -133,15 +146,100 @@ + + + + + 28 + 28 + + + + + 28 + 28 + + + + Left-align text box to reference point + + + true + + + true + + + + + + + + 28 + 28 + + + + + 28 + 28 + + + + Horizontally center text box to reference point + + + true + + + true + + + + + + + + 28 + 28 + + + + + 28 + 28 + + + + Right-align text box to reference point + + + true + + + true + + + + + + + + + 0 + + + 4 + - Qt::Horizontal + Qt::Orientation::Horizontal - 0 - 0 + 40 + 20 @@ -246,6 +344,22 @@ + + + + Qt::Orientation::Horizontal + + + QSizePolicy::Policy::Fixed + + + + 84 + 20 + + + + diff --git a/src/notation/view/widgets/editstyle.cpp b/src/notation/view/widgets/editstyle.cpp index db64d5bae80d4..bb0792cf8e029 100644 --- a/src/notation/view/widgets/editstyle.cpp +++ b/src/notation/view/widgets/editstyle.cpp @@ -1051,6 +1051,7 @@ EditStyle::EditStyle(QWidget* parent) connect(buttonGroup, &QButtonGroup::buttonClicked, setSignalMapper, mapFunction); } else if (auto alignSelect = qobject_cast(sw.widget)) { connect(alignSelect, &AlignSelect::alignChanged, setSignalMapper, mapFunction); + connect(alignSelect, &AlignSelect::positionChanged, setSignalMapper, mapFunction); } else if (auto offsetSelect = qobject_cast(sw.widget)) { connect(offsetSelect, &OffsetSelect::offsetChanged, setSignalMapper, mapFunction); } else if (auto fontStyle = qobject_cast(sw.widget)) { @@ -1145,8 +1146,8 @@ EditStyle::EditStyle(QWidget* parent) textStyleValueChanged(TextStylePropertyType::TextAlign, textStyleAlign->align()); }); - connect(textPositionSelect, &TextPositionSelect::positionChanged, this, [=]() { - textStyleValueChanged(TextStylePropertyType::Position, textPositionSelect->position()); + connect(textStyleAlign, &AlignSelect::positionChanged, this, [=]() { + textStyleValueChanged(TextStylePropertyType::Position, textStyleAlign->position()); }); // offset @@ -2762,7 +2763,7 @@ void EditStyle::textStyleChanged(int row) break; case TextStylePropertyType::Position: - textPositionSelect->setPosition(styleValue(a.sid).value()); + textStyleAlign->setPosition(styleValue(a.sid).value()); resetTextStyleAlign->setEnabled(styleValue(a.sid) != defaultStyleValue(a.sid)); break; diff --git a/src/notation/view/widgets/editstyle.ui b/src/notation/view/widgets/editstyle.ui index 6260fd734e305..07efa91cd3bd6 100644 --- a/src/notation/view/widgets/editstyle.ui +++ b/src/notation/view/widgets/editstyle.ui @@ -7,7 +7,7 @@ 0 0 962 - 824 + 832 @@ -12602,19 +12602,6 @@ followed by dashes Edit text style - - - - - - - Offset: - - - textStyleOffset - - - @@ -12628,67 +12615,20 @@ followed by dashes - - - - Style: - - - textStyleFontStyle - - - - - - - Size: - - - textStyleFontSize - - - - - - - - + + Reset to default - Reset 'Offset' values + Reset 'Font size' value - - - - Use musical symbols font for tuplet numbers - - - - - - - Follow staff size - - - - - - - Color: - - - textStyleColor - - - - + @@ -12902,6 +12842,128 @@ followed by dashes + + + + + + + + + + false + + + pt + + + 1.000000000000000 + + + + + + + false + + + li + + + 0.100000000000000 + + + 1.000000000000000 + + + + + + + Line spacing: + + + textStyleLineSpacing + + + + + + + Name: + + + styleName + + + + + + + Reset to default + + + Reset 'Offset' values + + + + + + + + + + + 0 + 0 + + + + + + + + Use musical symbols font for tuplet numbers + + + + + + + Font: + + + textStyleFontFace + + + + + + + Color: + + + textStyleColor + + + + + + + Offset: + + + textStyleOffset + + + + + + + Qt::FocusPolicy::StrongFocus + + + @@ -12945,156 +13007,114 @@ followed by dashes - - - - Reset to default + + + + + + + Align: - - Reset 'Font size' value + + textStyleAlign + + + + - + Follow staff size - - + + Reset to default - Reset 'Font face' value + Reset 'Font style' values - - + + Reset to default - Reset 'Align' values + Reset 'Follow staff size' value - - - - false - - - li - - - 0.100000000000000 - - - 1.000000000000000 - - - - - - - - 0 - 0 - - - - - - - - false - - - pt + + + + Style: - - 1.000000000000000 + + textStyleFontStyle - - + + Reset to default - Reset 'Color' value + Reset 'Font face' value - - + + + + + Reset to default - Reset 'Font style' values + Reset 'Color' value - - - - Qt::FocusPolicy::StrongFocus - - - - - - - Line spacing: - - - textStyleLineSpacing - - - - - + + Reset to default - Reset 'Follow staff size' value + Reset 'Name' value - - + + - Align: + Size: - textStyleAlign + textStyleFontSize - - - - - - @@ -13108,42 +13128,19 @@ followed by dashes - - - - Name: - - - styleName - - - - - - - Font: - - - textStyleFontFace - - - - - + + Reset to default - Reset 'Name' value + Reset 'Align' values - - - @@ -13235,12 +13232,6 @@ followed by dashes
uicomponents/view/widgets/radiobuttongroupbox.h
1 - - mu::notation::TextPositionSelect - QWidget -
notation/view/widgets/textpositionselect.h
- 1 -
pageList diff --git a/src/notation/view/widgets/text_position_select.ui b/src/notation/view/widgets/text_position_select.ui deleted file mode 100644 index 2d4db21f1f6ff..0000000000000 --- a/src/notation/view/widgets/text_position_select.ui +++ /dev/null @@ -1,132 +0,0 @@ - - - PositionSelect - - - - 0 - 0 - 94 - 32 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 0 - - - - - 0 - - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - - - - - 28 - 28 - - - - - 28 - 28 - - - - Align left edge of text to reference point - - - true - - - true - - - - - - - - 28 - 28 - - - - - 28 - 28 - - - - Center text on reference point - - - true - - - true - - - - - - - - 28 - 28 - - - - - 28 - 28 - - - - Align right edge of text to reference point - - - true - - - true - - - - - - - - - - - - diff --git a/src/notation/view/widgets/textpositionselect.cpp b/src/notation/view/widgets/textpositionselect.cpp deleted file mode 100644 index 6ed9aacc89924..0000000000000 --- a/src/notation/view/widgets/textpositionselect.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* - * SPDX-License-Identifier: GPL-3.0-only - * MuseScore-Studio-CLA-applies - * - * MuseScore Studio - * Music Composition & Notation - * - * Copyright (C) 2025 MuseScore Limited - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 3 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "textpositionselect.h" - -#include - -#include "ui/view/widgetutils.h" - -using namespace mu::notation; -using namespace muse::ui; - -TextPositionSelect::TextPositionSelect(QWidget* parent) - : QWidget(parent), muse::Injectable(muse::iocCtxForQWidget(this)) -{ - setupUi(this); - - positionButtons = new QButtonGroup(this); - positionButtons->addButton(positionLeft); - positionButtons->addButton(positionHCenter); - positionButtons->addButton(positionRight); - - WidgetUtils::setWidgetIcon(positionLeft, IconCode::Code::ALIGN_LEFT); - WidgetUtils::setWidgetIcon(positionRight, IconCode::Code::ALIGN_RIGHT); - WidgetUtils::setWidgetIcon(positionHCenter, IconCode::Code::ALIGN_HORIZONTAL_CENTER); - - connect(positionButtons, &QButtonGroup::buttonToggled, this, &TextPositionSelect::_positionChanged); - connect(positionButtons, &QButtonGroup::buttonToggled, this, &TextPositionSelect::_positionChanged); -} - -void TextPositionSelect::_positionChanged() -{ - emit positionChanged(position()); -} - -mu::engraving::AlignH TextPositionSelect::position() const -{ - mu::engraving::AlignH position = mu::engraving::AlignH::LEFT; - if (positionHCenter->isChecked()) { - position = mu::engraving::AlignH::HCENTER; - } else if (positionRight->isChecked()) { - position = mu::engraving::AlignH::RIGHT; - } - return position; -} - -void TextPositionSelect::setPosition(mu::engraving::AlignH a) -{ - blockPosition(true); - if (a == mu::engraving::AlignH::HCENTER) { - positionHCenter->setChecked(true); - } else if (a == mu::engraving::AlignH::RIGHT) { - positionRight->setChecked(true); - } else { - positionLeft->setChecked(true); - } - blockPosition(false); -} - -void TextPositionSelect::blockPosition(bool val) -{ - positionButtons->blockSignals(val); -} diff --git a/src/notation/view/widgets/textpositionselect.h b/src/notation/view/widgets/textpositionselect.h deleted file mode 100644 index 3bdda915db8f9..0000000000000 --- a/src/notation/view/widgets/textpositionselect.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * SPDX-License-Identifier: GPL-3.0-only - * MuseScore-Studio-CLA-applies - * - * MuseScore Studio - * Music Composition & Notation - * - * Copyright (C) 2025 MuseScore Limited - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 3 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -#pragma once - -#include "modularity/ioc.h" -#include "ui_text_position_select.h" -#include "engraving/types/types.h" - -namespace mu::notation { -class TextPositionSelect : public QWidget, public Ui::PositionSelect, public muse::Injectable -{ - Q_OBJECT - -public: - TextPositionSelect(QWidget* parent); - mu::engraving::AlignH position() const; - void setPosition(mu::engraving::AlignH); - -signals: - void positionChanged(mu::engraving::AlignH); - -private: - QButtonGroup* positionButtons; - - void blockPosition(bool val); - -private slots: - void _positionChanged(); -}; -} diff --git a/src/notation/view/widgets/widgets.cmake b/src/notation/view/widgets/widgets.cmake index 64ac35516eec5..044afd797c513 100644 --- a/src/notation/view/widgets/widgets.cmake +++ b/src/notation/view/widgets/widgets.cmake @@ -43,6 +43,4 @@ set(WIDGETS_SRC ${CMAKE_CURRENT_LIST_DIR}/timeline.h ${CMAKE_CURRENT_LIST_DIR}/realizeharmonydialog.cpp ${CMAKE_CURRENT_LIST_DIR}/realizeharmonydialog.h - ${CMAKE_CURRENT_LIST_DIR}/textpositionselect.cpp - ${CMAKE_CURRENT_LIST_DIR}/textpositionselect.h ) diff --git a/vtest/scores/text-align.mscz b/vtest/scores/text-align.mscz new file mode 100644 index 0000000000000..43f3cb7bceccf Binary files /dev/null and b/vtest/scores/text-align.mscz differ