WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/00-core/CacheHelper.cs
@@ -293,12 +293,91 @@ using (var img = Image.FromFile(fileName)) { _pumpImage = img.CloneC(HydroL2d.Pump.Size.Width, HydroL2d.Pump.Size.Height); _pumpImage.RotateFlip(RotateFlipType.RotateNoneFlipY); } } return _pumpImage; } } private static Image _pumpImage = null; /// <summary> /// 水泵选择线画笔 /// </summary> public static Pen PumpSelectedLinePen { get { if (_pumpSelectedLinePen == null) { var lineColor = ColorTranslator.FromHtml(HydroL2d.Pump.SelectedLine.Color); var lineWidth = HydroL2d.Pump.SelectedLine.Width; _pumpSelectedLinePen = new Pen(lineColor, lineWidth); } return _pumpSelectedLinePen; } } private static Pen _pumpSelectedLinePen = null; /// <summary> /// 水泵选择图片 /// </summary> public static Image PumpSelectedImage { get { if (_pumpSelectedImage == null) { var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"images/l2d/{HydroL2d.Pump.SelectedImage}.png"); using (var img = Image.FromFile(fileName)) { _pumpSelectedImage = img.CloneC(HydroL2d.Pump.SelectedSize.Width, HydroL2d.Pump.SelectedSize.Height); _pumpSelectedImage.RotateFlip(RotateFlipType.RotateNoneFlipY); } } return _pumpSelectedImage; } } private static Image _pumpSelectedImage = null; /// <summary> /// 水泵悬停线画笔 /// </summary> public static Pen PumpHoveredLinePen { get { if (_pumpHoveredLinePen == null) { var lineColor = ColorTranslator.FromHtml(HydroL2d.Pump.HoveredLine.Color); var lineWidth = HydroL2d.Pump.HoveredLine.Width; _pumpHoveredLinePen = new Pen(lineColor, lineWidth); } return _pumpHoveredLinePen; } } private static Pen _pumpHoveredLinePen = null; /// <summary> /// 水泵悬停图片 /// </summary> public static Image PumpHoveredImage { get { if (_pumpHoveredImage == null) { var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"images/l2d/{HydroL2d.Pump.HoveredImage}.png"); using (var img = Image.FromFile(fileName)) { _pumpHoveredImage = img.CloneC(HydroL2d.Pump.HoveredSize.Width, HydroL2d.Pump.HoveredSize.Height); _pumpHoveredImage.RotateFlip(RotateFlipType.RotateNoneFlipY); } } return _pumpHoveredImage; } } private static Image _pumpHoveredImage = null; #endregion @@ -335,6 +414,7 @@ using (var img = Image.FromFile(fileName)) { _valveImage = img.CloneC(HydroL2d.Valve.Size.Width, HydroL2d.Valve.Size.Height); _valveImage.RotateFlip(RotateFlipType.RotateNoneFlipY); } } return _valveImage; @@ -342,6 +422,84 @@ } private static Image _valveImage = null; /// <summary> /// 阀门选择线画笔 /// </summary> public static Pen ValveSelectedLinePen { get { if (_valveSelectedLinePen == null) { var lineColor = ColorTranslator.FromHtml(HydroL2d.Valve.SelectedLine.Color); var lineWidth = HydroL2d.Valve.SelectedLine.Width; _valveSelectedLinePen = new Pen(lineColor, lineWidth); } return _valveSelectedLinePen; } } private static Pen _valveSelectedLinePen = null; /// <summary> /// 阀门选择图片 /// </summary> public static Image ValveSelectedImage { get { if (_valveSelectedImage == null) { var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"images/l2d/{HydroL2d.Valve.SelectedImage}.png"); using (var img = Image.FromFile(fileName)) { _valveSelectedImage = img.CloneC(HydroL2d.Valve.SelectedSize.Width, HydroL2d.Valve.SelectedSize.Height); _valveSelectedImage.RotateFlip(RotateFlipType.RotateNoneFlipY); } } return _valveSelectedImage; } } private static Image _valveSelectedImage = null; /// <summary> /// 阀门悬停线画笔 /// </summary> public static Pen ValveHoveredLinePen { get { if (_valveHoveredLinePen == null) { var lineColor = ColorTranslator.FromHtml(HydroL2d.Valve.HoveredLine.Color); var lineWidth = HydroL2d.Valve.HoveredLine.Width; _valveHoveredLinePen = new Pen(lineColor, lineWidth); } return _valveHoveredLinePen; } } private static Pen _valveHoveredLinePen = null; /// <summary> /// 阀门悬停图片 /// </summary> public static Image ValveHoveredImage { get { if (_valveHoveredImage == null) { var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"images/l2d/{HydroL2d.Valve.HoveredImage}.png"); using (var img = Image.FromFile(fileName)) { _valveHoveredImage = img.CloneC(HydroL2d.Valve.HoveredSize.Width, HydroL2d.Valve.HoveredSize.Height); _valveHoveredImage.RotateFlip(RotateFlipType.RotateNoneFlipY); } } return _valveHoveredImage; } } private static Image _valveHoveredImage = null; #endregion WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/01-network/04-link/Pump.cs
@@ -16,6 +16,26 @@ public float? LineWidth { get; set; } /// <summary> /// 悬停线色 /// </summary> public Color? HoveredLineColor { get; set; } /// <summary> /// 悬停线宽 /// </summary> public float? HoveredLineWidth { get; set; } /// <summary> /// 选择线色 /// </summary> public Color? SelectedLineColor { get; set; } /// <summary> /// 选择线宽 /// </summary> public float? SelectedLineWidth { get; set; } /// <summary> /// 图片 /// </summary> public Image Image { get; set; } @@ -29,6 +49,38 @@ /// 高度 /// </summary> public float? Height { get; set; } /// <summary> /// 悬停图片 /// </summary> public Image HoveredImage { get; set; } /// <summary> /// 悬停宽度 /// </summary> public float? HoveredWidth { get; set; } /// <summary> /// 悬停高度 /// </summary> public float? HoveredHeight { get; set; } /// <summary> /// 选择图片 /// </summary> public Image SelectedImage { get; set; } /// <summary> /// 选择宽度 /// </summary> public float? SelectedWidth { get; set; } /// <summary> /// 选择高度 /// </summary> public float? SelectedHeight { get; set; } private Coordinate _coordinate { get; set; }//坐标信息 @@ -51,53 +103,156 @@ public override void Draw(Graphics g) { _coordinate = GetCoordinate(g); #region 画线 var fromCachePen = true; var pen = CacheHelper.PumpLinePen; if (this.LineColor.HasValue && this.LineWidth.HasValue) if (this.Hovered) { pen = new Pen(this.LineColor.Value, this.LineWidth.Value); fromCachePen = false; var fromCachePen = true; var pen = CacheHelper.PumpHoveredLinePen; if (this.HoveredLineColor.HasValue && this.HoveredLineWidth.HasValue) { pen = new Pen(this.HoveredLineColor.Value, this.HoveredLineWidth.Value); fromCachePen = false; } var penWidth = pen.Width; pen.Width = pen.Width / g.PageScale; g.DrawLine(pen, this.StartPosition, this.EndPosition); pen.Width = penWidth; if (!fromCachePen) { pen.Dispose(); } } var penWidth = pen.Width; pen.Width = pen.Width / g.PageScale; g.DrawLine(pen, this.StartPosition, this.EndPosition); pen.Width = penWidth; if (!fromCachePen) else if (this.Selected) { pen.Dispose(); var fromCachePen = true; var pen = CacheHelper.PumpSelectedLinePen; if (this.SelectedLineColor.HasValue && this.SelectedLineWidth.HasValue) { pen = new Pen(this.SelectedLineColor.Value, this.SelectedLineWidth.Value); fromCachePen = false; } var penWidth = pen.Width; pen.Width = pen.Width / g.PageScale; g.DrawLine(pen, this.StartPosition, this.EndPosition); pen.Width = penWidth; if (!fromCachePen) { pen.Dispose(); } } else { var fromCachePen = true; var pen = CacheHelper.PumpLinePen; if (this.LineColor.HasValue && this.LineWidth.HasValue) { pen = new Pen(this.LineColor.Value, this.LineWidth.Value); fromCachePen = false; } var penWidth = pen.Width; pen.Width = pen.Width / g.PageScale; g.DrawLine(pen, this.StartPosition, this.EndPosition); pen.Width = penWidth; if (!fromCachePen) { pen.Dispose(); } } #endregion #region 画图片 var img = CacheHelper.PumpImage; if (this.Image != null) if (this.Hovered) { img = this.Image; var img = CacheHelper.PumpHoveredImage; if (this.HoveredImage != null) { img = this.HoveredImage; } var width = this.HoveredWidth.HasValue ? this.HoveredWidth.Value : CacheHelper.HydroL2d.Pump.HoveredSize.Width; var height = this.HoveredHeight.HasValue ? this.HoveredHeight.Value : CacheHelper.HydroL2d.Pump.HoveredSize.Height; var isNewImage = false; if (img.Width != (int)width || img.Height != (int)height) { img = img.CloneC(width, height); isNewImage = true; } var pt = this.StartPosition.GetCenter(this.EndPosition); var dx = width / g.PageScale / 2f; var dy = height / g.PageScale / 2f; var p0 = new PointF(pt.X - dx, pt.Y - dy); g.DrawImage(img, p0); if (isNewImage) { img.Dispose(); } } var width = this.Width.HasValue ? this.Width.Value : CacheHelper.HydroL2d.Pump.Size.Width; var height = this.Height.HasValue ? this.Height.Value : CacheHelper.HydroL2d.Pump.Size.Height; var isNewImage = false; if (img.Width != (int)width || img.Height != (int)height) else if (this.Selected) { img = img.CloneC(width, height); isNewImage = true; var img = CacheHelper.PumpSelectedImage; if (this.SelectedImage != null) { img = this.SelectedImage; } var width = this.SelectedWidth.HasValue ? this.SelectedWidth.Value : CacheHelper.HydroL2d.Pump.SelectedSize.Width; var height = this.SelectedHeight.HasValue ? this.SelectedHeight.Value : CacheHelper.HydroL2d.Pump.SelectedSize.Height; var isNewImage = false; if (img.Width != (int)width || img.Height != (int)height) { img = img.CloneC(width, height); isNewImage = true; } var pt = this.StartPosition.GetCenter(this.EndPosition); var dx = width / g.PageScale / 2f; var dy = height / g.PageScale / 2f; var p0 = new PointF(pt.X - dx, pt.Y - dy); g.DrawImage(img, p0); if (isNewImage) { img.Dispose(); } } else { var img = CacheHelper.PumpImage; if (this.Image != null) { img = this.Image; } var width = this.Width.HasValue ? this.Width.Value : CacheHelper.HydroL2d.Pump.Size.Width; var height = this.Height.HasValue ? this.Height.Value : CacheHelper.HydroL2d.Pump.Size.Height; var isNewImage = false; if (img.Width != (int)width || img.Height != (int)height) { img = img.CloneC(width, height); isNewImage = true; } var pt = this.StartPosition.GetCenter(this.EndPosition); var dx = width / g.PageScale / 2f; var dy = height / g.PageScale / 2f; var p0 = new PointF(pt.X - dx, pt.Y - dy); g.DrawImage(img, p0); if (isNewImage) { img.Dispose(); } } var pt = this.StartPosition.GetCenter(this.EndPosition); var dx = width / g.PageScale / 2f; var dy = height / g.PageScale / 2f; var p0 = new PointF(pt.X - dx, pt.Y - dy); g.DrawImage(img, p0); if (isNewImage) { img.Dispose(); } #endregion WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/01-network/04-link/Valve.cs
@@ -16,6 +16,26 @@ public float? LineWidth { get; set; } /// <summary> /// 悬停线色 /// </summary> public Color? HoveredLineColor { get; set; } /// <summary> /// 悬停线宽 /// </summary> public float? HoveredLineWidth { get; set; } /// <summary> /// 选择线色 /// </summary> public Color? SelectedLineColor { get; set; } /// <summary> /// 选择线宽 /// </summary> public float? SelectedLineWidth { get; set; } /// <summary> /// 图片 /// </summary> public Image Image { get; set; } @@ -29,6 +49,36 @@ /// 高度 /// </summary> public float? Height { get; set; } /// <summary> /// 悬停图片 /// </summary> public Image HoveredImage { get; set; } /// <summary> /// 悬停宽度 /// </summary> public float? HoveredWidth { get; set; } /// <summary> /// 悬停高度 /// </summary> public float? HoveredHeight { get; set; } /// <summary> /// 选择图片 /// </summary> public Image SelectedImage { get; set; } /// <summary> /// 选择宽度 /// </summary> public float? SelectedWidth { get; set; } /// <summary> /// 选择高度 /// </summary> public float? SelectedHeight { get; set; } private Coordinate _coordinate { get; set; }//坐标信息 @@ -51,53 +101,156 @@ public override void Draw(Graphics g) { _coordinate = GetCoordinate(g); #region 画线 var fromCachePen = true; var pen = CacheHelper.ValveLinePen; if (this.LineColor.HasValue && this.LineWidth.HasValue) if (this.Hovered) { pen = new Pen(this.LineColor.Value, this.LineWidth.Value); fromCachePen = false; var fromCachePen = true; var pen = CacheHelper.ValveHoveredLinePen; if (this.HoveredLineColor.HasValue && this.HoveredLineWidth.HasValue) { pen = new Pen(this.HoveredLineColor.Value, this.HoveredLineWidth.Value); fromCachePen = false; } var penWidth = pen.Width; pen.Width = pen.Width / g.PageScale; g.DrawLine(pen, this.StartPosition, this.EndPosition); pen.Width = penWidth; if (!fromCachePen) { pen.Dispose(); } } var penWidth = pen.Width; pen.Width = pen.Width / g.PageScale; g.DrawLine(pen, this.StartPosition, this.EndPosition); pen.Width = penWidth; if (!fromCachePen) else if (this.Selected) { pen.Dispose(); var fromCachePen = true; var pen = CacheHelper.ValveSelectedLinePen; if (this.SelectedLineColor.HasValue && this.SelectedLineWidth.HasValue) { pen = new Pen(this.SelectedLineColor.Value, this.SelectedLineWidth.Value); fromCachePen = false; } var penWidth = pen.Width; pen.Width = pen.Width / g.PageScale; g.DrawLine(pen, this.StartPosition, this.EndPosition); pen.Width = penWidth; if (!fromCachePen) { pen.Dispose(); } } else { var fromCachePen = true; var pen = CacheHelper.ValveLinePen; if (this.LineColor.HasValue && this.LineWidth.HasValue) { pen = new Pen(this.LineColor.Value, this.LineWidth.Value); fromCachePen = false; } var penWidth = pen.Width; pen.Width = pen.Width / g.PageScale; g.DrawLine(pen, this.StartPosition, this.EndPosition); pen.Width = penWidth; if (!fromCachePen) { pen.Dispose(); } } #endregion #region 画图片 var img = CacheHelper.ValveImage; if (this.Image != null) if (this.Hovered) { img = this.Image; var img = CacheHelper.ValveHoveredImage; if (this.HoveredImage != null) { img = this.HoveredImage; } var width = this.HoveredWidth.HasValue ? this.HoveredWidth.Value : CacheHelper.HydroL2d.Valve.HoveredSize.Width; var height = this.HoveredHeight.HasValue ? this.HoveredHeight.Value : CacheHelper.HydroL2d.Valve.HoveredSize.Height; var isNewImage = false; if (img.Width != (int)width || img.Height != (int)height) { img = img.CloneC(width, height); isNewImage = true; } var pt = this.StartPosition.GetCenter(this.EndPosition); var dx = width / g.PageScale / 2f; var dy = height / g.PageScale / 2f; var p0 = new PointF(pt.X - dx, pt.Y - dy); g.DrawImage(img, p0); if (isNewImage) { img.Dispose(); } } var width = this.Width.HasValue ? this.Width.Value : CacheHelper.HydroL2d.Valve.Size.Width; var height = this.Height.HasValue ? this.Height.Value : CacheHelper.HydroL2d.Valve.Size.Height; var isNewImage = false; if (img.Width != (int)width || img.Height != (int)height) else if (this.Selected) { img = img.CloneC(width, height); isNewImage = true; var img = CacheHelper.ValveSelectedImage; if (this.SelectedImage != null) { img = this.SelectedImage; } var width = this.SelectedWidth.HasValue ? this.SelectedWidth.Value : CacheHelper.HydroL2d.Valve.SelectedSize.Width; var height = this.SelectedHeight.HasValue ? this.SelectedHeight.Value : CacheHelper.HydroL2d.Valve.SelectedSize.Height; var isNewImage = false; if (img.Width != (int)width || img.Height != (int)height) { img = img.CloneC(width, height); isNewImage = true; } var pt = this.StartPosition.GetCenter(this.EndPosition); var dx = width / g.PageScale / 2f; var dy = height / g.PageScale / 2f; var p0 = new PointF(pt.X - dx, pt.Y - dy); g.DrawImage(img, p0); if (isNewImage) { img.Dispose(); } } else { var img = CacheHelper.ValveImage; if (this.Image != null) { img = this.Image; } var width = this.Width.HasValue ? this.Width.Value : CacheHelper.HydroL2d.Valve.Size.Width; var height = this.Height.HasValue ? this.Height.Value : CacheHelper.HydroL2d.Valve.Size.Height; var isNewImage = false; if (img.Width != (int)width || img.Height != (int)height) { img = img.CloneC(width, height); isNewImage = true; } var pt = this.StartPosition.GetCenter(this.EndPosition); var dx = width / g.PageScale / 2f; var dy = height / g.PageScale / 2f; var p0 = new PointF(pt.X - dx, pt.Y - dy); g.DrawImage(img, p0); if (isNewImage) { img.Dispose(); } } var pt = this.StartPosition.GetCenter(this.EndPosition); var dx = width / g.PageScale / 2f; var dy = height / g.PageScale / 2f; var p0 = new PointF(pt.X - dx, pt.Y - dy); g.DrawImage(img, p0); if (isNewImage) { img.Dispose(); } #endregion WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/02-panel/NetworkPanel.cs
@@ -110,8 +110,8 @@ g.TranslateTransform(_dxo, _dyo); g.ScaleTransform(1, -1); //_network.Draw(g, dispRect); _network.Draw(g); _network.Draw(g, dispRect); // _network.Draw(g); } lock (_dispLocker) { @@ -312,7 +312,7 @@ { return default; } var pt = ClientToDispPoint(_clientRectf.Location); var pt = ClientToDispPoint(new PointF(_clientRectf.X, _clientRectf.Height)); var width = _clientRectf.Width / _zoom; var height = _clientRectf.Height / _zoom; return new RectangleF(pt, new SizeF(width, height)); WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/03-settings/01-paras/05-pump/Paras_HydroL2d_Pump.cs
@@ -20,6 +20,40 @@ /// </summary> public Paras_HydroL2d_Size Size { get; set; } /// <summary> /// 选择线 /// </summary> public Paras_HydroL2d_Line SelectedLine { get; set; } /// <summary> /// 选择图片 /// </summary> public string SelectedImage { get; set; } /// <summary> /// 选择尺寸 /// </summary> public Paras_HydroL2d_Size SelectedSize { get; set; } /// <summary> /// 悬停线 /// </summary> public Paras_HydroL2d_Line HoveredLine { get; set; } /// <summary> /// 悬停图片 /// </summary> public string HoveredImage { get; set; } /// <summary> /// 悬停尺寸 /// </summary> public Paras_HydroL2d_Size HoveredSize { get; set; } } } WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/03-settings/01-paras/06-valve/Paras_HydroL2d_Pump.cs
@@ -20,6 +20,35 @@ /// </summary> public Paras_HydroL2d_Size Size { get; set; } /// <summary> /// 选择线 /// </summary> public Paras_HydroL2d_Line SelectedLine { get; set; } /// <summary> /// 选择图片 /// </summary> public string SelectedImage { get; set; } /// <summary> /// 选择尺寸 /// </summary> public Paras_HydroL2d_Size SelectedSize { get; set; } /// <summary> /// 悬停线 /// </summary> public Paras_HydroL2d_Line HoveredLine { get; set; } /// <summary> /// 悬停图片 /// </summary> public string HoveredImage { get; set; } /// <summary> /// 悬停尺寸 /// </summary> public Paras_HydroL2d_Size HoveredSize { get; set; } } WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/Yw.WinFrmUI.Hydro.L2d.Core.csproj
@@ -32,12 +32,18 @@ <ItemGroup> <None Remove="images\l2d\Loading.gif" /> <None Remove="images\l2d\Pump.png" /> <None Remove="images\l2d\pump.png" /> <None Remove="images\l2d\pump_hovered.png" /> <None Remove="images\l2d\pump_selected.png" /> <None Remove="images\l2d\Reservoir.png" /> <None Remove="images\l2d\reservoir_hovered.png" /> <None Remove="images\l2d\reservoir_selected.png" /> <None Remove="images\l2d\Tank.png" /> <None Remove="images\l2d\tank_hovered.png" /> <None Remove="images\l2d\tank_selected.png" /> <None Remove="images\l2d\Valve.png" /> <None Remove="images\l2d\valve.png" /> <None Remove="images\l2d\valve_hovered.png" /> <None Remove="images\l2d\valve_selected.png" /> <None Remove="paras_hydro_l2d_settings.json" /> </ItemGroup> @@ -48,7 +54,19 @@ <Content Include="images\l2d\pump.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="images\l2d\pump_hovered.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="images\l2d\pump_selected.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="images\l2d\reservoir.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="images\l2d\reservoir_hovered.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="images\l2d\reservoir_selected.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="images\l2d\tank.png"> @@ -63,6 +81,12 @@ <Content Include="images\l2d\valve.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="images\l2d\valve_hovered.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="images\l2d\valve_selected.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="paras_hydro_l2d_settings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/images/l2d/Pump.pngWinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/images/l2d/Valve.pngWinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/images/l2d/pump_hovered.png
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/images/l2d/pump_selected.png
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/images/l2d/valve_hovered.png
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/images/l2d/valve_selected.png
WinFrmUI/Yw.WinFrmUI.Hydro.L2d.Core/paras_hydro_l2d_settings.json
@@ -81,6 +81,24 @@ }, "Image": "pump", "Size": { "Width": 30, "Height": 30 }, "HoveredLine": { "Color": "#ffbf00", "Width": 4 }, "HoveredImage": "pump_hovered", "HoveredSize": { "Width": 32, "Height": 32 }, "SelectedLine": { "Color": "Red", "Width": 4 }, "SelectedImage": "pump_selected", "SelectedSize": { "Width": 32, "Height": 32 } @@ -92,6 +110,24 @@ }, "Image": "valve", "Size": { "Width": 30, "Height": 30 }, "HoveredLine": { "Color": "#ffbf00", "Width": 4 }, "HoveredImage": "valve_hovered", "HoveredSize": { "Width": 32, "Height": 32 }, "SelectedLine": { "Color": "Red", "Width": 4 }, "SelectedImage": "valve_selected", "SelectedSize": { "Width": 32, "Height": 32 }