@@ -710,14 +710,18 @@ FBox::FBox(System* parent)
710710
711711void FBox::init ()
712712{
713- std::vector<FretDiagram*> newDiagrams;
714- StringList newDiagramsNames;
713+ LOGDA () << " ============= init" ;
715714
716715 StringList oldDiagramsNames;
716+ std::vector<FretDiagram*> oldDiagrams;
717717 for (EngravingItem* element : el ()) {
718- oldDiagramsNames.push_back (toFretDiagram (element)->harmonyText ().toLower ());
718+ FretDiagram* diagram = toFretDiagram (element);
719+ oldDiagrams.push_back (diagram);
720+ oldDiagramsNames.push_back (diagram->harmonyText ().toLower ());
719721 }
720722
723+ StringList diagramsNamesInScore;
724+ std::vector<EngravingItem*> harmonyOrDiagramsInScore;
721725 for (mu::engraving::Segment* segment = masterScore ()->firstSegment (mu::engraving::SegmentType::ChordRest); segment;
722726 segment = segment->next1 (mu::engraving::SegmentType::ChordRest)) {
723727 for (EngravingItem* item : segment->annotations ()) {
@@ -729,35 +733,36 @@ void FBox::init()
729733 continue ;
730734 }
731735
732- FretDiagram* fretDiagram = FretDiagram::makeFromHarmonyOrFretDiagram (item);
733- if (!fretDiagram) {
736+ if (!(item->isHarmony () || item->isFretDiagram ())) {
734737 continue ;
735738 }
736739
737- String harmonyName = fretDiagram->harmonyText ().toLower ();
738- if (muse::contains (newDiagramsNames, harmonyName) || harmonyName.empty ()) {
739- delete fretDiagram;
740+ String harmonyName = item->isHarmony () ? toHarmony (item)->plainText ().toLower ()
741+ : item->isFretDiagram () ? toFretDiagram (item)->harmonyText ().toLower ()
742+ : String ();
743+ if (harmonyName.empty () || muse::contains (diagramsNamesInScore, harmonyName)) {
740744 continue ;
741745 }
742746
743- newDiagrams. emplace_back (fretDiagram );
744- newDiagramsNames .push_back (harmonyName);
747+ harmonyOrDiagramsInScore. push_back (item );
748+ diagramsNamesInScore .push_back (harmonyName);
745749 }
746750 }
747751
748- if (newDiagramsNames == oldDiagramsNames) {
749- muse::DeleteAll (newDiagrams);
750- return ;
752+ for (size_t i = 0 ; i < oldDiagramsNames.size (); ++i) {
753+ String oldName = oldDiagramsNames[i];
754+ if (!muse::contains (diagramsNamesInScore, oldName)) {
755+ score ()->undoRemoveElement (oldDiagrams[i]);
756+ }
751757 }
752758
753- DEFER {
754- triggerLayout ();
755- };
756-
757- clearElements ();
758-
759- for (FretDiagram* diagram : newDiagrams) {
760- add (diagram);
759+ for (size_t i = 0 ; i < diagramsNamesInScore.size (); ++i) {
760+ String newName = diagramsNamesInScore[i];
761+ if (!muse::contains (oldDiagramsNames, newName)) {
762+ FretDiagram* newDiagram = FretDiagram::makeFromHarmonyOrFretDiagram (harmonyOrDiagramsInScore[i]);
763+ newDiagram->setParent (this );
764+ score ()->undoAddElement (newDiagram);
765+ }
761766 }
762767
763768 if (m_diagramsOrder.empty ()) {
0 commit comments