LCOV - code coverage report
Current view: top level - src/palette/internal - palettecreator.cpp Coverage Total Hit
Test: filtered_coverage.info Lines: 0.0 % 1122 0
Test Date: 2026-11-05 04:07:02

            Line data    Source code
       1              : /*
       2              :  * SPDX-License-Identifier: GPL-3.0-only
       3              :  * MuseScore-Studio-CLA-applies
       4              :  *
       5              :  * MuseScore Studio
       6              :  * Music Composition & Notation
       7              :  *
       8              :  * Copyright (C) 2021 MuseScore Limited and others
       9              :  *
      10              :  * This program is free software: you can redistribute it and/or modify
      11              :  * it under the terms of the GNU General Public License version 3 as
      12              :  * published by the Free Software Foundation.
      13              :  *
      14              :  * This program is distributed in the hope that it will be useful,
      15              :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      16              :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      17              :  * GNU General Public License for more details.
      18              :  *
      19              :  * You should have received a copy of the GNU General Public License
      20              :  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
      21              :  */
      22              : 
      23              : #include "palettecreator.h"
      24              : 
      25              : #include "translation.h"
      26              : 
      27              : #include "engraving/types/typesconv.h"
      28              : #include "engraving/types/symnames.h"
      29              : 
      30              : #include "engraving/dom/accidental.h"
      31              : #include "engraving/dom/actionicon.h"
      32              : #include "engraving/dom/ambitus.h"
      33              : #include "engraving/dom/arpeggio.h"
      34              : #include "engraving/dom/articulation.h"
      35              : #include "engraving/dom/bagpembell.h"
      36              : #include "engraving/dom/barline.h"
      37              : #include "engraving/dom/bracket.h"
      38              : #include "engraving/dom/breath.h"
      39              : #include "engraving/dom/capo.h"
      40              : #include "engraving/dom/chord.h"
      41              : #include "engraving/dom/chordbracket.h"
      42              : #include "engraving/dom/chordline.h"
      43              : #include "engraving/dom/chordrest.h"
      44              : #include "engraving/dom/clef.h"
      45              : #include "engraving/dom/dynamic.h"
      46              : #include "engraving/dom/expression.h"
      47              : #include "engraving/dom/factory.h"
      48              : #include "engraving/dom/fermata.h"
      49              : #include "engraving/dom/fingering.h"
      50              : #include "engraving/dom/fret.h"
      51              : #include "engraving/dom/glissando.h"
      52              : #include "engraving/dom/gradualtempochange.h"
      53              : #include "engraving/dom/guitarbend.h"
      54              : #include "engraving/dom/hairpin.h"
      55              : #include "engraving/dom/hammeronpulloff.h"
      56              : #include "engraving/dom/harppedaldiagram.h"
      57              : #include "engraving/dom/instrchange.h"
      58              : #include "engraving/dom/jump.h"
      59              : #include "engraving/dom/keysig.h"
      60              : #include "engraving/dom/layoutbreak.h"
      61              : #include "engraving/dom/letring.h"
      62              : #include "engraving/dom/marker.h"
      63              : #include "engraving/dom/masterscore.h"
      64              : #include "engraving/dom/measure.h"
      65              : #include "engraving/dom/measurenumber.h"
      66              : #include "engraving/dom/measurerepeat.h"
      67              : #include "engraving/dom/note.h"
      68              : #include "engraving/dom/ornament.h"
      69              : #include "engraving/dom/ottava.h"
      70              : #include "engraving/dom/palmmute.h"
      71              : #include "engraving/dom/part.h"
      72              : #include "engraving/dom/pedal.h"
      73              : #include "engraving/dom/playtechannotation.h"
      74              : #include "engraving/dom/rehearsalmark.h"
      75              : #include "engraving/dom/segment.h"
      76              : #include "engraving/dom/slur.h"
      77              : #include "engraving/dom/spacer.h"
      78              : #include "engraving/dom/staff.h"
      79              : #include "engraving/dom/stafftext.h"
      80              : #include "engraving/dom/stringtunings.h"
      81              : #include "engraving/dom/systemtext.h"
      82              : #include "engraving/dom/tapping.h"
      83              : #include "engraving/dom/tempotext.h"
      84              : #include "engraving/dom/textline.h"
      85              : #include "engraving/dom/timesig.h"
      86              : #include "engraving/dom/tremolosinglechord.h"
      87              : #include "engraving/dom/tremolotwochord.h"
      88              : #include "engraving/dom/tremolobar.h"
      89              : #include "engraving/dom/trill.h"
      90              : #include "engraving/dom/vibrato.h"
      91              : #include "engraving/dom/volta.h"
      92              : #include "engraving/dom/whammybar.h"
      93              : 
      94              : #include "engraving/editing/editstaffbrackets.h"
      95              : 
      96              : using namespace mu;
      97              : using namespace mu::palette;
      98              : using namespace mu::engraving;
      99              : 
     100              : static const qreal FRAME_MAG = 1.25;
     101              : 
     102              : // Default wrapper...
     103              : template<class C>
     104              : struct makeElementImplWrapper {
     105              :     template<typename ... Args>
     106            0 :     static std::shared_ptr<C> makeElementImpl(mu::engraving::Score* score, Args&&... args)
     107              :     {
     108            0 :         return std::make_shared<C>(score->dummy(), std::forward<Args>(args)...);
     109              :     }
     110              : };
     111              : 
     112              : // Specialised wrappers...
     113              : #define IMPL_WRAPPER(T, P) \
     114              :     template<> \
     115              :     struct makeElementImplWrapper<T> { \
     116              :         template<typename ... Args> \
     117              :         static std::shared_ptr<T> makeElementImpl(mu::engraving::Score * score, Args && ... args) \
     118              :         { \
     119              :             return std::make_shared<T>(P, std::forward<Args>(args)...); \
     120              :         } \
     121              :     }; \
     122              : 
     123            0 : IMPL_WRAPPER(Dynamic, score->dummy())
     124            0 : IMPL_WRAPPER(MeasureRepeat, score->dummy())
     125              : IMPL_WRAPPER(Hairpin, score->dummy())
     126            0 : IMPL_WRAPPER(SystemText, score->dummy())
     127            0 : IMPL_WRAPPER(TempoText, score->dummy())
     128            0 : IMPL_WRAPPER(StaffText, score->dummy())
     129            0 : IMPL_WRAPPER(Expression, score->dummy())
     130            0 : IMPL_WRAPPER(PlayTechAnnotation, score->dummy())
     131            0 : IMPL_WRAPPER(Capo, score->dummy())
     132            0 : IMPL_WRAPPER(StringTunings, score->dummy())
     133            0 : IMPL_WRAPPER(RehearsalMark, score->dummy())
     134              : 
     135            0 : IMPL_WRAPPER(Jump, score->dummy())
     136            0 : IMPL_WRAPPER(MeasureNumber, score->dummy())
     137              : 
     138            0 : IMPL_WRAPPER(Fingering, score->dummy())
     139            0 : IMPL_WRAPPER(NoteHead, score->dummy())
     140              : 
     141              : // Dispatcher method ...
     142              : template<class C, typename ... Args>
     143            0 : std::shared_ptr<C> makeElement(mu::engraving::Score* score, Args&&... args)
     144              : {
     145            0 :     return makeElementImplWrapper<C>::makeElementImpl(score, std::forward<Args>(args)...);
     146              : }
     147              : 
     148            0 : engraving::MasterScore* PaletteCreator::paletteScore() const
     149              : {
     150            0 :     return paletteScoreProvider()->paletteScore();
     151              : }
     152              : 
     153            0 : PaletteTreePtr PaletteCreator::newMasterPaletteTree()
     154              : {
     155            0 :     PaletteTreePtr tree = std::make_shared<PaletteTree>();
     156              : 
     157            0 :     tree->append(newClefsPalette());
     158            0 :     tree->append(newKeySigPalette());
     159            0 :     tree->append(newTimePalette());
     160            0 :     tree->append(newTempoPalette());
     161            0 :     tree->append(newPitchPalette());
     162            0 :     tree->append(newAccidentalsPalette());
     163            0 :     tree->append(newDynamicsPalette());
     164            0 :     tree->append(newArticulationsPalette());
     165            0 :     tree->append(newTextPalette());
     166            0 :     tree->append(newKeyboardPalette());
     167            0 :     tree->append(newRepeatsPalette());
     168            0 :     tree->append(newBarLinePalette());
     169            0 :     tree->append(newLayoutPalette());
     170            0 :     tree->append(newBracketsPalette());
     171            0 :     tree->append(newOrnamentsPalette());
     172            0 :     tree->append(newBreathPalette());
     173            0 :     tree->append(newGraceNotePalette());
     174            0 :     tree->append(newNoteHeadsPalette());
     175            0 :     tree->append(newArpeggioPalette());
     176            0 :     tree->append(newTremoloPalette());
     177            0 :     tree->append(newHarpPalette());
     178            0 :     tree->append(newGuitarPalette());
     179            0 :     tree->append(newFingeringPalette());
     180            0 :     tree->append(newFretboardDiagramPalette());
     181            0 :     tree->append(newAccordionPalette());
     182            0 :     tree->append(newBagpipeEmbellishmentPalette());
     183            0 :     tree->append(newHandbellsPalette());
     184            0 :     tree->append(newBeamPalette());
     185            0 :     tree->append(newLinesPalette());
     186              : 
     187            0 :     return tree;
     188            0 : }
     189              : 
     190            0 : PaletteTreePtr PaletteCreator::newDefaultPaletteTree()
     191              : {
     192            0 :     PaletteTreePtr defaultPalette = std::make_shared<PaletteTree>();
     193              : 
     194            0 :     defaultPalette->append(newClefsPalette(true));
     195            0 :     defaultPalette->append(newKeySigPalette());
     196            0 :     defaultPalette->append(newTimePalette(true));
     197            0 :     defaultPalette->append(newTempoPalette(true));
     198            0 :     defaultPalette->append(newPitchPalette(true));
     199            0 :     defaultPalette->append(newAccidentalsPalette(true));
     200            0 :     defaultPalette->append(newDynamicsPalette(true));
     201            0 :     defaultPalette->append(newArticulationsPalette(true));
     202            0 :     defaultPalette->append(newTextPalette(true));
     203            0 :     defaultPalette->append(newKeyboardPalette());
     204            0 :     defaultPalette->append(newRepeatsPalette(true));
     205            0 :     defaultPalette->append(newBarLinePalette(true));
     206            0 :     defaultPalette->append(newLayoutPalette());
     207            0 :     defaultPalette->append(newBracketsPalette());
     208            0 :     defaultPalette->append(newOrnamentsPalette(true));
     209            0 :     defaultPalette->append(newBreathPalette(true));
     210            0 :     defaultPalette->append(newGraceNotePalette());
     211            0 :     defaultPalette->append(newNoteHeadsPalette());
     212            0 :     defaultPalette->append(newArpeggioPalette());
     213            0 :     defaultPalette->append(newTremoloPalette());
     214            0 :     defaultPalette->append(newHarpPalette());
     215            0 :     defaultPalette->append(newGuitarPalette(true));
     216            0 :     defaultPalette->append(newFingeringPalette(true));
     217            0 :     defaultPalette->append(newFretboardDiagramPalette(true));
     218            0 :     defaultPalette->append(newAccordionPalette());
     219            0 :     defaultPalette->append(newBagpipeEmbellishmentPalette());
     220            0 :     defaultPalette->append(newHandbellsPalette(true));
     221            0 :     defaultPalette->append(newBeamPalette());
     222            0 :     defaultPalette->append(newLinesPalette(true));
     223            0 :     return defaultPalette;
     224            0 : }
     225              : 
     226            0 : PalettePtr PaletteCreator::newBeamPalette()
     227              : {
     228            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Beam);
     229            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Beam properties"));
     230            0 :     sp->setGridSize(35, 33);
     231            0 :     sp->setDrawGrid(true);
     232            0 :     sp->setVisible(false);
     233              : 
     234            0 :     sp->appendActionIcon(ActionIconType::BEAM_AUTO)->mag = 1.4;
     235            0 :     sp->appendActionIcon(ActionIconType::BEAM_NONE)->mag = 1.4;
     236            0 :     sp->appendActionIcon(ActionIconType::BEAM_BREAK_LEFT)->mag = 1.4;
     237            0 :     sp->appendActionIcon(ActionIconType::BEAM_BREAK_INNER_8TH)->mag = 1.4;
     238            0 :     sp->appendActionIcon(ActionIconType::BEAM_BREAK_INNER_16TH)->mag = 1.4;
     239            0 :     sp->appendActionIcon(ActionIconType::BEAM_JOIN)->mag = 1.4;
     240            0 :     sp->appendActionIcon(ActionIconType::BEAM_FEATHERED_DECELERATE)->mag = 1.4;
     241            0 :     sp->appendActionIcon(ActionIconType::BEAM_FEATHERED_ACCELERATE)->mag = 1.4;
     242              : 
     243            0 :     return sp;
     244            0 : }
     245              : 
     246            0 : PalettePtr PaletteCreator::newDynamicsPalette(bool defaultPalette)
     247              : {
     248            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Dynamic);
     249            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Dynamics"));
     250            0 :     sp->setGridSize(defaultPalette ? 50 : 60, 28);
     251            0 :     sp->setDrawGrid(true);
     252              : 
     253              :     static const std::vector<const char*> defaultDynamics = {
     254              :         "ppp", "pp", "p", "mp", "mf", "f", "ff", "fff",
     255              :         "fp", "pf", "sf", "sfz", "sff", "sffz", "sfp",
     256              :         "rfz", "rf", "fz"
     257            0 :     };
     258              : 
     259              :     static const std::vector<const char*> masterDynamics = {
     260              :         "pppppp", "ppppp", "pppp",
     261              :         "ppp", "pp", "p", "mp", "mf", "f", "ff", "fff",
     262              :         "ffff", "fffff", "ffffff",
     263              :         "fp", "pf", "sf", "sfz", "sff", "sffz", "sfff", "sfffz",
     264              :         "sfp", "sfpp", "rfz", "rf", "fz", "m", "r", "s", "z", "n"
     265            0 :     };
     266              : 
     267            0 :     for (const char* dynamicType : defaultPalette ? defaultDynamics : masterDynamics) {
     268            0 :         auto dynamic = makeElement<Dynamic>(paletteScore());
     269            0 :         dynamic->setDynamicType(String::fromAscii(dynamicType));
     270            0 :         sp->appendElement(dynamic, TConv::userName(dynamic->dynamicType()));
     271            0 :     }
     272              : 
     273              :     static const std::vector<HairpinType> hairpins {
     274              :         HairpinType::CRESC_LINE,
     275              :         HairpinType::DIM_LINE,
     276              :         HairpinType::CRESC_HAIRPIN,
     277              :         HairpinType::DIM_HAIRPIN,
     278            0 :     };
     279              : 
     280            0 :     for (HairpinType hairpinType : hairpins) {
     281            0 :         auto hairpin = Factory::makeHairpin(paletteScore()->dummy());
     282            0 :         hairpin->setHairpinType(hairpinType);
     283            0 :         qreal mag = (hairpinType == HairpinType::CRESC_LINE || hairpinType == HairpinType::DIM_LINE) ? 1 : 0.9;
     284            0 :         const QPointF offset = hairpinType == HairpinType::CRESC_LINE ? QPointF(1, 0.25)
     285            0 :                                : hairpinType == HairpinType::DIM_LINE ? QPointF(1, 0.0)
     286            0 :                                : QPointF(0, 0);
     287            0 :         sp->appendElement(hairpin, hairpin->subtypeUserName(), mag, offset);
     288            0 :     }
     289              : 
     290            0 :     return sp;
     291            0 : }
     292              : 
     293            0 : PalettePtr PaletteCreator::newKeySigPalette()
     294              : {
     295            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::KeySig);
     296            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Key signatures"));
     297            0 :     sp->setMag(0.8);
     298            0 :     sp->setGridSize(56, 47);
     299            0 :     sp->setDrawGrid(true);
     300            0 :     sp->setYOffset(1.0);
     301              : 
     302            0 :     for (int i = 0; i < 7; ++i) {
     303            0 :         auto k = Factory::makeKeySig(paletteScore()->dummy());
     304            0 :         k->setKey(Key(i + 1));
     305            0 :         sp->appendElement(k, TConv::userName(Key(i + 1)));
     306            0 :     }
     307            0 :     for (int i = -7; i < 0; ++i) {
     308            0 :         auto k = Factory::makeKeySig(paletteScore()->dummy());
     309            0 :         k->setKey(Key(i));
     310            0 :         sp->appendElement(k, TConv::userName(Key(i)));
     311            0 :     }
     312            0 :     auto k = Factory::makeKeySig(paletteScore()->dummy());
     313            0 :     k->setKey(Key::C);
     314            0 :     sp->appendElement(k, TConv::userName(Key::C));
     315              : 
     316              :     // atonal key signature
     317            0 :     KeySigEvent nke;
     318            0 :     nke.setConcertKey(Key::C);
     319            0 :     nke.setCustom(true);
     320            0 :     nke.setMode(KeyMode::NONE);
     321            0 :     auto nk = Factory::makeKeySig(paletteScore()->dummy());
     322            0 :     nk->setKeySigEvent(nke);
     323            0 :     sp->appendElement(nk, TConv::userName(Key::C, true));
     324              : 
     325            0 :     return sp;
     326            0 : }
     327              : 
     328            0 : PalettePtr PaletteCreator::newAccidentalsPalette(bool defaultPalette)
     329              : {
     330            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Accidental);
     331            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Accidentals"));
     332            0 :     sp->setGridSize(33, 36);
     333            0 :     sp->setDrawGrid(true);
     334              : 
     335            0 :     int end = 0;
     336            0 :     if (defaultPalette) {
     337            0 :         end = int(AccidentalType::SHARP3);
     338              :     } else {
     339            0 :         end = int(AccidentalType::END);
     340              :     }
     341              : 
     342            0 :     for (int i = int(AccidentalType::FLAT); i < end; ++i) {
     343            0 :         auto ac = Factory::makeAccidental(paletteScore()->dummy());
     344            0 :         ac->setAccidentalType(AccidentalType(i));
     345            0 :         if (ac->symId() != SymId::noSym) {
     346            0 :             sp->appendElement(ac, ac->subtypeUserName());
     347              :         }
     348            0 :     }
     349              : 
     350            0 :     if (!defaultPalette) {
     351            0 :         sp->appendActionIcon(ActionIconType::PARENTHESES);
     352            0 :         sp->appendActionIcon(ActionIconType::BRACKETS);
     353              :     }
     354              : 
     355            0 :     return sp;
     356            0 : }
     357              : 
     358            0 : PalettePtr PaletteCreator::newBarLinePalette(bool defaultPalette)
     359              : {
     360            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::BarLine);
     361            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Barlines"));
     362            0 :     sp->setMag(0.8);
     363            0 :     sp->setGridSize(48, 38);
     364            0 :     sp->setDrawGrid(true);
     365              : 
     366              :     // bar line styles
     367            0 :     for (const BarLineTableItem& bti : BarLine::barLineTable) {
     368            0 :         auto b = Factory::makeBarLine(paletteScore()->dummy());
     369            0 :         b->setBarLineType(bti.type);
     370            0 :         sp->appendElement(b, bti.userName);
     371            0 :     }
     372              : 
     373              :     // bar line spans
     374            0 :     if (!defaultPalette) {
     375              :         const struct {
     376              :             int from, to;
     377              :             muse::TranslatableString userName;
     378              :         } spans[] = {
     379              :             { BARLINE_SPAN_TICK1_FROM,  BARLINE_SPAN_TICK1_TO,  SymNames::userNameForSymId(SymId::barlineTick) },
     380              :             { BARLINE_SPAN_TICK2_FROM,  BARLINE_SPAN_TICK2_TO,  muse::TranslatableString("engraving/sym", "Tick barline 2") },  // Not in SMuFL
     381              :             { BARLINE_SPAN_SHORT1_FROM, BARLINE_SPAN_SHORT1_TO, SymNames::userNameForSymId(SymId::barlineShort) },
     382              :             { BARLINE_SPAN_SHORT2_FROM, BARLINE_SPAN_SHORT2_TO, muse::TranslatableString("engraving/sym", "Short barline 2") }, // Not in SMuFL
     383            0 :         };
     384            0 :         for (auto span : spans) {
     385            0 :             auto b = Factory::makeBarLine(paletteScore()->dummy());
     386            0 :             b->setBarLineType(BarLineType::NORMAL);
     387            0 :             b->setSpanFrom(span.from);
     388            0 :             b->setSpanTo(span.to);
     389            0 :             sp->appendElement(b, span.userName);
     390            0 :         }
     391            0 :     }
     392            0 :     return sp;
     393            0 : }
     394              : 
     395            0 : PalettePtr PaletteCreator::newRepeatsPalette(bool defaultPalette)
     396              : {
     397            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Repeat);
     398            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Repeats & jumps"));
     399            0 :     sp->setMag(0.75);
     400            0 :     sp->setGridSize(100, 28);
     401            0 :     sp->setDrawGrid(true);
     402              : 
     403              :     struct MeasureRepeatInfo
     404              :     {
     405              :         SymId id = SymId::noSym;
     406              :         int measuresCount = 0;
     407              :     };
     408              : 
     409              :     const std::vector<MeasureRepeatInfo> defaultMeasureRepeats {
     410              :         { SymId::repeat1Bar, 1 }
     411            0 :     };
     412              : 
     413              :     const std::vector<MeasureRepeatInfo> masterMeasureRepeats {
     414              :         { SymId::repeat1Bar, 1 },
     415              :         { SymId::repeat2Bars, 2 },
     416              :         { SymId::repeat4Bars, 4 }
     417            0 :     };
     418              : 
     419            0 :     for (MeasureRepeatInfo repeat: defaultPalette ? defaultMeasureRepeats : masterMeasureRepeats) {
     420            0 :         std::shared_ptr<MeasureRepeat> rm = makeElement<MeasureRepeat>(paletteScore());
     421            0 :         rm->mutldata()->symId = repeat.id;
     422            0 :         rm->setNumMeasures(repeat.measuresCount);
     423            0 :         sp->appendElement(rm, SymNames::userNameForSymId(repeat.id));
     424            0 :     }
     425              : 
     426              :     const std::vector<MarkerType> defaultMarkers = {
     427              :         MarkerType::SEGNO, MarkerType::CODA, MarkerType::FINE, MarkerType::TOCODA, MarkerType::TOCODASYM
     428            0 :     };
     429              : 
     430              :     const std::vector<MarkerType> allMarkers = {
     431              :         MarkerType::SEGNO,
     432              :         MarkerType::VARSEGNO,
     433              :         MarkerType::CODA,
     434              :         MarkerType::VARCODA,
     435              :         MarkerType::CODETTA,
     436              :         MarkerType::FINE,
     437              :         MarkerType::TOCODA,
     438              :         MarkerType::TOCODASYM,
     439              :         MarkerType::DA_CODA,
     440              :         MarkerType::DA_DBLCODA,
     441              :         MarkerType::USER
     442            0 :     };
     443              : 
     444            0 :     for (MarkerType markerType : (defaultPalette ? defaultMarkers : allMarkers)) {
     445            0 :         if (markerType == MarkerType::CODETTA || markerType == MarkerType::USER) {// Codetta not in SMuFL
     446            0 :             continue;
     447              :         }
     448              : 
     449            0 :         auto mk = makeElement<Marker>(paletteScore());
     450            0 :         mk->setMarkerType(markerType);
     451            0 :         mk->styleChanged();
     452            0 :         sp->appendElement(mk, TConv::userName(markerType));
     453            0 :     }
     454              : 
     455              :     const std::vector<JumpTypeTableItem> defaultJumpTypeTable {
     456              :         { JumpType::DC,         "D.C.",         "start", "end",  "" },
     457              :         { JumpType::DC_AL_FINE, "D.C. al Fine", "start", "fine", "" },
     458              :         { JumpType::DC_AL_CODA, "D.C. al Coda", "start", "coda", "codab" },
     459              :         { JumpType::DS_AL_CODA, "D.S. al Coda", "segno", "coda", "codab" },
     460              :         { JumpType::DS_AL_FINE, "D.S. al Fine", "segno", "fine", "" },
     461              :         { JumpType::DS,         "D.S.",         "segno", "end",  "" },
     462            0 :     };
     463              : 
     464            0 :     for (const JumpTypeTableItem& item : (defaultPalette ? defaultJumpTypeTable : jumpTypeTable)) {
     465            0 :         auto jp = makeElement<Jump>(paletteScore());
     466            0 :         jp->setJumpType(item.type);
     467            0 :         sp->appendElement(jp, TConv::userName(item.type));
     468            0 :     }
     469              : 
     470            0 :     for (const BarLineTableItem& bti : BarLine::barLineTable) {
     471            0 :         switch (bti.type) {
     472            0 :         case BarLineType::START_REPEAT:
     473              :         case BarLineType::END_REPEAT:
     474              :         case BarLineType::END_START_REPEAT:
     475            0 :             break;
     476            0 :         default:
     477            0 :             continue;
     478              :         }
     479              : 
     480            0 :         auto b = Factory::makeBarLine(paletteScore()->dummy());
     481            0 :         b->setBarLineType(bti.type);
     482            0 :         PaletteCellPtr cell = sp->appendElement(b, bti.userName);
     483            0 :         cell->drawStaff = false;
     484            0 :     }
     485              : 
     486            0 :     auto volta = makeElement<Volta>(paletteScore());
     487            0 :     volta->setVoltaType(Volta::Type::CLOSED);
     488            0 :     volta->setText(u"1.");
     489            0 :     std::vector<int> il;
     490            0 :     il.push_back(1);
     491            0 :     volta->setEndings(il);
     492            0 :     sp->appendElement(volta, QT_TRANSLATE_NOOP("palette", "Prima volta"));
     493              : 
     494            0 :     volta = makeElement<Volta>(paletteScore());
     495            0 :     volta->setVoltaType(Volta::Type::OPEN);
     496            0 :     volta->setText(u"2.");
     497            0 :     il.clear();
     498            0 :     il.push_back(2);
     499            0 :     volta->setEndings(il);
     500            0 :     sp->appendElement(volta, QT_TRANSLATE_NOOP("palette", "Seconda volta, open"));
     501              : 
     502            0 :     volta = makeElement<Volta>(paletteScore());
     503            0 :     volta->setVoltaType(Volta::Type::CLOSED);
     504            0 :     volta->setText(u"2.");
     505            0 :     il.clear();
     506            0 :     il.push_back(2);
     507            0 :     volta->setEndings(il);
     508            0 :     sp->appendElement(volta, QT_TRANSLATE_NOOP("palette", "Seconda volta"));
     509              : 
     510            0 :     volta = makeElement<Volta>(paletteScore());
     511            0 :     volta->setVoltaType(Volta::Type::CLOSED);
     512            0 :     volta->setText(u"3.");
     513            0 :     il.clear();
     514            0 :     il.push_back(3);
     515            0 :     volta->setEndings(il);
     516            0 :     sp->appendElement(volta, QT_TRANSLATE_NOOP("palette", "Terza volta"));
     517              : 
     518            0 :     if (!defaultPalette) {
     519            0 :         auto vibrato = makeElement<Vibrato>(paletteScore());
     520            0 :         vibrato->setVibratoType(VibratoType::VIBRATO_SAWTOOTH);
     521            0 :         sp->appendElement(vibrato, TConv::userName(VibratoType::VIBRATO_SAWTOOTH));
     522              : 
     523            0 :         vibrato = makeElement<Vibrato>(paletteScore());
     524            0 :         vibrato->setVibratoType(VibratoType::VIBRATO_SAWTOOTH_WIDE);
     525            0 :         sp->appendElement(vibrato, TConv::userName(VibratoType::VIBRATO_SAWTOOTH_WIDE));
     526            0 :     }
     527              : 
     528            0 :     return sp;
     529            0 : }
     530              : 
     531            0 : PalettePtr PaletteCreator::newLayoutPalette()
     532              : {
     533            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Layout);
     534              :     //: The name of a palette
     535            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Layout"));
     536            0 :     sp->setGridSize(42, 36);
     537            0 :     sp->setDrawGrid(true);
     538              : 
     539              :     static const std::vector<LayoutBreakType> layoutBreaks  {
     540              :         LayoutBreakType::LINE,
     541              :         LayoutBreakType::PAGE,
     542              :         LayoutBreakType::SECTION,
     543              :         LayoutBreakType::NOBREAK
     544            0 :     };
     545            0 :     for (LayoutBreakType layoutBreakType : layoutBreaks) {
     546            0 :         auto lb = Factory::makeLayoutBreak(paletteScore()->dummy());
     547            0 :         lb->setLayoutBreakType(layoutBreakType);
     548            0 :         sp->appendElement(lb, TConv::userName(layoutBreakType));
     549            0 :     }
     550              : 
     551            0 :     sp->appendActionIcon(ActionIconType::SYSTEM_LOCK);
     552            0 :     sp->appendActionIcon(ActionIconType::PAGE_LOCK);
     553              : 
     554              :     static const std::vector<SpacerType> spacers  {
     555              :         SpacerType::DOWN,
     556              :         SpacerType::UP,
     557              :         SpacerType::FIXED
     558            0 :     };
     559            0 :     for (SpacerType spacerType : spacers) {
     560            0 :         auto spacer = Factory::makeSpacer(paletteScore()->dummy());
     561            0 :         spacer->setSpacerType(spacerType);
     562            0 :         spacer->setGap(3_sp);
     563            0 :         PaletteCellPtr cell = sp->appendElement(spacer, spacer->subtypeUserName());
     564            0 :         cell->mag = .7;
     565            0 :     }
     566              : 
     567            0 :     sp->appendActionIcon(ActionIconType::VFRAME, FRAME_MAG);
     568            0 :     sp->appendActionIcon(ActionIconType::HFRAME, FRAME_MAG);
     569            0 :     sp->appendActionIcon(ActionIconType::TFRAME, FRAME_MAG);
     570            0 :     sp->appendActionIcon(ActionIconType::FFRAME, FRAME_MAG);
     571            0 :     sp->appendActionIcon(ActionIconType::STAFF_TYPE_CHANGE);
     572            0 :     sp->appendActionIcon(ActionIconType::MEASURE);
     573              : 
     574            0 :     return sp;
     575            0 : }
     576              : 
     577            0 : PalettePtr PaletteCreator::newFingeringPalette(bool defaultPalette)
     578              : {
     579            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Fingering);
     580            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Fingerings"));
     581            0 :     sp->setMag(1.5);
     582            0 :     sp->setGridSize(28, 30);
     583            0 :     sp->setDrawGrid(true);
     584            0 :     sp->setVisible(false);
     585              : 
     586            0 :     const char* finger = "012345";
     587            0 :     for (unsigned i = 0; i < strlen(finger); ++i) {
     588            0 :         auto f = makeElement<Fingering>(paletteScore());
     589            0 :         f->setXmlText(QString(finger[i]));
     590            0 :         sp->appendElement(f, QT_TRANSLATE_NOOP("palette", "Fingering %1"));
     591            0 :     }
     592              : 
     593            0 :     finger = "pimac";
     594            0 :     for (unsigned i = 0; i < strlen(finger); ++i) {
     595            0 :         auto f = makeElement<Fingering>(paletteScore());
     596            0 :         f->setTextStyleType(TextStyleType::RH_GUITAR_FINGERING);
     597            0 :         f->setXmlText(QString(finger[i]));
     598            0 :         sp->appendElement(f, QT_TRANSLATE_NOOP("palette", "RH guitar fingering %1"));
     599            0 :     }
     600              : 
     601            0 :     finger = "012345T";
     602            0 :     for (unsigned i = 0; i < strlen(finger); ++i) {
     603            0 :         auto f = makeElement<Fingering>(paletteScore());
     604            0 :         f->setTextStyleType(TextStyleType::LH_GUITAR_FINGERING);
     605            0 :         f->setXmlText(QString(finger[i]));
     606            0 :         sp->appendElement(f, QT_TRANSLATE_NOOP("palette", "LH guitar fingering %1"));
     607            0 :     }
     608            0 :     finger = defaultPalette ? "123456" : "0123456789";
     609            0 :     for (unsigned i = 0; i < strlen(finger); ++i) {
     610            0 :         auto f = makeElement<Fingering>(paletteScore());
     611            0 :         f->initTextStyleType(TextStyleType::STRING_NUMBER);
     612            0 :         f->setXmlText(QString(finger[i]));
     613            0 :         sp->appendElement(f, QT_TRANSLATE_NOOP("palette", "String number %1"));
     614            0 :     }
     615              : 
     616              :     static const SymIdList defaultLute {
     617              :         SymId::stringsThumbPosition
     618            0 :     };
     619              :     static const SymIdList masterLute {
     620              :         SymId::stringsThumbPosition,
     621              :         SymId::luteFingeringRHThumb, SymId::luteFingeringRHFirst,
     622              :         SymId::luteFingeringRHSecond, SymId::luteFingeringRHThird
     623            0 :     };
     624              :     // include additional symbol-based fingerings (temporarily?) implemented as articulations
     625            0 :     for (auto i : defaultPalette ? defaultLute : masterLute) {
     626            0 :         auto s = Factory::makeArticulation(paletteScore()->dummy());
     627            0 :         s->setSymId(i);
     628            0 :         sp->appendElement(s, s->subtypeUserName());
     629            0 :     }
     630            0 :     return sp;
     631            0 : }
     632              : 
     633            0 : PalettePtr PaletteCreator::newTremoloPalette()
     634              : {
     635            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Tremolo);
     636            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Tremolos"));
     637            0 :     sp->setGridSize(27, 40);
     638            0 :     sp->setDrawGrid(true);
     639            0 :     sp->setVisible(false);
     640              : 
     641            0 :     for (int i = int(TremoloType::R8); i <= int(TremoloType::BUZZ_ROLL); ++i) {
     642            0 :         auto tremolo = Factory::makeTremoloSingleChord(paletteScore()->dummy());
     643            0 :         tremolo->setTremoloType(TremoloType(i));
     644            0 :         sp->appendElement(tremolo, tremolo->subtypeUserName());
     645            0 :     }
     646              : 
     647            0 :     for (int i = int(TremoloType::C8); i <= int(TremoloType::C256); ++i) {
     648            0 :         auto tremolo = Factory::makeTremoloTwoChord(paletteScore()->dummy());
     649            0 :         tremolo->setTremoloType(TremoloType(i));
     650            0 :         sp->appendElement(tremolo, tremolo->subtypeUserName());
     651            0 :     }
     652              : 
     653              :     static const SymIdList dots {
     654              :         SymId::tremoloDivisiDots2,
     655              :         SymId::tremoloDivisiDots3,
     656              :         SymId::tremoloDivisiDots4,
     657              :         SymId::tremoloDivisiDots6
     658            0 :     };
     659              :     // include additional symbol-based tremolo articulations, implemented as articulations
     660            0 :     for (auto i : dots) {
     661            0 :         auto s = Factory::makeArticulation(paletteScore()->dummy());
     662            0 :         s->setSymId(i);
     663            0 :         sp->appendElement(s, s->subtypeUserName());
     664            0 :     }
     665            0 :     return sp;
     666            0 : }
     667              : 
     668            0 : PalettePtr PaletteCreator::newNoteHeadsPalette()
     669              : {
     670            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::NoteHead);
     671            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Noteheads"));
     672            0 :     sp->setMag(1.3);
     673            0 :     sp->setGridSize(33, 36);
     674            0 :     sp->setDrawGrid(true);
     675            0 :     sp->setVisible(false);
     676              : 
     677            0 :     for (int i = 0; i < int(NoteHeadGroup::HEAD_DO_WALKER); ++i) {
     678            0 :         SymId sym = Note::noteHead(0, NoteHeadGroup(i), NoteHeadType::HEAD_HALF);
     679              :         // HEAD_BREVIS_ALT shows up only for brevis value
     680            0 :         if (i == int(NoteHeadGroup::HEAD_BREVIS_ALT)) {
     681            0 :             sym = Note::noteHead(0, NoteHeadGroup(i), NoteHeadType::HEAD_BREVIS);
     682              :         }
     683            0 :         auto nh = makeElement<NoteHead>(paletteScore());
     684            0 :         nh->setSym(sym);
     685            0 :         sp->appendElement(nh, TConv::userName((NoteHeadGroup(i))));
     686            0 :     }
     687              : 
     688            0 :     sp->appendActionIcon(ActionIconType::PARENTHESES);
     689              : 
     690            0 :     return sp;
     691            0 : }
     692              : 
     693            0 : PalettePtr PaletteCreator::newArticulationsPalette(bool defaultPalette)
     694              : {
     695            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Articulation);
     696            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Articulations"));
     697            0 :     sp->setGridSize(42, 25);
     698            0 :     sp->setDrawGrid(true);
     699              : 
     700            0 :     auto slur = Factory::makeSlur(paletteScore()->dummy());
     701            0 :     sp->appendElement(slur, QT_TRANSLATE_NOOP("palette", "Slur"));
     702              : 
     703              :     // do not include additional symbol-based fingerings (temporarily?) implemented as articulations
     704              :     static const SymIdList defaultArticulations {
     705              :         SymId::articAccentAbove,
     706              :         SymId::articStaccatoAbove,
     707              :         SymId::articStaccatissimoAbove,
     708              :         SymId::articTenutoAbove,
     709              :         SymId::articTenutoStaccatoAbove,
     710              :         SymId::articMarcatoAbove,
     711              :         SymId::articAccentStaccatoAbove,
     712              :         SymId::articMarcatoStaccatoAbove,
     713              :         SymId::articMarcatoTenutoAbove,
     714              :         SymId::articStaccatissimoStrokeAbove,
     715              :         SymId::articStaccatissimoWedgeAbove,
     716              :         SymId::articStressAbove,
     717              :         SymId::articTenutoAccentAbove,
     718              :         SymId::articUnstressAbove,
     719              :         SymId::brassMuteOpen,
     720              :         SymId::brassMuteClosed,
     721              :         SymId::stringsHarmonic,
     722              :         SymId::stringsUpBow,
     723              :         SymId::stringsDownBow
     724            0 :     };
     725              : 
     726              :     static const SymIdList masterArticulations {
     727              :         SymId::articAccentAbove,
     728              :         SymId::articStaccatoAbove,
     729              :         SymId::articStaccatissimoAbove,
     730              :         SymId::articTenutoAbove,
     731              :         SymId::articTenutoStaccatoAbove,
     732              :         SymId::articMarcatoAbove,
     733              :         SymId::articAccentStaccatoAbove,
     734              :         SymId::articMarcatoStaccatoAbove,
     735              :         SymId::articMarcatoTenutoAbove,
     736              :         SymId::articStaccatissimoStrokeAbove,
     737              :         SymId::articStaccatissimoWedgeAbove,
     738              :         SymId::articStressAbove,
     739              :         SymId::articTenutoAccentAbove,
     740              :         SymId::articUnstressAbove,
     741              : 
     742              :         SymId::articSoftAccentAbove,                        // supplemental articulations
     743              :         SymId::articSoftAccentStaccatoAbove,
     744              :         SymId::articSoftAccentTenutoAbove,
     745              :         SymId::articSoftAccentTenutoStaccatoAbove,
     746              : 
     747              :         SymId::guitarFadeIn,
     748              :         SymId::guitarFadeOut,
     749              :         SymId::guitarVolumeSwell,
     750              :         SymId::wiggleSawtooth,
     751              :         SymId::wiggleSawtoothWide,
     752              :         SymId::wiggleVibratoLargeFaster,
     753              :         SymId::wiggleVibratoLargeSlowest,
     754              :         SymId::brassMuteOpen,
     755              :         SymId::brassMuteClosed,
     756              :         SymId::stringsHarmonic,
     757              :         SymId::stringsUpBow,
     758              :         SymId::stringsDownBow,
     759              :         SymId::pluckedSnapPizzicatoAbove,
     760              :         SymId::pictHalfOpen2,
     761              :         // SymId::stringsThumbPosition,
     762              :         // SymId::luteFingeringRHThumb,
     763              :         // SymId::luteFingeringRHFirst,
     764              :         // SymId::luteFingeringRHSecond,
     765              :         // SymId::luteFingeringRHThird,
     766            0 :     };
     767              : 
     768            0 :     for (SymId articulationType : defaultPalette ? defaultArticulations : masterArticulations) {
     769            0 :         auto artic = Factory::makeArticulation(paletteScore()->dummy());
     770            0 :         artic->setSymId(articulationType);
     771            0 :         sp->appendElement(artic, artic->subtypeUserName());
     772            0 :     }
     773              : 
     774            0 :     return sp;
     775            0 : }
     776              : 
     777            0 : PalettePtr PaletteCreator::newOrnamentsPalette(bool defaultPalette)
     778              : {
     779            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Ornament);
     780            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Ornaments"));
     781            0 :     sp->setGridSize(73, 27);
     782            0 :     sp->setMag(1);
     783            0 :     sp->setDrawGrid(true);
     784            0 :     sp->setVisible(false);
     785              : 
     786              :     static const SymIdList defaultOrnaments {
     787              :         SymId::ornamentTurn,
     788              :         SymId::ornamentTurnInverted,
     789              :         SymId::ornamentTrill,
     790              :         SymId::ornamentShortTrill,
     791              :         SymId::ornamentMordent
     792            0 :     };
     793              : 
     794              :     static const SymIdList masterOrnaments {
     795              :         SymId::ornamentTurn,
     796              :         SymId::ornamentTurnInverted,
     797              :         SymId::ornamentTurnSlash,
     798              :         SymId::ornamentTurnUp,
     799              :         SymId::ornamentTurnUpS,
     800              :         SymId::ornamentTrill,
     801              :         SymId::ornamentShortTrill,
     802              :         SymId::ornamentMordent,
     803              :         SymId::ornamentHaydn,
     804              :         SymId::ornamentTremblement,
     805              :         SymId::ornamentPrallMordent,
     806              :         SymId::ornamentUpPrall,
     807              :         SymId::ornamentPrecompMordentUpperPrefix,           // SymId::ornamentDownPrall,
     808              :         SymId::ornamentUpMordent,
     809              :         SymId::ornamentDownMordent,
     810              :         SymId::ornamentPrallDown,
     811              :         SymId::ornamentPrallUp,
     812              :         SymId::ornamentLinePrall,
     813              :         SymId::ornamentPrecompSlide,
     814              :         SymId::ornamentShake3,
     815              :         SymId::ornamentShakeMuffat1,
     816              :         SymId::ornamentTremblementCouperin,
     817              :         SymId::ornamentPinceCouperin
     818            0 :     };
     819              : 
     820            0 :     for (auto ornamentType : defaultPalette ? defaultOrnaments : masterOrnaments) {
     821            0 :         auto ornament = Factory::makeOrnament(paletteScore()->dummy());
     822            0 :         ornament->setSymId(ornamentType);
     823            0 :         qreal mag = ornament->symId() == SymId::ornamentTrill ? 1.0 : 1.2;
     824            0 :         sp->appendElement(ornament, ornament->subtypeUserName(), mag);
     825            0 :     }
     826              : 
     827              :     static const std::vector<TrillType> trillTypes = {
     828              :         TrillType::TRILL_LINE, TrillType::UPPRALL_LINE, TrillType::DOWNPRALL_LINE, TrillType::PRALLPRALL_LINE,
     829            0 :     };
     830              : 
     831            0 :     for (TrillType trillType : trillTypes) {
     832            0 :         auto trill = makeElement<Trill>(paletteScore());
     833            0 :         trill->setTrillType(trillType);
     834              : 
     835            0 :         qreal mag = (trillType == TrillType::TRILL_LINE || trillType == TrillType::PRALLPRALL_LINE) ? 1.0 : 0.8;
     836            0 :         sp->appendElement(trill, TConv::userName(trillType), mag);
     837            0 :     }
     838              : 
     839            0 :     return sp;
     840            0 : }
     841              : 
     842            0 : PalettePtr PaletteCreator::newAccordionPalette()
     843              : {
     844            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Accordion);
     845              :     //: The name of a palette
     846            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Accordion"));
     847            0 :     sp->setGridSize(42, 25);
     848            0 :     sp->setDrawGrid(true);
     849            0 :     sp->setVisible(false);
     850              : 
     851              :     static const SymIdList art {
     852              :         SymId::accdnCombDot,
     853              :         SymId::accdnCombLH2RanksEmpty,
     854              :         SymId::accdnCombLH3RanksEmptySquare,
     855              :         SymId::accdnCombRH3RanksEmpty,
     856              :         SymId::accdnCombRH4RanksEmpty,
     857              :         SymId::accdnDiatonicClef,
     858              :         SymId::accdnLH2Ranks16Round,
     859              :         SymId::accdnLH2Ranks8Plus16Round,
     860              :         SymId::accdnLH2Ranks8Round,
     861              :         SymId::accdnLH2RanksFullMasterRound,
     862              : 
     863              :         SymId::accdnLH2RanksMasterPlus16Round,
     864              :         SymId::accdnLH2RanksMasterRound,
     865              :         SymId::accdnLH3Ranks2Plus8Square,
     866              :         SymId::accdnLH3Ranks2Square,
     867              :         SymId::accdnLH3Ranks8Square,
     868              :         SymId::accdnLH3RanksDouble8Square,
     869              :         SymId::accdnLH3RanksTuttiSquare,
     870              :         SymId::accdnPull,
     871              :         SymId::accdnPush,
     872              :         SymId::accdnRH3RanksAccordion,
     873              : 
     874              :         SymId::accdnRH3RanksAuthenticMusette,
     875              :         SymId::accdnRH3RanksBandoneon,
     876              :         SymId::accdnRH3RanksBassoon,
     877              :         SymId::accdnRH3RanksClarinet,
     878              :         SymId::accdnRH3RanksDoubleTremoloLower8ve,
     879              :         SymId::accdnRH3RanksDoubleTremoloUpper8ve,
     880              :         SymId::accdnRH3RanksFullFactory,
     881              :         SymId::accdnRH3RanksHarmonium,
     882              :         SymId::accdnRH3RanksImitationMusette,
     883              :         SymId::accdnRH3RanksLowerTremolo8,
     884              : 
     885              :         SymId::accdnRH3RanksMaster,
     886              :         SymId::accdnRH3RanksOboe,
     887              :         SymId::accdnRH3RanksOrgan,
     888              :         SymId::accdnRH3RanksPiccolo,
     889              :         SymId::accdnRH3RanksTremoloLower8ve,
     890              :         SymId::accdnRH3RanksTremoloUpper8ve,
     891              :         SymId::accdnRH3RanksTwoChoirs,
     892              :         SymId::accdnRH3RanksUpperTremolo8,
     893              :         SymId::accdnRH3RanksViolin,
     894              :         SymId::accdnRH4RanksAlto,
     895              : 
     896              :         SymId::accdnRH4RanksBassAlto,
     897              :         SymId::accdnRH4RanksMaster,
     898              :         SymId::accdnRH4RanksSoftBass,
     899              :         SymId::accdnRH4RanksSoftTenor,
     900              :         SymId::accdnRH4RanksSoprano,
     901              :         SymId::accdnRH4RanksTenor,
     902              :         SymId::accdnRicochet2,
     903              :         SymId::accdnRicochet3,
     904              :         SymId::accdnRicochet4,
     905              :         SymId::accdnRicochet5,
     906              : 
     907              :         SymId::accdnRicochet6,
     908              :         SymId::accdnRicochetStem2,
     909              :         SymId::accdnRicochetStem3,
     910              :         SymId::accdnRicochetStem4,
     911              :         SymId::accdnRicochetStem5,
     912              :         SymId::accdnRicochetStem6
     913            0 :     };
     914            0 :     for (auto i : art) {
     915            0 :         auto s = makeElement<Symbol>(paletteScore());
     916            0 :         s->setSym(i);
     917            0 :         sp->appendElement(s, SymNames::userNameForSymId(i));
     918            0 :     }
     919            0 :     return sp;
     920            0 : }
     921              : 
     922            0 : PalettePtr PaletteCreator::newBracketsPalette()
     923              : {
     924            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Bracket);
     925            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Brackets"));
     926            0 :     sp->setMag(0.7);
     927            0 :     sp->setGridSize(40, 80);
     928            0 :     sp->setDrawGrid(true);
     929            0 :     sp->setVisible(false);
     930              : 
     931            0 :     const std::array<std::pair<BracketType, const char*>, 5> types { {
     932              :         { BracketType::NORMAL, QT_TRANSLATE_NOOP("palette", "Bracket") },
     933              :         { BracketType::BRACE,  QT_TRANSLATE_NOOP("palette", "Brace") },
     934              :         { BracketType::SQUARE, QT_TRANSLATE_NOOP("palette", "Square") },
     935              :         { BracketType::LINE,   QT_TRANSLATE_NOOP("palette", "Line") },
     936              :         { BracketType::GROUP,  QT_TRANSLATE_NOOP("palette", "Group bracket") }
     937              :     } };
     938              : 
     939              :     static Part* bracketItemOwnerPart = nullptr;
     940              :     static Staff* bracketItemOwner = nullptr;
     941            0 :     if (!bracketItemOwner) {
     942            0 :         bracketItemOwnerPart = new Part(paletteScore());
     943            0 :         bracketItemOwner = Factory::createStaff(bracketItemOwnerPart);
     944            0 :         paletteScore()->appendStaff(bracketItemOwner);
     945              :     }
     946              : 
     947            0 :     EditStaffBrackets::setBracketType(paletteScore(), bracketItemOwner->idx(), types.size() - 1, BracketType::NORMAL);
     948              : 
     949            0 :     for (size_t i = 0; i < types.size(); ++i) {
     950            0 :         auto b1 = Factory::makeBracket(paletteScore()->dummy());
     951            0 :         auto bi1 = paletteScore()->brackets(bracketItemOwner->idx())[i];
     952            0 :         const auto& type = types[i];
     953            0 :         bi1->setBracketType(type.first);
     954            0 :         b1->setBracketItem(bi1);
     955            0 :         sp->appendElement(b1, type.second); // Bracket, Brace, Square, Line, Group
     956            0 :     }
     957            0 :     return sp;
     958            0 : }
     959              : 
     960            0 : PalettePtr PaletteCreator::newBreathPalette(bool defaultPalette)
     961              : {
     962            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Breath);
     963            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Breaths & pauses"));
     964            0 :     sp->setGridSize(40, 40);
     965            0 :     sp->setDrawGrid(true);
     966            0 :     sp->setVisible(false);
     967              : 
     968              :     // Fermatas
     969              : 
     970              :     static const SymIdList defaultFermatas {
     971              :         SymId::fermataAbove,
     972              :         SymId::fermataShortAbove,
     973              :         SymId::fermataLongAbove
     974            0 :     };
     975              : 
     976              :     static const SymIdList masterFermatas {
     977              :         SymId::fermataAbove,
     978              :         SymId::fermataShortAbove,
     979              :         SymId::fermataLongAbove,
     980              :         SymId::fermataLongHenzeAbove,
     981              :         SymId::fermataShortHenzeAbove,
     982              :         SymId::fermataVeryLongAbove,
     983              :         SymId::fermataVeryShortAbove,
     984            0 :     };
     985              : 
     986              :     // Breaths
     987              : 
     988            0 :     for (auto i : defaultPalette ? defaultFermatas : masterFermatas) {
     989            0 :         auto f = Factory::makeFermata(paletteScore()->dummy());
     990            0 :         f->setSymIdAndTimeStretch(i);
     991            0 :         sp->appendElement(f, f->subtypeUserName());
     992            0 :     }
     993              : 
     994            0 :     for (BreathType breath : Breath::BREATH_LIST) {
     995            0 :         if ((breath.id == SymId::chantCaesura || breath.id == SymId::caesuraSingleStroke) && defaultPalette) {
     996            0 :             continue;
     997              :         }
     998            0 :         auto a = Factory::makeBreath(paletteScore()->dummy());
     999            0 :         a->setSymId(breath.id);
    1000            0 :         a->setPause(breath.pause);
    1001            0 :         sp->appendElement(a, SymNames::userNameForSymId(breath.id));
    1002            0 :     }
    1003              : 
    1004            0 :     return sp;
    1005            0 : }
    1006              : 
    1007            0 : PalettePtr PaletteCreator::newArpeggioPalette()
    1008              : {
    1009            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Arpeggio);
    1010            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Arpeggios & glissandos"));
    1011            0 :     sp->setGridSize(42, 44);
    1012            0 :     sp->setDrawGrid(true);
    1013            0 :     sp->setVisible(false);
    1014              : 
    1015            0 :     for (int i = 0; i < 6; ++i) {
    1016            0 :         if (ArpeggioType(i) == ArpeggioType::BRACKET) {
    1017              :             // Deprecated, now handled by CHORD_BRACKET
    1018            0 :             continue;
    1019              :         }
    1020            0 :         auto a = Factory::makeArpeggio(paletteScore()->dummy());
    1021            0 :         a->setArpeggioType(ArpeggioType(i));
    1022            0 :         sp->appendElement(a, a->arpeggioTypeName());
    1023            0 :     }
    1024              : 
    1025            0 :     for (int i = 0; i < 2; ++i) {
    1026            0 :         auto a = makeElement<Glissando>(paletteScore());
    1027            0 :         a->setGlissandoType(GlissandoType(i));
    1028            0 :         if (a->glissandoType() != a->style().styleV(Sid::glissandoType).value<GlissandoType>()) {
    1029            0 :             a->setPropertyFlags(Pid::GLISS_TYPE, PropertyFlags::UNSTYLED);
    1030              :         }
    1031            0 :         sp->appendElement(a, a->subtypeUserName());
    1032            0 :     }
    1033              : 
    1034              :     //fall and doits
    1035              : 
    1036              :     static const std::vector<ChordLineType> chordLineTypes {
    1037              :         ChordLineType::FALL,
    1038              :         ChordLineType::DOIT,
    1039              :         ChordLineType::PLOP,
    1040              :         ChordLineType::SCOOP
    1041            0 :     };
    1042              : 
    1043            0 :     for (ChordLineType chordLineType : chordLineTypes) {
    1044            0 :         auto cl = Factory::makeChordLine(paletteScore()->dummy());
    1045            0 :         cl->setChordLineType(chordLineType);
    1046            0 :         sp->appendElement(cl, cl->chordLineTypeName());
    1047            0 :     }
    1048              : 
    1049            0 :     for (ChordLineType chordLineType : chordLineTypes) {
    1050            0 :         auto cl = Factory::makeChordLine(paletteScore()->dummy());
    1051            0 :         cl->setChordLineType(chordLineType);
    1052            0 :         cl->setStraight(true);
    1053            0 :         sp->appendElement(cl, cl->chordLineTypeName());
    1054            0 :     }
    1055              : 
    1056            0 :     for (ChordLineType chordLineType : chordLineTypes) {
    1057            0 :         auto cl = Factory::makeChordLine(paletteScore()->dummy());
    1058            0 :         cl->setChordLineType(chordLineType);
    1059            0 :         cl->setStraight(true);
    1060            0 :         cl->setWavy(true);
    1061            0 :         sp->appendElement(cl, cl->chordLineTypeName());
    1062            0 :     }
    1063            0 :     return sp;
    1064            0 : }
    1065              : 
    1066            0 : PalettePtr PaletteCreator::newClefsPalette(bool defaultPalette)
    1067              : {
    1068            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Clef);
    1069            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Clefs"));
    1070            0 :     sp->setMag(0.8);
    1071            0 :     sp->setGridSize(36, 55);
    1072            0 :     sp->setDrawGrid(true);
    1073            0 :     sp->setYOffset(1.0);
    1074              : 
    1075              :     static const std::vector<ClefType> clefsDefault  {
    1076              :         ClefType::G, ClefType::G8_VA, ClefType::G15_MA, ClefType::G8_VB, ClefType::C3,
    1077              :         ClefType::C4, ClefType::F, ClefType::F_8VA,
    1078              :         ClefType::F8_VB, ClefType::PERC, ClefType::TAB, ClefType::TAB4
    1079            0 :     };
    1080              :     static const std::vector<ClefType> clefsMaster  {
    1081              :         ClefType::G, ClefType::G8_VA, ClefType::G15_MA, ClefType::G8_VB, ClefType::G15_MB, ClefType::G8_VB_O,
    1082              :         ClefType::G8_VB_C, ClefType::G8_VB_P, ClefType::G_1, ClefType::C1, ClefType::C2, ClefType::C3,
    1083              :         ClefType::C4, ClefType::C4_8VB, ClefType::C5, ClefType::C_19C, ClefType::C1_F18C, ClefType::C3_F18C, ClefType::C4_F18C,
    1084              :         ClefType::C1_F20C, ClefType::C3_F20C, ClefType::C4_F20C,
    1085              :         ClefType::F, ClefType::F_8VA, ClefType::F_15MA,
    1086              :         ClefType::F8_VB, ClefType::F15_MB, ClefType::F_B, ClefType::F_C, ClefType::F_F18C, ClefType::F_19C,
    1087              :         ClefType::PERC,
    1088              :         ClefType::PERC2, ClefType::TAB, ClefType::TAB4, ClefType::TAB_SERIF, ClefType::TAB4_SERIF
    1089            0 :     };
    1090              : 
    1091            0 :     for (ClefType clefType : defaultPalette ? clefsDefault : clefsMaster) {
    1092            0 :         auto clef = Factory::makeClef(paletteScore()->dummy());
    1093            0 :         clef->setClefType(ClefTypeList(clefType, clefType));
    1094            0 :         sp->appendElement(clef, TConv::userName(clefType));
    1095            0 :     }
    1096            0 :     return sp;
    1097            0 : }
    1098              : 
    1099            0 : PalettePtr PaletteCreator::newGraceNotePalette()
    1100              : {
    1101            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::GraceNote);
    1102            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Grace notes"));
    1103            0 :     sp->setMag(1.35);
    1104            0 :     sp->setGridSize(45, 40);
    1105            0 :     sp->setDrawGrid(true);
    1106            0 :     sp->setVisible(false);
    1107              : 
    1108            0 :     sp->appendActionIcon(ActionIconType::ACCIACCATURA);
    1109            0 :     sp->appendActionIcon(ActionIconType::APPOGGIATURA);
    1110            0 :     sp->appendActionIcon(ActionIconType::GRACE4);
    1111            0 :     sp->appendActionIcon(ActionIconType::GRACE16);
    1112            0 :     sp->appendActionIcon(ActionIconType::GRACE32);
    1113            0 :     sp->appendActionIcon(ActionIconType::GRACE8_AFTER);
    1114            0 :     sp->appendActionIcon(ActionIconType::GRACE16_AFTER);
    1115            0 :     sp->appendActionIcon(ActionIconType::GRACE32_AFTER);
    1116              : 
    1117            0 :     return sp;
    1118            0 : }
    1119              : 
    1120            0 : PalettePtr PaletteCreator::newBagpipeEmbellishmentPalette()
    1121              : {
    1122            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::BagpipeEmbellishment);
    1123            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Bagpipe embellishments"));
    1124            0 :     sp->setMag(0.8);
    1125            0 :     sp->setYOffset(2.0);
    1126            0 :     sp->setGridSize(55, 72);
    1127            0 :     sp->setDrawGrid(true);
    1128            0 :     sp->setVisible(false);
    1129              : 
    1130            0 :     for (size_t i = 0; i < TConv::embellishmentsCount(); ++i) {
    1131            0 :         auto b = makeElement<BagpipeEmbellishment>(paletteScore());
    1132            0 :         b->setEmbelType(EmbellishmentType(i));
    1133              :         // TODO: pass TranslatableString
    1134            0 :         sp->appendElement(b, TConv::userName(static_cast<EmbellishmentType>(i)).str);
    1135            0 :     }
    1136              : 
    1137            0 :     return sp;
    1138            0 : }
    1139              : 
    1140            0 : PalettePtr PaletteCreator::newLinesPalette(bool defaultPalette)
    1141              : {
    1142            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Line);
    1143            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Lines"));
    1144            0 :     sp->setMag(.8);
    1145            0 :     sp->setGridSize(75, 28);
    1146            0 :     sp->setDrawGrid(true);
    1147            0 :     sp->setVisible(false);
    1148              : 
    1149            0 :     auto slur = Factory::makeSlur(paletteScore()->dummy());
    1150            0 :     sp->appendElement(slur, QT_TRANSLATE_NOOP("palette", "Slur"));
    1151              : 
    1152              :     static const std::vector<HairpinType> hairpins {
    1153              :         HairpinType::CRESC_HAIRPIN,
    1154              :         HairpinType::DIM_HAIRPIN,
    1155              :         HairpinType::CRESC_LINE,
    1156              :         HairpinType::DIM_LINE
    1157            0 :     };
    1158              : 
    1159            0 :     for (HairpinType hairpinType : hairpins) {
    1160            0 :         auto hairpin = Factory::makeHairpin(paletteScore()->dummy());
    1161            0 :         hairpin->setHairpinType(hairpinType);
    1162            0 :         sp->appendElement(hairpin, hairpin->subtypeUserName());
    1163            0 :     }
    1164              : 
    1165            0 :     auto volta = makeElement<Volta>(paletteScore());
    1166            0 :     volta->setVoltaType(Volta::Type::CLOSED);
    1167            0 :     volta->setText(u"1.");
    1168            0 :     std::vector<int> il;
    1169            0 :     il.push_back(1);
    1170            0 :     volta->setEndings(il);
    1171            0 :     sp->appendElement(volta, QT_TRANSLATE_NOOP("palette", "Prima volta"));
    1172              : 
    1173            0 :     if (!defaultPalette) {
    1174            0 :         volta = makeElement<Volta>(paletteScore());
    1175            0 :         volta->setVoltaType(Volta::Type::CLOSED);
    1176            0 :         volta->setText(u"2.");
    1177            0 :         il.clear();
    1178            0 :         il.push_back(2);
    1179            0 :         volta->setEndings(il);
    1180            0 :         sp->appendElement(volta, QT_TRANSLATE_NOOP("palette", "Seconda volta"));
    1181              : 
    1182            0 :         volta = makeElement<Volta>(paletteScore());
    1183            0 :         volta->setVoltaType(Volta::Type::CLOSED);
    1184            0 :         volta->setText(u"3.");
    1185            0 :         il.clear();
    1186            0 :         il.push_back(3);
    1187            0 :         volta->setEndings(il);
    1188            0 :         sp->appendElement(volta, QT_TRANSLATE_NOOP("palette", "Terza volta"));
    1189              :     }
    1190              : 
    1191            0 :     volta = makeElement<Volta>(paletteScore());
    1192            0 :     volta->setVoltaType(Volta::Type::OPEN);
    1193            0 :     volta->setText(u"2.");
    1194            0 :     il.clear();
    1195            0 :     il.push_back(2);
    1196            0 :     volta->setEndings(il);
    1197            0 :     sp->appendElement(volta, QT_TRANSLATE_NOOP("palette", "Seconda volta, open"));
    1198              : 
    1199              :     static const std::vector<OttavaType> ottavasDefault {
    1200              :         OttavaType::OTTAVA_8VA,
    1201              :         OttavaType::OTTAVA_8VB,
    1202              :         OttavaType::OTTAVA_15MA
    1203            0 :     };
    1204              :     static const std::vector<OttavaType> ottavasMaster {
    1205              :         OttavaType::OTTAVA_8VA,
    1206              :         OttavaType::OTTAVA_8VB,
    1207              :         OttavaType::OTTAVA_15MA,
    1208              :         OttavaType::OTTAVA_15MB,
    1209              :         OttavaType::OTTAVA_22MA,
    1210              :         OttavaType::OTTAVA_22MB
    1211            0 :     };
    1212            0 :     for (OttavaType ottavaType : defaultPalette ? ottavasDefault : ottavasMaster) {
    1213            0 :         auto ottava = makeElement<Ottava>(paletteScore());
    1214            0 :         ottava->setOttavaType(ottavaType);
    1215            0 :         ottava->styleChanged();
    1216            0 :         sp->appendElement(ottava, ottava->subtypeUserName());
    1217            0 :     }
    1218              : 
    1219            0 :     auto pedal = makeElement<Pedal>(paletteScore());
    1220            0 :     pedal->setEndHookType(HookType::HOOK_90);
    1221            0 :     pedal->setBeginText(pedal->propertyDefault(Pid::BEGIN_TEXT).value<String>());
    1222            0 :     pedal->setContinueText(pedal->propertyDefault(Pid::CONTINUE_TEXT).value<String>());
    1223            0 :     pedal->setEndText(pedal->propertyDefault(Pid::END_TEXT).value<String>());
    1224            0 :     sp->appendElement(pedal, QT_TRANSLATE_NOOP("palette", "Pedal (with ped and line)"));
    1225              : 
    1226            0 :     pedal = makeElement<Pedal>(paletteScore());
    1227            0 :     pedal->setLineVisible(false);
    1228            0 :     pedal->setEndHookType(HookType::ROSETTE);
    1229            0 :     pedal->setBeginText(pedal->propertyDefault(Pid::BEGIN_TEXT).value<String>());
    1230            0 :     pedal->setContinueText(pedal->propertyDefault(Pid::CONTINUE_TEXT).value<String>());
    1231            0 :     pedal->setEndText(pedal->propertyDefault(Pid::END_TEXT).value<String>());
    1232            0 :     sp->appendElement(pedal, QT_TRANSLATE_NOOP("palette", "Pedal (with ped and asterisk)"));
    1233              : 
    1234            0 :     pedal = makeElement<Pedal>(paletteScore());
    1235            0 :     pedal->setBeginHookType(HookType::HOOK_90);
    1236            0 :     pedal->setEndHookType(HookType::HOOK_90);
    1237            0 :     pedal->setBeginText(pedal->propertyDefault(Pid::BEGIN_TEXT).value<String>());
    1238            0 :     pedal->setContinueText(pedal->propertyDefault(Pid::CONTINUE_TEXT).value<String>());
    1239            0 :     pedal->setEndText(pedal->propertyDefault(Pid::END_TEXT).value<String>());
    1240            0 :     sp->appendElement(pedal, QT_TRANSLATE_NOOP("palette", "Pedal (straight hooks)"));
    1241              : 
    1242            0 :     if (!defaultPalette) {
    1243            0 :         pedal = makeElement<Pedal>(paletteScore());
    1244            0 :         pedal->setBeginHookType(HookType::HOOK_90);
    1245            0 :         pedal->setEndHookType(HookType::HOOK_45);
    1246            0 :         pedal->setBeginText(pedal->propertyDefault(Pid::BEGIN_TEXT).value<String>());
    1247            0 :         pedal->setContinueText(pedal->propertyDefault(Pid::CONTINUE_TEXT).value<String>());
    1248            0 :         pedal->setEndText(pedal->propertyDefault(Pid::END_TEXT).value<String>());
    1249            0 :         sp->appendElement(pedal, QT_TRANSLATE_NOOP("palette", "Pedal (angled end hook)"));
    1250              : 
    1251            0 :         pedal = makeElement<Pedal>(paletteScore());
    1252            0 :         pedal->setBeginHookType(HookType::HOOK_45);
    1253            0 :         pedal->setEndHookType(HookType::HOOK_45);
    1254            0 :         pedal->setBeginText(pedal->propertyDefault(Pid::BEGIN_TEXT).value<String>());
    1255            0 :         pedal->setContinueText(pedal->propertyDefault(Pid::CONTINUE_TEXT).value<String>());
    1256            0 :         pedal->setEndText(pedal->propertyDefault(Pid::END_TEXT).value<String>());
    1257            0 :         sp->appendElement(pedal, QT_TRANSLATE_NOOP("palette", "Pedal (both hooks angled)"));
    1258              : 
    1259            0 :         pedal = makeElement<Pedal>(paletteScore());
    1260            0 :         pedal->setBeginHookType(HookType::HOOK_45);
    1261            0 :         pedal->setEndHookType(HookType::HOOK_90);
    1262            0 :         pedal->setBeginText(pedal->propertyDefault(Pid::BEGIN_TEXT).value<String>());
    1263            0 :         pedal->setContinueText(pedal->propertyDefault(Pid::CONTINUE_TEXT).value<String>());
    1264            0 :         pedal->setEndText(pedal->propertyDefault(Pid::END_TEXT).value<String>());
    1265            0 :         sp->appendElement(pedal, QT_TRANSLATE_NOOP("palette", "Pedal (angled start hook)"));
    1266              :     }
    1267              : 
    1268              :     static const std::vector<TrillType> trillTypes = {
    1269              :         TrillType::TRILL_LINE, TrillType::UPPRALL_LINE, TrillType::DOWNPRALL_LINE, TrillType::PRALLPRALL_LINE,
    1270            0 :     };
    1271              : 
    1272              :     static const std::vector<TrillType> defaultTrills = {
    1273              :         { TrillType::TRILL_LINE, TrillType::DOWNPRALL_LINE, TrillType::PRALLPRALL_LINE }
    1274            0 :     };
    1275              : 
    1276            0 :     for (TrillType trillType : defaultPalette ? defaultTrills : trillTypes) {
    1277            0 :         auto trill = makeElement<Trill>(paletteScore());
    1278            0 :         trill->setTrillType(trillType);
    1279            0 :         sp->appendElement(trill, TConv::userName(trillType));
    1280            0 :     }
    1281              : 
    1282            0 :     auto staffTextLine = makeElement<TextLine>(paletteScore());
    1283            0 :     staffTextLine->setBeginText(u"Staff");
    1284            0 :     staffTextLine->setEndHookType(HookType::HOOK_90);
    1285            0 :     sp->appendElement(staffTextLine, QT_TRANSLATE_NOOP("palette", "Staff text line"));
    1286              : 
    1287            0 :     auto systemTextLine = makeElement<TextLine>(paletteScore(), true);
    1288            0 :     systemTextLine->setLen(12 * paletteScore()->style().spatium());
    1289            0 :     systemTextLine->setBeginText(u"System");
    1290            0 :     systemTextLine->setEndHookType(HookType::HOOK_90);
    1291            0 :     sp->appendElement(systemTextLine, QT_TRANSLATE_NOOP("palette", "System text line"));
    1292              : 
    1293            0 :     if (!defaultPalette) {
    1294            0 :         auto textLine = makeElement<TextLine>(paletteScore());
    1295            0 :         textLine->setBeginText(u"VII");
    1296            0 :         textLine->setEndHookType(HookType::HOOK_90);
    1297            0 :         sp->appendElement(textLine, QT_TRANSLATE_NOOP("palette", "Text line"));
    1298            0 :     }
    1299              : 
    1300            0 :     auto line = makeElement<TextLine>(paletteScore());
    1301            0 :     line->setDiagonal(true);
    1302            0 :     sp->appendElement(line, QT_TRANSLATE_NOOP("palette", "Line"));
    1303              : 
    1304            0 :     auto rightArrowLine = makeElement<TextLine>(paletteScore());
    1305            0 :     rightArrowLine->setDiagonal(true);
    1306            0 :     rightArrowLine->setEndHookType(HookType::ARROW);
    1307            0 :     sp->appendElement(rightArrowLine, QT_TRANSLATE_NOOP("palette", "Line (right arrowhead)"));
    1308              : 
    1309            0 :     auto leftArrowLine = makeElement<TextLine>(paletteScore());
    1310            0 :     leftArrowLine->setDiagonal(true);
    1311            0 :     leftArrowLine->setBeginHookType(HookType::ARROW);
    1312            0 :     sp->appendElement(leftArrowLine, QT_TRANSLATE_NOOP("palette", "Line (left arrowhead)"));
    1313              : 
    1314            0 :     sp->appendActionIcon(ActionIconType::NOTE_ANCHORED_LINE, 2);
    1315              : 
    1316            0 :     auto a = Factory::makeAmbitus(paletteScore()->dummy());
    1317            0 :     sp->appendElement(a, QT_TRANSLATE_NOOP("palette", "Ambitus"));
    1318              : 
    1319            0 :     auto letRing = makeElement<LetRing>(paletteScore());
    1320            0 :     sp->appendElement(letRing, QT_TRANSLATE_NOOP("palette", "Let ring"));
    1321              : 
    1322              :     static const std::vector<VibratoType> vibratoTable = {
    1323              :         { VibratoType::GUITAR_VIBRATO, VibratoType::GUITAR_VIBRATO_WIDE, VibratoType::VIBRATO_SAWTOOTH,
    1324              :           VibratoType::VIBRATO_SAWTOOTH_WIDE },
    1325            0 :     };
    1326              : 
    1327              :     static const std::vector<VibratoType> defaultVibratoTable = {
    1328              :         { VibratoType::GUITAR_VIBRATO, VibratoType::VIBRATO_SAWTOOTH },
    1329            0 :     };
    1330              : 
    1331            0 :     for (VibratoType vibratoType : defaultPalette ? defaultVibratoTable : vibratoTable) {
    1332            0 :         auto vibrato = makeElement<Vibrato>(paletteScore());
    1333            0 :         vibrato->setVibratoType(vibratoType);
    1334            0 :         sp->appendElement(vibrato, TConv::userName(vibratoType));
    1335            0 :     }
    1336              : 
    1337            0 :     auto pm = makeElement<PalmMute>(paletteScore());
    1338            0 :     sp->appendElement(pm, QT_TRANSLATE_NOOP("palette", "Palm mute"));
    1339              : 
    1340              :     std::array<QString, 3> names = { QT_TRANSLATE_NOOP("palette", "Chord bracket"),
    1341              :                                      QT_TRANSLATE_NOOP("palette", "Chord bracket (play with left hand)"),
    1342            0 :                                      QT_TRANSLATE_NOOP("palette", "Chord bracket (play with right hand)") };
    1343            0 :     for (int i = 0; i < 3; ++i) {
    1344            0 :         DirectionV hookPos = DirectionV(i);
    1345            0 :         auto c = Factory::makeChordBracket(paletteScore()->dummy());
    1346            0 :         c->setProperty(Pid::BRACKET_HOOK_POS, hookPos);
    1347            0 :         sp->appendElement(c, names[i]);
    1348            0 :     }
    1349              : 
    1350            0 :     return sp;
    1351            0 : }
    1352              : 
    1353            0 : PalettePtr PaletteCreator::newTempoPalette(bool defaultPalette)
    1354              : {
    1355            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Tempo);
    1356            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Tempo"));
    1357            0 :     sp->setMag(0.65);
    1358            0 :     sp->setGridSize(90, 30);
    1359            0 :     sp->setDrawGrid(true);
    1360              : 
    1361              :     struct TempoPattern {
    1362              :         QString pattern;
    1363              :         const char* name;
    1364              :         double f;
    1365              :         bool relative;
    1366              :         bool italian;
    1367              :         bool followText;
    1368              :         bool basic;
    1369              :         bool masterOnly;
    1370              : 
    1371            0 :         TempoPattern(const QString& s, const char* n, double v, bool r, bool i, bool f, bool b, bool m)
    1372            0 :             : pattern(s), name(n), f(v), relative(r), italian(i), followText(f), basic(b), masterOnly(m) {}
    1373              :     };
    1374              : 
    1375              :     static const TempoPattern tps[] = {
    1376              :         TempoPattern("<sym>metNoteHalfUp</sym> = 80",
    1377              :                      QT_TRANSLATE_NOOP("palette", "Half note = 80 BPM"),
    1378            0 :                      80.0 / 30.0, false, false, true, true, false),
    1379              :         TempoPattern("<sym>metNoteQuarterUp</sym> = 80",
    1380              :                      QT_TRANSLATE_NOOP("palette", "Quarter note = 80 BPM"),
    1381            0 :                      80.0 / 60.0, false, false, true, true, false),
    1382              :         TempoPattern("<sym>metNote8thUp</sym> = 80",
    1383              :                      QT_TRANSLATE_NOOP("palette", "Eighth note = 80 BPM"),
    1384            0 :                      80.0 / 120.0, false, false, true, true, false),
    1385              :         TempoPattern("<sym>metNoteHalfUp</sym><sym>space</sym><sym>metAugmentationDot</sym> = 80",
    1386              :                      QT_TRANSLATE_NOOP("palette", "Dotted half note = 80 BPM"),
    1387            0 :                      120 / 30.0, false, false, true, false, false),
    1388              :         TempoPattern("<sym>metNoteQuarterUp</sym><sym>space</sym><sym>metAugmentationDot</sym> = 80",
    1389              :                      QT_TRANSLATE_NOOP("palette", "Dotted quarter note = 80 BPM"),
    1390            0 :                      120 / 60.0, false, false, true, true,  false),
    1391              :         TempoPattern("<sym>metNote8thUp</sym><sym>space</sym><sym>metAugmentationDot</sym> = 80",
    1392              :                      QT_TRANSLATE_NOOP("palette", "Dotted eighth note = 80 BPM"),
    1393            0 :                      120 / 120.0, false, false, true, false, false),
    1394              : 
    1395            0 :         TempoPattern("Grave",            "Grave",             35.0 / 60.0, false, true, false, false, false),
    1396            0 :         TempoPattern("Largo",            "Largo",             50.0 / 60.0, false, true, false, false, false),
    1397            0 :         TempoPattern("Lento",            "Lento",             52.5 / 60.0, false, true, false, false, false),
    1398            0 :         TempoPattern("Larghetto",        "Larghetto",         63.0 / 60.0, false, true, false, false, true),
    1399            0 :         TempoPattern("Adagio",           "Adagio",            71.0 / 60.0, false, true, false, false, false),
    1400            0 :         TempoPattern("Andante",          "Andante",           92.0 / 60.0, false, true, false, false, false),
    1401            0 :         TempoPattern("Andantino",        "Andantino",         94.0 / 60.0, false, true, false, false, true),
    1402            0 :         TempoPattern("Moderato",         "Moderato",         114.0 / 60.0, false, true, false, false, false),
    1403            0 :         TempoPattern("Allegretto",       "Allegretto",       116.0 / 60.0, false, true, false, false, false),
    1404            0 :         TempoPattern("Allegro",          "Allegro",          144.0 / 60.0, false, true, false, false, false),
    1405            0 :         TempoPattern("Vivace",           "Vivace",           172.0 / 60.0, false, true, false, false, false),
    1406            0 :         TempoPattern("Presto",           "Presto",           187.0 / 60.0, false, true, false, false, false),
    1407            0 :         TempoPattern("Prestissimo",      "Prestissimo",      200.0 / 60.0, false, true, false, false, true),
    1408              : 
    1409              :         TempoPattern("<sym>metNoteQuarterUp</sym> = <sym>metNoteQuarterUp</sym><sym>space</sym><sym>metAugmentationDot</sym>",
    1410              :                      QT_TRANSLATE_NOOP("palette", "Metric modulation: quarter note = dotted quarter note"),
    1411            0 :                      3.0 / 2.0, true, false, true, false, false),
    1412              :         TempoPattern("<sym>metNoteQuarterUp</sym><sym>space</sym><sym>metAugmentationDot</sym> = <sym>metNoteQuarterUp</sym>",
    1413              :                      QT_TRANSLATE_NOOP("palette", "Metric modulation: dotted quarter note = quarter note"),
    1414            0 :                      2.0 / 3.0, true, false, true, false, false),
    1415              :         TempoPattern("<sym>metNoteHalfUp</sym> = <sym>metNoteQuarterUp</sym>",
    1416              :                      QT_TRANSLATE_NOOP("palette", "Metric modulation: half note = quarter note"),
    1417            0 :                      1.0 / 2.0, true, false, true, false, false),
    1418              :         TempoPattern("<sym>metNoteQuarterUp</sym> = <sym>metNoteHalfUp</sym>",
    1419              :                      QT_TRANSLATE_NOOP("palette", "Metric modulation: quarter note = half note"),
    1420            0 :                      2.0 / 1.0, true, false, true, false, false),
    1421              :         TempoPattern("<sym>metNote8thUp</sym> = <sym>metNote8thUp</sym>",
    1422              :                      QT_TRANSLATE_NOOP("palette", "Metric modulation: eighth note = eighth note"),
    1423            0 :                      1.0 / 1.0, true, false, true, false, false),
    1424              :         TempoPattern("<sym>metNoteQuarterUp</sym> = <sym>metNoteQuarterUp</sym>",
    1425              :                      QT_TRANSLATE_NOOP("palette", "Metric modulation: quarter note = quarter note"),
    1426            0 :                      1.0 / 1.0, true, false, true, false, false),
    1427              :         TempoPattern("<sym>metNote8thUp</sym><sym>space</sym><sym>metAugmentationDot</sym> = <sym>metNoteQuarterUp</sym>",
    1428              :                      QT_TRANSLATE_NOOP("palette", "Metric modulation: dotted eighth note = quarter note"),
    1429            0 :                      4.0 / 3.0, true, false, true, false, false),
    1430            0 :     };
    1431              : 
    1432            0 :     for (TempoPattern tp : tps) {
    1433            0 :         auto tt = makeElement<TempoText>(paletteScore());
    1434            0 :         tt->setFollowText(tp.followText);
    1435            0 :         tt->setXmlText(tp.pattern);
    1436            0 :         if (tp.relative) {
    1437            0 :             tt->setRelative(tp.f);
    1438            0 :             sp->appendElement(tt, tp.name, 1.5);
    1439            0 :         } else if (tp.italian) {
    1440            0 :             tt->setTempo(tp.f);
    1441            0 :             sp->appendElement(tt, tp.name, 1.3);
    1442              :         } else {
    1443            0 :             tt->setTempo(tp.f);
    1444            0 :             sp->appendElement(tt, tp.name, 1.5);
    1445              :         }
    1446            0 :     }
    1447              : 
    1448              :     static const std::map<GradualTempoChangeType, const char*> DEFAULT_TEMPO_CHANGE = {
    1449              :         { GradualTempoChangeType::Accelerando, QT_TRANSLATE_NOOP("palette", "accel.") },
    1450              :         { GradualTempoChangeType::Allargando,  QT_TRANSLATE_NOOP("palette", "allarg.") },
    1451              :         { GradualTempoChangeType::Rallentando, QT_TRANSLATE_NOOP("palette", "rall.") },
    1452              :         { GradualTempoChangeType::Ritardando,  QT_TRANSLATE_NOOP("palette", "rit.") },
    1453            0 :     };
    1454              : 
    1455              :     static const std::map<GradualTempoChangeType, const char*> MASTER_TEMPO_CHANGE = {
    1456              :         { GradualTempoChangeType::Accelerando,  QT_TRANSLATE_NOOP("palette", "accel.") },
    1457              :         { GradualTempoChangeType::Allargando,   QT_TRANSLATE_NOOP("palette", "allarg.") },
    1458              :         { GradualTempoChangeType::Calando,      QT_TRANSLATE_NOOP("palette", "calando") },
    1459              :         { GradualTempoChangeType::Lentando,     QT_TRANSLATE_NOOP("palette", "lentando") },
    1460              :         { GradualTempoChangeType::Morendo,      QT_TRANSLATE_NOOP("palette", "morendo") },
    1461              :         { GradualTempoChangeType::Precipitando, QT_TRANSLATE_NOOP("palette", "precipitando") },
    1462              :         { GradualTempoChangeType::Rallentando,  QT_TRANSLATE_NOOP("palette", "rall.") },
    1463              :         { GradualTempoChangeType::Ritardando,   QT_TRANSLATE_NOOP("palette", "rit.") },
    1464              :         { GradualTempoChangeType::Smorzando,    QT_TRANSLATE_NOOP("palette", "smorz.") },
    1465              :         { GradualTempoChangeType::Sostenuto,    QT_TRANSLATE_NOOP("palette", "sost.") },
    1466              :         { GradualTempoChangeType::Stringendo,   QT_TRANSLATE_NOOP("palette", "string.") }
    1467            0 :     };
    1468              : 
    1469            0 :     for (const auto& pair : defaultPalette ? DEFAULT_TEMPO_CHANGE : MASTER_TEMPO_CHANGE) {
    1470            0 :         auto item = makeElement<GradualTempoChange>(paletteScore());
    1471            0 :         item->setTempoChangeType(pair.first);
    1472            0 :         const String& text = String::fromUtf8(pair.second);
    1473            0 :         item->setBeginText(text);
    1474            0 :         item->setContinueText(String(u"(%1)").arg(text));
    1475            0 :         sp->appendElement(item, pair.second, 1.3)->yoffset = 0.4;
    1476            0 :     }
    1477              : 
    1478            0 :     const char* aTempoStr = QT_TRANSLATE_NOOP("palette", "a tempo");
    1479            0 :     auto aTempoTxt = makeElement<TempoText>(paletteScore());
    1480            0 :     aTempoTxt->setFollowText(true);
    1481            0 :     aTempoTxt->setXmlText(aTempoStr);
    1482            0 :     aTempoTxt->setATempo();
    1483            0 :     sp->appendElement(aTempoTxt, aTempoStr, 1.3);
    1484              : 
    1485            0 :     const char* tempoPrimoStr = QT_TRANSLATE_NOOP("palette", "tempo primo");
    1486            0 :     auto tempoPrimoTxt = makeElement<TempoText>(paletteScore());
    1487            0 :     tempoPrimoTxt->setFollowText(true);
    1488            0 :     tempoPrimoTxt->setXmlText(tempoPrimoStr);
    1489            0 :     tempoPrimoTxt->setTempoPrimo();
    1490            0 :     sp->appendElement(tempoPrimoTxt, tempoPrimoStr, 1.3);
    1491              : 
    1492            0 :     auto stxt = makeElement<SystemText>(paletteScore());
    1493            0 :     stxt->initTextStyleType(TextStyleType::TEMPO);
    1494            0 :     stxt->setXmlText(String::fromAscii(QT_TRANSLATE_NOOP("palette", "Swing")));
    1495            0 :     stxt->setSwing(true);
    1496            0 :     PaletteCellPtr cell = sp->appendElement(stxt, QT_TRANSLATE_NOOP("palette", "Swing"), 1.3);
    1497            0 :     cell->yoffset = 0.4;
    1498            0 :     cell->setElementTranslated(true);
    1499              : 
    1500            0 :     stxt = makeElement<SystemText>(paletteScore());
    1501            0 :     stxt->initTextStyleType(TextStyleType::TEMPO);
    1502              :     /*: System text to switch from swing rhythm back to straight rhythm */
    1503            0 :     stxt->setXmlText(QT_TRANSLATE_NOOP("palette", "Straight"));
    1504              :     // need to be true to enable the "Off" option
    1505            0 :     stxt->setSwing(true);
    1506              :     // 0 (swingUnit) turns of swing; swingRatio is set to default
    1507            0 :     stxt->setSwingParameters(0, stxt->style().styleI(Sid::swingRatio));
    1508              :     /*: System text to switch from swing rhythm back to straight rhythm */
    1509            0 :     cell = sp->appendElement(stxt, QT_TRANSLATE_NOOP("palette", "Straight"), 1.3);
    1510            0 :     cell->yoffset = 0.4;
    1511            0 :     cell->setElementTranslated(true);
    1512            0 :     return sp;
    1513            0 : }
    1514              : 
    1515            0 : PalettePtr PaletteCreator::newTextPalette(bool defaultPalette)
    1516              : {
    1517            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Text);
    1518            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Text"));
    1519            0 :     sp->setGridSize(100, 28);
    1520            0 :     sp->setMag(0.85);
    1521            0 :     sp->setDrawGrid(true);
    1522              : 
    1523            0 :     auto st = makeElement<StaffText>(paletteScore());
    1524            0 :     st->setXmlText(QT_TRANSLATE_NOOP("palette", "Staff text"));
    1525            0 :     sp->appendElement(st, QT_TRANSLATE_NOOP("palette", "Staff text"))->setElementTranslated(true);
    1526              : 
    1527            0 :     auto staffTextLine = makeElement<TextLine>(paletteScore());
    1528            0 :     staffTextLine->setBeginText(u"Staff");
    1529            0 :     staffTextLine->setEndHookType(HookType::HOOK_90);
    1530            0 :     sp->appendElement(staffTextLine, QT_TRANSLATE_NOOP("palette", "Staff text line"));
    1531              : 
    1532            0 :     auto stxt = makeElement<SystemText>(paletteScore());
    1533            0 :     stxt->setXmlText(QT_TRANSLATE_NOOP("palette", "System text"));
    1534            0 :     sp->appendElement(stxt, QT_TRANSLATE_NOOP("palette", "System text"))->setElementTranslated(true);
    1535              : 
    1536            0 :     auto systemTextLine = makeElement<TextLine>(paletteScore(), true);
    1537            0 :     systemTextLine->setLen(12 * paletteScore()->style().spatium());
    1538            0 :     systemTextLine->setBeginText(u"System");
    1539            0 :     systemTextLine->setEndHookType(HookType::HOOK_90);
    1540            0 :     sp->appendElement(systemTextLine, QT_TRANSLATE_NOOP("palette", "System text line"));
    1541              : 
    1542            0 :     auto expressionText = makeElement<Expression>(paletteScore());
    1543            0 :     expressionText->setTextStyleType(TextStyleType::EXPRESSION);
    1544            0 :     expressionText->setXmlText(QT_TRANSLATE_NOOP("palette", "expression"));
    1545            0 :     expressionText->setPlacement(PlacementV::BELOW);
    1546            0 :     sp->appendElement(expressionText, QT_TRANSLATE_NOOP("palette", "Expression text"))->setElementTranslated(true);
    1547              : 
    1548            0 :     auto is = makeElement<InstrumentChange>(paletteScore());
    1549            0 :     is->setXmlText(QT_TRANSLATE_NOOP("palette", "Change instr."));
    1550            0 :     sp->appendElement(is, QT_TRANSLATE_NOOP("palette", "Instrument change"))->setElementTranslated(true);
    1551              : 
    1552            0 :     auto rhm = makeElement<RehearsalMark>(paletteScore());
    1553            0 :     rhm->setXmlText("B1");
    1554            0 :     sp->appendElement(rhm, QT_TRANSLATE_NOOP("palette", "Rehearsal mark"));
    1555              : 
    1556              :     struct PlayTechAnnotationInfo {
    1557              :         const char* xmlText;
    1558              :         PlayingTechniqueType playTechType;
    1559              :         bool expressionType = false;
    1560              :         muse::TranslatableString userName = TConv::userName(playTechType);
    1561              :     };
    1562              : 
    1563              :     static const std::vector<PlayTechAnnotationInfo> playTechAnnotations = {
    1564              :         { QT_TRANSLATE_NOOP("palette", "legato"),    PlayingTechniqueType::Legato },
    1565              :         { QT_TRANSLATE_NOOP("palette", "pizz."),     PlayingTechniqueType::Pizzicato },
    1566              :         { QT_TRANSLATE_NOOP("palette", "arco"),      PlayingTechniqueType::Natural, false, muse::TranslatableString("palette", "Arco") },
    1567              :         { QT_TRANSLATE_NOOP("palette", "tremolo"),   PlayingTechniqueType::Tremolo, true },
    1568              :         //: For brass and plucked string instruments: staff text that prescribes to use mute while playing, see https://en.wikipedia.org/wiki/Mute_(music)
    1569              :         { QT_TRANSLATE_NOOP("palette", "mute"),      PlayingTechniqueType::Mute },
    1570              :         //: For brass and plucked string instruments: staff text that prescribes to play without mute, see https://en.wikipedia.org/wiki/Mute_(music)
    1571              :         { QT_TRANSLATE_NOOP("palette", "open"),      PlayingTechniqueType::Open },
    1572              :         { QT_TRANSLATE_NOOP("palette", "distort"),   PlayingTechniqueType::Distortion },
    1573              :         { QT_TRANSLATE_NOOP("palette", "overdrive"), PlayingTechniqueType::Overdrive },
    1574              :         { QT_TRANSLATE_NOOP("palette", "harmonics"), PlayingTechniqueType::Harmonics },
    1575              :         { QT_TRANSLATE_NOOP("palette", "jazz tone"), PlayingTechniqueType::JazzTone },
    1576              :         { QT_TRANSLATE_NOOP("palette", "normal"),    PlayingTechniqueType::Natural },
    1577            0 :     };
    1578              : 
    1579            0 :     for (PlayTechAnnotationInfo playTechAnnotation : playTechAnnotations) {
    1580            0 :         auto pta = makeElement<PlayTechAnnotation>(paletteScore());
    1581            0 :         if (playTechAnnotation.expressionType) {
    1582            0 :             pta->setTextStyleType(TextStyleType::EXPRESSION);
    1583              :         }
    1584            0 :         pta->setXmlText(playTechAnnotation.xmlText);
    1585            0 :         pta->setTechniqueType(playTechAnnotation.playTechType);
    1586            0 :         sp->appendElement(pta, playTechAnnotation.userName)->setElementTranslated(true);
    1587            0 :     }
    1588              : 
    1589            0 :     if (!defaultPalette) {
    1590              :         // Measure numbers, unlike other elements (but like most text elements),
    1591              :         // are not copied directly into the score when drop.
    1592              :         // Instead, they simply set the corresponding measure's MeasureNumberMode to SHOW
    1593              :         // Because of that, the element shown in the palettes does not have to have any particular formatting.
    1594            0 :         auto meaNum = makeElement<MeasureNumber>(paletteScore());
    1595            0 :         meaNum->setProperty(Pid::TEXT_STYLE, TextStyleType::STAFF);       // Make the element bigger in the palettes (using the default measure number style makes it too small)
    1596            0 :         meaNum->setXmlText(QT_TRANSLATE_NOOP("palette", "Measure number"));
    1597            0 :         sp->appendElement(meaNum, QT_TRANSLATE_NOOP("palette", "Measure number"))->setElementTranslated(true);
    1598              : 
    1599              :         static const std::vector<PlayTechAnnotationInfo> playTechAnnotationsMaster = {
    1600              :             { QT_TRANSLATE_NOOP("palette", "détaché"),   PlayingTechniqueType::Detache },
    1601              :             { QT_TRANSLATE_NOOP("palette", "martelé"),   PlayingTechniqueType::Martele },
    1602              :             { QT_TRANSLATE_NOOP("palette", "col legno"), PlayingTechniqueType::ColLegno },
    1603              :             { QT_TRANSLATE_NOOP("palette", "sul pont."), PlayingTechniqueType::SulPonticello },
    1604              :             { QT_TRANSLATE_NOOP("palette", "sul tasto"), PlayingTechniqueType::SulTasto },
    1605              :             { QT_TRANSLATE_NOOP("palette", "vibrato"),   PlayingTechniqueType::Vibrato },
    1606            0 :         };
    1607              : 
    1608            0 :         for (PlayTechAnnotationInfo playTechAnnotation : playTechAnnotationsMaster) {
    1609            0 :             auto pta = makeElement<PlayTechAnnotation>(paletteScore());
    1610            0 :             pta->setXmlText(playTechAnnotation.xmlText);
    1611            0 :             pta->setTechniqueType(playTechAnnotation.playTechType);
    1612            0 :             sp->appendElement(pta, TConv::userName(playTechAnnotation.playTechType))->setElementTranslated(true);
    1613            0 :         }
    1614            0 :     }
    1615              : 
    1616            0 :     return sp;
    1617            0 : }
    1618              : 
    1619            0 : PalettePtr PaletteCreator::newTimePalette(bool defaultPalette)
    1620              : {
    1621              :     struct TS {
    1622              :         int numerator;
    1623              :         int denominator;
    1624              :         TimeSigType type;
    1625              :         const char* name;
    1626              :     };
    1627              : 
    1628            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::TimeSig);
    1629            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Time signatures"));
    1630            0 :     sp->setMag(.8);
    1631            0 :     sp->setGridSize(42, 38);
    1632            0 :     sp->setDrawGrid(true);
    1633              : 
    1634              :     static const std::vector<TS> defaultTimeSignatureList = {
    1635              :         { 2,  4, TimeSigType::NORMAL, "2/4" },
    1636              :         { 3,  4, TimeSigType::NORMAL, "3/4" },
    1637              :         { 4,  4, TimeSigType::NORMAL, "4/4" },
    1638              :         { 5,  4, TimeSigType::NORMAL, "5/4" },
    1639              :         { 6,  4, TimeSigType::NORMAL, "6/4" },
    1640              :         { 3,  8, TimeSigType::NORMAL, "3/8" },
    1641              :         { 4,  8, TimeSigType::NORMAL, "4/8" },
    1642              :         { 5,  8, TimeSigType::NORMAL, "5/8" },
    1643              :         { 6,  8, TimeSigType::NORMAL, "6/8" },
    1644              :         { 7,  8, TimeSigType::NORMAL, "7/8" },
    1645              :         { 9,  8, TimeSigType::NORMAL, "9/8" },
    1646              :         { 12, 8, TimeSigType::NORMAL, "12/8" },
    1647              :         { 4,  4, TimeSigType::FOUR_FOUR,  QT_TRANSLATE_NOOP("engraving/timesig", "Common time") },
    1648              :         { 2,  2, TimeSigType::ALLA_BREVE, QT_TRANSLATE_NOOP("engraving/timesig", "Cut time") },
    1649              :         { 2,  2, TimeSigType::NORMAL, "2/2" },
    1650              :         { 3,  2, TimeSigType::NORMAL, "3/2" }
    1651            0 :     };
    1652              : 
    1653              :     static const std::vector<TS> masterTimeSignatureList = {
    1654              :         { 2,  4, TimeSigType::NORMAL, "2/4" },
    1655              :         { 3,  4, TimeSigType::NORMAL, "3/4" },
    1656              :         { 4,  4, TimeSigType::NORMAL, "4/4" },
    1657              :         { 5,  4, TimeSigType::NORMAL, "5/4" },
    1658              :         { 6,  4, TimeSigType::NORMAL, "6/4" },
    1659              :         { 3,  8, TimeSigType::NORMAL, "3/8" },
    1660              :         { 4,  8, TimeSigType::NORMAL, "4/8" },
    1661              :         { 5,  8, TimeSigType::NORMAL, "5/8" },
    1662              :         { 6,  8, TimeSigType::NORMAL, "6/8" },
    1663              :         { 7,  8, TimeSigType::NORMAL, "7/8" },
    1664              :         { 9,  8, TimeSigType::NORMAL, "9/8" },
    1665              :         { 12, 8, TimeSigType::NORMAL, "12/8" },
    1666              :         { 4,  4, TimeSigType::FOUR_FOUR,  QT_TRANSLATE_NOOP("engraving/timesig", "Common time") },
    1667              :         { 2,  2, TimeSigType::ALLA_BREVE, QT_TRANSLATE_NOOP("engraving/timesig", "Cut time") },
    1668              :         { 2,  2, TimeSigType::NORMAL, "2/2" },
    1669              :         { 3,  2, TimeSigType::NORMAL, "3/2" },
    1670              :         { 4,  2, TimeSigType::NORMAL, "4/2" },
    1671              :         { 2,  2, TimeSigType::CUT_BACH,   QT_TRANSLATE_NOOP("engraving/timesig", "Cut time (Bach)") },
    1672              :         { 9,  8, TimeSigType::CUT_TRIPLE, QT_TRANSLATE_NOOP("engraving/timesig", "Cut triple time (9/8)") }
    1673            0 :     };
    1674              : 
    1675            0 :     for (const TS& timeSignatureType : defaultPalette ? defaultTimeSignatureList : masterTimeSignatureList) {
    1676            0 :         auto timeSignature = Factory::makeTimeSig(paletteScore()->dummy());
    1677            0 :         timeSignature->setSig(Fraction(timeSignatureType.numerator, timeSignatureType.denominator), timeSignatureType.type);
    1678            0 :         sp->appendElement(timeSignature, timeSignatureType.name);
    1679            0 :     }
    1680              : 
    1681            0 :     return sp;
    1682            0 : }
    1683              : 
    1684            0 : PalettePtr PaletteCreator::newFretboardDiagramPalette(bool defaultPalette)
    1685              : {
    1686            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::FretboardDiagram);
    1687            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Fretboard diagrams"));
    1688            0 :     sp->setGridSize(42, 45);
    1689            0 :     sp->setDrawGrid(true);
    1690            0 :     sp->setVisible(false);
    1691              : 
    1692              :     struct FretDiagramInfo {
    1693              :         String harmony;
    1694              :         muse::TranslatableString userName;
    1695              :     };
    1696              : 
    1697              :     static const std::vector<FretDiagramInfo> fretboardDiagrams = {
    1698              :         { u"",  muse::TranslatableString("palette", "Blank") },
    1699              : 
    1700              :         { u"C",  muse::TranslatableString("palette", "C") },
    1701              :         { u"Cm", muse::TranslatableString("palette", "Cm") },
    1702              :         { u"C7", muse::TranslatableString("palette", "C7") },
    1703              : 
    1704              :         { u"D",  muse::TranslatableString("palette", "D") },
    1705              :         { u"Dm", muse::TranslatableString("palette", "Dm") },
    1706              :         { u"D7", muse::TranslatableString("palette", "D7") },
    1707              : 
    1708              :         { u"E",  muse::TranslatableString("palette", "E") },
    1709              :         { u"Em", muse::TranslatableString("palette", "Em") },
    1710              :         { u"E7", muse::TranslatableString("palette", "E7") },
    1711              : 
    1712              :         { u"F",  muse::TranslatableString("palette", "F") },
    1713              :         { u"Fm", muse::TranslatableString("palette", "Fm") },
    1714              :         { u"F7", muse::TranslatableString("palette", "F7") },
    1715              : 
    1716              :         { u"G",  muse::TranslatableString("palette", "G") },
    1717              :         { u"Gm", muse::TranslatableString("palette", "Gm") },
    1718              :         { u"G7", muse::TranslatableString("palette", "G7") },
    1719              : 
    1720              :         { u"A",  muse::TranslatableString("palette", "A") },
    1721              :         { u"Am", muse::TranslatableString("palette", "Am") },
    1722              :         { u"A7", muse::TranslatableString("palette", "A7") },
    1723              : 
    1724              :         { u"B",  muse::TranslatableString("palette", "B") },
    1725              :         { u"Bm", muse::TranslatableString("palette", "Bm") },
    1726              :         { u"B7", muse::TranslatableString("palette", "B7") }
    1727            0 :     };
    1728              : 
    1729            0 :     for (const FretDiagramInfo& fretboardDiagram : fretboardDiagrams) {
    1730            0 :         auto fret = Factory::makeFretDiagram(paletteScore()->dummy());
    1731              : 
    1732            0 :         if (fretboardDiagram.harmony.empty()) {
    1733            0 :             fret->clear();
    1734              :         } else {
    1735            0 :             fret->setHarmony(fretboardDiagram.harmony);
    1736            0 :             fret->updateDiagram(fretboardDiagram.harmony);
    1737              :         }
    1738              : 
    1739            0 :         sp->appendElement(fret, fretboardDiagram.userName);
    1740            0 :     }
    1741              : 
    1742            0 :     if (!defaultPalette) {
    1743            0 :         sp->appendActionIcon(ActionIconType::FFRAME, FRAME_MAG);
    1744              :     }
    1745              : 
    1746            0 :     return sp;
    1747            0 : }
    1748              : 
    1749            0 : PalettePtr PaletteCreator::newGuitarPalette(bool defaultPalette)
    1750              : {
    1751            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Guitar);
    1752            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Guitar"));
    1753            0 :     sp->setGridSize(60, 33);
    1754            0 :     sp->setMag(1.2);
    1755            0 :     sp->setDrawGrid(true);
    1756            0 :     sp->setVisible(false);
    1757              : 
    1758            0 :     auto capoLine = makeElement<TextLine>(paletteScore());
    1759            0 :     capoLine->setBeginText(u"VII");
    1760            0 :     capoLine->setEndHookType(HookType::HOOK_90);
    1761            0 :     sp->appendElement(capoLine, QT_TRANSLATE_NOOP("palette", "Barré line"), 0.8);
    1762              : 
    1763            0 :     auto pm = makeElement<PalmMute>(paletteScore());
    1764            0 :     sp->appendElement(pm, QT_TRANSLATE_NOOP("palette", "Palm mute"), 0.8);
    1765              : 
    1766            0 :     auto letRing = makeElement<LetRing>(paletteScore());
    1767            0 :     sp->appendElement(letRing, QT_TRANSLATE_NOOP("palette", "Let ring"), 0.8);
    1768              : 
    1769            0 :     auto whammyBar = makeElement<WhammyBar>(paletteScore());
    1770            0 :     sp->appendElement(whammyBar, QT_TRANSLATE_NOOP("palette", "Whammy bar"), 0.8);
    1771              : 
    1772              :     static const std::vector<VibratoType> vibratos = {
    1773              :         { VibratoType::GUITAR_VIBRATO, VibratoType::GUITAR_VIBRATO_WIDE }
    1774            0 :     };
    1775              : 
    1776            0 :     for (VibratoType vibratoType : vibratos) {
    1777            0 :         auto vibrato = makeElement<Vibrato>(paletteScore());
    1778            0 :         vibrato->setVibratoType(vibratoType);
    1779            0 :         sp->appendElement(vibrato, TConv::userName(vibratoType));
    1780            0 :     }
    1781              : 
    1782            0 :     sp->appendActionIcon(ActionIconType::DIVE, 1.5);
    1783            0 :     sp->appendActionIcon(ActionIconType::PRE_DIVE, 1.5);
    1784            0 :     sp->appendActionIcon(ActionIconType::DIP, 1.4);
    1785            0 :     sp->appendActionIcon(ActionIconType::SCOOP, 1.5);
    1786              : 
    1787            0 :     sp->appendActionIcon(ActionIconType::STANDARD_BEND, 1.5);
    1788            0 :     sp->appendActionIcon(ActionIconType::PRE_BEND, 1.5);
    1789            0 :     sp->appendActionIcon(ActionIconType::GRACE_NOTE_BEND, 1.4);
    1790            0 :     sp->appendActionIcon(ActionIconType::SLIGHT_BEND, 1.5);
    1791              : 
    1792            0 :     const char* finger = "pimac";
    1793            0 :     for (unsigned i = 0; i < strlen(finger); ++i) {
    1794            0 :         auto f = makeElement<Fingering>(paletteScore());
    1795            0 :         f->setTextStyleType(TextStyleType::RH_GUITAR_FINGERING);
    1796            0 :         f->setXmlText(QString(finger[i]));
    1797            0 :         sp->appendElement(f, QT_TRANSLATE_NOOP("palette", "RH guitar fingering %1"));
    1798            0 :     }
    1799              : 
    1800            0 :     finger = "012345T";
    1801            0 :     for (unsigned i = 0; i < strlen(finger); ++i) {
    1802            0 :         auto f = makeElement<Fingering>(paletteScore());
    1803            0 :         f->setTextStyleType(TextStyleType::LH_GUITAR_FINGERING);
    1804            0 :         f->setXmlText(QString(finger[i]));
    1805            0 :         sp->appendElement(f, QT_TRANSLATE_NOOP("palette", "LH guitar fingering %1"));
    1806            0 :     }
    1807            0 :     finger = defaultPalette ? "123456" : "0123456789";
    1808            0 :     for (unsigned i = 0; i < strlen(finger); ++i) {
    1809            0 :         auto f = makeElement<Fingering>(paletteScore());
    1810            0 :         f->initTextStyleType(TextStyleType::STRING_NUMBER);
    1811            0 :         f->setXmlText(QString(finger[i]));
    1812            0 :         sp->appendElement(f, QT_TRANSLATE_NOOP("palette", "String number %1"));
    1813            0 :     }
    1814              : 
    1815            0 :     auto lhTapping = Factory::makeTapping(paletteScore()->dummy());
    1816            0 :     lhTapping->setHand(TappingHand::LEFT);
    1817            0 :     sp->appendElement(lhTapping, QT_TRANSLATE_NOOP("palette", "Left-hand tapping"), 1.0);
    1818              : 
    1819            0 :     auto rhTapping = Factory::makeTapping(paletteScore()->dummy());
    1820            0 :     rhTapping->setHand(TappingHand::RIGHT);
    1821            0 :     sp->appendElement(rhTapping, QT_TRANSLATE_NOOP("palette", "Right-hand tapping"), 1.0);
    1822              : 
    1823            0 :     auto hopo = Factory::makeHammerOnPullOff(paletteScore()->dummy());
    1824            0 :     sp->appendElement(hopo, QT_TRANSLATE_NOOP("palette", "Hammer-on / pull-off"), 0.8);
    1825              : 
    1826              :     static const SymIdList luteSymbols {
    1827              :         SymId::stringsThumbPosition,
    1828              :         SymId::luteFingeringRHThumb, SymId::luteFingeringRHFirst,
    1829              :         SymId::luteFingeringRHSecond, SymId::luteFingeringRHThird
    1830            0 :     };
    1831              : 
    1832            0 :     for (auto i : luteSymbols) {
    1833            0 :         auto s = Factory::makeArticulation(paletteScore()->dummy());
    1834            0 :         s->setSymId(i);
    1835            0 :         sp->appendElement(s, s->subtypeUserName());
    1836            0 :     }
    1837              : 
    1838            0 :     auto capo = makeElement<Capo>(paletteScore());
    1839            0 :     capo->setXmlText(String::fromAscii(QT_TRANSLATE_NOOP("palette", "Capo")));
    1840            0 :     sp->appendElement(capo, QT_TRANSLATE_NOOP("palette", "Capo"), 0.9)->setElementTranslated(true);
    1841              : 
    1842            0 :     auto stringTunings = makeElement<StringTunings>(paletteScore());
    1843            0 :     stringTunings->setXmlText(u"<sym>guitarString6</sym> - D");
    1844            0 :     stringTunings->initTextStyleType(TextStyleType::STRING_TUNINGS);
    1845            0 :     sp->appendElement(stringTunings, QT_TRANSLATE_NOOP("palette", "String tunings"), 0.9)->setElementTranslated(true);
    1846              : 
    1847              :     struct PlayTechAnnotationInfo {
    1848              :         const char* xmlText;
    1849              :         PlayingTechniqueType playTechType;
    1850              :     };
    1851              : 
    1852              :     static const std::vector<PlayTechAnnotationInfo> playTechAnnotations = {
    1853              :         { QT_TRANSLATE_NOOP("palette", "distort"),   PlayingTechniqueType::Distortion, },
    1854              :         { QT_TRANSLATE_NOOP("palette", "overdrive"), PlayingTechniqueType::Overdrive, },
    1855              :         { QT_TRANSLATE_NOOP("palette", "harmonics"), PlayingTechniqueType::Harmonics, },
    1856              :         { QT_TRANSLATE_NOOP("palette", "jazz tone"), PlayingTechniqueType::JazzTone, },
    1857              :         { QT_TRANSLATE_NOOP("palette", "normal"),    PlayingTechniqueType::Natural },
    1858            0 :     };
    1859              : 
    1860            0 :     for (const PlayTechAnnotationInfo& playTechAnnotation : playTechAnnotations) {
    1861            0 :         auto pta = makeElement<PlayTechAnnotation>(paletteScore());
    1862            0 :         pta->setXmlText(playTechAnnotation.xmlText);
    1863            0 :         pta->setTechniqueType(playTechAnnotation.playTechType);
    1864            0 :         sp->appendElement(pta, TConv::userName(playTechAnnotation.playTechType), 0.8)->setElementTranslated(true);
    1865            0 :     }
    1866              : 
    1867            0 :     sp->appendActionIcon(ActionIconType::FFRAME, FRAME_MAG);
    1868              : 
    1869            0 :     return sp;
    1870            0 : }
    1871              : 
    1872            0 : PalettePtr PaletteCreator::newKeyboardPalette()
    1873              : {
    1874            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Keyboard);
    1875            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Keyboard"));
    1876            0 :     sp->setGridSize(73, 30);
    1877            0 :     sp->setDrawGrid(true);
    1878              : 
    1879            0 :     auto pedal = makeElement<Pedal>(paletteScore());
    1880            0 :     pedal->setLineVisible(false);
    1881            0 :     pedal->setEndHookType(HookType::ROSETTE);
    1882            0 :     pedal->setBeginText(pedal->propertyDefault(Pid::BEGIN_TEXT).value<String>());
    1883            0 :     pedal->setContinueText(pedal->propertyDefault(Pid::CONTINUE_TEXT).value<String>());
    1884            0 :     pedal->setEndText(pedal->propertyDefault(Pid::END_TEXT).value<String>());
    1885            0 :     sp->appendElement(pedal, QT_TRANSLATE_NOOP("palette", "Pedal (with ped and asterisk)"));
    1886              : 
    1887            0 :     pedal = makeElement<Pedal>(paletteScore());
    1888            0 :     pedal->setEndHookType(HookType::HOOK_90);
    1889            0 :     pedal->setBeginText(pedal->propertyDefault(Pid::BEGIN_TEXT).value<String>());
    1890            0 :     pedal->setContinueText(pedal->propertyDefault(Pid::CONTINUE_TEXT).value<String>());
    1891            0 :     pedal->setEndText(pedal->propertyDefault(Pid::END_TEXT).value<String>());
    1892            0 :     sp->appendElement(pedal, QT_TRANSLATE_NOOP("palette", "Pedal (with ped and line)"));
    1893              : 
    1894            0 :     pedal = makeElement<Pedal>(paletteScore());
    1895            0 :     pedal->setBeginHookType(HookType::HOOK_90);
    1896            0 :     pedal->setEndHookType(HookType::HOOK_90);
    1897            0 :     pedal->setBeginText(pedal->propertyDefault(Pid::BEGIN_TEXT).value<String>());
    1898            0 :     pedal->setContinueText(pedal->propertyDefault(Pid::CONTINUE_TEXT).value<String>());
    1899            0 :     pedal->setEndText(pedal->propertyDefault(Pid::END_TEXT).value<String>());
    1900            0 :     sp->appendElement(pedal, QT_TRANSLATE_NOOP("palette", "Pedal (straight hooks)"));
    1901              : 
    1902            0 :     pedal = makeElement<Pedal>(paletteScore());
    1903            0 :     pedal->setBeginHookType(HookType::HOOK_90);
    1904            0 :     pedal->setEndHookType(HookType::HOOK_45);
    1905            0 :     pedal->setBeginText(pedal->propertyDefault(Pid::BEGIN_TEXT).value<String>());
    1906            0 :     pedal->setContinueText(pedal->propertyDefault(Pid::CONTINUE_TEXT).value<String>());
    1907            0 :     pedal->setEndText(pedal->propertyDefault(Pid::END_TEXT).value<String>());
    1908            0 :     sp->appendElement(pedal, QT_TRANSLATE_NOOP("palette", "Pedal (angled end hook)"));
    1909              : 
    1910            0 :     pedal = makeElement<Pedal>(paletteScore());
    1911            0 :     pedal->setBeginHookType(HookType::HOOK_45);
    1912            0 :     pedal->setEndHookType(HookType::HOOK_45);
    1913            0 :     pedal->setBeginText(pedal->propertyDefault(Pid::BEGIN_TEXT).value<String>());
    1914            0 :     pedal->setContinueText(pedal->propertyDefault(Pid::CONTINUE_TEXT).value<String>());
    1915            0 :     pedal->setEndText(pedal->propertyDefault(Pid::END_TEXT).value<String>());
    1916            0 :     sp->appendElement(pedal, QT_TRANSLATE_NOOP("palette", "Pedal (both hooks angled)"));
    1917              : 
    1918            0 :     pedal = makeElement<Pedal>(paletteScore());
    1919            0 :     pedal->setBeginHookType(HookType::HOOK_45);
    1920            0 :     pedal->setEndHookType(HookType::HOOK_90);
    1921            0 :     pedal->setBeginText(pedal->propertyDefault(Pid::BEGIN_TEXT).value<String>());
    1922            0 :     pedal->setContinueText(pedal->propertyDefault(Pid::CONTINUE_TEXT).value<String>());
    1923            0 :     pedal->setEndText(pedal->propertyDefault(Pid::END_TEXT).value<String>());
    1924            0 :     sp->appendElement(pedal, QT_TRANSLATE_NOOP("palette", "Pedal (angled start hook)"));
    1925              : 
    1926              :     std::array<QString, 3> names = { QT_TRANSLATE_NOOP("palette", "Chord bracket"),
    1927              :                                      QT_TRANSLATE_NOOP("palette", "Chord bracket (play with left hand)"),
    1928            0 :                                      QT_TRANSLATE_NOOP("palette", "Chord bracket (play with right hand)") };
    1929            0 :     for (int i = 0; i < 3; ++i) {
    1930            0 :         DirectionV hookPos = DirectionV(i);
    1931            0 :         auto c = Factory::makeChordBracket(paletteScore()->dummy());
    1932            0 :         c->setProperty(Pid::BRACKET_HOOK_POS, hookPos);
    1933            0 :         sp->appendElement(c, names[i]);
    1934            0 :     }
    1935              : 
    1936            0 :     return sp;
    1937            0 : }
    1938              : 
    1939            0 : PalettePtr PaletteCreator::newPitchPalette(bool defaultPalette)
    1940              : {
    1941            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Pitch);
    1942              :     //: The name of a palette
    1943            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Pitch"));
    1944            0 :     sp->setGridSize(100, 30);
    1945            0 :     sp->setDrawGrid(true);
    1946            0 :     sp->setMag(0.8);
    1947              : 
    1948              :     static const std::vector<OttavaType> ottavasDefault {
    1949              :         OttavaType::OTTAVA_8VA,
    1950              :         OttavaType::OTTAVA_8VB,
    1951              :         OttavaType::OTTAVA_15MA,
    1952              :         OttavaType::OTTAVA_15MB
    1953            0 :     };
    1954              : 
    1955              :     static const std::vector<OttavaType> ottavasMaster {
    1956              :         OttavaType::OTTAVA_8VA,
    1957              :         OttavaType::OTTAVA_8VB,
    1958              :         OttavaType::OTTAVA_15MA,
    1959              :         OttavaType::OTTAVA_15MB,
    1960              :         OttavaType::OTTAVA_22MA,
    1961              :         OttavaType::OTTAVA_22MB
    1962            0 :     };
    1963              : 
    1964            0 :     for (OttavaType ottavaType : defaultPalette ? ottavasDefault : ottavasMaster) {
    1965            0 :         auto ottava = makeElement<Ottava>(paletteScore());
    1966            0 :         ottava->setOttavaType(ottavaType);
    1967            0 :         ottava->styleChanged();
    1968            0 :         sp->appendElement(ottava, ottava->subtypeUserName());
    1969            0 :     }
    1970              : 
    1971            0 :     auto a = Factory::makeAmbitus(paletteScore()->dummy());
    1972            0 :     sp->appendElement(a, QT_TRANSLATE_NOOP("palette", "Ambitus"));
    1973            0 :     return sp;
    1974            0 : }
    1975              : 
    1976            0 : PalettePtr PaletteCreator::newHarpPalette()
    1977              : {
    1978            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Harp);
    1979            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Harp"));
    1980            0 :     sp->setGridSize(90, 30);
    1981            0 :     sp->setDrawGrid(true);
    1982            0 :     sp->setVisible(false);
    1983              : 
    1984            0 :     auto pedalDiagram = Factory::makeHarpPedalDiagram(paletteScore()->dummy());
    1985            0 :     sp->appendElement(pedalDiagram, QT_TRANSLATE_NOOP("palette", "Harp pedal diagram"));
    1986              : 
    1987            0 :     auto pedalTextDiagram = Factory::makeHarpPedalDiagram(paletteScore()->dummy());
    1988            0 :     pedalTextDiagram->setIsDiagram(false);
    1989              : 
    1990            0 :     sp->appendElement(pedalTextDiagram, QT_TRANSLATE_NOOP("palette", "Harp pedal text diagram"));
    1991              : 
    1992            0 :     return sp;
    1993            0 : }
    1994              : 
    1995            0 : PalettePtr PaletteCreator::newHandbellsPalette(bool defaultPalette)
    1996              : {
    1997            0 :     PalettePtr sp = std::make_shared<Palette>(iocContext(), Palette::Type::Handbells);
    1998            0 :     sp->setName(QT_TRANSLATE_NOOP("palette", "Handbells"));
    1999            0 :     sp->setGridSize(42, 25);
    2000            0 :     sp->setDrawGrid(true);
    2001            0 :     sp->setVisible(false);
    2002              : 
    2003              :     static const std::vector<SymId> standardHandbellsArticSymbols {
    2004              :         SymId::handbellsMartellato,
    2005              :         SymId::handbellsMartellatoLift,
    2006              :         SymId::handbellsMalletBellSuspended,
    2007              :         SymId::handbellsMalletBellOnTable,
    2008              :         SymId::handbellsMalletLft,
    2009              :         SymId::handbellsPluckLift,
    2010              :         SymId::handbellsGyro,
    2011            0 :     };
    2012              : 
    2013              :     static const std::vector<ArticulationTextType> handbellsTextTypes {
    2014              :         ArticulationTextType::TD,
    2015              :         ArticulationTextType::BD,
    2016              :         ArticulationTextType::RT,
    2017              :         ArticulationTextType::PL,
    2018              :         ArticulationTextType::SB,
    2019              :         ArticulationTextType::VIB,
    2020            0 :     };
    2021              : 
    2022              :     struct HandbellsPlayTechInfo {
    2023              :         const char* xmlText;
    2024              :         PlayingTechniqueType playTechType;
    2025              :     };
    2026              : 
    2027              :     static const std::vector<HandbellsPlayTechInfo> standardHandbellsPlayTech {
    2028              :         { "R", PlayingTechniqueType::HandbellsR, },
    2029              :         { "LV", PlayingTechniqueType::HandbellsLV, },
    2030              :         { "<sym>handbellsDamp3</sym>",   PlayingTechniqueType::HandbellsDamp, },
    2031              :         { "<sym>handbellsSwingUp</sym>",   PlayingTechniqueType::HandbellsSwingUp, },
    2032              :         { "<sym>handbellsSwingDown</sym>",   PlayingTechniqueType::HandbellsSwingDown, },
    2033              :         { "<sym>handbellsEcho1</sym>",   PlayingTechniqueType::HandbellsEcho1, },
    2034            0 :     };
    2035              : 
    2036            0 :     for (SymId symId : standardHandbellsArticSymbols) {
    2037            0 :         auto artic = Factory::makeArticulation(paletteScore()->dummy());
    2038            0 :         artic->setSymId(symId);
    2039            0 :         sp->appendElement(artic, artic->subtypeUserName(),
    2040            0 :                           symId == SymId::handbellsGyro ? 0.7 : symId == SymId::handbellsMalletBellSuspended ? 1.4 : 1.0);
    2041            0 :     }
    2042              : 
    2043            0 :     for (ArticulationTextType textType : handbellsTextTypes) {
    2044            0 :         auto artic = Factory::makeArticulation(paletteScore()->dummy());
    2045            0 :         artic->setTextType(textType);
    2046            0 :         sp->appendElement(artic, artic->subtypeUserName(), 1.1);
    2047            0 :     }
    2048              : 
    2049            0 :     for (const HandbellsPlayTechInfo& info : standardHandbellsPlayTech) {
    2050            0 :         auto element = makeElement<PlayTechAnnotation>(paletteScore());
    2051            0 :         element->setProperty(Pid::TEXT_STYLE, TextStyleType::ARTICULATION);
    2052            0 :         element->setXmlText(info.xmlText);
    2053            0 :         element->setTechniqueType(info.playTechType);
    2054            0 :         sp->appendElement(element, TConv::userName(info.playTechType),
    2055            0 :                           info.playTechType == PlayingTechniqueType::HandbellsLV
    2056            0 :                           || info.playTechType == PlayingTechniqueType::HandbellsR ? 1.1 : 1.0);
    2057            0 :     }
    2058              : 
    2059            0 :     if (!defaultPalette) {
    2060              :         static const std::vector<SymId> additionalHandbellsArticSymbols {
    2061              :             SymId::handbellsHandMartellato,
    2062              :             SymId::handbellsMutedMartellato,
    2063            0 :         };
    2064              : 
    2065            0 :         for (SymId symId : additionalHandbellsArticSymbols) {
    2066            0 :             auto artic = Factory::makeArticulation(paletteScore()->dummy());
    2067            0 :             artic->setSymId(symId);
    2068            0 :             sp->appendElement(artic, artic->subtypeUserName());
    2069            0 :         }
    2070              : 
    2071              :         static const std::vector<HandbellsPlayTechInfo> additionalHandbellsPlayTech {
    2072              :             { "<sym>handbellsSwing</sym>",   PlayingTechniqueType::HandbellsSwing, },
    2073              :             { "<sym>handbellsEcho2</sym>",   PlayingTechniqueType::HandbellsEcho2, },
    2074            0 :         };
    2075              : 
    2076            0 :         for (const HandbellsPlayTechInfo& info : additionalHandbellsPlayTech) {
    2077            0 :             auto element = makeElement<PlayTechAnnotation>(paletteScore());
    2078            0 :             element->setProperty(Pid::TEXT_STYLE, TextStyleType::ARTICULATION);
    2079            0 :             element->setXmlText(info.xmlText);
    2080            0 :             element->setTechniqueType(info.playTechType);
    2081            0 :             sp->appendElement(element, TConv::userName(info.playTechType));
    2082            0 :         }
    2083              :     }
    2084              : 
    2085            0 :     return sp;
    2086            0 : }
        

Generated by: LCOV version 2.0-1