Skip to content

Commit

Permalink
Merge pull request #26751 from mike-spa/portStuff
Browse files Browse the repository at this point in the history
Port stuff
  • Loading branch information
RomanPudashkin authored Feb 26, 2025
2 parents 38deda2 + 7027a6a commit c787bd6
Show file tree
Hide file tree
Showing 19 changed files with 225 additions and 91 deletions.
7 changes: 5 additions & 2 deletions src/engraving/dom/edit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5143,7 +5143,10 @@ void Score::undoChangeParent(EngravingItem* element, EngravingItem* parent, staf
EngravingItem* item = toEngravingItem(obj);
Score* linkedScore = item->score();
Staff* linkedOrigin = item->staff();
Staff* linkedDest = linkedScore != this ? destStaff->findLinkedInScore(linkedScore) : linkedOrigin; // don't allow staff-change of linked elements within the same score
Staff* linkedDest = linkedScore != this && destStaff != element->staff() ? destStaff->findLinkedInScore(linkedScore) : linkedOrigin; // don't allow staff-change of linked elements within the same score
if (!linkedDest && element->systemFlag()) {
linkedDest = linkedScore->staff(0);
}

if (!linkedScore) {
continue;
Expand All @@ -5160,7 +5163,7 @@ void Score::undoChangeParent(EngravingItem* element, EngravingItem* parent, staf
Measure* oldMeas = oldSeg->measure();
Measure* newMeas = linkedScore->tick2measure(oldMeas->tick());
linkedParent = newMeas->tick2segment(oldSeg->tick(), oldSeg->segmentType());
if (!linkedParent && oldSeg->isChordRestType()) {
if (!linkedParent && oldSeg->isType(Segment::CHORD_REST_OR_TIME_TICK_TYPE)) {
// A ChordRest segment that exists in the score may not exist in the part.
// In that case we create a TimeTick segment as new parent for the linked item.
linkedParent = newMeas->getSegment(SegmentType::TimeTick, oldSeg->tick());
Expand Down
4 changes: 2 additions & 2 deletions src/engraving/dom/line.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -586,9 +586,9 @@ LineSegment* LineSegment::rebaseAnchor(Grip grip, Segment* newSeg)
const Segment* newTickSeg = left ? l->startSegment() : l->endSegment();
const System* newSpannerSystem = newTickSeg->measure()->system();

if (newSeg->system() != oldLineSegSystem || oldSpannerSystem != newSpannerSystem) {
if ((oldLineSegSystem && newSeg->system() != oldLineSegSystem) || oldSpannerSystem != newSpannerSystem) {
renderer()->layoutItem(l);
return left ? l->frontSegment() : l->backSegment();
return l->segmentsEmpty() ? nullptr : left ? l->frontSegment() : l->backSegment();
} else if (anchorChanged) {
rebaseOffsetsOnAnchorChanged(grip, oldPos, oldLineSegSystem);
}
Expand Down
5 changes: 3 additions & 2 deletions src/engraving/dom/select.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -813,8 +813,9 @@ void Selection::updateSelectedElements()
if ((sp->tick() >= stick && sp->tick() < etick) || (sp->tick2() >= stick && sp->tick2() <= etick)) {
EngravingItem* startCR = sp->startCR();
EngravingItem* endCR = sp->endCR();
const bool canSelectStart = (sp->startElement()->isTimeTickAnchor() || canSelect(startCR));
const bool canSelectEnd = (sp->endElement()->isTimeTickAnchor() || canSelect(endCR));
const bool canSelectStart
= (sp->startElement()->isTimeTickAnchor() || sp->startElement()->isSegment() || canSelect(startCR));
const bool canSelectEnd = (sp->endElement()->isTimeTickAnchor() || sp->endElement()->isSegment() || canSelect(endCR));
if (canSelectStart && canSelectEnd) {
for (auto seg : sp->spannerSegments()) {
appendFiltered(seg); // spanner with start or end in range selection
Expand Down
2 changes: 1 addition & 1 deletion src/engraving/dom/utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1483,7 +1483,7 @@ std::vector<EngravingItem*> collectSystemObjects(const Score* score, const std::
}

for (const Segment& seg : measure->segments()) {
if (seg.isChordRestType()) {
if (seg.isType(Segment::CHORD_REST_OR_TIME_TICK_TYPE)) {
for (EngravingItem* annotation : seg.annotations()) {
if (!annotation || !annotation->systemFlag()) {
continue;
Expand Down
4 changes: 2 additions & 2 deletions src/engraving/rendering/paddingtable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ void PaddingTable::createTable(const MStyle& style)
table[ElementType::REST][ElementType::BAR_LINE] = 1.65 * spatium;
table[ElementType::REST][ElementType::KEYSIG] = 1.5 * spatium;
table[ElementType::REST][ElementType::TIMESIG] = 1.5 * spatium;
table[ElementType::REST][ElementType::PARENTHESIS] = 0.35 * spatium;
table[ElementType::REST][ElementType::PARENTHESIS] = table[ElementType::NOTE][ElementType::PARENTHESIS];

table[ElementType::CLEF][ElementType::NOTE] = style.styleMM(Sid::clefKeyRightMargin);
table[ElementType::CLEF][ElementType::LEDGER_LINE]
Expand Down Expand Up @@ -246,7 +246,7 @@ void PaddingTable::createTable(const MStyle& style)
table[ElementType::PARENTHESIS][ElementType::CLEF] = 0.2 * spatium;
table[ElementType::PARENTHESIS][ElementType::STEM] = 0.35 * spatium;
table[ElementType::PARENTHESIS][ElementType::NOTE] = style.styleMM(Sid::barNoteDistance);
table[ElementType::PARENTHESIS][ElementType::REST] = 0.35 * spatium;
table[ElementType::PARENTHESIS][ElementType::REST] = table[ElementType::PARENTHESIS][ElementType::NOTE];
table[ElementType::PARENTHESIS][ElementType::NOTEDOT] = 0.35 * spatium;
table[ElementType::PARENTHESIS][ElementType::HOOK] = 0.35 * spatium;
table[ElementType::PARENTHESIS][ElementType::PARENTHESIS] = 1.0 * spatium;
Expand Down
1 change: 1 addition & 0 deletions src/engraving/rendering/score/autoplace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -464,6 +464,7 @@ bool Autoplace::itemsShouldIgnoreEachOther(const EngravingItem* itemToAutoplace,
ElementType::DYNAMIC,
ElementType::EXPRESSION,
ElementType::STICKING,
ElementType::HARMONY
};
return !itemToAutoplace->isTextBase() || muse::contains(TEXT_BASED_TYPES_WHICH_IGNORE_EACH_OTHER, type1);
}
Expand Down
2 changes: 1 addition & 1 deletion src/engraving/rendering/score/masklayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ void MaskLayout::maskBarlineForText(BarLine* barline, const std::vector<TextBase

for (TextBase* text : allSystemText) {
const double fontSizeScaleFactor = text->size() / 10.0;
const double collisionPadding = 0.25 * spatium * fontSizeScaleFactor;
const double collisionPadding = 0.2 * spatium * fontSizeScaleFactor;
const bool hasFrame = text->frameType() != FrameType::NO_FRAME;
const bool useHighResShape = !text->isDynamic() && !text->hasFrame();
const double maskPadding = hasFrame ? 0.0 : std::clamp(0.5 * spatium * fontSizeScaleFactor, 0.1 * spatium, spatium);
Expand Down
9 changes: 5 additions & 4 deletions src/engraving/rendering/score/measurelayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1252,8 +1252,9 @@ MeasureLayout::MeasureStartEndPos MeasureLayout::getMeasureStartEndPos(const Mea
break;
}

if (!modernMMRest && (s2->isClefRepeatAnnounceType() || s2->isTimeSigRepeatAnnounceType() || s2->isKeySigRepeatAnnounceType()
|| s2->isEndBarLineType()) && s2->element(staffIdx * VOICES)) {
if (!modernMMRest
&& (s2->isClefRepeatAnnounceType() || (s2->isTimeSigRepeatAnnounceType() && !s2->hasTimeSigAboveStaves())
|| s2->isKeySigRepeatAnnounceType() || s2->isEndBarLineType()) && s2->element(staffIdx * VOICES)) {
break;
}
}
Expand Down Expand Up @@ -2007,8 +2008,8 @@ void MeasureLayout::placeParentheses(const Segment* segment, track_idx_t trackId
const double itemToRightParen = rightParenX - itemRightX;
const double parenToItemDist = (leftParenToItem + itemToRightParen) / 2;

leftParen->mutldata()->moveX(-std::abs(parenToItemDist - leftParenToItem));
rightParen->mutldata()->moveX(-std::abs(itemToRightParen - parenToItemDist));
leftParen->mutldata()->moveX(-(parenToItemDist - leftParenToItem));
rightParen->mutldata()->moveX(-(itemToRightParen - parenToItemDist));
}

Parenthesis* MeasureLayout::findOrCreateParenthesis(Segment* segment, const DirectionH direction, const track_idx_t track)
Expand Down
69 changes: 37 additions & 32 deletions src/engraving/rendering/score/tlayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4681,46 +4681,51 @@ void TLayout::layoutRehearsalMark(const RehearsalMark* item, RehearsalMark::Layo

LD_CONDITION(s->ldata()->isSetPos());

if (s->rtick().isZero()) {
// first CR of measure, alignment is hcenter or right (the usual cases)
// align with barline, point just after header, or start of measure depending on context
if (!s->rtick().isZero()) {
return;
}

const Measure* m = s->measure();
const Segment* header = s->prev(); // possibly just a start repeat
double measureX = -s->x();
const Segment* repeat = m->findSegmentR(SegmentType::StartRepeatBarLine, Fraction(0, 1));
// first CR of measure, alignment is hcenter or right (the usual cases)
// align with barline, point just after header, or start of measure depending on context
const Measure* m = s->measure();
const Segment* header = s->prev(); // possibly just a start repeat
while (header && header->isType(Segment::CHORD_REST_OR_TIME_TICK_TYPE)) {
header = header->prev();
}
double measureX = -s->x();
const Segment* repeat = m->findSegmentR(SegmentType::StartRepeatBarLine, Fraction(0, 1));

if (repeat) {
LD_CONDITION(repeat->ldata()->isSetPos());
}
if (repeat) {
LD_CONDITION(repeat->ldata()->isSetPos());
}

double barlineX = repeat ? repeat->x() - s->x() : measureX;
const System* sys = m->system();
bool systemFirst = (sys && m->isFirstInSystem());
double barlineX = repeat ? repeat->x() - s->x() : measureX;
const System* sys = m->system();
bool systemFirst = (sys && m->isFirstInSystem());

if (!header || repeat || !systemFirst) {
// no header, or header with repeat, or header mid-system - align with barline
ldata->setPosX(barlineX);
} else {
// header at start of system
// align to a point just after the header
EngravingItem* e = header->element(item->track());
if (!header || repeat || !systemFirst) {
// no header, or header with repeat, or header mid-system - align with barline
ldata->setPosX(barlineX);
return;
}

if (e) {
LD_CONDITION(e->ldata()->isSetBbox());
}
// header at start of system
// align to a point just after the header
EngravingItem* e = header->element(item->track());

LD_CONDITION(header->ldata()->isSetBbox());
if (e) {
LD_CONDITION(e->ldata()->isSetBbox());
}

double w = e ? e->ldata()->bbox().width() : header->ldata()->bbox().width();
ldata->setPosX(header->x() + w - s->x());
LD_CONDITION(header->ldata()->isSetBbox());

// special case for right aligned rehearsal marks at start of system
// left align with start of measure if that is further left
if (item->align() == AlignH::RIGHT) {
ldata->setPosX(std::min(ldata->pos().x(), measureX + ldata->bbox().width()));
}
}
double w = e ? e->ldata()->bbox().width() : header->ldata()->bbox().width();
ldata->setPosX(header->x() + w - s->x());

// special case for right aligned rehearsal marks at start of system
// left align with start of measure if that is further left
if (item->align() == AlignH::RIGHT) {
ldata->setPosX(std::min(ldata->pos().x(), measureX + ldata->bbox().width()));
}
}

Expand Down
81 changes: 69 additions & 12 deletions src/instrumentsscene/view/layoutpaneltreemodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ LayoutPanelTreeModel::LayoutPanelTreeModel(QObject* parent)
updateRearrangementAvailability();
updateRemovingAvailability();
updateSelectedItemsType();
updateIsAddingSystemMarkingsAvailable();
});

connect(this, &LayoutPanelTreeModel::rowsInserted, this, [this]() {
Expand Down Expand Up @@ -134,7 +135,7 @@ bool LayoutPanelTreeModel::removeRows(int row, int count, const QModelIndex& par
parentItem = m_rootItem;
}

if (parentItem == m_rootItem) {
if (parentItem == m_rootItem && needWarnOnRemoveRows(row, count)) {
// When removing instruments, the user needs to be warned in some cases
if (!warnAboutRemovingInstrumentsIfNecessary(count)) {
return false;
Expand Down Expand Up @@ -182,7 +183,9 @@ void LayoutPanelTreeModel::onBeforeChangeNotation()
QList<muse::ID> partIdList;

for (const AbstractLayoutPanelTreeItem* item : m_rootItem->childItems()) {
partIdList << item->id();
if (item->type() == LayoutPanelItemType::ItemType::PART) {
partIdList << item->id();
}
}

m_sortedPartIdList[notationToKey(m_notation)] = partIdList;
Expand Down Expand Up @@ -362,9 +365,10 @@ void LayoutPanelTreeModel::load()
setupPartsConnections();
listenNotationSelectionChanged();

updateIsAddingSystemMarkingsAvailable();

emit isEmptyChanged();
emit isAddingAvailableChanged(true);
emit isAddingSystemMarkingsAvailableChanged(isAddingSystemMarkingsAvailable());
}

void LayoutPanelTreeModel::sortParts(notation::PartList& parts)
Expand Down Expand Up @@ -426,6 +430,8 @@ void LayoutPanelTreeModel::addSystemMarkings()
if (const Staff* staff = resolveNewSystemObjectStaff()) {
m_masterNotation->parts()->addSystemObjects({ staff->id() });
}

updateIsAddingSystemMarkingsAvailable();
}

void LayoutPanelTreeModel::moveSelectedRowsUp()
Expand Down Expand Up @@ -526,8 +532,8 @@ bool LayoutPanelTreeModel::moveRows(const QModelIndex& sourceParent, int sourceR
sourceParentItem->moveChildren(sourceFirstRow, count, destinationParentItem, destinationRow, !m_dragInProgress);
endMoveRows();

updateRearrangementAvailability();
updateSystemObjectLayers();
updateRearrangementAvailability();

return true;
}
Expand Down Expand Up @@ -692,7 +698,7 @@ bool LayoutPanelTreeModel::isAddingAvailable() const

bool LayoutPanelTreeModel::isAddingSystemMarkingsAvailable() const
{
return isAddingAvailable() && m_notation->isMaster();
return m_isAddingSystemMarkingsAvailable;
}

bool LayoutPanelTreeModel::isEmpty() const
Expand Down Expand Up @@ -799,7 +805,16 @@ void LayoutPanelTreeModel::updateMovingDownAvailability(bool isSelectionMovable,

// exclude the control item
bool hasControlItem = parentItem->type() != LayoutPanelItemType::ROOT;
int lastItemRowIndex = parentItem->childCount() - 1 - (hasControlItem ? 1 : 0);
const AbstractLayoutPanelTreeItem* curItem = modelIndexToItem(lastSelectedRowIndex);
bool lastSelectedIsSystemObjectLayer = curItem && curItem->type() == LayoutPanelItemType::ItemType::SYSTEM_OBJECTS_LAYER;

IF_ASSERT_FAILED(lastSelectedRowIndex.row() != 0 || !lastSelectedIsSystemObjectLayer) {
// Selecting/moving the top system object layer not allowed
setIsMovingDownAvailable(false);
return;
}

int lastItemRowIndex = parentItem->childCount() - 1 - (hasControlItem ? 1 : 0) - (lastSelectedIsSystemObjectLayer ? 1 : 0);

bool isRowInBoundaries = lastSelectedRowIndex.isValid() && lastSelectedRowIndex.row() < lastItemRowIndex;

Expand Down Expand Up @@ -865,15 +880,52 @@ void LayoutPanelTreeModel::updateSelectedItemsType()
}
}

void LayoutPanelTreeModel::updateIsAddingSystemMarkingsAvailable()
{
bool addingSysMarkAvailable = false;

if (!isAddingAvailable() || !m_notation->isMaster()) {
addingSysMarkAvailable = false;
} else {
int systemLayerCount = 0;
for (const AbstractLayoutPanelTreeItem* item : m_rootItem->childItems()) {
if (item->type() == LayoutPanelItemType::SYSTEM_OBJECTS_LAYER) {
++systemLayerCount;
}
}

addingSysMarkAvailable = systemLayerCount < 0.5 * m_rootItem->childCount();
}

if (addingSysMarkAvailable != m_isAddingSystemMarkingsAvailable) {
m_isAddingSystemMarkingsAvailable = addingSysMarkAvailable;
emit isAddingSystemMarkingsAvailableChanged(m_isAddingSystemMarkingsAvailable);
}
}

void LayoutPanelTreeModel::setItemsSelected(const QModelIndexList& indexes, bool selected)
{
for (const QModelIndex& index : indexes) {
if (AbstractLayoutPanelTreeItem* item = modelIndexToItem(index)) {
if (!item->isSelectable()) {
continue;
}
item->setIsSelected(selected);
}
}
}

bool LayoutPanelTreeModel::needWarnOnRemoveRows(int row, int count)
{
for (int i = row + count - 1; i >= row; --i) {
if (m_rootItem->childType(i) != LayoutPanelItemType::SYSTEM_OBJECTS_LAYER) {
return true;
}
}

return false;
}

bool LayoutPanelTreeModel::warnAboutRemovingInstrumentsIfNecessary(int count)
{
// Only warn if excerpts are existent
Expand Down Expand Up @@ -962,17 +1014,17 @@ void LayoutPanelTreeModel::updateSystemObjectLayers()

// Remove old system object layers
std::vector<const PartTreeItem*> partItems;
std::vector<const SystemObjectsLayerTreeItem*> existingSystemObjectLayers;
std::vector<SystemObjectsLayerTreeItem*> existingSystemObjectLayers;

for (const AbstractLayoutPanelTreeItem* item : children) {
for (AbstractLayoutPanelTreeItem* item : children) {
if (item->type() != LayoutPanelItemType::SYSTEM_OBJECTS_LAYER) {
if (item->type() == LayoutPanelItemType::PART) {
partItems.push_back(static_cast<const PartTreeItem*>(item));
}
continue;
}

auto layerItem = static_cast<const SystemObjectsLayerTreeItem*>(item);
auto layerItem = static_cast<SystemObjectsLayerTreeItem*>(item);
if (muse::remove(newSystemObjectStaves, const_cast<Staff*>(layerItem->staff()))) {
existingSystemObjectLayers.push_back(layerItem);
continue;
Expand All @@ -985,7 +1037,7 @@ void LayoutPanelTreeModel::updateSystemObjectLayers()
}

// Update position of existing layers if changed
for (const SystemObjectsLayerTreeItem* layerItem : existingSystemObjectLayers) {
for (SystemObjectsLayerTreeItem* layerItem : existingSystemObjectLayers) {
const PartTreeItem* partItem = findPartItemByStaff(layerItem->staff());
IF_ASSERT_FAILED(partItem) {
continue;
Expand All @@ -994,11 +1046,13 @@ void LayoutPanelTreeModel::updateSystemObjectLayers()
const int partRow = partItem->row();
const int layerRow = layerItem->row();

if (partRow < layerRow) {
if (layerRow != partRow - 1) {
beginMoveRows(QModelIndex(), layerRow, layerRow, QModelIndex(), partRow);
m_rootItem->moveChildren(layerRow, 1, m_rootItem, partRow, false /*updateNotation*/);
endMoveRows();
}

layerItem->updateSystemObjects();
}

if (newSystemObjectStaves.empty()) {
Expand All @@ -1021,7 +1075,10 @@ void LayoutPanelTreeModel::updateSystemObjectLayers()
m_rootItem->insertChild(newItem, row);
endInsertRows();

m_selectionModel->select(createIndex(row, 0, newItem));
if (row != 0) {
m_selectionModel->select(createIndex(row, 0, newItem));
}

break;
}
}
Expand Down
Loading

0 comments on commit c787bd6

Please sign in to comment.