// -------------------------------------------------------- @HoverWidth // -- Animate the width of target element to desired value on hover -- // -------------------------------------------------------------------- public static void HoverWidth(this VisualElement target, float initialWidth = 0f, float desiredWidth = 100f, int duration = 1000, Action hoverCallback = null, Action leaveCallback = null, bool afterAnimation = false) { initialWidth = initialWidth == 0f ? target.resolvedStyle.width : initialWidth; var enterAnim = new ValueAnimation <StyleValues>(); var leaveAnim = new ValueAnimation <StyleValues>(); void MouseEnter() { enterAnim = afterAnimation ? target.AnimateWidth(initialWidth, desiredWidth, duration, callback: hoverCallback) : target.AnimateWidth(initialWidth, desiredWidth, duration); } // @formatter:off void MouseLeave() { leaveAnim = target.AnimateWidth(desiredWidth, initialWidth, duration, easing: Easy.EaseInOutQuint); } // @formatter:on target.RegisterCallback <MouseOverEvent>(evt => { if (enterAnim.isRunning) { enterAnim.Stop(); } if (leaveAnim.isRunning) { leaveAnim.Stop(); } MouseEnter(); if (!afterAnimation) { hoverCallback?.Invoke(); } evt.StopPropagation(); }); target.RegisterCallback <MouseLeaveEvent>(evt => { if (enterAnim.isRunning) { enterAnim.Stop(); } if (leaveAnim.isRunning) { leaveAnim.Stop(); } MouseLeave(); // leaveCallback?.Invoke(); evt.StopPropagation(); target.schedule.Execute(leaveCallback).StartingIn(duration); }); }
// -------------------------------------------------------- @HoverWidth // -- Animate the width of target element to desired value on hover -- // -------------------------------------------------------------------- public static AnimatedItems <MouseOverEvent, MouseOutEvent> HoverWidth( this VisualElement target, float initialWidth = 0f, float desiredWidth = 100f, int duration = 1000, Action hoverCallback = null, Action leaveCallback = null, bool afterAnimation = false, bool includeChildren = true, bool stopPropagation = true, TrickleDown useTrickleDown = TrickleDown.NoTrickleDown) { initialWidth = initialWidth == 0f ? target.resolvedStyle.width : initialWidth; var enterAnim = new ValueAnimation <StyleValues>(); var leaveAnim = new ValueAnimation <StyleValues>(); enterAnim = afterAnimation ? target.AnimateWidth(initialWidth, desiredWidth, duration, callback: hoverCallback) : target.AnimateWidth(initialWidth, desiredWidth, duration); enterAnim.KeepAlive(); leaveAnim = target.AnimateWidth(desiredWidth, initialWidth, duration, easing: Easy.EaseInOutQuint); leaveAnim.KeepAlive(); void MouseEnter() { enterAnim.Start(); } // @formatter:off void MouseLeave() { leaveAnim.Start(); } // @formatter:on EventCallback <MouseOverEvent> mouseOverEvent = evt => { if (enterAnim.isRunning) { enterAnim.Stop(); } if (leaveAnim.isRunning) { leaveAnim.Stop(); } MouseEnter(); if (!afterAnimation) { hoverCallback?.Invoke(); } if (stopPropagation) { evt.StopPropagation(); } }; EventCallback <MouseOutEvent> mouseOutEvent = evt => { if (enterAnim.isRunning) { enterAnim.Stop(); } if (leaveAnim.isRunning) { leaveAnim.Stop(); } MouseLeave(); if (stopPropagation) { evt.StopPropagation(); } target.schedule.Execute(leaveCallback).StartingIn(duration); }; target.RegisterCallback(mouseOverEvent, includeChildren, useTrickleDown); target.RegisterCallback(mouseOutEvent, includeChildren, useTrickleDown); return(new AnimatedItems <MouseOverEvent, MouseOutEvent>(target) { AnimatedItemList = new List <ValueAnimation <StyleValues> > { enterAnim, leaveAnim }, EventCallbacks = (mouseOverEvent, mouseOutEvent) });