Skip to content

Fix object reference arrows not hiding with per-object visibility#4455

Open
Aayushmaan-24 wants to merge 1 commit into
mapeditor:masterfrom
Aayushmaan-24:fix-4451-object-reference-arrows-issue
Open

Fix object reference arrows not hiding with per-object visibility#4455
Aayushmaan-24 wants to merge 1 commit into
mapeditor:masterfrom
Aayushmaan-24:fix-4451-object-reference-arrows-issue

Conversation

@Aayushmaan-24
Copy link
Copy Markdown

Object reference arrows were correctly hidden when hiding an entire layer, but remained visible when toggling the visibility of individual objects.

The root cause was in addRemoveObjectReferences(): it checked objectGroup->isHidden() to skip hidden layers, but never checked object->isVisible() for individual objects. Additionally, when a MapObjectsChanged event was emitted for a visibility toggle, only syncOverlayItems() was called (which only syncs positions), so the arrows were never removed.

Fix:

  • In addRemoveObjectReferences(), skip invisible source objects and skip creating arrows that point to invisible target objects.
  • In changeEvent(), when MapObjectsChanged carries VisibleProperty, call addRemoveObjectReferences() to rebuild arrows.

Fixes #4451

Object reference arrows were correctly hidden when hiding an entire
layer, but remained visible when toggling the visibility of individual
objects.

The root cause was in addRemoveObjectReferences(): it checked
objectGroup->isHidden() to skip hidden layers, but never checked
object->isVisible() for individual objects. Additionally, when a
MapObjectsChanged event was emitted for a visibility toggle, only
syncOverlayItems() was called (which only syncs positions), so the
arrows were never removed.

Fix:
- In addRemoveObjectReferences(), skip invisible source objects and
  skip creating arrows that point to invisible target objects.
- In changeEvent(), when MapObjectsChanged carries VisibleProperty,
  call addRemoveObjectReferences() to rebuild arrows.

Fixes mapeditor#4451
Copy link
Copy Markdown
Member

@bjorn bjorn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for trying to address this issue!

As-is, the change is not entirely complete and I think it's not a good idea to take target object visibility into account. See inline comments.

forEachObjectReference(object->properties(), [&] (ObjectRef ref) {
MapObject *targetObject = DisplayObjectRef(ref, mMapDocument).object();
if (targetObject && !targetObject->isVisible())
return;
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we're going to hide based on target object visibility, it will be easier to do it in ensureReferenceItem. However, I'm not entirely sure it's helpful. We also don't hide arrows pointing at objects in hidden layers (only arrows pointing from hidden layers).

mReferencesByTargetObject[targetObject].append(item);
};

if (Preferences::instance()->showObjectReferences()) {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's a check on object->isVisible() missing here.

const auto &mapObjectsChange = static_cast<const MapObjectsChangeEvent&>(event);
if (mapObjectsChange.properties & MapObject::VisibleProperty) {
if (Preferences::instance()->showObjectReferences())
addRemoveObjectReferences();
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This full refresh based on any toggle of visibility may be a little heavy. I think this is another reason to not base reference visibility on the target object, because in that case we could instead call the addRemoveObjectReferences overload that takes a specific object, for each of the changed objects only.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

objects reference arrows still draw despite object toggled hidden

2 participants