public void Render(RenderContext context) { if (!Visible) { return; } UpdateLayout(); var view = Rectangle.Intersect(context.View, Bounds); if (view.Width == 0 || view.Height == 0) { return; } var oldScissorRectangle = context.Scissor; if (ClipToBounds && !MyraEnvironment.DisableClipping) { var newScissorRectangle = Rectangle.Intersect(oldScissorRectangle, view); if (newScissorRectangle.IsEmpty) { return; } context.Scissor = newScissorRectangle; } var oldOpacity = context.Opacity; var oldView = context.View; context.Opacity *= Opacity; context.View = view; BeforeRender?.Invoke(context); // Background var background = GetCurrentBackground(); if (background != null) { background.Draw(context, BackgroundBounds); } // Borders var border = GetCurrentBorder(); if (border != null) { var borderBounds = BorderBounds; if (BorderThickness.Left > 0) { border.Draw(context, new Rectangle(borderBounds.X, borderBounds.Y, BorderThickness.Left, borderBounds.Height)); } if (BorderThickness.Top > 0) { border.Draw(context, new Rectangle(borderBounds.X, borderBounds.Y, borderBounds.Width, BorderThickness.Top)); } if (BorderThickness.Right > 0) { border.Draw(context, new Rectangle(borderBounds.Right - BorderThickness.Right, borderBounds.Y, BorderThickness.Right, borderBounds.Height)); } if (BorderThickness.Bottom > 0) { border.Draw(context, new Rectangle(borderBounds.X, borderBounds.Bottom - BorderThickness.Bottom, borderBounds.Width, BorderThickness.Bottom)); } } InternalRender(context); AfterRender?.Invoke(context); // Restore context settings context.View = oldView; context.Opacity = oldOpacity; // Optional debug rendering if (MyraEnvironment.DrawWidgetsFrames) { context.DrawRectangle(Bounds, Color.LightGreen); } if (MyraEnvironment.DrawKeyboardFocusedWidgetFrame && IsKeyboardFocused) { context.DrawRectangle(Bounds, Color.Red); } if (MyraEnvironment.DrawMouseWheelFocusedWidgetFrame && IsMouseWheelFocused) { context.DrawRectangle(Bounds, Color.Yellow); } if (ClipToBounds && !MyraEnvironment.DisableClipping) { // Restore scissor context.Scissor = oldScissorRectangle; } }