From 9f63f47c7d91a71dcdbde39535e57688fb20ed77 Mon Sep 17 00:00:00 2001 From: Roman Pudashkin Date: Tue, 4 Jul 2023 11:41:43 +0300 Subject: [PATCH] fix #18065: add Capo if it is not in the Guitar palette --- src/engraving/types/constants.h | 1 + src/palette/internal/palette.cpp | 3 +++ src/palette/internal/palettecompat.cpp | 30 ++++++++++++++++++++++++++ src/palette/internal/palettecompat.h | 5 +++++ 4 files changed, 39 insertions(+) diff --git a/src/engraving/types/constants.h b/src/engraving/types/constants.h index 2d21d7761c7c1..6aaa8409962b5 100644 --- a/src/engraving/types/constants.h +++ b/src/engraving/types/constants.h @@ -83,6 +83,7 @@ struct Constants // - A bunch of new options for dynamics // - Clefs carry a "header" tag in the file (istead of trying to guess it from context) // - New "Ornament" item with new properties and options +// - New "Capo" item constexpr static int DIVISION = 480; constexpr static BeatsPerSecond DEFAULT_TEMPO = 2.0; //default tempo is equal 120 bpm diff --git a/src/palette/internal/palette.cpp b/src/palette/internal/palette.cpp index 00828be79b3ad..f863394198442 100644 --- a/src/palette/internal/palette.cpp +++ b/src/palette/internal/palette.cpp @@ -42,6 +42,7 @@ #include "palettelayout.h" #include "palettecell.h" +#include "palettecompat.h" #include "log.h" @@ -317,6 +318,8 @@ bool Palette::read(XmlReader& e, bool pasteMode) m_type = guessType(); } + PaletteCompat::addNewItemsIfNeeded(*this, gpaletteScore); + return true; } diff --git a/src/palette/internal/palettecompat.cpp b/src/palette/internal/palettecompat.cpp index 3308dd2956e0b..bcf9000147fb4 100644 --- a/src/palette/internal/palettecompat.cpp +++ b/src/palette/internal/palettecompat.cpp @@ -34,8 +34,12 @@ #include "libmscore/ornament.h" #include "libmscore/score.h" #include "libmscore/stafftext.h" +#include "libmscore/capo.h" #include "engraving/types/symid.h" +#include "palette.h" +#include "palettecell.h" + using namespace mu::palette; using namespace mu::engraving; @@ -69,3 +73,29 @@ void PaletteCompat::migrateOldPaletteItemIfNeeded(ElementPtr& element, Score* pa element.reset(newExpression); } } + +void PaletteCompat::addNewItemsIfNeeded(Palette& palette, Score* paletteScore) +{ + if (palette.type() == Palette::Type::Guitar) { + addNewGuitarItems(palette, paletteScore); + } +} + +void PaletteCompat::addNewGuitarItems(Palette& guitarPalette, Score* paletteScore) +{ + bool containsCapo = false; + + for (const PaletteCellPtr& cell : guitarPalette.cells()) { + if (cell->element && cell->element->isCapo()) { + containsCapo = true; + break; + } + } + + if (!containsCapo) { + auto capo = std::make_shared(paletteScore->dummy()->segment()); + capo->setXmlText(String::fromAscii(QT_TRANSLATE_NOOP("palette", "Capo"))); + int defaultPosition = std::min(7, guitarPalette.cellsCount()); + guitarPalette.insertElement(defaultPosition, capo, QT_TRANSLATE_NOOP("palette", "Capo"))->setElementTranslated(true); + } +} diff --git a/src/palette/internal/palettecompat.h b/src/palette/internal/palettecompat.h index 109b0191486c2..628a496020504 100644 --- a/src/palette/internal/palettecompat.h +++ b/src/palette/internal/palettecompat.h @@ -26,10 +26,15 @@ #include "libmscore/engravingitem.h" namespace mu::palette { +class Palette; class PaletteCompat { public: static void migrateOldPaletteItemIfNeeded(engraving::ElementPtr& element, engraving::Score* paletteScore); + static void addNewItemsIfNeeded(Palette& palette, engraving::Score* paletteScore); + +private: + static void addNewGuitarItems(Palette& guitarPalette, engraving::Score* paletteScore); }; } // namespace mu::palette #endif // MU_PALETTE_PALETTECOMPAT_H