Skip to content

Commit a695ad9

Browse files
committed
Correctly set properties for keysigs
1 parent 23e3c30 commit a695ad9

File tree

2 files changed

+34
-13
lines changed

2 files changed

+34
-13
lines changed

src/engraving/dom/keysig.cpp

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "types/typesconv.h"
2626

2727
#include "masterscore.h"
28+
#include "measure.h"
2829
#include "score.h"
2930
#include "segment.h"
3031
#include "staff.h"
@@ -152,7 +153,7 @@ bool KeySig::isChange() const
152153
if (!segment() || segment()->segmentType() != SegmentType::KeySig) {
153154
return false;
154155
}
155-
Fraction keyTick = tick();
156+
const Fraction keyTick = tick();
156157
return staff()->currentKeyTick(keyTick) == keyTick;
157158
}
158159

@@ -197,12 +198,39 @@ PointF KeySig::staffOffset() const
197198
return PointF(0.0, 0.0);
198199
}
199200

201+
EngravingItem* KeySig::propertyDelegate(Pid propertyId)
202+
{
203+
switch (propertyId) {
204+
case Pid::KEY:
205+
case Pid::KEY_CONCERT:
206+
case Pid::SHOW_COURTESY:
207+
case Pid::KEYSIG_MODE:
208+
case Pid::IS_COURTESY: {
209+
if (staff() && segment()) {
210+
const Fraction changeTick = staff()->currentKeyTick(tick());
211+
if (Segment* s = score()->tick2segment(changeTick, true, SegmentType::KeySig)) {
212+
return toKeySig(s->element(staff2track(staffIdx())));
213+
}
214+
}
215+
break;
216+
}
217+
default:
218+
break;
219+
}
220+
221+
return nullptr;
222+
}
223+
200224
//---------------------------------------------------------
201225
// getProperty
202226
//---------------------------------------------------------
203227

204228
PropertyValue KeySig::getProperty(Pid propertyId) const
205229
{
230+
EngravingItem* e = const_cast<KeySig*>(this)->propertyDelegate(propertyId);
231+
if (e && !isChange()) {
232+
return e->getProperty(propertyId);
233+
}
206234
switch (propertyId) {
207235
case Pid::KEY:
208236
return int(key());
@@ -225,29 +253,21 @@ PropertyValue KeySig::getProperty(Pid propertyId) const
225253

226254
bool KeySig::setProperty(Pid propertyId, const PropertyValue& v)
227255
{
256+
EngravingItem* e = const_cast<KeySig*>(this)->propertyDelegate(propertyId);
257+
if (e && !isChange()) {
258+
return e->setProperty(propertyId, v);
259+
}
228260
switch (propertyId) {
229261
case Pid::KEY:
230-
if (generated()) {
231-
return false;
232-
}
233262
setKey(m_sig.concertKey(), Key(v.toInt()));
234263
break;
235264
case Pid::KEY_CONCERT:
236-
if (generated()) {
237-
return false;
238-
}
239265
setKey(Key(v.toInt()));
240266
break;
241267
case Pid::SHOW_COURTESY:
242-
if (generated()) {
243-
return false;
244-
}
245268
setShowCourtesy(v.toBool());
246269
break;
247270
case Pid::KEYSIG_MODE:
248-
if (generated()) {
249-
return false;
250-
}
251271
setMode(KeyMode(v.toInt()));
252272
staff()->setKey(tick(), keySigEvent());
253273
break;

src/engraving/dom/keysig.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ class KeySig final : public EngravingItem
9494
PropertyValue getProperty(Pid propertyId) const override;
9595
bool setProperty(Pid propertyId, const PropertyValue&) override;
9696
PropertyValue propertyDefault(Pid id) const override;
97+
virtual EngravingItem* propertyDelegate(Pid) override;
9798

9899
EngravingItem* nextSegmentElement() override;
99100
EngravingItem* prevSegmentElement() override;

0 commit comments

Comments
 (0)