Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

More system object refinements #26572

Merged
merged 3 commits into from
Feb 18, 2025
Merged
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
41 changes: 24 additions & 17 deletions src/engraving/dom/engravingitem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -450,29 +450,36 @@ staff_idx_t EngravingItem::effectiveStaffIdx() const
return muse::nidx;
}

const Staff* originalStaff = m_score->staff(originalStaffIdx);
if (originalStaff->show() && system->staff(originalStaffIdx)->show()) {
return originalStaffIdx;
}
const std::vector<Staff*>& systemObjectStaves = m_score->systemObjectStaves(); // CAUTION: may not be ordered
if (originalStaffIdx > 0) {
staff_idx_t prevSysObjStaffIdx = 0;
for (Staff* sysObjStaff : systemObjectStaves) {
staff_idx_t sysObjStaffIdx = sysObjStaff->idx();
if (sysObjStaffIdx > prevSysObjStaffIdx && sysObjStaffIdx < originalStaffIdx) {
prevSysObjStaffIdx = sysObjStaffIdx;
}
}

staff_idx_t nextSystemObjectStaff = muse::nidx;
const std::vector<Staff*>& systemObjectStaves = m_score->systemObjectStaves();
for (size_t i = 0; i < systemObjectStaves.size(); ++i) {
staff_idx_t idx = systemObjectStaves[i]->idx();
if (idx > originalStaffIdx) {
nextSystemObjectStaff = idx;
break;
bool omitObject = true;
for (staff_idx_t stfIdx = prevSysObjStaffIdx; stfIdx < originalStaffIdx; ++stfIdx) {
if (m_score->staff(stfIdx)->show() && system->staff(stfIdx)->show()) {
omitObject = false;
break;
}
}
}

staff_idx_t nstaves = m_score->nstaves();
for (staff_idx_t staffIdx = originalStaffIdx + 1; staffIdx < nstaves && staffIdx < nextSystemObjectStaff; ++staffIdx) {
if (m_score->staff(staffIdx)->show() && system->staff(staffIdx)->show()) {
return staffIdx;
if (omitObject) {
// If all staves between this and the previous system object are hidden
// we omit this object because it will be replaced by the upper one
return muse::nidx;
}
}

return muse::nidx;
if (m_score->staff(originalStaffIdx)->show() && system->staff(originalStaffIdx)->show()) {
return originalStaffIdx;
}

return system->nextVisibleStaff(originalStaffIdx);
}

bool EngravingItem::isTopSystemObject() const
Expand Down
2 changes: 1 addition & 1 deletion src/engraving/dom/timesig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ void TimeSig::setParent(Segment* parent)

double TimeSig::mag() const
{
return staff() ? staff()->staffMag(tick()) : 1.0;
return timeSigPlacement() == TimeSigPlacement::NORMAL && staff() ? staff()->staffMag(tick()) : 1.0;
}

//---------------------------------------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ Item {
isMovingUpAvailable: treeModel.isMovingUpAvailable
isMovingDownAvailable: treeModel.isMovingDownAvailable
isAddingAvailable: treeModel.isAddingAvailable
isAddingSystemMarkingsAvailable: treeModel.isAddingSystemMarkingsAvailable
isRemovingAvailable: treeModel.isRemovingAvailable
selectedItemsType: treeModel.selectedItemsType

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ RowLayout {
property bool isMovingDownAvailable: false
property bool isRemovingAvailable: false
property bool isAddingAvailable: value
property bool isAddingSystemMarkingsAvailable: value

property int selectedItemsType: LayoutPanelItemType.UNDEFINED

Expand Down Expand Up @@ -68,6 +69,7 @@ RowLayout {
navigation.order: 1

enabled: root.isAddingAvailable
addSystemMarkingsAvailable: root.isAddingSystemMarkingsAvailable

onAddInstrumentRequested: {
root.addInstrumentRequested()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ MenuButton {
signal addInstrumentRequested()
signal addSystemMarkingsRequested()

property bool addSystemMarkingsAvailable: true

//: Keep in sync with the message that appears if there are no instruments in the score (LayoutPanel.qml)
text: qsTrc("layoutpanel", "Add")

Expand All @@ -44,7 +46,7 @@ MenuButton {
menuModel: [
{ id: "ADD_INSTRUMENT", title: qsTrc("layoutpanel", "New instrument") },
{},
{ id: "ADD_SYSTEM_MARKINGS", title: qsTrc("layoutpanel", "System markings (tempo, rehearsal marks, etc.)") },
{ id: "ADD_SYSTEM_MARKINGS", title: qsTrc("layoutpanel", "System markings (tempo, rehearsal marks, etc.)"), enabled: root.addSystemMarkingsAvailable },
]

onHandleMenuItem: function(itemId) {
Expand Down
16 changes: 13 additions & 3 deletions src/instrumentsscene/view/layoutpaneltreemodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -344,9 +344,13 @@ void LayoutPanelTreeModel::load()
SystemObjectGroupsByStaff systemObjects = collectSystemObjectGroups(systemObjectStaves);

for (const Part* part : masterParts) {
for (Staff* staff : part->staves()) {
if (muse::contains(systemObjectStaves, staff)) {
m_rootItem->appendChild(buildSystemObjectsLayerItem(staff, systemObjects[staff]));
if (m_notation->isMaster()) {
// Only show system object staves in master score
// TODO: extend system object staves logic to parts
for (Staff* staff : part->staves()) {
if (muse::contains(systemObjectStaves, staff)) {
m_rootItem->appendChild(buildSystemObjectsLayerItem(staff, systemObjects[staff]));
}
}
}

Expand All @@ -360,6 +364,7 @@ void LayoutPanelTreeModel::load()

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

void LayoutPanelTreeModel::sortParts(notation::PartList& parts)
Expand Down Expand Up @@ -685,6 +690,11 @@ bool LayoutPanelTreeModel::isAddingAvailable() const
return m_notation != nullptr;
}

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

bool LayoutPanelTreeModel::isEmpty() const
{
return m_rootItem ? m_rootItem->isEmpty() : true;
Expand Down
3 changes: 3 additions & 0 deletions src/instrumentsscene/view/layoutpaneltreemodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ class LayoutPanelTreeModel : public QAbstractItemModel, public muse::async::Asyn
Q_PROPERTY(bool isMovingDownAvailable READ isMovingDownAvailable NOTIFY isMovingDownAvailableChanged)
Q_PROPERTY(bool isRemovingAvailable READ isRemovingAvailable NOTIFY isRemovingAvailableChanged)
Q_PROPERTY(bool isAddingAvailable READ isAddingAvailable NOTIFY isAddingAvailableChanged)
Q_PROPERTY(bool isAddingSystemMarkingsAvailable READ isAddingSystemMarkingsAvailable NOTIFY isAddingSystemMarkingsAvailableChanged)
Q_PROPERTY(bool isEmpty READ isEmpty NOTIFY isEmptyChanged)
Q_PROPERTY(QString addInstrumentsKeyboardShortcut READ addInstrumentsKeyboardShortcut NOTIFY addInstrumentsKeyboardShortcutChanged)
Q_PROPERTY(int selectedItemsType READ selectedItemsType NOTIFY selectedItemsTypeChanged)
Expand All @@ -79,6 +80,7 @@ class LayoutPanelTreeModel : public QAbstractItemModel, public muse::async::Asyn
bool isMovingDownAvailable() const;
bool isRemovingAvailable() const;
bool isAddingAvailable() const;
bool isAddingSystemMarkingsAvailable() const;
bool isEmpty() const;
QString addInstrumentsKeyboardShortcut() const;
int selectedItemsType() const;
Expand Down Expand Up @@ -107,6 +109,7 @@ class LayoutPanelTreeModel : public QAbstractItemModel, public muse::async::Asyn
void isMovingUpAvailableChanged(bool isMovingUpAvailable);
void isMovingDownAvailableChanged(bool isMovingDownAvailable);
void isAddingAvailableChanged(bool isAddingAvailable);
void isAddingSystemMarkingsAvailableChanged(bool isAddingSystemMarkingsAvailable);
void isRemovingAvailableChanged(bool isRemovingAvailable);
void isEmptyChanged();
void addInstrumentsKeyboardShortcutChanged();
Expand Down
2 changes: 1 addition & 1 deletion src/instrumentsscene/view/systemobjectslayertreeitem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ void SystemObjectsLayerTreeItem::onUndoStackChanged(const mu::engraving::ScoreCh
isSystemObj = toTimeSig(item)->timeSigPlacement() != TimeSigPlacement::NORMAL;
}

if (!isSystemObj || item->staffIdx() != m_staffIdx) {
if (!isSystemObj || item->staffIdx() != m_staffIdx || item->isLayoutBreak()) {
continue;
}

Expand Down
2 changes: 2 additions & 0 deletions src/notation/inotation.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ class INotation

virtual bool hasVisibleParts() const = 0;

virtual bool isMaster() const = 0;

// draw
virtual ViewMode viewMode() const = 0;
virtual void setViewMode(const ViewMode& viewMode) = 0;
Expand Down
5 changes: 5 additions & 0 deletions src/notation/internal/notation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,11 @@ bool Notation::hasVisibleParts() const
return false;
}

bool Notation::isMaster() const
{
return m_score->isMaster();
}

void Notation::notifyAboutNotationChanged()
{
m_notationChanged.notify();
Expand Down
2 changes: 2 additions & 0 deletions src/notation/internal/notation.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ class Notation : virtual public INotation, public IGetScore, public muse::Inject

bool hasVisibleParts() const override;

bool isMaster() const override;

ViewMode viewMode() const override;
void setViewMode(const ViewMode& viewMode) override;
muse::async::Notification viewModeChanged() const override;
Expand Down
Loading