Skip to content

Commit

Permalink
Fixed testing issues
Browse files Browse the repository at this point in the history
  • Loading branch information
Eism committed Oct 16, 2023
1 parent f621f82 commit cf54fef
Show file tree
Hide file tree
Showing 11 changed files with 164 additions and 47 deletions.
39 changes: 22 additions & 17 deletions src/engraving/dom/measure.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1330,23 +1330,7 @@ bool Measure::acceptDrop(EditData& data) const
return true;

case ElementType::STRING_TUNINGS: {
const StringData* stringData = score()->staff(staffIdx)->part()->instrument(tick())->stringData();
if (!stringData || stringData->frettedStrings() == 0) {
return false;
}

// already a string tunings element in this measure
bool alreadyHasStringTunings = false;
for (const Segment& segment : m_segments) {
for (EngravingItem* element : segment.annotations()) {
if (element && element->isStringTunings()) {
alreadyHasStringTunings = true;
break;
}
}
}

if (alreadyHasStringTunings) {
if (!canAddStringTunings(staffIdx)) {
return false;
}

Expand Down Expand Up @@ -3252,6 +3236,27 @@ void Measure::spaceRightAlignedSegments()
}
}

bool Measure::canAddStringTunings(staff_idx_t staffIdx) const
{
const StringData* stringData = score()->staff(staffIdx)->part()->instrument(tick())->stringData();
if (!stringData || stringData->frettedStrings() == 0) {
return false;
}

// already a string tunings element in this measure
bool alreadyHasStringTunings = false;
for (const Segment& segment : m_segments) {
for (EngravingItem* element : segment.annotations()) {
if (element && element->isStringTunings()) {
alreadyHasStringTunings = true;
break;
}
}
}

return !alreadyHasStringTunings;
}

void Measure::stretchToTargetWidth(double targetWidth)
{
if (targetWidth < width()) {
Expand Down
2 changes: 2 additions & 0 deletions src/engraving/dom/measure.h
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,8 @@ class Measure final : public MeasureBase

void spaceRightAlignedSegments();

bool canAddStringTunings(staff_idx_t staffIdx) const;

private:

friend class Factory;
Expand Down
14 changes: 14 additions & 0 deletions src/engraving/dom/note.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1539,6 +1539,17 @@ bool Note::acceptDrop(EditData& data) const
const Staff* st = staff();
bool isTablature = st->isTabStaff(tick());
bool tabFingering = st->staffTypeForElement(this)->showTabFingering();

if (type == ElementType::STRING_TUNINGS) {
staff_idx_t staffIdx;
Segment* seg;
if (!score()->pos2measure(data.pos, &staffIdx, 0, &seg, 0)) {
return false;
}

return chord()->measure()->canAddStringTunings(staffIdx);
}

return type == ElementType::ARTICULATION
|| type == ElementType::ORNAMENT
|| type == ElementType::FERMATA
Expand Down Expand Up @@ -1820,6 +1831,9 @@ EngravingItem* Note::drop(EditData& data)
toChordLine(e)->setNote(this);
return ch->drop(data);

case ElementType::STRING_TUNINGS:
return ch->measure()->drop(data);

default:
Spanner* spanner;
if (e->isSpanner() && (spanner = toSpanner(e))->anchor() == Spanner::Anchor::NOTE) {
Expand Down
13 changes: 13 additions & 0 deletions src/engraving/dom/rest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,16 @@ bool Rest::acceptDrop(EditData& data) const
return true;
}

if (type == ElementType::STRING_TUNINGS) {
staff_idx_t staffIdx;
Segment* seg;
if (!score()->pos2measure(data.pos, &staffIdx, 0, &seg, 0)) {
return false;
}

return measure()->canAddStringTunings(staffIdx);
}

// prevent 'hanging' slurs, avoid crash on tie
static const std::set<ElementType> ignoredTypes {
ElementType::SLUR,
Expand Down Expand Up @@ -268,6 +278,9 @@ EngravingItem* Rest::drop(EditData& data)
score()->undoAddElement(e);
return e;

case ElementType::STRING_TUNINGS:
return measure()->drop(data);

default:
return ChordRest::drop(data);
}
Expand Down
2 changes: 1 addition & 1 deletion src/engraving/dom/stringtunings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ bool StringTunings::noStringVisible() const
String StringTunings::generateText() const
{
const StringData* stringData = this->stringData();
if (stringData->isNull()) {
if (!stringData || stringData->isNull()) {
return u"";
}

Expand Down
14 changes: 9 additions & 5 deletions src/engraving/rendering/dev/tlayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ void TLayout::layoutItem(EngravingItem* item, LayoutContext& ctx)
layoutSticking(item_cast<const Sticking*>(item), static_cast<Sticking::LayoutData*>(ldata));
break;
case ElementType::STRING_TUNINGS:
layout(item_cast<StringTunings*>(item), ctx);
layoutStringTunings(item_cast<StringTunings*>(item), ctx);
break;
case ElementType::SYMBOL:
layoutSymbol(item_cast<const Symbol*>(item), static_cast<Symbol::LayoutData*>(ldata), ctx);
Expand Down Expand Up @@ -4963,10 +4963,11 @@ void TLayout::layoutStretched(StretchedBend* item, LayoutContext& ctx)
item->setPos(0.0, 0.0);
}

void TLayout::layout(StringTunings* item, LayoutContext& ctx)
void TLayout::layoutStringTunings(StringTunings* item, LayoutContext& ctx)
{
item->updateText();
layoutTextBase(item, ctx);

TLayout::layoutBaseTextBase(item, ctx);

if (item->noStringVisible()) {
double spatium = item->spatium();
Expand Down Expand Up @@ -5000,8 +5001,11 @@ void TLayout::layout(StringTunings* item, LayoutContext& ctx)

for (TextBlock& block : item->mutldata()->blocks) {
double xMove = 0.0;
for (auto& it = ++(block.fragments().begin()); it != block.fragments().end(); ++it) {
TextFragment& fragment = *it;
for (TextFragment& fragment : block.fragments()) {
if (block.fragments().front() == fragment) { // skip first
continue;
}

if (fragment.font(item).type() == mu::draw::Font::Type::MusicSymbol) {
xMove = secondStringXAlign - fragment.pos.x();
}
Expand Down
2 changes: 1 addition & 1 deletion src/engraving/rendering/dev/tlayout.h
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ class TLayout
static void layoutSticking(const Sticking* item, Sticking::LayoutData* ldata);
static void layoutStretchedBend(StretchedBend* item, LayoutContext& ctx);
static void layoutStretched(StretchedBend* item, LayoutContext& ctx);
static void layout(StringTunings* item, LayoutContext& ctx);
static void layoutStringTunings(StringTunings* item, LayoutContext& ctx);

static void layoutSymbol(const Symbol* item, Symbol::LayoutData* ldata, const LayoutContext& ctx);
static void layoutFSymbol(const FSymbol* item, FSymbol::LayoutData* ldata);
Expand Down
55 changes: 52 additions & 3 deletions src/engraving/rendering/stable/tlayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ void TLayout::layoutItem(EngravingItem* item, LayoutContext& ctx)
break;
case ElementType::STICKING: layout(item_cast<Sticking*>(item), ctx);
break;
case ElementType::STRING_TUNINGS: layout(item_cast<StringTunings*>(item), ctx);
case ElementType::STRING_TUNINGS: layoutStringTunings(item_cast<StringTunings*>(item), ctx);
break;
case ElementType::SYMBOL: layout(item_cast<Symbol*>(item), ctx);
break;
Expand Down Expand Up @@ -4492,10 +4492,59 @@ void TLayout::layoutStretched(StretchedBend* item, LayoutContext& ctx)
item->setPos(0.0, 0.0);
}

void TLayout::layout(StringTunings* item, LayoutContext& ctx)
void TLayout::layoutStringTunings(StringTunings* item, LayoutContext& ctx)
{
item->updateText();
layoutTextBase(item, ctx);

TLayout::layoutTextBase(item, ctx);

if (item->noStringVisible()) {
double spatium = item->spatium();
mu::draw::Font font(item->font());

RectF rect;
rect.setTopLeft({ 0, item->ldata()->bbox().y() - font.weight() - spatium * .15 });
rect.setSize({ font.weight() - spatium, (font.weight() - spatium * .35) * 1.5 });

item->setbbox(rect);
}

for (TextBlock& block : item->mutldata()->blocks) {
for (TextFragment& fragment : block.fragments()) {
mu::draw::Font font = fragment.font(item);
if (font.type() == mu::draw::Font::Type::MusicSymbol) {
// HACK: the music symbol doesn't have a good baseline
// to go with text so we correct it here
const double baselineAdjustment = 0.35 * font.pointSizeF();
fragment.pos.setY(fragment.pos.y() + baselineAdjustment);
}
}
}

double secondStringXAlign = 0.0;
for (const TextFragment& fragment : item->fragmentList()) {
if (fragment.font(item).type() == mu::draw::Font::Type::MusicSymbol) {
secondStringXAlign = std::max(secondStringXAlign, fragment.pos.x());
}
}

for (TextBlock& block : item->mutldata()->blocks) {
double xMove = 0.0;
for (TextFragment& fragment : block.fragments()) {
if (block.fragments().front() == fragment) { // skip first
continue;
}

if (fragment.font(item).type() == mu::draw::Font::Type::MusicSymbol) {
xMove = secondStringXAlign - fragment.pos.x();
}
fragment.pos.setX(fragment.pos.x() + xMove);
}
}

Segment* parentSegment = item->segment();
item->move(PointF(-parentSegment->x(), 0.0));

Autoplace::autoplaceSegmentElement(item, item->mutldata());
}

Expand Down
2 changes: 1 addition & 1 deletion src/engraving/rendering/stable/tlayout.h
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ class TLayout
static void layout(Sticking* item, LayoutContext& ctx);
static void layout(StretchedBend* item, LayoutContext& ctx);
static void layoutStretched(StretchedBend* item, LayoutContext& ctx);
static void layout(StringTunings* item, LayoutContext& ctx);
static void layoutStringTunings(StringTunings* item, LayoutContext& ctx);

static void layout(Symbol* item, LayoutContext& ctx);
static void layout(FSymbol* item, LayoutContext& ctx);
Expand Down
66 changes: 47 additions & 19 deletions src/notation/view/internal/stringtuningssettingsmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,8 @@ bool StringTuningsSettingsModel::setStringValue(int stringIndex, const QString&

StringTuningsItem* item = m_strings.at(stringIndex);

int value = engraving::string2pitch(stringValue);
QString _stringValue = fixStringValue(stringValue);
int value = engraving::string2pitch(_stringValue);
if (value == -1) {
item->valueChanged();
return false;
Expand All @@ -144,22 +145,26 @@ bool StringTuningsSettingsModel::setStringValue(int stringIndex, const QString&

bool StringTuningsSettingsModel::canIncreaseStringValue(const QString& stringValue) const
{
return engraving::string2pitch(stringValue) != -1;
QString value = fixStringValue(stringValue);
return engraving::string2pitch(value) != -1;
}

QString StringTuningsSettingsModel::increaseStringValue(const QString& stringValue)
{
return engraving::pitch2string(engraving::string2pitch(stringValue) + 1);
QString value = fixStringValue(stringValue);
return engraving::pitch2string(engraving::string2pitch(value) + 1);
}

bool StringTuningsSettingsModel::canDecreaseStringValue(const QString& stringValue) const
{
return engraving::string2pitch(stringValue) != -1;
QString value = fixStringValue(stringValue);
return engraving::string2pitch(value) != -1;
}

QString StringTuningsSettingsModel::decreaseStringValue(const QString& stringValue)
{
return engraving::pitch2string(engraving::string2pitch(stringValue) - 1);
QString value = fixStringValue(stringValue);
return engraving::pitch2string(engraving::string2pitch(value) - 1);
}

QVariantList StringTuningsSettingsModel::presets(bool withCustom) const
Expand Down Expand Up @@ -304,21 +309,23 @@ void StringTuningsSettingsModel::updateStrings()
m_strings.clear();

for (const QVariant& _preset : presets) {
if (_preset.toMap()["text"].toString() != currentPreset) {
continue;
}

QVariantList valueList = _preset.toMap()["value"].toList();
for (int i = 0; i < valueList.size(); ++i) {
StringTuningsItem* item = new StringTuningsItem(this);

item->blockSignals(true);
item->setShow(true);
item->setNumber(QString::number(i + 1));
item->setValue(valueList[i].toInt());
item->blockSignals(false);
if (_preset.toMap()["text"].toString() == currentPreset) {
QVariantList valueList = _preset.toMap()["value"].toList();
int numOfStrings = valueList.size();
for (int i = 0; i < numOfStrings; ++i) {
int valueIndex = numOfStrings - i - 1;
StringTuningsItem* item = new StringTuningsItem(this);

item->blockSignals(true);
item->setShow(true);
item->setNumber(QString::number(i + 1));
item->setValue(valueList[valueIndex].toInt());
item->blockSignals(false);

m_strings.push_back(item);
}

m_strings.push_back(item);
break;
}
}

Expand Down Expand Up @@ -399,6 +406,27 @@ void StringTuningsSettingsModel::doSetCurrentPreset(const QString& preset)
emit currentPresetChanged();
}

QString StringTuningsSettingsModel::fixStringValue(const QString& stringValue) const
{
if (stringValue.isEmpty()) {
return QString();
}

QString value = stringValue[0];
for (int i = 1; i < stringValue.size(); ++i) {
QChar symbol = stringValue[i].toLower();
if (symbol == "b") {
value.append("");
} else if (symbol == "#") {
value.append("");
} else {
value.append(symbol);
}
}

return value;
}

StringTuningsItem::StringTuningsItem(QObject* parent)
: QObject(parent)
{
Expand Down
2 changes: 2 additions & 0 deletions src/notation/view/internal/stringtuningssettingsmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ class StringTuningsSettingsModel : public AbstractElementPopupModel

void doSetCurrentPreset(const QString& preset);

QString fixStringValue(const QString& stringValue) const;

QList<StringTuningsItem*> m_strings;

std::string m_itemId;
Expand Down

0 comments on commit cf54fef

Please sign in to comment.