using AtomUI.Theme.Styling; using AtomUI.Theme.TokenSystem; using Avalonia; using Avalonia.Media; namespace AtomUI.Controls; [ControlDesignToken] internal class MenuToken : AbstractControlDesignToken { public const string ID = "Menu"; public MenuToken() : base(ID) { } /// /// 菜单的圆角 /// public CornerRadius MenuPopupBorderRadius { get; set; } /// /// 菜单 Popup 阴影 /// public BoxShadows MenuPopupBoxShadows { get; set; } /// /// 菜单内容边距 /// public Thickness MenuPopupContentPadding { get; set; } /// /// 菜单 Popup 最小宽度 /// public double MenuPopupMinWidth { get; set; } /// /// 菜单 Popup 最大宽度 /// public double MenuPopupMaxWidth { get; set; } /// /// 菜单 Popup 最大高度 /// public double MenuPopupMaxHeight { get; set; } /// /// 分离菜单项的高度,这个用于菜单中快捷功能的图标显示 /// TODO 暂时还没实现,但是最终会实现 /// public double MenuTearOffHeight { get; set; } /// /// 弹出框背景色 /// public Color MenuBgColor { get; set; } /// /// 菜单项文字颜色 /// public Color ItemColor { get; set; } /// /// 快捷键颜色 /// public Color KeyGestureColor { get; set; } /// /// 菜单项边距 /// public Thickness ItemMargin { get; set; } /// /// 菜单项文字悬浮颜色 /// public Color ItemHoverColor { get; set; } /// /// 菜单项文字禁用颜色 /// public Color ItemDisabledColor { get; set; } /// /// 危险菜单项文字颜色 /// public Color DangerItemColor { get; set; } /// /// 危险菜单项文字悬浮颜色 /// public Color DangerItemHoverColor { get; set; } /// /// 菜单项背景色 /// public Color ItemBg { get; set; } /// /// 菜单项悬浮态背景色 /// public Color ItemHoverBg { get; set; } /// /// 菜单项高度 /// public double ItemHeight { get; set; } /// /// 图标尺寸 /// public double ItemIconSize { get; set; } /// /// 图标与文字间距 /// public double ItemIconMarginInlineEnd { get; set; } /// /// 菜单项的圆角 /// public CornerRadius ItemBorderRadius { get; set; } /// /// 菜单项横向内间距 /// public Thickness ItemPaddingInline { get; set; } /// /// 顶层菜单项颜色 /// public Color TopLevelItemColor { get; set; } /// /// 顶层菜单项选中颜色 /// public Color TopLevelItemSelectedColor { get; set; } /// /// 顶层菜单项鼠标放上去的颜色 /// public Color TopLevelItemHoverColor { get; set; } /// /// 顶层菜单项背景色 /// public Color TopLevelItemBg { get; set; } /// /// 顶层菜单项选中时背景色 /// public Color TopLevelItemSelectedBg { get; set; } /// /// 顶层菜单项鼠标放上去背景色 /// public Color TopLevelItemHoverBg { get; set; } /// /// 顶层菜单项小号圆角 /// public CornerRadius TopLevelItemBorderRadiusSM { get; set; } /// /// 顶层菜单项圆角 /// public CornerRadius TopLevelItemBorderRadius { get; set; } /// /// 顶层菜单项大号圆角 /// public CornerRadius TopLevelItemBorderRadiusLG { get; set; } /// /// 顶层菜单项小号内间距 /// public Thickness TopLevelItemPaddingSM { get; set; } /// /// 顶层菜单项间距 /// public Thickness TopLevelItemPadding { get; set; } /// /// 顶层菜单项大号内间距 /// public Thickness TopLevelItemPaddingLG { get; set; } /// /// 顶层菜单项小号字体 /// public double TopLevelItemFontSizeSM { get; set; } = double.NaN; /// /// 顶层菜单项字体 /// public double TopLevelItemFontSize { get; set; } = double.NaN; /// /// 顶层菜单项大号字体 /// public double TopLevelItemFontSizeLG { get; set; } = double.NaN; /// /// 顶层菜单项内容字体行高 /// public double TopLevelItemLineHeight { get; set; } = double.NaN; /// /// 大号顶层菜单项内容字体行高 /// public double TopLevelItemLineHeightLG { get; set; } = double.NaN; /// /// 小号顶层菜单项内容字体行高 /// public double TopLevelItemLineHeightSM { get; set; } = double.NaN; /// /// 顶层弹出菜单,距离顶层菜单项的边距 /// public double TopLevelItemPopupMarginToAnchor { get; set; } /// /// 滚动按钮 Icon 大小 /// public double ScrollButtonIconSize { get; set; } /// /// 滚动按内边距 /// public Thickness ScrollButtonPadding { get; set; } /// /// 滚动按内边距 /// public Thickness ScrollButtonMargin { get; set; } /// /// 菜单分割项的高度 /// public double SeparatorItemHeight { get; set; } protected internal override void CalculateFromAlias() { base.CalculateFromAlias(); var colorTextDisabled = SharedToken.ColorTextDisabled; var colorError = SharedToken.ColorError; var colorTextSecondary = SharedToken.ColorTextQuaternary; var colorBgContainer = SharedToken.ColorBgContainer; var colorBgElevated = SharedToken.ColorBgElevated; var colorBgTextHover = SharedToken.ColorBgTextHover; var padding = SharedToken.UniformlyPadding; var controlHeight = SharedToken.ControlHeight; var controlHeightSM = SharedToken.ControlHeightSM; var controlHeightLG = SharedToken.ControlHeightLG; var fontSize = SharedToken.FontSize; var fontSizeLG = SharedToken.FontSizeLG; KeyGestureColor = colorTextSecondary; ItemBorderRadius = SharedToken.BorderRadius; ItemColor = SharedToken.ColorText; ItemHoverColor = ItemColor; ItemBg = colorBgElevated; ItemHoverBg = colorBgTextHover; ItemMargin = new Thickness(0, 0, SharedToken.UniformlyMarginXXS, 0); // Disabled ItemDisabledColor = colorTextDisabled; // Danger DangerItemColor = colorError; DangerItemHoverColor = colorError; ItemHeight = controlHeightSM; MenuBgColor = SharedToken.ColorBgElevated; ItemPaddingInline = new Thickness(padding, SharedToken.UniformlyPaddingXXS); ItemIconSize = SharedToken.IconSize; ItemIconMarginInlineEnd = controlHeightSM - fontSize; TopLevelItemColor = SharedToken.ColorText; TopLevelItemSelectedColor = SharedToken.ColorTextSecondary; TopLevelItemHoverColor = SharedToken.ColorTextSecondary; TopLevelItemBg = colorBgContainer; TopLevelItemHoverBg = colorBgTextHover; TopLevelItemSelectedBg = colorBgTextHover; TopLevelItemBorderRadiusSM = SharedToken.BorderRadiusSM; TopLevelItemBorderRadius = SharedToken.BorderRadius; TopLevelItemBorderRadiusLG = SharedToken.BorderRadiusLG; TopLevelItemFontSize = !double.IsNaN(TopLevelItemFontSize) ? TopLevelItemFontSize : fontSize; TopLevelItemFontSizeSM = !double.IsNaN(TopLevelItemFontSizeSM) ? TopLevelItemFontSizeSM : fontSize; TopLevelItemFontSizeLG = !double.IsNaN(TopLevelItemFontSizeLG) ? TopLevelItemFontSizeLG : fontSizeLG; TopLevelItemLineHeight = !double.IsNaN(TopLevelItemLineHeight) ? TopLevelItemLineHeight : CalculatorUtils.CalculateLineHeight(TopLevelItemFontSize) * TopLevelItemFontSize; TopLevelItemLineHeightSM = !double.IsNaN(TopLevelItemLineHeightSM) ? TopLevelItemLineHeightSM : CalculatorUtils.CalculateLineHeight(TopLevelItemFontSizeSM) * TopLevelItemFontSizeSM; TopLevelItemLineHeightLG = !double.IsNaN(TopLevelItemLineHeightLG) ? TopLevelItemLineHeightLG : CalculatorUtils.CalculateLineHeight(TopLevelItemFontSizeLG) * TopLevelItemFontSizeLG; TopLevelItemPaddingSM = new Thickness(SharedToken.PaddingContentHorizontalXS * 0.7, Math.Max((controlHeightSM - TopLevelItemLineHeightSM) / 2, 0)); TopLevelItemPadding = new Thickness(SharedToken.PaddingContentHorizontalXS, Math.Max((controlHeight - TopLevelItemLineHeight) / 2, 0)); TopLevelItemPaddingLG = new Thickness(SharedToken.PaddingContentHorizontalSM, Math.Max((controlHeightLG - TopLevelItemLineHeightLG) / 2, 0)); TopLevelItemPopupMarginToAnchor = SharedToken.UniformlyMarginXXS; MenuPopupBorderRadius = SharedToken.BorderRadiusLG; MenuPopupMinWidth = 120; MenuPopupMaxWidth = 800; MenuPopupMaxHeight = ItemHeight * 15; SeparatorItemHeight = SharedToken.LineWidth * 5; // 上下两像素,留一像素给自己 MenuTearOffHeight = ItemHeight * 1.2; // 暂时这么定义吧 MenuPopupContentPadding = new Thickness(SharedToken.UniformlyPaddingXXS, MenuPopupBorderRadius.TopLeft / 2); MenuPopupBoxShadows = SharedToken.BoxShadowsSecondary; ScrollButtonIconSize = SharedToken.IconSizeSM; ScrollButtonPadding = SharedToken.PaddingXS; ScrollButtonMargin = new Thickness(SharedToken.UniformlyMarginXXS / 2); } }