Skip to content

Commit e71ef8a

Browse files
replaceDrumset API: add tick parameter
1 parent 6fcc8a5 commit e71ef8a

File tree

6 files changed

+29
-30
lines changed

6 files changed

+29
-30
lines changed

src/engraving/api/tests/score_tests.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1236,7 +1236,7 @@ TEST_F(Engraving_ApiScoreTests, replaceDrumset)
12361236
newDs.drum(36).name = u"Kick Drum";
12371237

12381238
score->startCmd(TranslatableString::untranslatable("Replace drumset test"));
1239-
EditPart::replaceDrumset(score, part, u"drumset", newDs);
1239+
EditPart::replaceDrumset(score, part, Fraction(0, 1), newDs);
12401240
score->endCmd();
12411241

12421242
// [THEN] The drumset should have the new name
@@ -1288,7 +1288,9 @@ TEST_F(Engraving_ApiScoreTests, replaceDrumsetApi)
12881288
ASSERT_NE(cloned, nullptr);
12891289

12901290
cloned->setName(36, "Kick Drum");
1291-
apiScore.replaceDrumset(apiPart, cloned);
1291+
apiv1::Fraction tick(Fraction(0, 1));
1292+
1293+
apiScore.replaceDrumset(apiPart, &tick, cloned);
12921294

12931295
// [THEN] The drumset should have the new name
12941296
EXPECT_EQ(domPart->instrument()->drumset()->name(36), u"Kick Drum");

src/engraving/api/v1/score.cpp

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -382,33 +382,22 @@ bool Score::setVoiceVisible(Staff* staff, int voiceIndex, bool visible)
382382
return mu::engraving::EditPart::setVoiceVisible(score(), staff->staff(), voiceIndex, visible);
383383
}
384384

385-
void Score::replaceDrumset(Part* part, Drumset* drumset)
385+
void Score::replaceDrumset(Part* part, apiv1::Fraction* tick, Drumset* drumset)
386386
{
387387
if (!part) {
388388
LOGW("replaceDrumset: part is null");
389389
return;
390390
}
391-
if (!drumset) {
392-
LOGW("replaceDrumset: drumset is null");
391+
if (!tick) {
392+
LOGW("setInstrumentName: tick is null");
393393
return;
394394
}
395-
396-
// Find the instrumentId from the part's first instrument that has a drumset
397-
mu::engraving::String instrumentId;
398-
for (auto pair : part->part()->instruments()) {
399-
mu::engraving::Instrument* instr = pair.second;
400-
if (instr && instr->drumset()) {
401-
instrumentId = instr->id();
402-
break;
403-
}
404-
}
405-
406-
if (instrumentId.isEmpty()) {
407-
LOGW("replaceDrumset: no percussion instrument found in part");
395+
if (!drumset) {
396+
LOGW("replaceDrumset: drumset is null");
408397
return;
409398
}
410399

411-
mu::engraving::EditPart::replaceDrumset(score(), part->part(), instrumentId, *drumset->drumset());
400+
mu::engraving::EditPart::replaceDrumset(score(), part->part(), tick->fraction(), *drumset->drumset());
412401
}
413402

414403
void Score::insertPart(const QString& instrumentId, int index)

src/engraving/api/v1/score.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -687,14 +687,17 @@ class Score : public apiv1::ScoreElement, public muse::Contextable
687687

688688
/** APIDOC
689689
* Replaces the drumset of a part's percussion instrument.
690-
* Use Instrument.cloneDrumset() to get a modifiable copy, then call Drumset.setDrum()
691-
* to modify entries, and finally pass the modified drumset to this method.
690+
* Use Instrument.cloneDrumset() to get a modifiable copy, update it with the
691+
* available Drumset setter methods (`setName()`, `setNoteHead()`, `setLine()`,
692+
* `setVoice()`, `setStemDirection()`, `setShortcut()`), and then pass the
693+
* modified drumset to this method.
692694
* @method
693695
* @param {Engraving.Part} part The Part object.
696+
* @param {Fraction} tick The tick position (use fraction(0, 1) for the beginning).
694697
* @param {Engraving.Drumset} drumset The new Drumset to apply.
695698
* @since 4.7
696699
*/
697-
Q_INVOKABLE void replaceDrumset(apiv1::Part* part, apiv1::Drumset* drumset);
700+
Q_INVOKABLE void replaceDrumset(apiv1::Part* part, apiv1::Fraction* tick, apiv1::Drumset* drumset);
698701

699702
/** APIDOC
700703
* Inserts a part with the instrument defined by `instrumentId` at the given index.

src/engraving/editing/editpart.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -740,17 +740,15 @@ void EditPart::replacePart(Score* score, Part* oldPart, const InstrumentTemplate
740740
insertPart(score, templ, partIndex);
741741
}
742742

743-
void EditPart::replaceDrumset(Score* score, Part* part, const String& instrumentId, const Drumset& newDrumset)
743+
void EditPart::replaceDrumset(Score* score, Part* part, const Fraction& tick, const Drumset& newDrumset)
744744
{
745745
if (!score || !part) {
746746
return;
747747
}
748748

749-
for (auto pair : part->instruments()) {
750-
Instrument* instrument = pair.second;
751-
if (instrument && instrument->drumset() && instrument->id() == instrumentId) {
752-
score->undo(new ChangeDrumset(instrument, newDrumset, part));
753-
}
749+
Instrument* instrument = part->instrument(tick);
750+
if (instrument) {
751+
score->undo(new ChangeDrumset(instrument, newDrumset, part));
754752
}
755753
}
756754

src/engraving/editing/editpart.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ class EditPart
241241

242242
static bool setVoiceVisible(Score* score, Staff* staff, int voiceIndex, bool visible);
243243

244-
static void replaceDrumset(Score* score, Part* part, const String& instrumentId, const Drumset& newDrumset);
244+
static void replaceDrumset(Score* score, Part* part, const Fraction& tick, const Drumset& newDrumset);
245245

246246
static void insertPart(Score* score, const InstrumentTemplate* templ, size_t index);
247247
static void replacePart(Score* score, Part* oldPart, const InstrumentTemplate* templ);

src/notation/internal/notationparts.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -720,7 +720,14 @@ void NotationParts::replaceDrumset(const InstrumentKey& instrumentKey, const Dru
720720

721721
if (undoable) {
722722
startEdit(TranslatableString("undoableAction", "Edit drumset"));
723-
EditPart::replaceDrumset(score(), part, instrumentKey.instrumentId, newDrumset);
723+
724+
for (auto pair : part->instruments()) {
725+
Instrument* instrument = pair.second;
726+
if (instrument && instrument->drumset() && instrument->id() == instrumentKey.instrumentId) {
727+
EditPart::replaceDrumset(score(), part, Fraction::fromTicks(pair.first), newDrumset);
728+
}
729+
}
730+
724731
apply();
725732
} else {
726733
for (auto pair : part->instruments()) {

0 commit comments

Comments
 (0)