Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions src/engraving/compat/engravingcompat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions src/engraving/compat/engravingcompat.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
15 changes: 15 additions & 0 deletions src/engraving/dom/textbase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
//---------------------------------------------------------
Expand Down
2 changes: 2 additions & 0 deletions src/engraving/dom/textbase.h
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand Down
6 changes: 0 additions & 6 deletions src/engraving/rendering/score/dynamicslayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
5 changes: 1 addition & 4 deletions src/engraving/rendering/score/lyricslayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
5 changes: 5 additions & 0 deletions src/engraving/rendering/score/textlayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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) {
Expand Down
21 changes: 0 additions & 21 deletions src/engraving/rendering/score/tlayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
108 changes: 103 additions & 5 deletions src/inspector/models/text/textsettingsmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,9 @@ void TextSettingsModel::loadProperties(const PropertyIdSet& propertyIdSet)
updateIsLineSpacingAvailable();
updateIsPositionAvailable();
updateUsePositionRelativeToLine();
updateLeftPositionText();
updateCenterPositionText();
updateRightPositionText();
}

bool TextSettingsModel::isTextLineText() const
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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<TextTypes::FrameType>(m_frameType->value().toInt())
Expand Down Expand Up @@ -703,18 +751,68 @@ 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;
}
}

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);
Expand Down
19 changes: 19 additions & 0 deletions src/inspector/models/text/textsettingsmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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();
Expand All @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -204,6 +219,10 @@ public slots:
bool m_isPositionAvailable = false;

bool m_usePositionRelativeToLine = false;

QString m_leftPositionText;
QString m_centerPositionText;
QString m_rightPositionText;
};
}

Expand Down
Loading
Loading