Skip to content

Commit

Permalink
Surface refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
mike-spa committed Jul 26, 2023
1 parent 85431f8 commit 7d926f9
Show file tree
Hide file tree
Showing 9 changed files with 41 additions and 62 deletions.
8 changes: 4 additions & 4 deletions src/engraving/libmscore/edit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4899,21 +4899,21 @@ bool Score::undoPropertyChanged(EngravingItem* item, Pid propId, const PropertyV
changed = true;
}

std::list<EngravingObject*> linkedItems = item->linkListForProperty(propId);
std::list<EngravingObject*> linkedItems = item->linkListForPropertyPropagation();

for (EngravingObject* linkedItem : linkedItems) {
if (linkedItem == item) {
continue;
}
PropertyPropagate propertyPropagate = item->propertyPropagate(linkedItem, propId);
PropertyPropagation propertyPropagate = item->propertyPropagation(linkedItem, propId);
switch (propertyPropagate) {
case PropertyPropagate::PROPAGATE:
case PropertyPropagation::PROPAGATE:
if (linkedItem->getProperty(propId) != currentPropValue) {
undoStack()->push(new ChangeProperty(linkedItem, propId, currentPropValue, propFlags), 0);
changed = true;
}
break;
case PropertyPropagate::UNLINK:
case PropertyPropagation::UNLINK:
item->unlinkPropertyFromMaster(propId);
break;
default:
Expand Down
37 changes: 6 additions & 31 deletions src/engraving/libmscore/engravingitem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1195,7 +1195,7 @@ bool EngravingItem::setProperty(Pid propertyId, const PropertyValue& v)
break;
}
if (!_isPositionLinkedToMaster) {
relinkPositionPropertiesToMaster();
relinkPropertiesToMaster(PropertyGroup::POSITION);
}
setPositionLinkedToMaster(v.toBool());
break;
Expand All @@ -1204,7 +1204,7 @@ bool EngravingItem::setProperty(Pid propertyId, const PropertyValue& v)
break;
}
if (!_isAppearanceLinkedToMaster) {
relinkAppearancePropertiesToMaster();
relinkPropertiesToMaster(PropertyGroup::APPEARANCE);
}
setAppearanceLinkedToMaster(v.toBool());
break;
Expand All @@ -1220,11 +1220,11 @@ bool EngravingItem::setProperty(Pid propertyId, const PropertyValue& v)
return true;
}

void EngravingItem::relinkPositionPropertiesToMaster()
void EngravingItem::relinkPropertiesToMaster(PropertyGroup propertyGroup)
{
assert(!score()->isMaster());

std::list<EngravingObject*> linkedElements = linkListForProperty(Pid::END);
std::list<EngravingObject*> linkedElements = linkListForPropertyPropagation();
EngravingObject* masterElement = nullptr;
for (EngravingObject* element : linkedElements) {
if (element->score()->isMaster()) {
Expand All @@ -1237,34 +1237,9 @@ void EngravingItem::relinkPositionPropertiesToMaster()
return;
}

for (Pid propertyId : positionProperties()) {
PropertyValue masterValue = masterElement->getProperty(propertyId);
PropertyFlags masterFlags = masterElement->propertyFlags(propertyId);
setProperty(propertyId, masterValue);
setPropertyFlags(propertyId, masterFlags);
}

return;
}

void EngravingItem::relinkAppearancePropertiesToMaster()
{
assert(!score()->isMaster());

std::list<EngravingObject*> linkedElements = linkListForProperty(Pid::END);
EngravingObject* masterElement = nullptr;
for (EngravingObject* element : linkedElements) {
if (element->score()->isMaster()) {
masterElement = element;
break;
}
}

if (!masterElement) {
return;
}
const std::set<Pid>& propertiesToRelink = propertyGroup == PropertyGroup::POSITION ? positionProperties() : appearanceProperties();

for (Pid propertyId : appearanceProperties()) {
for (Pid propertyId : propertiesToRelink) {
PropertyValue masterValue = masterElement->getProperty(propertyId);
PropertyFlags masterFlags = masterElement->propertyFlags(propertyId);
setProperty(propertyId, masterValue);
Expand Down
3 changes: 1 addition & 2 deletions src/engraving/libmscore/engravingitem.h
Original file line number Diff line number Diff line change
Expand Up @@ -549,8 +549,7 @@ class EngravingItem : public EngravingObject

virtual bool isPropertyLinkedToMaster(Pid id) const;
void unlinkPropertyFromMaster(Pid id);
void relinkPositionPropertiesToMaster();
void relinkAppearancePropertiesToMaster();
void relinkPropertiesToMaster(PropertyGroup propertyGroup);

private:
#ifndef ENGRAVING_NO_ACCESSIBILITY
Expand Down
22 changes: 11 additions & 11 deletions src/engraving/libmscore/engravingobject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -386,21 +386,21 @@ static void changeProperty(EngravingObject* e, Pid t, const PropertyValue& st, P

static void changeProperties(EngravingObject* object, Pid propertyId, const PropertyValue& propertyValue, PropertyFlags propertyFlag)
{
std::list<EngravingObject*> linkList = object->linkListForProperty(propertyId);
std::list<EngravingObject*> linkList = object->linkListForPropertyPropagation();
for (EngravingObject* linkedObject : linkList) {
if (linkedObject == object) {
changeProperty(object, propertyId, propertyValue, propertyFlag);
continue;
}

PropertyPropagate propertyPropagate = object->propertyPropagate(linkedObject, propertyId);
PropertyPropagation propertyPropagate = object->propertyPropagation(linkedObject, propertyId);
switch (propertyPropagate) {
case PropertyPropagate::NONE:
case PropertyPropagation::NONE:
break;
case PropertyPropagate::PROPAGATE:
case PropertyPropagation::PROPAGATE:
changeProperty(linkedObject, propertyId, propertyValue, propertyFlag);
break;
case PropertyPropagate::UNLINK:
case PropertyPropagation::UNLINK:
toEngravingItem(object)->unlinkPropertyFromMaster(propertyId);
break;
default:
Expand Down Expand Up @@ -761,17 +761,17 @@ PropertyValue EngravingObject::styleValue(Pid pid, Sid sid) const
}
}

PropertyPropagate EngravingObject::propertyPropagate(EngravingObject* destinationObject, Pid propertyId)
PropertyPropagation EngravingObject::propertyPropagation(EngravingObject* destinationObject, Pid propertyId)
{
assert(destinationObject != this);

if (propertyLink(propertyId)) {
return PropertyPropagate::PROPAGATE; // These properties are always linked, no matter what
return PropertyPropagation::PROPAGATE; // These properties are always linked, no matter what
}

if (!isEngravingItem() || !destinationObject->isEngravingItem()
|| propertyId == Pid::POSITION_LINKED_TO_MASTER || propertyId == Pid::APPEARANCE_LINKED_TO_MASTER || propertyId == Pid::GENERATED) {
return PropertyPropagate::NONE;
return PropertyPropagation::NONE;
}

EngravingItem* destinationItem = toEngravingItem(destinationObject);
Expand All @@ -780,13 +780,13 @@ PropertyPropagate EngravingObject::propertyPropagate(EngravingObject* destinatio
if (sourceScore != destinationScore && !sourceScore->isMaster()) {
// Properties are only propagated when being edited from master. If this is being edited
// from a part score, we mark it as unlinked so it becomes independent in the part.
return PropertyPropagate::UNLINK;
return PropertyPropagation::UNLINK;
}

if (destinationItem->isPropertyLinkedToMaster(propertyId) || sourceScore == destinationScore) {
return PropertyPropagate::PROPAGATE;
return PropertyPropagation::PROPAGATE;
}

return PropertyPropagate::NONE;
return PropertyPropagation::NONE;
}
}
4 changes: 2 additions & 2 deletions src/engraving/libmscore/engravingobject.h
Original file line number Diff line number Diff line change
Expand Up @@ -297,8 +297,8 @@ class EngravingObject
LinkedObjects* links() const { return _links; }
void setLinks(LinkedObjects* le);

PropertyPropagate propertyPropagate(EngravingObject* destinationObject, Pid propertyId);
virtual const std::list<EngravingObject*> linkListForProperty(Pid) const { return linkList(); }
PropertyPropagation propertyPropagation(EngravingObject* destinationObject, Pid propertyId);
virtual const std::list<EngravingObject*> linkListForPropertyPropagation() const { return linkList(); }

//---------------------------------------------------
// check type
Expand Down
7 changes: 6 additions & 1 deletion src/engraving/libmscore/property.h
Original file line number Diff line number Diff line change
Expand Up @@ -420,12 +420,17 @@ enum class Pid {
END
};

enum class PropertyPropagate {
enum class PropertyPropagation {
NONE,
PROPAGATE,
UNLINK,
};

enum class PropertyGroup {
POSITION,
APPEARANCE,
};

using PropertyIdSet = std::unordered_set<Pid>;

extern PropertyValue propertyFromString(P_TYPE type, String value);
Expand Down
10 changes: 5 additions & 5 deletions src/engraving/libmscore/spanner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ void SpannerSegment::scanElements(void* data, void (* func)(void*, EngravingItem
}
}

const std::list<EngravingObject*> SpannerSegment::linkListForProperty(Pid) const
const std::list<EngravingObject*> SpannerSegment::linkListForPropertyPropagation() const
{
std::list<EngravingObject*> result;
result.push_back((EngravingObject*)this);
Expand Down Expand Up @@ -672,19 +672,19 @@ bool Spanner::setProperty(Pid propertyId, const PropertyValue& v)
if (isPositionLinkedToMaster()) {
for (SpannerSegment* seg : spannerSegments()) {
seg->setPositionLinkedToMaster(v.toBool());
seg->relinkPositionPropertiesToMaster();
seg->relinkPropertiesToMaster(PropertyGroup::POSITION);
}
relinkPositionPropertiesToMaster();
relinkPropertiesToMaster(PropertyGroup::POSITION);
}
break;
case Pid::APPEARANCE_LINKED_TO_MASTER:
setAppearanceLinkedToMaster(v.toBool());
if (isAppearanceLinkedToMaster()) {
for (SpannerSegment* seg : spannerSegments()) {
seg->setAppearanceLinkedToMaster(v.toBool());
seg->relinkAppearancePropertiesToMaster();
seg->relinkPropertiesToMaster(PropertyGroup::APPEARANCE);
}
relinkAppearancePropertiesToMaster();
relinkPropertiesToMaster(PropertyGroup::APPEARANCE);
}
break;
default:
Expand Down
2 changes: 1 addition & 1 deletion src/engraving/libmscore/spanner.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ class SpannerSegment : public EngravingItem
void triggerLayout() const override;
void autoplaceSpannerSegment();

const std::list<EngravingObject*> linkListForProperty(Pid) const override;
const std::list<EngravingObject*> linkListForPropertyPropagation() const override;
bool isPropertyLinkedToMaster(Pid id) const override;

protected:
Expand Down
10 changes: 5 additions & 5 deletions src/engraving/libmscore/textbase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3336,7 +3336,7 @@ void TextBase::undoChangeProperty(Pid id, const PropertyValue& v, PropertyFlags
return;
}

const std::list<EngravingObject*> linkedObjects = linkListForProperty(id);
const std::list<EngravingObject*> linkedObjects = linkListForPropertyPropagation();
for (EngravingObject* linkedObject : linkedObjects) {
TextBase* linkedText = toTextBase(linkedObject);
if (linkedText == this) {
Expand All @@ -3347,13 +3347,13 @@ void TextBase::undoChangeProperty(Pid id, const PropertyValue& v, PropertyFlags

Score* linkedScore = linkedText->score();
TextCursor* linkedCursor = linkedText->cursor();
PropertyPropagate propertyPropagation = propertyPropagate(linkedText, id);
PropertyPropagation propertyPropagate = propertyPropagation(linkedText, id);

switch (propertyPropagation) {
case PropertyPropagate::PROPAGATE:
switch (propertyPropagate) {
case PropertyPropagation::PROPAGATE:
linkedScore->undo(new ChangeTextProperties(linkedCursor, id, v, ps));
break;
case PropertyPropagate::UNLINK:
case PropertyPropagation::UNLINK:
unlinkPropertyFromMaster(id);
break;
default:
Expand Down

0 comments on commit 7d926f9

Please sign in to comment.