File: System\Windows\Forms\Controls\Buttons\ButtonInternal\RadioButtonModernAdapter.cs
Web Access
Project: src\winforms\src\System.Windows.Forms\System.Windows.Forms.csproj (System.Windows.Forms)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Drawing;
 
namespace System.Windows.Forms.ButtonInternal;
 
/// <summary>
///  Paints a normal-appearance <see cref="RadioButton"/> with the modern animated glyph renderer.
/// </summary>
internal sealed class RadioButtonModernAdapter : RadioButtonBaseAdapter
{
    private readonly FlatStyle _flatStyle;
 
    internal RadioButtonModernAdapter(RadioButton control, FlatStyle flatStyle) : base(control)
    {
        _flatStyle = flatStyle;
    }
 
    internal override void PaintUp(PaintEventArgs e, CheckState state)
    {
        if (Control.Appearance == Appearance.Button)
        {
            ButtonAdapter.PaintUp(e, Control.Checked ? CheckState.Checked : CheckState.Unchecked);
            return;
        }
 
        PaintCore(e);
    }
 
    internal override void PaintDown(PaintEventArgs e, CheckState state)
    {
        if (Control.Appearance == Appearance.Button)
        {
            ButtonAdapter.PaintDown(e, Control.Checked ? CheckState.Checked : CheckState.Unchecked);
            return;
        }
 
        PaintCore(e);
    }
 
    internal override void PaintOver(PaintEventArgs e, CheckState state)
    {
        if (Control.Appearance == Appearance.Button)
        {
            ButtonAdapter.PaintOver(e, Control.Checked ? CheckState.Checked : CheckState.Unchecked);
            return;
        }
 
        PaintCore(e);
    }
 
    protected override ButtonBaseAdapter CreateButtonAdapter()
        => _flatStyle switch
        {
            FlatStyle.Flat => DarkModeAdapterFactory.CreateFlatAdapter(Control),
            FlatStyle.Popup => DarkModeAdapterFactory.CreatePopupAdapter(Control),
            _ => DarkModeAdapterFactory.CreateStandardAdapter(Control)
        };
 
    protected override LayoutOptions Layout(PaintEventArgs e)
    {
        LayoutOptions layout = CommonLayout();
        layout.CheckSize = Math.Max(
            Control.LogicalToDeviceUnits(13),
            (int)(Control.Font.Height * 0.9f));
 
        return layout;
    }
 
    internal override LayoutOptions CommonLayout()
    {
        LayoutOptions layout = base.CommonLayout();
        layout.ShadowedText = false;
 
        return layout;
    }
 
    private void PaintCore(PaintEventArgs e)
    {
        Graphics graphics = e.GraphicsInternal;
        ParentBackgroundRenderer.Paint(
            Control,
            graphics,
            Control.ClientRectangle,
            Control.BackColor);
 
        LayoutData layout = Layout(e).Layout();
        AdjustFocusRectangle(layout);
        PaintBackgroundImage(e);
 
        Color? customOnColor = Control.ShouldSerializeBackColor()
            ? Control.BackColor
            : null;
 
        Color? customBorderColor = Control.FlatAppearance.BorderColor.IsEmpty
            ? null
            : Control.FlatAppearance.BorderColor;
 
        Control.RadioGlyphRenderer.NotifyCheckedChanged(Control.Checked);
        Control.RadioGlyphRenderer.DrawGlyph(
            graphics,
            layout.CheckBounds,
            _flatStyle,
            Control.Enabled,
            Control.MouseIsOver,
            Control.Focused && Control.ShowFocusCues,
            customOnColor,
            customBorderColor);
 
        PaintImage(e, layout);
 
        Color preferredTextColor = Control.ShouldSerializeForeColor()
            ? Control.ForeColor
            : Application.IsDarkModeEnabled
                ? Color.FromArgb(0xF0, 0xF0, 0xF0)
                : SystemColors.WindowText;
        Color textColor = Control.Enabled
            ? preferredTextColor
            : ModernControlColorMath.GetDisabledTextColor(
                preferredTextColor,
                Control.Parent?.BackColor ?? Control.BackColor);
 
        PaintField(e, layout, PaintRender(e).Calculate(), textColor, drawFocus: true);
    }
}