Skip to content

Commit

Permalink
update staff type when replacing instrument
Browse files Browse the repository at this point in the history
  • Loading branch information
RomanPudashkin committed Nov 28, 2024
1 parent 0485373 commit 8572b81
Show file tree
Hide file tree
Showing 13 changed files with 60 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,12 @@ void InstrumentsActionsController::changeInstrument()
key.partId = instrumentChange->part()->id();
key.tick = instrumentChange->tick();

RetVal<Instrument> instrument = selectInstrumentsScenario()->selectInstrument(key);
if (!instrument.ret) {
LOGE() << instrument.ret.toString();
RetVal<InstrumentTemplate> templ = selectInstrumentsScenario()->selectInstrument(key);
if (!templ.ret) {
LOGE() << templ.ret.toString();
return;
}

master->parts()->replaceInstrument(key, instrument.val);
Instrument instrument = Instrument::fromTemplate(&templ.val);
master->parts()->replaceInstrument(key, instrument);
}
5 changes: 2 additions & 3 deletions src/instrumentsscene/internal/selectinstrumentscenario.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ RetVal<PartInstrumentListScoreOrder> SelectInstrumentsScenario::selectInstrument
return selectInstruments(params);
}

RetVal<Instrument> SelectInstrumentsScenario::selectInstrument(const InstrumentKey& currentInstrumentKey) const
RetVal<InstrumentTemplate> SelectInstrumentsScenario::selectInstrument(const InstrumentKey& currentInstrumentKey) const
{
StringList params {
u"canSelectMultipleInstruments=false",
Expand All @@ -49,8 +49,7 @@ RetVal<Instrument> SelectInstrumentsScenario::selectInstrument(const InstrumentK
}

const InstrumentTemplate& templ = selectedInstruments.val.instruments.first().instrumentTemplate;

return RetVal<Instrument>::make_ok(Instrument::fromTemplate(&templ));
return RetVal<InstrumentTemplate>::make_ok(templ);
}

RetVal<PartInstrumentListScoreOrder> SelectInstrumentsScenario::selectInstruments(const StringList& params) const
Expand Down
5 changes: 2 additions & 3 deletions src/instrumentsscene/internal/selectinstrumentscenario.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,8 @@ class SelectInstrumentsScenario : public notation::ISelectInstrumentsScenario

public:
muse::RetVal<notation::PartInstrumentListScoreOrder> selectInstruments() const override;
muse::RetVal<notation::Instrument> selectInstrument(const notation::InstrumentKey& currentInstrumentId = notation::InstrumentKey())
const
override;
muse::RetVal<notation::InstrumentTemplate> selectInstrument(
const notation::InstrumentKey& currentInstrumentId = notation::InstrumentKey()) const override;

private:
muse::RetVal<notation::PartInstrumentListScoreOrder> selectInstruments(const muse::StringList& params) const;
Expand Down
16 changes: 11 additions & 5 deletions src/instrumentsscene/view/parttreeitem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -200,14 +200,20 @@ void PartTreeItem::replaceInstrument()
instrumentKey.instrumentId = m_instrumentId;
instrumentKey.tick = Part::MAIN_INSTRUMENT_TICK;

RetVal<Instrument> selectedInstrument = selectInstrumentsScenario()->selectInstrument(instrumentKey);
if (!selectedInstrument.ret) {
LOGE() << selectedInstrument.ret.toString();
RetVal<InstrumentTemplate> templ = selectInstrumentsScenario()->selectInstrument(instrumentKey);
if (!templ.ret) {
LOGE() << templ.ret.toString();
return;
}

const Instrument& newInstrument = selectedInstrument.val;
masterNotation()->parts()->replaceInstrument(instrumentKey, newInstrument);
Instrument instrument = Instrument::fromTemplate(&templ.val);

const StaffType* staffType = templ.val.staffTypePreset;
if (!staffType) {
staffType = StaffType::getDefaultPreset(templ.val.staffGroup);
}

masterNotation()->parts()->replaceInstrument(instrumentKey, instrument, staffType);
}

void PartTreeItem::resetAllFormatting()
Expand Down
3 changes: 2 additions & 1 deletion src/notation/inotationparts.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ class INotationParts
virtual void insertPart(Part* part, size_t index) = 0;

virtual void replacePart(const muse::ID& partId, Part* newPart) = 0;
virtual void replaceInstrument(const InstrumentKey& instrumentKey, const Instrument& newInstrument) = 0;
virtual void replaceInstrument(const InstrumentKey& instrumentKey, const Instrument& newInstrument,
const StaffType* newStaffType = nullptr) = 0;
virtual void replaceDrumset(const InstrumentKey& instrumentKey, const Drumset& newDrumset, bool undoable = true) = 0;

virtual muse::async::Notification partsChanged() const = 0;
Expand Down
7 changes: 4 additions & 3 deletions src/notation/internal/masternotationparts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,8 @@ bool MasterNotationParts::appendLinkedStaff(Staff* staff, const muse::ID& source
return true;
}

void MasterNotationParts::replaceInstrument(const InstrumentKey& instrumentKey, const Instrument& newInstrument)
void MasterNotationParts::replaceInstrument(const InstrumentKey& instrumentKey, const Instrument& newInstrument,
const StaffType* newStaffType)
{
TRACEFUNC;

Expand All @@ -195,10 +196,10 @@ void MasterNotationParts::replaceInstrument(const InstrumentKey& instrumentKey,

mu::engraving::Interval oldTranspose = part ? part->instrument()->transpose() : mu::engraving::Interval(0, 0);

NotationParts::replaceInstrument(instrumentKey, newInstrument);
NotationParts::replaceInstrument(instrumentKey, newInstrument, newStaffType);

for (INotationPartsPtr parts : excerptsParts()) {
parts->replaceInstrument(instrumentKey, newInstrument);
parts->replaceInstrument(instrumentKey, newInstrument, newStaffType);
}

// this also transposes all linked parts
Expand Down
3 changes: 2 additions & 1 deletion src/notation/internal/masternotationparts.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ class MasterNotationParts : public NotationParts
bool appendStaff(Staff* staff, const muse::ID& destinationPartId) override;
bool appendLinkedStaff(Staff* staff, const muse::ID& sourceStaffId, const muse::ID& destinationPartId) override;

void replaceInstrument(const InstrumentKey& instrumentKey, const Instrument& newInstrument) override;
void replaceInstrument(const InstrumentKey& instrumentKey, const Instrument& newInstrument,
const StaffType* newStaffType = nullptr) override;
void replaceDrumset(const InstrumentKey& instrumentKey, const Drumset& newDrumset, bool undoable = true) override;

private:
Expand Down
7 changes: 4 additions & 3 deletions src/notation/internal/notationinteraction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1640,13 +1640,14 @@ bool NotationInteraction::selectInstrument(mu::engraving::InstrumentChange* inst
return false;
}

RetVal<Instrument> selectedInstrument = selectInstrumentScenario()->selectInstrument();
if (!selectedInstrument.ret) {
RetVal<InstrumentTemplate> templ = selectInstrumentScenario()->selectInstrument();
if (!templ.ret) {
return false;
}

Instrument newInstrument = Instrument::fromTemplate(&templ.val);
instrumentChange->setInit(true);
instrumentChange->setupInstrument(&selectedInstrument.val);
instrumentChange->setupInstrument(&newInstrument);

return true;
}
Expand Down
15 changes: 8 additions & 7 deletions src/notation/internal/notationparts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -598,7 +598,7 @@ void NotationParts::replacePart(const ID& partId, Part* newPart)
notifyAboutPartReplaced(part, newPart);
}

void NotationParts::replaceInstrument(const InstrumentKey& instrumentKey, const Instrument& newInstrument)
void NotationParts::replaceInstrument(const InstrumentKey& instrumentKey, const Instrument& newInstrument, const StaffType* newStaffType)
{
TRACEFUNC;

Expand All @@ -617,15 +617,16 @@ void NotationParts::replaceInstrument(const InstrumentKey& instrumentKey, const
for (staff_idx_t staffIdx = 0; staffIdx < part->nstaves(); ++staffIdx) {
Staff* staff = part->staves().at(staffIdx);
StaffConfig config = staffConfig(staff->id());
StaffConfig newConfig = config;

mu::engraving::ClefTypeList newClefTypeList = newInstrument.clefType(staffIdx);

if (config.clefTypeList == newClefTypeList) {
continue;
newConfig.clefTypeList = newInstrument.clefType(staffIdx);
if (newStaffType) {
newConfig.staffType = *newStaffType;
}

config.clefTypeList = newClefTypeList;
doSetStaffConfig(staff, config);
if (config != newConfig) {
doSetStaffConfig(staff, newConfig);
}
}
} else {
mu::engraving::InstrumentChange* instrumentChange = findInstrumentChange(part, instrumentKey.tick);
Expand Down
3 changes: 2 additions & 1 deletion src/notation/internal/notationparts.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,8 @@ class NotationParts : public INotationParts, public muse::async::Asyncable
void insertPart(Part* part, size_t index) override;

void replacePart(const muse::ID& partId, Part* newPart) override;
void replaceInstrument(const InstrumentKey& instrumentKey, const Instrument& newInstrument) override;
void replaceInstrument(const InstrumentKey& instrumentKey, const Instrument& newInstrument,
const StaffType* newStaffType = nullptr) override;
void replaceDrumset(const InstrumentKey& instrumentKey, const Drumset& newDrumset, bool undoable = true) override;

muse::async::Notification partsChanged() const override;
Expand Down
2 changes: 1 addition & 1 deletion src/notation/iselectinstrumentscenario.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class ISelectInstrumentsScenario : MODULE_EXPORT_INTERFACE
virtual ~ISelectInstrumentsScenario() = default;

virtual muse::RetVal<PartInstrumentListScoreOrder> selectInstruments() const = 0;
virtual muse::RetVal<Instrument> selectInstrument(const InstrumentKey& currentInstrumentKey = InstrumentKey()) const = 0;
virtual muse::RetVal<InstrumentTemplate> selectInstrument(const InstrumentKey& currentInstrumentKey = InstrumentKey()) const = 0;
};
}

Expand Down
5 changes: 5 additions & 0 deletions src/notation/notationtypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,11 @@ struct StaffConfig

return equal;
}

bool operator!=(const StaffConfig& conf) const
{
return !(*this == conf);
}
};

struct TransposeOptions
Expand Down
16 changes: 12 additions & 4 deletions src/notation/view/widgets/editstaff.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -579,14 +579,22 @@ void EditStaff::applyPartProperties()

void EditStaff::showReplaceInstrumentDialog()
{
RetVal<Instrument> selectedInstrument = selectInstrumentsScenario()->selectInstrument(m_instrumentKey);
if (!selectedInstrument.ret) {
LOGE() << selectedInstrument.ret.toString();
RetVal<InstrumentTemplate> templ = selectInstrumentsScenario()->selectInstrument(m_instrumentKey);
if (!templ.ret) {
LOGE() << templ.ret.toString();
return;
}

m_instrument = selectedInstrument.val;
const StaffType* staffType = templ.val.staffTypePreset;
if (!staffType) {
staffType = StaffType::getDefaultPreset(StaffGroup::STANDARD);
}

m_instrument = Instrument::fromTemplate(&templ.val);
m_staff->setStaffType(Fraction(0,1), *staffType);

updateInstrument();
updateStaffType(*staffType);
}

void EditStaff::editStringDataClicked()
Expand Down

0 comments on commit 8572b81

Please sign in to comment.