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
204228PropertyValue 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
226254bool 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);
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 ;
0 commit comments