/// <summary> /// Returns a clone of the node hierarchy. /// </summary> public virtual Node Clone() { var clone = (Node)MemberwiseClone(); ++CreatedCount; clone.Parent = null; clone.FirstAnimation = null; clone.FirstChild = null; clone.NextSibling = null; clone.gestures = null; clone.AsWidget = clone as Widget; clone.Animations = Animations.Clone(clone); clone.Animators = AnimatorCollection.SharedClone(clone, Animators); clone.Nodes = Nodes.Clone(clone); clone.Components = Components.Clone(clone); clone.IsAwake = false; if (RenderChainBuilder != null) { clone.RenderChainBuilder = RenderChainBuilder.Clone(clone); } if (Presenter != null) { clone.Presenter = Presenter.Clone(); } if (PostPresenter != null) { clone.PostPresenter = PostPresenter.Clone(); } clone.DirtyMask = DirtyFlags.All; clone.UserData = null; return(clone); }
public override void Update(float delta) { if (ContinuousRendering()) { Window.Invalidate(); } var context = WidgetContext.Current; // Find the node under mouse, using the render chain built on one frame before. context.NodeUnderMouse = LookForNodeUnderMouse(renderChain); // Assign NodeCapturedByMouse if any mouse button was pressed. var anyCaptureKeyPressed = IsAnyCaptureKeyPressed(); if (!prevAnyCaptureKeyPressed && anyCaptureKeyPressed) { context.NodeCapturedByMouse = context.NodeUnderMouse; } // Process mouse/touch screen input. context.GestureManager.Process(); // Update the widget hierarchy. context.MouseCursor = MouseCursor.Default; base.Update(delta); Window.Cursor = context.MouseCursor; // Set NodeCapturedByMouse to null if all mouse buttons were released. if (prevAnyCaptureKeyPressed && !anyCaptureKeyPressed) { context.NodeCapturedByMouse = null; } prevAnyCaptureKeyPressed = anyCaptureKeyPressed; if (Window.Input.WasKeyPressed(Key.DismissSoftKeyboard)) { SetFocus(null); } // Refresh widgets layout. LayoutManager.Layout(); RaiseUpdating(delta); ManageFocusOnWindowActivation(); // Rebuild the render chain. renderChain.Clear(); renderChain.ClipRegion = new Rectangle(Vector2.Zero, Size); RenderChainBuilder?.AddToRenderChain(renderChain); }
public virtual void Update(float delta) { if (ContinuousRendering()) { Window.Invalidate(); } var context = WidgetContext.Current; // Find the node under mouse, using the render chain built on one frame before. context.NodeUnderMouse = LookForNodeUnderMouse(renderChain); // Assign NodeCapturedByMouse if any mouse button was pressed or files were dropped. var anyCaptureKeyPressed = IsAnyCaptureKeyPressed(); if (!prevAnyCaptureKeyPressed && anyCaptureKeyPressed || Window.Input.DroppedFiles.Count > 0) { context.NodeCapturedByMouse = context.NodeUnderMouse; } else if ( !anyCaptureKeyPressed || (!(context.NodeCapturedByMouse as Widget)?.GloballyVisible ?? false) || (!(context.NodeCapturedByMouse as Node3D)?.GloballyVisible ?? false) ) { // Set NodeCapturedByMouse to null if all mouse buttons are released or widget became invisible. context.NodeCapturedByMouse = null; } prevAnyCaptureKeyPressed = anyCaptureKeyPressed; // Update the widget hierarchy. context.MouseCursor = MouseCursor.Default; Manager.Update(delta); Window.Cursor = context.MouseCursor; if (Window.Input.WasKeyPressed(Key.DismissSoftKeyboard)) { SetFocus(null); } ManageFocusOnWindowActivation(); // Rebuild the render chain. renderChain.Clear(); renderChain.ClipRegion = new Rectangle(Vector2.Zero, Size); RenderChainBuilder?.AddToRenderChain(renderChain); }