Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions src/engraving/dom/fret.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1320,6 +1320,45 @@ String FretDiagram::screenReaderInfo() const
return res;
}

int FretDiagram::fingeringFromChar(Char c)
{
switch (c.unicode()) {
case '1': return int(FretDiagram::FingeringValue::ONE);
case '2': return int(FretDiagram::FingeringValue::TWO);
case '3': return int(FretDiagram::FingeringValue::THREE);
case '4': return int(FretDiagram::FingeringValue::FOUR);
case '5': return int(FretDiagram::FingeringValue::FIVE);

case 'T':
case 't':
return int(FretDiagram::FingeringValue::THUMB);

case 'P':
case 'p':
return int(FretDiagram::FingeringValue::PULGAR);

default:
return int(FretDiagram::FingeringValue::NONE);
}
}

String FretDiagram::fingeringToString(int v)
{
if (v >= 1 && v <= 5) {
return String::number(v);
}

if (v == int(FretDiagram::FingeringValue::THUMB)) {
return String(u"T");
}

if (v == int(FretDiagram::FingeringValue::PULGAR)) {
return String(u"P");
}

return String();
}

void FretDiagram::setFingering(std::vector<int> v)
{
m_fingering = std::move(v);
Expand Down
14 changes: 14 additions & 0 deletions src/engraving/dom/fret.h
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,20 @@ class FretDiagram final : public EngravingItem
String accessibleInfo() const override;
String screenReaderInfo() const override;

enum class FingeringValue : int {
NONE = 0,
ONE,
TWO,
THREE,
FOUR,
FIVE,
THUMB = 6, //T
PULGAR = 7 //P
};

static int fingeringFromChar(Char c);
static String fingeringToString(int v);

bool showFingering() const { return m_showFingering; }
void setShowFingering(bool v) { m_showFingering = v; }
const std::vector<int>& fingering() const { return m_fingering; }
Expand Down
2 changes: 1 addition & 1 deletion src/engraving/rendering/score/tlayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2478,7 +2478,7 @@ void TLayout::layoutFretDiagram(const FretDiagram* item, FretDiagram::LayoutData
if (finger == 0) {
continue;
}
String fingerS = String::number(finger);
String fingerS = FretDiagram::fingeringToString(finger);
double width = fontMetrics.width(fingerS);
double digitHeight = fontMetrics.tightBoundingRect(fingerS).height();
double xOff = -0.5 * width;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ Item {
required property int index

property int string: repeater.count - index - 1
property string finger: root.model ? root.model.fingerings[string] : 0
property string finger: root.model ? root.model.displayFingerings[string] : 0

Layout.preferredWidth: 40
spacing: 8
Expand All @@ -150,25 +150,35 @@ Item {

textHorizontalAlignment: Qt.AlignHCenter
indeterminateText: '-'

isIndeterminate: {
const fingerInt = parseInt(repeaterItem.finger)
return isNaN(fingerInt) || fingerInt < 1 || fingerInt > 5
const f = repeaterItem.finger

if(!f || f.length === 0)
return true

if(f === "T" || f === "P")
return false

const v = parseInt(f)
return isNaN(v) || v < 1 || v > 5

}

currentText: isIndeterminate ? '' : repeaterItem.finger

validator: IntInputValidator {
top: 5
bottom: 0
validator: RegularExpressionValidator { regularExpression: /^[1-5TtPp]?$/ }

onTextEdited: {
text = text.toUpperCase()
}

navigation.name: `Finger ${repeaterItem.string + 1} text input`
navigation.panel: root.navigationPanel
navigation.row: repeater.navigationRowStart + repeaterItem.index
navigation.accessible.name: qsTrc("inspector", "Finger for string %1").arg(repeaterItem.string + 1)

onTextEditingFinished: function (newTextValue) {
var newFinger = parseInt(newTextValue)
onTextEditingFinished: function (newFinger) {
if (root.model) {
root.model.setFingering(repeaterItem.string, newFinger)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,14 +190,38 @@ QStringList FretDiagramSettingsModel::fingerings() const
return fingerings.split(',');
}

void FretDiagramSettingsModel::setFingering(int string, int finger)
QStringList FretDiagramSettingsModel::displayFingerings() const
{
finger = std::clamp(finger, 0, 5);
QStringList domList = fingerings();
QStringList result;

for (const QString& t : domList) {
bool ok = false;
int v = t.toInt(&ok);
if (!ok) {
v = int(mu::engraving::FretDiagram::FingeringValue::NONE);
}

mu::engraving::String s = mu::engraving::FretDiagram::fingeringToString(v);
result << s.toQString();
}

return result;
}

void FretDiagramSettingsModel::setFingering(int string, const QString& fingerText)
{
int fingerValue = int(mu::engraving::FretDiagram::FingeringValue::NONE);

if (!fingerText.isEmpty()) {
mu::engraving::Char ch(fingerText[0].unicode());
fingerValue = mu::engraving::FretDiagram::fingeringFromChar(ch);
}

QStringList curFingerings = fingerings();
assert(string < curFingerings.size());

QString newFinger = QString::number(finger);
QString newFinger = QString::number(fingerValue);
curFingerings[string] = newFinger;
QString newFingerings = curFingerings.join(",");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ class FretDiagramSettingsModel : public AbstractInspectorModel
Q_PROPERTY(QVariant fretDiagram READ fretDiagram NOTIFY fretDiagramChanged)
Q_PROPERTY(mu::inspector::PropertyItem * showFingerings READ showFingerings CONSTANT)
Q_PROPERTY(QStringList fingerings READ fingerings NOTIFY fingeringsChanged)
Q_PROPERTY(QStringList displayFingerings READ displayFingerings NOTIFY fretDiagramChanged)

public:
explicit FretDiagramSettingsModel(QObject* parent, IElementRepositoryService* repository);
Expand All @@ -76,8 +77,9 @@ class FretDiagramSettingsModel : public AbstractInspectorModel
PropertyItem* verticalAlign() const;
PropertyItem* showFingerings() const;
QStringList fingerings() const;
QStringList displayFingerings() const;

Q_INVOKABLE void setFingering(int string, int finger);
Q_INVOKABLE void setFingering(int string, const QString& fingerText);
Q_INVOKABLE void resetFingerings();

QVariant fretDiagram() const;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,8 @@ void FretCanvas::draw(QPainter* painter)
if (finger == 0) {
continue;
}
QString fingerS = QString::number(finger);
String fs = mu::engraving::FretDiagram::fingeringToString(finger);
QString fingerS = fs.toQString();
double width = fontMetrics.width(fingerS);
double xOff = -0.5 * width;
double fingerX = (m_diagram->strings() - i - 1) * stringDist + xOff;
Expand Down
Loading