/// <summary> /// Forces removal of this drawable from its parent, followed by immediate synchronous disposal. /// </summary> /// <remarks> /// This is intended as a temporary solution for the fact that there is no way to easily dispose /// a component in a way that is guaranteed to be synchronously run on the update thread. /// /// Eventually components will have a better method for unloading. /// </remarks> /// <param name="drawable">The <see cref="Drawable"/> to be disposed.</param> public static void RemoveAndDisposeImmediately(this Drawable drawable) { ThreadSafety.EnsureUpdateThread(); drawable.Parent?.RemoveInternal(drawable); drawable.Dispose(); }
/// <summary> /// Invalidates draw matrix and autosize caches. /// </summary> /// <returns>If the invalidate was actually necessary.</returns> public virtual bool Invalidate(Invalidation invalidation = Invalidation.All, Drawable source = null, bool shallPropagate = true) { if (invalidation == Invalidation.None) { return(false); } ThreadSafety.EnsureUpdateThread(); OnInvalidate?.Invoke(); if (shallPropagate && Parent != null && source != Parent) { Parent.Invalidate(Parent.InvalidationEffectByChildren(invalidation), this, false); } bool alreadyInvalidated = true; // Either ScreenSize OR ScreenPosition OR Colour if ((invalidation & (Invalidation.Position | Invalidation.Colour | Invalidation.SizeInParentSpace)) > 0) { if ((invalidation & (Invalidation.Position | Invalidation.SizeInParentSpace)) > 0) { if ((invalidation & Invalidation.SizeInParentSpace) > 0) { alreadyInvalidated &= !boundingSizeBacking.Invalidate(); } alreadyInvalidated &= !screenSpaceDrawQuadBacking.Invalidate(); } alreadyInvalidated &= !drawInfoBacking.Invalidate(); } if ((invalidation & Invalidation.Visibility) > 0) { alreadyInvalidated &= !isVisibleBacking.Invalidate(); } if (!alreadyInvalidated) { foreach (DrawNode n in validDrawNodes) { n.IsValid = false; } validDrawNodes.Clear(); } return(!alreadyInvalidated); }
/// <summary> /// Invalidates draw matrix and autosize caches. /// </summary> /// <returns>If the invalidate was actually necessary.</returns> public virtual bool Invalidate(Invalidation invalidation = Invalidation.All, Drawable source = null, bool shallPropagate = true) { if (invalidation == Invalidation.None) { return(false); } ThreadSafety.EnsureUpdateThread(); OnInvalidate?.Invoke(); if (shallPropagate && Parent != null && source != Parent) { Parent.Invalidate(Parent.InvalidationEffectByChildren(invalidation), this, false); } bool alreadyInvalidated = true; if ((invalidation & Invalidation.SizeInParentSpace) > 0) { alreadyInvalidated &= !boundingSizeBacking.Invalidate(); } // Either ScreenSize OR ScreenPosition if ((invalidation & Invalidation.ScreenSpaceQuad) > 0) { alreadyInvalidated &= !screenSpaceDrawQuadBacking.Invalidate(); } // Either ScreenSize OR ScreenPosition OR Colour if ((invalidation & Invalidation.DrawInfo) > 0) { alreadyInvalidated &= !drawInfoBacking.Invalidate(); } if ((invalidation & Invalidation.Visibility) > 0) { alreadyInvalidated &= !isVisibleBacking.Invalidate(); } if (alreadyInvalidated || !shallPropagate) { return(!alreadyInvalidated); } if (children != null) { foreach (var c in children) { Debug.Assert(c != source); Invalidation childInvalidation = invalidation; //if (c.SizeMode == InheritMode.None) childInvalidation = childInvalidation & ~Invalidation.SizeInParentSpace; c.Invalidate(childInvalidation, this); } } return(!alreadyInvalidated); }