Merge pull request #20128 from Eism/palette_more_items_repeats_fix

Fixed palette items
This commit is contained in:
DmitryArefiev 2023-11-22 18:38:48 +02:00 committed by GitHub
commit 5384a156e7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 89 additions and 7 deletions

View file

@ -683,6 +683,7 @@ void SingleLayout::layout(Bracket* item, const Context& ctx)
Bracket::LayoutData* ldata = item->mutldata();
ldata->setBracketHeight(3.5 * item->spatium() * 2);
ldata->braceSymbol = item->braceSymbol();
Shape shape;

View file

@ -274,7 +274,7 @@ void TWrite::writeStyledProperties(const EngravingItem* item, XmlWriter& xml)
void TWrite::writeItemProperties(const EngravingItem* item, XmlWriter& xml, WriteContext& ctx)
{
if (!MScore::testMode) {
if (!MScore::testMode && !item->score()->isPaletteScore()) {
xml.tag("eid", item->eid().toUint64());
}

View file

@ -125,6 +125,17 @@ PaletteCellPtr Palette::insertElement(size_t idx, ElementPtr element, const Tran
return insertElement(idx, element, name.str, mag, offset, tag);
}
PaletteCellPtr Palette::insertActionIcon(size_t idx, ActionIconType type, actions::ActionCode code, double mag)
{
const ui::UiAction& action = actionsRegister()->action(code);
QString name = !action.description.isEmpty() ? action.description.qTranslated() : action.title.qTranslatedWithoutMnemonic();
auto icon = std::make_shared<ActionIcon>(gpaletteScore->dummy());
icon->setActionType(type);
icon->setAction(code, static_cast<char16_t>(action.iconCode));
return insertElement(idx, icon, name, mag);
}
PaletteCellPtr Palette::appendElement(ElementPtr element, const QString& name, qreal mag, const QPointF& offset, const QString& tag)
{
if (element) {
@ -181,6 +192,21 @@ bool Palette::insertCells(size_t idx, std::vector<PaletteCellPtr> cells)
return true;
}
bool Palette::removeCell(PaletteCellPtr cell)
{
return removeCells({ cell });
}
bool Palette::removeCells(std::vector<PaletteCellPtr> cells)
{
for (PaletteCellPtr& c : cells) {
c->setParent(nullptr);
m_cells.erase(std::remove(m_cells.begin(), m_cells.end(), c), m_cells.end());
}
return true;
}
PaletteCellPtr Palette::takeCell(size_t idx)
{
std::vector<PaletteCellPtr> cells = takeCells(idx, 1);
@ -316,6 +342,7 @@ bool Palette::read(XmlReader& e, bool pasteMode)
m_type = guessType();
}
PaletteCompat::removeOldItemsIfNeeded(*this);
PaletteCompat::addNewItemsIfNeeded(*this, gpaletteScore);
return true;

View file

@ -112,6 +112,7 @@ public:
const QPointF& offset = QPointF(), const QString& tag = "");
PaletteCellPtr insertElement(size_t idx, engraving::ElementPtr element, const TranslatableString& name, qreal mag = 1.0,
const QPointF& offset = QPointF(), const QString& tag = "");
PaletteCellPtr insertActionIcon(size_t idx, engraving::ActionIconType type, actions::ActionCode code, double mag = 1.0);
// TODO: Remove QString overload
PaletteCellPtr appendElement(engraving::ElementPtr element, const QString& name, qreal mag = 1.0,
const QPointF& offset = QPointF(), const QString& tag = "");
@ -121,6 +122,8 @@ public:
bool insertCell(size_t idx, PaletteCellPtr cell);
bool insertCells(size_t idx, std::vector<PaletteCellPtr> cells);
bool removeCell(PaletteCellPtr cell);
bool removeCells(std::vector<PaletteCellPtr> cells);
const std::vector<PaletteCellPtr>& cells() const { return m_cells; }
int cellsCount() const { return int(m_cells.size()); }

View file

@ -26,6 +26,7 @@
#include "engraving/rw/compat/compatutils.h"
#include "engraving/dom/actionicon.h"
#include "engraving/dom/articulation.h"
#include "engraving/dom/chordrest.h"
#include "engraving/dom/engravingitem.h"
@ -44,6 +45,13 @@
using namespace mu::palette;
using namespace mu::engraving;
static const std::unordered_set<ActionIconType> BENDS_ACTION_TYPES = {
ActionIconType::STANDARD_BEND,
ActionIconType::PRE_BEND,
ActionIconType::GRACE_NOTE_BEND,
ActionIconType::SLIGHT_BEND
};
void PaletteCompat::migrateOldPaletteItemIfNeeded(ElementPtr& element, Score* paletteScore)
{
EngravingItem* item = element.get();
@ -82,17 +90,35 @@ void PaletteCompat::addNewItemsIfNeeded(Palette& palette, Score* paletteScore)
}
}
void PaletteCompat::removeOldItemsIfNeeded(Palette& palette)
{
if (palette.type() == Palette::Type::Articulation
|| palette.type() == Palette::Type::Guitar) {
removeOldItems(palette);
}
}
void PaletteCompat::addNewGuitarItems(Palette& guitarPalette, Score* paletteScore)
{
bool containsCapo = false;
bool containsStringTunings = false;
bool containsGuitarBends = false;
for (const PaletteCellPtr& cell : guitarPalette.cells()) {
if (cell->element && cell->element->isCapo()) {
containsCapo = true;
const ElementPtr element = cell->element;
if (!element) {
continue;
}
if (cell->element && cell->element->isStringTunings()) {
if (element->isCapo()) {
containsCapo = true;
} else if (element->isStringTunings()) {
containsStringTunings = true;
} else if (element->isActionIcon()) {
const ActionIcon* icon = toActionIcon(element.get());
if (contains(BENDS_ACTION_TYPES, icon->actionType())) {
containsGuitarBends = true;
}
}
}
@ -111,4 +137,30 @@ void PaletteCompat::addNewGuitarItems(Palette& guitarPalette, Score* paletteScor
guitarPalette.insertElement(defaultPosition, stringTunings, QT_TRANSLATE_NOOP("palette", "String tunings"))->setElementTranslated(
true);
}
if (!containsGuitarBends) {
int defaultPosition = std::min(9, guitarPalette.cellsCount());
guitarPalette.insertActionIcon(defaultPosition, ActionIconType::STANDARD_BEND, "standard-bend", 1.25);
guitarPalette.insertActionIcon(defaultPosition, ActionIconType::PRE_BEND, "pre-bend", 1.25);
guitarPalette.insertActionIcon(defaultPosition, ActionIconType::GRACE_NOTE_BEND, "grace-note-bend", 1.25);
guitarPalette.insertActionIcon(defaultPosition, ActionIconType::SLIGHT_BEND, "slight-bend", 1.25);
}
}
void PaletteCompat::removeOldItems(Palette& palette)
{
std::vector<PaletteCellPtr> cellsToRemove;
for (const PaletteCellPtr& cell : palette.cells()) {
const ElementPtr element = cell->element;
if (!element) {
continue;
}
if (element->isBend()) {
cellsToRemove.emplace_back(cell);
}
}
palette.removeCells(cellsToRemove);
}

View file

@ -32,9 +32,11 @@ class PaletteCompat
public:
static void migrateOldPaletteItemIfNeeded(engraving::ElementPtr& element, engraving::Score* paletteScore);
static void addNewItemsIfNeeded(Palette& palette, engraving::Score* paletteScore);
static void removeOldItemsIfNeeded(Palette& palette);
private:
static void addNewGuitarItems(Palette& guitarPalette, engraving::Score* paletteScore);
static void removeOldItems(Palette& palette);
};
} // namespace mu::palette
#endif // MU_PALETTE_PALETTECOMPAT_H

View file

@ -764,9 +764,6 @@ PalettePtr PaletteCreator::newArticulationsPalette(bool defaultPalette)
}
if (!defaultPalette) {
auto bend = Factory::makeGuitarBend(gpaletteScore->dummy()->note());
sp->appendElement(bend, QT_TRANSLATE_NOOP("palette", "Bend"));
auto tb = Factory::makeTremoloBar(gpaletteScore->dummy());
tb->points().push_back(PitchValue(0, 0, false)); // "Dip"
tb->points().push_back(PitchValue(30, -100, false));