mirror of
https://github.com/netchx/netch.git
synced 2026-03-28 18:59:46 +08:00
Refactor DrawItem
This commit is contained in:
@@ -55,12 +55,29 @@ namespace Netch.Forms
|
||||
CheckForIllegalCrossThreadCalls = false;
|
||||
}
|
||||
|
||||
private void AddAddServerToolStripMenuItems()
|
||||
{
|
||||
foreach (var serversUtil in ServerHelper.ServerUtils.Where(i => !string.IsNullOrEmpty(i.FullName)))
|
||||
{
|
||||
var fullName = serversUtil.FullName;
|
||||
var control = new ToolStripMenuItem
|
||||
{
|
||||
Name = $"Add{fullName}ServerToolStripMenuItem",
|
||||
Size = new Size(259, 22),
|
||||
Text = i18N.TranslateFormat("Add [{0}] Server", fullName)
|
||||
};
|
||||
_mainFormText.Add(control.Name, new[] {"Add [{0}] Server", fullName});
|
||||
control.Click += AddServerToolStripMenuItem_Click;
|
||||
ServerToolStripMenuItem.DropDownItems.Add(control);
|
||||
}
|
||||
}
|
||||
|
||||
private void MainForm_Load(object sender, EventArgs e)
|
||||
{
|
||||
OnlyInstance.Called += OnCalled;
|
||||
|
||||
// 计算 ComboBox绘制 目标宽度
|
||||
_comboBoxNumberBoxWidth = ServerComboBox.Width / 10;
|
||||
RecordSize();
|
||||
|
||||
InitServer();
|
||||
ServerHelper.DelayTestHelper.UpdateInterval();
|
||||
@@ -75,8 +92,6 @@ namespace Netch.Forms
|
||||
// 隐藏 NatTypeStatusLabel
|
||||
NatTypeStatusText();
|
||||
|
||||
_configurationGroupBoxHeight = ConfigurationGroupBox.Height;
|
||||
_profileConfigurationHeight = ConfigurationGroupBox.Controls[0].Height / 3; // 因为 AutoSize, 所以得到的是Controls的总高度
|
||||
// 加载快速配置
|
||||
InitProfile();
|
||||
|
||||
@@ -98,27 +113,17 @@ namespace Netch.Forms
|
||||
await UpdateServersFromSubscribe(Global.Settings.UseProxyToUpdateSubscription);
|
||||
});
|
||||
}
|
||||
/// <summary>
|
||||
/// Init at <see cref="MainForm_Load" />
|
||||
/// </summary>
|
||||
private int _comboBoxNumberBoxWidth;
|
||||
|
||||
private void AddAddServerToolStripMenuItems()
|
||||
private void RecordSize()
|
||||
{
|
||||
foreach (var serversUtil in ServerHelper.ServerUtils.Where(i => !string.IsNullOrEmpty(i.FullName)))
|
||||
{
|
||||
var fullName = serversUtil.FullName;
|
||||
var control = new ToolStripMenuItem
|
||||
{
|
||||
Name = $"Add{fullName}ServerToolStripMenuItem",
|
||||
Size = new Size(259, 22),
|
||||
Text = i18N.TranslateFormat("Add [{0}] Server", fullName)
|
||||
};
|
||||
_mainFormText.Add(control.Name, new[] {"Add [{0}] Server", fullName});
|
||||
control.Click += AddServerToolStripMenuItem_Click;
|
||||
ServerToolStripMenuItem.DropDownItems.Add(control);
|
||||
}
|
||||
_numberBoxWidth = ServerComboBox.Width / 10;
|
||||
_numberBoxX = _numberBoxWidth * 9;
|
||||
_numberBoxWrap = _numberBoxWidth / 30;
|
||||
|
||||
_configurationGroupBoxHeight = ConfigurationGroupBox.Height;
|
||||
_profileConfigurationHeight = ConfigurationGroupBox.Controls[0].Height / 3; // 因为 AutoSize, 所以得到的是Controls的总高度
|
||||
}
|
||||
|
||||
private void InitText()
|
||||
{
|
||||
#region Record English
|
||||
@@ -1492,63 +1497,61 @@ namespace Netch.Forms
|
||||
|
||||
#endregion
|
||||
|
||||
#region ComboBox_DrawItem
|
||||
|
||||
private readonly SolidBrush _greenBrush = new(Color.FromArgb(50, 255, 56));
|
||||
private int _numberBoxWidth;
|
||||
private int _numberBoxX;
|
||||
private int _numberBoxWrap;
|
||||
|
||||
private void ComboBox_DrawItem(object sender, DrawItemEventArgs e)
|
||||
{
|
||||
try
|
||||
if (!(sender is ComboBox cbx))
|
||||
return;
|
||||
|
||||
// 绘制背景颜色
|
||||
e.Graphics.FillRectangle(Brushes.White, e.Bounds);
|
||||
|
||||
if (e.Index < 0) return;
|
||||
|
||||
// 绘制 备注/名称 字符串
|
||||
TextRenderer.DrawText(e.Graphics, cbx.Items[e.Index].ToString(), cbx.Font, e.Bounds, Color.Black, TextFormatFlags.Left);
|
||||
|
||||
switch (cbx.Items[e.Index])
|
||||
{
|
||||
if (!(sender is ComboBox cbx))
|
||||
return;
|
||||
|
||||
// 绘制背景颜色
|
||||
e.Graphics.FillRectangle(new SolidBrush(Color.White), e.Bounds);
|
||||
|
||||
if (e.Index < 0) return;
|
||||
|
||||
// 绘制 备注/名称 字符串
|
||||
e.Graphics.DrawString(cbx.Items[e.Index].ToString(), cbx.Font, new SolidBrush(Color.Black), e.Bounds);
|
||||
|
||||
switch (cbx.Items[e.Index])
|
||||
case Server item:
|
||||
{
|
||||
case Server item:
|
||||
// 计算延迟底色
|
||||
var numBoxBackBrush = item.Delay switch
|
||||
{
|
||||
// 计算延迟底色
|
||||
SolidBrush brush;
|
||||
if (item.Delay > 200)
|
||||
brush = new SolidBrush(Color.Red);
|
||||
else if (item.Delay > 80)
|
||||
brush = new SolidBrush(Color.Yellow);
|
||||
else if (item.Delay >= 0)
|
||||
brush = new SolidBrush(Color.FromArgb(50, 255, 56));
|
||||
else
|
||||
brush = new SolidBrush(Color.Gray);
|
||||
> 200 => Brushes.Red,
|
||||
> 80 => Brushes.Yellow,
|
||||
>= 0 => _greenBrush,
|
||||
_ => Brushes.Gray
|
||||
};
|
||||
|
||||
// 绘制延迟底色
|
||||
e.Graphics.FillRectangle(brush, _comboBoxNumberBoxWidth * 9, e.Bounds.Y, _comboBoxNumberBoxWidth, e.Bounds.Height);
|
||||
// 绘制延迟底色
|
||||
e.Graphics.FillRectangle(numBoxBackBrush, _numberBoxX, e.Bounds.Y, _numberBoxWidth, e.Bounds.Height);
|
||||
|
||||
// 绘制延迟字符串
|
||||
e.Graphics.DrawString(item.Delay.ToString(), cbx.Font, new SolidBrush(Color.Black),
|
||||
_comboBoxNumberBoxWidth * 9 + _comboBoxNumberBoxWidth / 30, e.Bounds.Y);
|
||||
break;
|
||||
}
|
||||
case Models.Mode item:
|
||||
{
|
||||
// 绘制 模式Box 底色
|
||||
e.Graphics.FillRectangle(new SolidBrush(Color.Gray), _comboBoxNumberBoxWidth * 9, e.Bounds.Y, _comboBoxNumberBoxWidth,
|
||||
e.Bounds.Height);
|
||||
|
||||
// 绘制 模式行数 字符串
|
||||
e.Graphics.DrawString(item.Rule.Count.ToString(), cbx.Font, new SolidBrush(Color.Black),
|
||||
_comboBoxNumberBoxWidth * 9 + _comboBoxNumberBoxWidth / 30, e.Bounds.Y);
|
||||
break;
|
||||
}
|
||||
// 绘制延迟字符串
|
||||
TextRenderer.DrawText(e.Graphics, item.Delay.ToString(), cbx.Font, new Point(_numberBoxX + _numberBoxWrap, e.Bounds.Y), Color.Black, TextFormatFlags.Left);
|
||||
break;
|
||||
}
|
||||
case Models.Mode item:
|
||||
{
|
||||
// 绘制 模式Box 底色
|
||||
e.Graphics.FillRectangle(Brushes.Gray, _numberBoxX, e.Bounds.Y, _numberBoxWidth,
|
||||
e.Bounds.Height);
|
||||
|
||||
// 绘制 模式行数 字符串
|
||||
TextRenderer.DrawText(e.Graphics, item.Rule.Count.ToString(), cbx.Font, new Point(_numberBoxX + _numberBoxWrap, e.Bounds.Y), Color.Black, TextFormatFlags.Left);
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// ignored
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -61,9 +61,7 @@ namespace Netch.Utils
|
||||
var reply = new Ping().Send(ip, timeout);
|
||||
|
||||
if (reply?.Status == IPStatus.Success)
|
||||
{
|
||||
return Convert.ToInt32(reply.RoundtripTime);
|
||||
}
|
||||
|
||||
return timeout;
|
||||
}
|
||||
@@ -71,9 +69,7 @@ namespace Netch.Utils
|
||||
public static string GetCityCode(string Hostname)
|
||||
{
|
||||
if (Hostname.Contains(":"))
|
||||
{
|
||||
Hostname = Hostname.Split(':')[0];
|
||||
}
|
||||
|
||||
string Country;
|
||||
try
|
||||
@@ -89,13 +85,9 @@ namespace Netch.Utils
|
||||
var DnsResult = DNS.Lookup(Hostname);
|
||||
|
||||
if (DnsResult != null)
|
||||
{
|
||||
Country = databaseReader.Country(DnsResult).Country.IsoCode;
|
||||
}
|
||||
else
|
||||
{
|
||||
Country = "Unknown";
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
@@ -138,7 +130,10 @@ namespace Netch.Utils
|
||||
}
|
||||
}
|
||||
|
||||
public static string GetFileVersion(string file) => File.Exists(file) ? FileVersionInfo.GetVersionInfo(file).FileVersion : string.Empty;
|
||||
public static string GetFileVersion(string file)
|
||||
{
|
||||
return File.Exists(file) ? FileVersionInfo.GetVersionInfo(file).FileVersion : string.Empty;
|
||||
}
|
||||
|
||||
public static bool SearchOutboundAdapter(bool logging = true)
|
||||
{
|
||||
@@ -195,19 +190,12 @@ namespace Netch.Utils
|
||||
{
|
||||
e.DrawBackground();
|
||||
|
||||
if (e.Index >= 0)
|
||||
{
|
||||
var brush = new SolidBrush(cbx.ForeColor);
|
||||
if (e.Index < 0)
|
||||
return;
|
||||
|
||||
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
|
||||
brush = SystemBrushes.HighlightText as SolidBrush;
|
||||
|
||||
e.Graphics.DrawString(cbx.Items[e.Index].ToString(), cbx.Font, brush, e.Bounds, new StringFormat
|
||||
{
|
||||
LineAlignment = StringAlignment.Center,
|
||||
Alignment = StringAlignment.Center
|
||||
});
|
||||
}
|
||||
TextRenderer.DrawText(e.Graphics, cbx.Items[e.Index].ToString(), cbx.Font, e.Bounds,
|
||||
(e.State & DrawItemState.Selected) == DrawItemState.Selected ? SystemColors.HighlightText : cbx.ForeColor,
|
||||
TextFormatFlags.HorizontalCenter);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -219,39 +207,29 @@ namespace Netch.Utils
|
||||
case ListView listView:
|
||||
// ListView sub item
|
||||
foreach (var item in listView.Columns.Cast<ColumnHeader>())
|
||||
{
|
||||
ComponentIterator(item, func);
|
||||
}
|
||||
|
||||
break;
|
||||
case ToolStripMenuItem toolStripMenuItem:
|
||||
// Iterator Menu strip sub item
|
||||
foreach (var item in toolStripMenuItem.DropDownItems.Cast<ToolStripItem>())
|
||||
{
|
||||
ComponentIterator(item, func);
|
||||
}
|
||||
|
||||
break;
|
||||
case MenuStrip menuStrip:
|
||||
// Menu Strip
|
||||
foreach (var item in menuStrip.Items.Cast<ToolStripItem>())
|
||||
{
|
||||
ComponentIterator(item, func);
|
||||
}
|
||||
|
||||
break;
|
||||
case ContextMenuStrip contextMenuStrip:
|
||||
foreach (var item in contextMenuStrip.Items.Cast<ToolStripItem>())
|
||||
{
|
||||
ComponentIterator(item, func);
|
||||
}
|
||||
|
||||
break;
|
||||
case Control control:
|
||||
foreach (var c in control.Controls.Cast<Control>())
|
||||
{
|
||||
ComponentIterator(c, func);
|
||||
}
|
||||
|
||||
if (control.ContextMenuStrip != null)
|
||||
ComponentIterator(control.ContextMenuStrip, func);
|
||||
|
||||
Reference in New Issue
Block a user