updated the popup for configuring pedal lines

This commit is contained in:
Roman Pudashkin 2021-09-21 18:44:00 +02:00 committed by pereverzev+v
parent 71e0d94b7c
commit f814cd6bef
16 changed files with 175 additions and 72 deletions

View file

@ -55,6 +55,9 @@ static const ElementStyle pedalStyle {
{ Sid::pedalPosBelow, Pid::OFFSET },
};
const QString Pedal::PEDAL_SYMBOL = "<sym>keyboardPedalPed</sym>";
const QString Pedal::STAR_SYMBOL = "<sym>keyboardPedalUp</sym>";
PedalSegment::PedalSegment(Pedal* sp, System* parent)
: TextLineBaseSegment(ElementType::PEDAL_SEGMENT, sp, parent, ElementFlag::MOVABLE | ElementFlag::ON_STAFF)
{

View file

@ -58,6 +58,9 @@ protected:
mu::PointF linePos(Grip, System**) const override;
public:
static const QString PEDAL_SYMBOL;
static const QString STAR_SYMBOL;
Pedal(EngravingItem* parent);
Pedal* clone() const override { return new Pedal(*this); }

View file

@ -1392,7 +1392,7 @@ static void readPedal114(XmlReader& e, const ReadContext& ctx, Pedal* pedal)
e.unknown();
}
}
pedal->setBeginText("<sym>keyboardPedalPed</sym>");
pedal->setBeginText(Pedal::PEDAL_SYMBOL);
}
//---------------------------------------------------------

View file

@ -3107,7 +3107,7 @@ void MusicXMLParserDirection::pedal(const QString& type, const int /* number */,
if (type == "start") {
auto p = spdesc._isStopped ? toPedal(spdesc._sp) : new Pedal(_score->dummy());
if (sign == "yes") {
p->setBeginText("<sym>keyboardPedalPed</sym>");
p->setBeginText(Pedal::PEDAL_SYMBOL);
} else {
p->setBeginHookType(HookType::HOOK_90);
}

View file

@ -54,7 +54,7 @@ HairpinLineSettingsModel::HairpinLineSettingsModel(QObject* parent, IElementRepo
{ Ms::HookType::HOOK_90T, IconCode::LINE_WITH_T_LIKE_END_HOOK }
};
setPossibleHookTypes(hookTypes);
setPossibleEndHookTypes(hookTypes);
createProperties();
}

View file

@ -37,7 +37,7 @@ void LetRingSettingsModel::createProperties()
{
LineSettingsModel::createProperties();
beginingHookType()->setIsVisible(false);
startHookType()->setIsVisible(false);
endHookType()->setIsVisible(false);
beginingTextHorizontalOffset()->setIsVisible(false);

View file

@ -36,11 +36,13 @@ LineSettingsModel::LineSettingsModel(QObject* parent, IElementRepositoryService*
void LineSettingsModel::createProperties()
{
m_lineStyle = buildPropertyItem(Ms::Pid::LINE_STYLE, [this](const Ms::Pid pid, const QVariant& newValue) {
auto applyPropertyValueAndUpdateAvailability = [this](const Ms::Pid pid, const QVariant& newValue) {
onPropertyValueChanged(pid, newValue);
onUpdateLinePropertiesAvailability();
});
};
m_lineStyle = buildPropertyItem(Ms::Pid::LINE_STYLE, applyPropertyValueAndUpdateAvailability);
m_isLineVisible = buildPropertyItem(Ms::Pid::LINE_VISIBLE, applyPropertyValueAndUpdateAvailability);
m_placement = buildPropertyItem(Ms::Pid::PLACEMENT);
@ -48,10 +50,9 @@ void LineSettingsModel::createProperties()
m_dashLineLength = buildPropertyItem(Ms::Pid::DASH_LINE_LEN);
m_dashGapLength = buildPropertyItem(Ms::Pid::DASH_GAP_LEN);
m_isLineVisible = buildPropertyItem(Ms::Pid::LINE_VISIBLE);
m_allowDiagonal = buildPropertyItem(Ms::Pid::DIAGONAL);
m_beginingHookType = buildPropertyItem(Ms::Pid::BEGIN_HOOK_TYPE);
m_startHookType = buildPropertyItem(Ms::Pid::BEGIN_HOOK_TYPE);
m_endHookType = buildPropertyItem(Ms::Pid::END_HOOK_TYPE);
m_hookHeight = buildPropertyItem(Ms::Pid::END_HOOK_HEIGHT);
@ -107,7 +108,7 @@ void LineSettingsModel::loadProperties()
loadPropertyItem(m_isLineVisible);
loadPropertyItem(m_allowDiagonal);
loadPropertyItem(m_beginingHookType);
loadPropertyItem(m_startHookType);
loadPropertyItem(m_endHookType);
loadPropertyItem(m_hookHeight);
@ -148,7 +149,7 @@ void LineSettingsModel::resetProperties()
m_dashGapLength,
m_isLineVisible,
m_allowDiagonal,
m_beginingHookType,
m_startHookType,
m_endHookType,
m_hookHeight,
m_beginingText,
@ -204,9 +205,9 @@ PropertyItem* LineSettingsModel::allowDiagonal() const
return m_allowDiagonal;
}
PropertyItem* LineSettingsModel::beginingHookType() const
PropertyItem* LineSettingsModel::startHookType() const
{
return m_beginingHookType;
return m_startHookType;
}
PropertyItem* LineSettingsModel::endHookType() const
@ -264,13 +265,23 @@ PropertyItem* LineSettingsModel::endTextVerticalOffset() const
return m_endTextVerticalOffset;
}
QVariantList LineSettingsModel::possibleStartHookTypes() const
{
return m_possibleStartHookTypes;
}
QVariantList LineSettingsModel::possibleEndHookTypes() const
{
return m_possibleEndHookTypes;
}
QVariantList LineSettingsModel::hookTypesToObjList(const QList<HookTypeInfo>& types) const
{
QVariantList result;
for (HookTypeInfo typeInfo : m_possibleHookTypes) {
for (HookTypeInfo typeInfo : types) {
QVariantMap obj;
obj["value"] = static_cast<int>(typeInfo.type);
obj["value"] = typeInfo.type;
obj["iconCode"] = static_cast<int>(typeInfo.icon);
result << obj;
@ -283,7 +294,7 @@ void LineSettingsModel::onUpdateLinePropertiesAvailability()
{
bool isLineAvailable = m_isLineVisible->value().toBool();
m_beginingHookType->setIsEnabled(isLineAvailable);
m_startHookType->setIsEnabled(isLineAvailable);
m_endHookType->setIsEnabled(isLineAvailable);
m_thickness->setIsEnabled(isLineAvailable);
m_hookHeight->setIsEnabled(isLineAvailable);
@ -302,7 +313,12 @@ bool LineSettingsModel::isTextVisible(TextType type) const
return type != TextType::EndText;
}
void LineSettingsModel::setPossibleHookTypes(const QList<HookTypeInfo>& types)
void LineSettingsModel::setPossibleStartHookTypes(const QList<HookTypeInfo>& types)
{
m_possibleHookTypes = types;
m_possibleStartHookTypes = hookTypesToObjList(types);
}
void LineSettingsModel::setPossibleEndHookTypes(const QList<HookTypeInfo>& types)
{
m_possibleEndHookTypes = hookTypesToObjList(types);
}

View file

@ -41,7 +41,7 @@ class LineSettingsModel : public AbstractInspectorModel
Q_PROPERTY(PropertyItem * isLineVisible READ isLineVisible CONSTANT)
Q_PROPERTY(PropertyItem * allowDiagonal READ allowDiagonal CONSTANT)
Q_PROPERTY(PropertyItem * beginingHookType READ beginingHookType CONSTANT)
Q_PROPERTY(PropertyItem * startHookType READ startHookType CONSTANT)
Q_PROPERTY(PropertyItem * endHookType READ endHookType CONSTANT)
Q_PROPERTY(PropertyItem * hookHeight READ hookHeight CONSTANT)
@ -71,7 +71,7 @@ public:
PropertyItem* isLineVisible() const;
PropertyItem* allowDiagonal() const;
PropertyItem* beginingHookType() const;
PropertyItem* startHookType() const;
PropertyItem* endHookType() const;
PropertyItem* hookHeight() const;
@ -87,6 +87,7 @@ public:
PropertyItem* endTextHorizontalOffset() const;
PropertyItem* endTextVerticalOffset() const;
Q_INVOKABLE QVariantList possibleStartHookTypes() const;
Q_INVOKABLE QVariantList possibleEndHookTypes() const;
protected:
@ -97,7 +98,17 @@ protected:
};
struct HookTypeInfo {
Ms::HookType type = Ms::HookType::NONE;
HookTypeInfo(Ms::HookType type, ui::IconCode::Code icon)
: type(static_cast<int>(type)), icon(icon)
{
}
HookTypeInfo(int type, ui::IconCode::Code icon)
: type(type), icon(icon)
{
}
int type = 0;
ui::IconCode::Code icon = ui::IconCode::Code::NONE;
};
@ -106,12 +117,14 @@ protected:
void resetProperties() override;
virtual void onUpdateLinePropertiesAvailability();
virtual bool isTextVisible(TextType type) const;
void setPossibleHookTypes(const QList<HookTypeInfo>& types);
void setPossibleStartHookTypes(const QList<HookTypeInfo>& types);
void setPossibleEndHookTypes(const QList<HookTypeInfo>& types);
private:
QVariantList hookTypesToObjList(const QList<HookTypeInfo>& types) const;
PropertyItem* m_lineStyle = nullptr;
PropertyItem* m_placement = nullptr;
@ -122,7 +135,7 @@ private:
PropertyItem* m_isLineVisible = nullptr;
PropertyItem* m_allowDiagonal = nullptr;
PropertyItem* m_beginingHookType = nullptr;
PropertyItem* m_startHookType = nullptr;
PropertyItem* m_endHookType = nullptr;
PropertyItem* m_hookHeight = nullptr;
@ -138,7 +151,8 @@ private:
PropertyItem* m_endTextHorizontalOffset = nullptr;
PropertyItem* m_endTextVerticalOffset = nullptr;
QList<HookTypeInfo> m_possibleHookTypes;
QVariantList m_possibleStartHookTypes;
QVariantList m_possibleEndHookTypes;
};
}

View file

@ -42,7 +42,7 @@ OttavaSettingsModel::OttavaSettingsModel(QObject* parent, IElementRepositoryServ
{ Ms::HookType::HOOK_45, IconCode::LINE_WITH_ANGLED_END_HOOK }
};
setPossibleHookTypes(hookTypes);
setPossibleEndHookTypes(hookTypes);
createProperties();
}

View file

@ -36,7 +36,7 @@ void PalmMuteSettingsModel::createProperties()
{
LineSettingsModel::createProperties();
beginingHookType()->setIsVisible(false);
startHookType()->setIsVisible(false);
endHookType()->setIsVisible(false);
beginingTextHorizontalOffset()->setIsVisible(false);

View file

@ -22,13 +22,16 @@
#include "pedalsettingsmodel.h"
#include "translation.h"
#include "ui/view/iconcodes.h"
#include "libmscore/pedal.h"
using namespace mu::inspector;
using IconCode = mu::ui::IconCode::Code;
static constexpr int HOOK_STAR = static_cast<int>(Ms::HookType::HOOK_90T) + 1;
PedalSettingsModel::PedalSettingsModel(QObject* parent, IElementRepositoryService* repository)
: LineSettingsModel(parent, repository, Ms::ElementType::PEDAL)
{
@ -36,54 +39,102 @@ PedalSettingsModel::PedalSettingsModel(QObject* parent, IElementRepositoryServic
setTitle(qtrc("inspector", "Pedal"));
setIcon(ui::IconCode::Code::PEDAL_MARKING);
static const QList<HookTypeInfo> hookTypes {
static const QList<HookTypeInfo> startHookTypes {
{ Ms::HookType::NONE, IconCode::LINE_NORMAL },
{ Ms::HookType::HOOK_45, IconCode::LINE_WITH_ANGLED_START_HOOK },
{ Ms::HookType::HOOK_90T, IconCode::LINE_WITH_T_LINE_START_HOOK }
};
setPossibleStartHookTypes(startHookTypes);
static const QList<HookTypeInfo> endHookTypes {
{ Ms::HookType::NONE, IconCode::LINE_NORMAL },
{ Ms::HookType::HOOK_90, IconCode::LINE_WITH_END_HOOK },
{ Ms::HookType::HOOK_45, IconCode::LINE_WITH_ANGLED_END_HOOK },
{ Ms::HookType::HOOK_90T, IconCode::LINE_PEDAL_STAR_ENDING }
{ Ms::HookType::HOOK_90T, IconCode::LINE_WITH_T_LIKE_END_HOOK },
{ HOOK_STAR, IconCode::LINE_PEDAL_STAR_ENDING }
};
setPossibleHookTypes(hookTypes);
setPossibleEndHookTypes(endHookTypes);
createProperties();
}
PropertyItem* PedalSettingsModel::showPedalSymbol() const
PropertyItem* PedalSettingsModel::lineType() const
{
return m_showPedalSymbol;
return m_lineType;
}
PropertyItem* PedalSettingsModel::showLineWithRosette() const
bool PedalSettingsModel::pedalSymbolVisible() const
{
return m_showLineWithRosette;
return beginingText()->value().toString() == Ms::Pedal::PEDAL_SYMBOL;
}
bool PedalSettingsModel::showLineWithRosetteVisible() const
bool PedalSettingsModel::isChangingLineVisibilityAllowed() const
{
return m_showLineWithRosetteVisible;
return isStarSymbolVisible();
}
bool PedalSettingsModel::isStarSymbolVisible() const
{
return endText()->value().toString() == Ms::Pedal::STAR_SYMBOL;
}
void PedalSettingsModel::setPedalSymbolVisible(bool visible)
{
beginingText()->setValue(visible ? Ms::Pedal::PEDAL_SYMBOL : "");
}
void PedalSettingsModel::createProperties()
{
LineSettingsModel::createProperties();
//! TODO: determine suitable properties
m_showPedalSymbol = buildPropertyItem(Ms::Pid::SYMBOL);
m_showLineWithRosette = buildPropertyItem(Ms::Pid::SYMBOL);
connect(beginingText(), &PropertyItem::isModifiedChanged, this, [this]() {
emit pedalSymbolVisibleChanged();
});
connect(endText(), &PropertyItem::isModifiedChanged, this, [this]() {
emit isChangingLineVisibilityAllowedChanged();
});
m_lineType = buildPropertyItem(Ms::Pid::END, [this](const Ms::Pid, const QVariant& newValue) {
setLineType(newValue.toInt());
});
}
void PedalSettingsModel::loadProperties()
{
LineSettingsModel::loadProperties();
loadPropertyItem(m_showPedalSymbol);
loadPropertyItem(m_showLineWithRosette);
m_lineType->setIsEnabled(true);
if (isStarSymbolVisible()) {
m_lineType->setValue(HOOK_STAR);
} else {
m_lineType->setValue(endHookType()->value());
}
}
void PedalSettingsModel::resetProperties()
void PedalSettingsModel::setLineType(int newType)
{
LineSettingsModel::resetProperties();
bool rosetteHookSelected = (newType == HOOK_STAR);
int hookType = newType;
QString text = QString();
m_showPedalSymbol->resetToDefault();
m_showLineWithRosette->resetToDefault();
if (rosetteHookSelected) {
hookType = static_cast<int>(Ms::HookType::NONE);
text = Ms::Pedal::STAR_SYMBOL;
startHookType()->setValue(hookType);
}
endHookType()->setValue(hookType);
endText()->setValue(text);
isLineVisible()->setValue(!rosetteHookSelected);
m_lineType->setValue(newType);
}
bool PedalSettingsModel::isTextVisible(TextType) const
{
return true;
}

View file

@ -29,30 +29,34 @@ class PedalSettingsModel : public LineSettingsModel
{
Q_OBJECT
Q_PROPERTY(PropertyItem * showPedalSymbol READ showPedalSymbol CONSTANT)
Q_PROPERTY(PropertyItem * showLineWithRosette READ showLineWithRosette CONSTANT)
Q_PROPERTY(bool showLineWithRosetteVisible READ showLineWithRosetteVisible NOTIFY showLineWithRosetteVisibleChanged)
Q_PROPERTY(PropertyItem* lineType READ lineType CONSTANT)
Q_PROPERTY(bool pedalSymbolVisible READ pedalSymbolVisible WRITE setPedalSymbolVisible NOTIFY pedalSymbolVisibleChanged)
Q_PROPERTY(bool isChangingLineVisibilityAllowed READ isChangingLineVisibilityAllowed NOTIFY isChangingLineVisibilityAllowedChanged)
public:
explicit PedalSettingsModel(QObject* parent, IElementRepositoryService* repository);
PropertyItem* showPedalSymbol() const;
PropertyItem* showLineWithRosette() const;
PropertyItem* lineType() const;
bool pedalSymbolVisible() const;
bool isChangingLineVisibilityAllowed() const;
bool showLineWithRosetteVisible() const;
public slots:
void setPedalSymbolVisible(bool visible);
signals:
void showLineWithRosetteVisibleChanged();
void pedalSymbolVisibleChanged();
void isChangingLineVisibilityAllowedChanged();
private:
bool isStarSymbolVisible() const;
void createProperties() override;
void loadProperties() override;
void resetProperties() override;
bool isTextVisible(TextType type) const override;
PropertyItem* m_showPedalSymbol = nullptr;
PropertyItem* m_showLineWithRosette = nullptr;
bool m_showLineWithRosetteVisible = false;
void setLineType(int newType);
PropertyItem* m_lineType = nullptr;
};
}

View file

@ -41,7 +41,7 @@ VoltaSettingsModel::VoltaSettingsModel(QObject* parent, IElementRepositoryServic
{ Ms::HookType::HOOK_90, IconCode::LINE_WITH_TWO_INVERTED_HOOKS },
};
setPossibleHookTypes(hookTypes);
setPossibleEndHookTypes(hookTypes);
createProperties();
}

View file

@ -39,32 +39,35 @@ Column {
spacing: 12
CheckBox {
isIndeterminate: root.model && root.model.showPedalSymbol.isUndefined
checked: root.model && !isIndeterminate && root.model.showPedalSymbol.value
checked: root.model && root.model.pedalSymbolVisible
text: qsTrc("inspector", "Show pedal symbol")
onClicked: {
root.model.showPedalSymbol.value = !checked
root.model.pedalSymbolVisible = !checked
}
}
LineTypeSection {
endHookType: root.model ? root.model.endHookType : null
startHookType: root.model ? root.model.startHookType : null
endHookType: root.model ? root.model.lineType : null
thickness: root.model ? root.model.thickness : null
hookHeight: root.model ? root.model.hookHeight : null
possibleStartHookTypes: root.model ? root.model.possibleStartHookTypes() : null
possibleEndHookTypes: root.model ? root.model.possibleEndHookTypes() : null
}
CheckBox {
isIndeterminate: root.model && root.model.showLineWithRosette.isUndefined
checked: root.model && !isIndeterminate && root.model.showLineWithRosette.value
visible: root.model & root.model.showLineWithRosetteVisible
isIndeterminate: root.model && root.model.isLineVisible.isUndefined
checked: root.model && !isIndeterminate && root.model.isLineVisible.value
visible: root.model && root.model.isChangingLineVisibilityAllowed
text: qsTrc("inspector", "Show line with rosette")
onClicked: {
root.model.showLineWithRosette.value = !checked
root.model.isLineVisible.value = !checked
}
}

View file

@ -32,10 +32,12 @@ import "../../../common"
Column {
id: root
property PropertyItem startHookType: null
property PropertyItem endHookType: null
property PropertyItem thickness: null
property PropertyItem hookHeight: null
property alias possibleStartHookTypes: startHookButtonGroup.model
property alias possibleEndHookTypes: lineTypeButtonGroup.model
width: parent.width
@ -49,6 +51,13 @@ Column {
propertyItem: root.endHookType
}
FlatRadioButtonGroupPropertyView {
id: startHookButtonGroup
titleText: qsTrc("inspector", "Start hook")
propertyItem: root.startHookType
}
Item {
height: childrenRect.height
width: parent.width

View file

@ -1042,16 +1042,16 @@ PalettePtr PaletteCreator::newLinesPalette()
auto pedal = makeElement<Pedal>(gpaletteScore);
pedal->setLen(w);
pedal->setBeginText("<sym>keyboardPedalPed</sym>");
pedal->setContinueText("(<sym>keyboardPedalPed</sym>)");
pedal->setBeginText(Pedal::PEDAL_SYMBOL);
pedal->setContinueText(QString("(%1)").arg(Pedal::PEDAL_SYMBOL));
pedal->setEndHookType(HookType::HOOK_90);
sp->appendElement(pedal, QT_TRANSLATE_NOOP("palette", "Pedal (with ped and line)"));
pedal = makeElement<Pedal>(gpaletteScore);
pedal->setLen(w);
pedal->setBeginText("<sym>keyboardPedalPed</sym>");
pedal->setContinueText("(<sym>keyboardPedalPed</sym>)");
pedal->setEndText("<sym>keyboardPedalUp</sym>");
pedal->setBeginText(Pedal::PEDAL_SYMBOL);
pedal->setContinueText(QString("(%1)").arg(Pedal::PEDAL_SYMBOL));
pedal->setEndText(Pedal::STAR_SYMBOL);
pedal->setLineVisible(false);
sp->appendElement(pedal, QT_TRANSLATE_NOOP("palette", "Pedal (with ped and asterisk)"));