#region Imports using DPumpHydr.WinFrmUI.RLT.Helper; using DPumpHydr.WinFrmUI.RLT.Manager; using DPumpHydr.WinFrmUI.RLT.Util; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using static DPumpHydr.WinFrmUI.RLT.Helper.MaterialDrawHelper; #endregion namespace DPumpHydr.WinFrmUI.RLT.Controls { #region MaterialLabel public class MaterialLabel : Label, MaterialControlI { [Browsable(false)] public int Depth { get; set; } [Browsable(false)] public MaterialSkinManager SkinManager => MaterialSkinManager.Instance; [Browsable(false)] public MaterialMouseState MouseState { get; set; } private ContentAlignment _TextAlign = ContentAlignment.TopLeft; [DefaultValue(typeof(ContentAlignment), "TopLeft")] public override ContentAlignment TextAlign { get => _TextAlign; set { _TextAlign = value; updateAligment(); Invalidate(); } } [Category("Material"), DefaultValue(false)] public bool HighEmphasis { get; set; } [Category("Material"), DefaultValue(false)] public bool UseAccent { get; set; } private MaterialSkinManager.FontType _fontType = MaterialSkinManager.FontType.Body1; [Category("Material"), DefaultValue(typeof(MaterialSkinManager.FontType), "Body1")] public MaterialSkinManager.FontType FontType { get => _fontType; set { _fontType = value; Font = SkinManager.GetFontByType(_fontType); Refresh(); } } public MaterialLabel() { FontType = MaterialSkinManager.FontType.Body1; TextAlign = ContentAlignment.TopLeft; } public override Size GetPreferredSize(Size proposedSize) { if (AutoSize) { Size strSize; using (MaterialNativeTextRenderer NativeText = new(CreateGraphics())) { strSize = NativeText.MeasureLogString(Text, SkinManager.GetLogFontByType(_fontType)); strSize.Width += 1; // necessary to avoid a bug when autosize = true } return strSize; } else { return proposedSize; } } private MaterialNativeTextRenderer.TextAlignFlags Alignment; private void updateAligment() { Alignment = _TextAlign switch { ContentAlignment.TopLeft => MaterialNativeTextRenderer.TextAlignFlags.Top | MaterialNativeTextRenderer.TextAlignFlags.Left, ContentAlignment.TopCenter => MaterialNativeTextRenderer.TextAlignFlags.Top | MaterialNativeTextRenderer.TextAlignFlags.Center, ContentAlignment.TopRight => MaterialNativeTextRenderer.TextAlignFlags.Top | MaterialNativeTextRenderer.TextAlignFlags.Right, ContentAlignment.MiddleLeft => MaterialNativeTextRenderer.TextAlignFlags.Middle | MaterialNativeTextRenderer.TextAlignFlags.Left, ContentAlignment.MiddleCenter => MaterialNativeTextRenderer.TextAlignFlags.Middle | MaterialNativeTextRenderer.TextAlignFlags.Center, ContentAlignment.MiddleRight => MaterialNativeTextRenderer.TextAlignFlags.Middle | MaterialNativeTextRenderer.TextAlignFlags.Right, ContentAlignment.BottomLeft => MaterialNativeTextRenderer.TextAlignFlags.Bottom | MaterialNativeTextRenderer.TextAlignFlags.Left, ContentAlignment.BottomCenter => MaterialNativeTextRenderer.TextAlignFlags.Bottom | MaterialNativeTextRenderer.TextAlignFlags.Center, ContentAlignment.BottomRight => MaterialNativeTextRenderer.TextAlignFlags.Bottom | MaterialNativeTextRenderer.TextAlignFlags.Right, _ => MaterialNativeTextRenderer.TextAlignFlags.Top | MaterialNativeTextRenderer.TextAlignFlags.Left, }; } protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; g.Clear(Parent.BackColor == Color.Transparent ? ((Parent.Parent == null || (Parent.Parent != null && Parent.Parent.BackColor == Color.Transparent)) ? SkinManager.BackgroundColor : Parent.Parent.BackColor) : Parent.BackColor); // Draw Text using MaterialNativeTextRenderer NativeText = new(g); NativeText.DrawMultilineTransparentText( Text, SkinManager.GetLogFontByType(_fontType), Enabled ? HighEmphasis ? UseAccent ? SkinManager.ColorScheme.AccentColor : // High emphasis, accent (SkinManager.Theme == MaterialSkinManager.Themes.LIGHT) ? SkinManager.ColorScheme.PrimaryColor : // High emphasis, primary Light theme SkinManager.ColorScheme.PrimaryColor.Lighten(0.25f) : // High emphasis, primary Dark theme SkinManager.TextHighEmphasisColor : // Normal SkinManager.TextDisabledOrHintColor, // Disabled ClientRectangle.Location, ClientRectangle.Size, Alignment); } protected override void InitLayout() { Font = SkinManager.GetFontByType(_fontType); } } #endregion }