Skip to content

Commit

Permalink
Started work on text diagrams
Browse files Browse the repository at this point in the history
  • Loading branch information
miiizen committed Jul 6, 2022
1 parent 59f3102 commit 795abb9
Show file tree
Hide file tree
Showing 5 changed files with 136 additions and 30 deletions.
6 changes: 4 additions & 2 deletions src/engraving/libmscore/edit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5327,7 +5327,8 @@ void Score::undoAddElement(EngravingItem* element, bool ctrlModifier)
&& et != ElementType::TREMOLOBAR
&& et != ElementType::FRET_DIAGRAM
&& et != ElementType::FERMATA
&& et != ElementType::HARMONY)
&& et != ElementType::HARMONY
&& et != ElementType::HARP_DIAGRAM)
) {
undo(new AddElement(element));
return;
Expand Down Expand Up @@ -5502,7 +5503,8 @@ void Score::undoAddElement(EngravingItem* element, bool ctrlModifier)
|| element->isSticking()
|| element->isFretDiagram()
|| element->isFermata()
|| element->isHarmony()) {
|| element->isHarmony()
|| element->isHarpPedalDiagram()) {
Segment* segment
= element->explicitParent()->isFretDiagram() ? toSegment(element->explicitParent()->explicitParent()) : toSegment(
element->explicitParent());
Expand Down
139 changes: 113 additions & 26 deletions src/engraving/libmscore/harppedaldiagram.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@

#include "rw/xml.h"

#include "log.h"

namespace mu::engraving {
// STYLE
static const ElementStyle harpPedalDiagramStyle {
Expand All @@ -41,70 +43,149 @@ HarpPedalDiagram::HarpPedalDiagram(Segment* parent)
_pedalState
= std::vector<PedalPosition> { PedalPosition::NATURAL, PedalPosition::NATURAL, PedalPosition::NATURAL, PedalPosition::NATURAL,
PedalPosition::NATURAL, PedalPosition::NATURAL, PedalPosition::NATURAL };
updateDiagramText();
}

HarpPedalDiagram::HarpPedalDiagram(const HarpPedalDiagram& h)
: TextBase(h)
{
_pedalState = h._pedalState;
_isDiagram = h._isDiagram;
}

void HarpPedalDiagram::layout()
{
updateDiagramText();

TextBase::layout();
}

void HarpPedalDiagram::setPedalState(std::vector<PedalPosition> state)
{
_pedalState = state;
updateDiagramText();
}

void HarpPedalDiagram::setIsDiagram(bool diagram)
{
_isDiagram = diagram;

updateDiagramText();
}

void HarpPedalDiagram::setPedal(HarpStrings harpString, PedalPosition pedal)
void HarpPedalDiagram::setPedal(HarpString harpString, PedalPosition pedal)
{
_pedalState.at(harpString) = pedal;

updateDiagramText();
}

void HarpPedalDiagram::updateDiagramText()
{
String diagram = String("");
for (int idx = 0; idx < _pedalState.size(); idx++) {
if (idx == 3) {
// insert separator
diagram.append(String("<sym>harpPedalDivider</sym>"));
if (_isDiagram) {
for (int idx = 0; idx < _pedalState.size(); idx++) {
if (idx == 3) {
// insert separator
diagram.append(String("<sym>harpPedalDivider</sym>"));
}
switch (_pedalState[idx]) {
case PedalPosition::FLAT:
diagram.append(String("<sym>harpPedalRaised</sym>"));
break;
case PedalPosition::NATURAL:
diagram.append(String("<sym>harpPedalCentered</sym>"));
break;
case PedalPosition::SHARP:
diagram.append(String("<sym>harpPedalLowered</sym>"));
break;
}
}
} else {
// find difference between pedal state of previous diagram and this one
// if no previous, assume starting from all natural
std::vector<PedalPosition> prevState;
HarpPedalDiagram* prevDiagram = searchPrevDiagram();

if (prevDiagram != nullptr) {
prevState = prevDiagram->getPedalState();
} else {
prevState = { PedalPosition::FLAT, PedalPosition::FLAT, PedalPosition::FLAT, PedalPosition::FLAT,
PedalPosition::FLAT, PedalPosition::FLAT, PedalPosition::FLAT };
}
switch (_pedalState[idx]) {
case PedalPosition::FLAT:
diagram.append(String("<sym>harpPedalRaised</sym>"));
break;
case PedalPosition::NATURAL:
diagram.append(String("<sym>harpPedalCentered</sym>"));
break;
case PedalPosition::SHARP:
diagram.append(String("<sym>harpPedalLowered</sym>"));
break;

for (int idx = 0; idx < _pedalState.size(); idx++) {
if (_pedalState[idx] != prevState[idx]) {
String strName = getStringName(static_cast<HarpString>(idx));
switch (_pedalState[idx]) {
case PedalPosition::FLAT:
diagram.append(strName + String("<sym>accidentalFlat</sym>, "));
break;
case PedalPosition::NATURAL:
diagram.append(strName + String("<sym>accidentalNatural</sym>, "));
break;
case PedalPosition::SHARP:
diagram.append(strName + String("<sym>accidentalSharp</sym>, "));
break;
}
}
}
// trailing comma
if (diagram.size() != 0) {
diagram.truncate(diagram.size() - 2);
}
}

setXmlText(diagram);
}

const String HarpPedalDiagram::getStringName(HarpString str)
{
switch (str) {
case HarpString::A:
return String("A");
case HarpString::B:
return String("B");
case HarpString::C:
return String("C");
case HarpString::D:
return String("D");
case HarpString::E:
return String("E");
case HarpString::F:
return String("F");
case HarpString::G:
return String("G");
}
}

// Goes through all previous segments until one with a harp pedal diagram is found

HarpPedalDiagram* HarpPedalDiagram::searchPrevDiagram()
{
EngravingItem* prevElem = this->prevElement();

while (prevElem != nullptr) {
if (prevElem->isType(ElementType::HARP_DIAGRAM)) {
return toHarpPedalDiagram(prevElem);
}
prevElem = prevElem->prevElement();
}
return nullptr;
}

void HarpPedalDiagram::read(XmlReader& xml)
{
while (xml.readNextStartElement()) {
const AsciiStringView tag = xml.name();
if (tag == "isDiagram") {
setIsDiagram(xml.readBool());
//} else if (tag == "pedalState") {
//read vector somehow
} else if (tag == "pedalState") {
while (xml.readNextStartElement()) {
const AsciiStringView stringTag = xml.name();
if (stringTag == "string") {
HarpString str = HarpString(xml.intAttribute("name"));
PedalPosition pos = PedalPosition(xml.readInt());
setPedal(str, pos);
LOGD() << "String " << str << " : " << " Pedal state " << static_cast<int>(pos);
} else {
xml.unknown();
}
}
} else if (!TextBase::readProperties(xml)) {
xml.unknown();
}
Expand All @@ -118,7 +199,15 @@ void HarpPedalDiagram::write(XmlWriter& xml) const
}
xml.startElement(this);
writeProperty(xml, Pid::HARP_IS_DIAGRAM);
//write vector of strings somehow

// Write vector of harp strings. Order is always D, C, B, E, F, G, A
xml.startElement("pedalState");
for (int idx = 0; idx < _pedalState.size(); idx++) {
LOGD() << "String " << idx << " : " << " Pedal state " << static_cast<int>(_pedalState[idx]);
xml.tag("string", { { "name", idx } }, static_cast<int>(_pedalState[idx]));
}
xml.endElement();

TextBase::writeProperties(xml);
xml.endElement();
}
Expand All @@ -144,8 +233,6 @@ bool HarpPedalDiagram::setProperty(Pid propertyId, const PropertyValue& v)
return false;
}
}

updateDiagramText();
return true;
}

Expand Down
10 changes: 8 additions & 2 deletions src/engraving/libmscore/harppedaldiagram.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ enum class PedalPosition {
};

// Use for indexes of _pedalState
enum HarpStrings {
enum HarpString {
D, C, B, E, F, G, A
};

Expand All @@ -56,6 +56,8 @@ class HarpPedalDiagram final : public TextBase
Segment* segment() const { return (Segment*)explicitParent(); }
Measure* measure() const { return (Measure*)explicitParent()->explicitParent(); }

void layout() override;

//TODO
// xml read/write
void read(XmlReader&) override;
Expand All @@ -73,12 +75,16 @@ class HarpPedalDiagram final : public TextBase

std::vector<PedalPosition> getPedalState() { return _pedalState; }
void setPedalState(std::vector<PedalPosition> state);
void setPedal(HarpStrings harpString, PedalPosition pedal);
void setPedal(HarpString harpString, PedalPosition pedal);

private:
//friend class Factory;

void updateDiagramText();

const String getStringName(HarpString str);

HarpPedalDiagram* searchPrevDiagram();
};
} // namespace mu::engraving

Expand Down
3 changes: 3 additions & 0 deletions src/engraving/libmscore/select.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
#include "glissando.h"
#include "hairpin.h"
#include "harmony.h"
#include "harppedaldiagram.h"
#include "fret.h"
#include "hook.h"
#include "input.h"
Expand Down Expand Up @@ -1032,6 +1033,8 @@ ByteArray Selection::symbolListMimeData() const
case ElementType::HAIRPIN:
seg = toHairpin(e)->startSegment();
break;
case ElementType::HARP_DIAGRAM:
seg = toHarpPedalDiagram(e)->segment();
default:
continue;
}
Expand Down
8 changes: 8 additions & 0 deletions src/palette/internal/palettecreator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1684,7 +1684,15 @@ PalettePtr PaletteCreator::newHarpPalette()
sp->setVisible(true); //TODO: maybe?

auto pedalDiagram = Factory::makeHarpPedalDiagram(gpaletteScore->dummy()->segment());
pedalDiagram->setPedal(HarpString::F, PedalPosition::SHARP);
sp->appendElement(pedalDiagram, QT_TRANSLATE_NOOP("palette", "Harp pedal diagram"));

auto pedalTextDiagram = Factory::makeHarpPedalDiagram(gpaletteScore->dummy()->segment());
pedalTextDiagram->setIsDiagram(false);
pedalTextDiagram->setPedal(HarpString::D, PedalPosition::FLAT);
pedalTextDiagram->setPedal(HarpString::C, PedalPosition::SHARP);
pedalTextDiagram->setPedal(HarpString::B, PedalPosition::FLAT);
sp->appendElement(pedalTextDiagram, QT_TRANSLATE_NOOP("palette", "Harp pedal text"));

return sp;
}

0 comments on commit 795abb9

Please sign in to comment.