Ejemplo n.º 1
0
        /// <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();
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        /// <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);
        }