mirror of
https://github.com/kwsch/PKHeX.git
synced 2026-04-28 03:27:14 -05:00
Add search box to flag/work row search
This commit is contained in:
parent
b6eb0745a3
commit
553f154657
|
|
@ -87,10 +87,9 @@ private void LoadFlags(EventLabelCollectionSystem editor)
|
||||||
};
|
};
|
||||||
|
|
||||||
var panel = CreateBoolPanel($"TLP_F{group.Key}");
|
var panel = CreateBoolPanel($"TLP_F{group.Key}");
|
||||||
tab.Controls.Add(panel);
|
var rows = new List<(string Search, CheckBox Check, Label Label)>();
|
||||||
TC_Flags.TabPages.Add(tab);
|
TC_Flags.TabPages.Add(tab);
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
foreach (var (name, index, _) in group)
|
foreach (var (name, index, _) in group)
|
||||||
{
|
{
|
||||||
var lbl = new Label { Text = name, Margin = Padding.Empty, AutoSize = true };
|
var lbl = new Label { Text = name, Margin = Padding.Empty, AutoSize = true };
|
||||||
|
|
@ -108,12 +107,14 @@ private void LoadFlags(EventLabelCollectionSystem editor)
|
||||||
if (NUD_Flag.Value == index)
|
if (NUD_Flag.Value == index)
|
||||||
CHK_CustomFlag.Checked = chk.Checked;
|
CHK_CustomFlag.Checked = chk.Checked;
|
||||||
};
|
};
|
||||||
panel.Controls.Add(chk, 0, i);
|
rows.Add((name, chk, lbl));
|
||||||
panel.Controls.Add(lbl, 1, i);
|
|
||||||
|
|
||||||
FlagDict.Add(index, chk);
|
FlagDict.Add(index, chk);
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ApplyBoolFilter(panel, rows, string.Empty);
|
||||||
|
var search = CreateSearchBox(text => ApplyBoolFilter(panel, rows, text));
|
||||||
|
var host = CreateSearchHost(search, panel);
|
||||||
|
tab.Controls.Add(host);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -131,10 +132,9 @@ private void LoadSystem(EventLabelCollectionSystem editor)
|
||||||
};
|
};
|
||||||
|
|
||||||
var panel = CreateBoolPanel($"TLP_S{group.Key}");
|
var panel = CreateBoolPanel($"TLP_S{group.Key}");
|
||||||
tab.Controls.Add(panel);
|
var rows = new List<(string Search, CheckBox Check, Label Label)>();
|
||||||
TC_System.TabPages.Add(tab);
|
TC_System.TabPages.Add(tab);
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
foreach (var (name, index, _) in group)
|
foreach (var (name, index, _) in group)
|
||||||
{
|
{
|
||||||
var lbl = new Label { Text = name, Margin = Padding.Empty, AutoSize = true };
|
var lbl = new Label { Text = name, Margin = Padding.Empty, AutoSize = true };
|
||||||
|
|
@ -152,12 +152,14 @@ private void LoadSystem(EventLabelCollectionSystem editor)
|
||||||
if (NUD_System.Value == index)
|
if (NUD_System.Value == index)
|
||||||
CHK_CustomSystem.Checked = chk.Checked;
|
CHK_CustomSystem.Checked = chk.Checked;
|
||||||
};
|
};
|
||||||
panel.Controls.Add(chk, 0, i);
|
rows.Add((name, chk, lbl));
|
||||||
panel.Controls.Add(lbl, 1, i);
|
|
||||||
|
|
||||||
SystemDict.Add(index, chk);
|
SystemDict.Add(index, chk);
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ApplyBoolFilter(panel, rows, string.Empty);
|
||||||
|
var search = CreateSearchBox(text => ApplyBoolFilter(panel, rows, text));
|
||||||
|
var host = CreateSearchHost(search, panel);
|
||||||
|
tab.Controls.Add(host);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -175,10 +177,9 @@ private void LoadWork(EventLabelCollectionSystem editor)
|
||||||
};
|
};
|
||||||
|
|
||||||
var panel = CreateWorkPanel($"TLP_W{group.Key}");
|
var panel = CreateWorkPanel($"TLP_W{group.Key}");
|
||||||
tab.Controls.Add(panel);
|
var rows = new List<(string Search, Label Label, ComboBox Combo, NumericUpDown Numeric)>();
|
||||||
TC_Work.TabPages.Add(tab);
|
TC_Work.TabPages.Add(tab);
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
foreach (var entry in group)
|
foreach (var entry in group)
|
||||||
{
|
{
|
||||||
var lbl = new Label { Text = entry.Name, Margin = Padding.Empty, AutoSize = true };
|
var lbl = new Label { Text = entry.Name, Margin = Padding.Empty, AutoSize = true };
|
||||||
|
|
@ -235,14 +236,97 @@ void ChangeConstValue(object? sender, EventArgs e)
|
||||||
if (mtb.Value == 0)
|
if (mtb.Value == 0)
|
||||||
ChangeConstValue(this, EventArgs.Empty);
|
ChangeConstValue(this, EventArgs.Empty);
|
||||||
|
|
||||||
panel.Controls.Add(lbl, 0, i);
|
rows.Add((entry.Name, lbl, cb, mtb));
|
||||||
panel.Controls.Add(cb, 1, i);
|
|
||||||
panel.Controls.Add(mtb, 2, i);
|
|
||||||
|
|
||||||
WorkDict.Add(entry.Index, mtb);
|
WorkDict.Add(entry.Index, mtb);
|
||||||
i++;
|
}
|
||||||
|
|
||||||
|
ApplyWorkFilter(panel, rows, string.Empty);
|
||||||
|
var search = CreateSearchBox(text => ApplyWorkFilter(panel, rows, text));
|
||||||
|
var host = CreateSearchHost(search, panel);
|
||||||
|
tab.Controls.Add(host);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void ApplyBoolFilter(TableLayoutPanel panel, IReadOnlyList<(string Search, CheckBox Check, Label Label)> rows, string text)
|
||||||
|
{
|
||||||
|
var query = text.Trim();
|
||||||
|
var hasQuery = query.Length != 0;
|
||||||
|
|
||||||
|
panel.SuspendLayout();
|
||||||
|
panel.Controls.Clear();
|
||||||
|
var rowIndex = 0;
|
||||||
|
for (var i = 0; i < rows.Count; i++)
|
||||||
|
{
|
||||||
|
var row = rows[i];
|
||||||
|
if (hasQuery && !row.Search.Contains(query, StringComparison.CurrentCultureIgnoreCase))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
panel.Controls.Add(row.Check, 0, rowIndex);
|
||||||
|
panel.Controls.Add(row.Label, 1, rowIndex);
|
||||||
|
rowIndex++;
|
||||||
|
}
|
||||||
|
panel.ResumeLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ApplyWorkFilter(TableLayoutPanel panel, IReadOnlyList<(string Search, Label Label, ComboBox Combo, NumericUpDown Numeric)> rows, string text)
|
||||||
|
{
|
||||||
|
var query = text.Trim();
|
||||||
|
var hasQuery = query.Length != 0;
|
||||||
|
|
||||||
|
panel.SuspendLayout();
|
||||||
|
panel.Controls.Clear();
|
||||||
|
var rowIndex = 0;
|
||||||
|
for (var i = 0; i < rows.Count; i++)
|
||||||
|
{
|
||||||
|
var row = rows[i];
|
||||||
|
if (hasQuery && !row.Search.Contains(query, StringComparison.CurrentCultureIgnoreCase))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
panel.Controls.Add(row.Label, 0, rowIndex);
|
||||||
|
panel.Controls.Add(row.Combo, 1, rowIndex);
|
||||||
|
panel.Controls.Add(row.Numeric, 2, rowIndex);
|
||||||
|
rowIndex++;
|
||||||
|
}
|
||||||
|
panel.ResumeLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
private TextBox CreateSearchBox(Action<string> applyFilter)
|
||||||
|
{
|
||||||
|
var box = new TextBox
|
||||||
|
{
|
||||||
|
PlaceholderText = "Search...",
|
||||||
|
Dock = DockStyle.Top,
|
||||||
|
Margin = Padding.Empty,
|
||||||
|
};
|
||||||
|
if (Application.IsDarkModeEnabled)
|
||||||
|
WinFormsTranslator.ReformatDark(box);
|
||||||
|
|
||||||
|
var timer = new Timer { Interval = 150 };
|
||||||
|
timer.Tick += (_, _) =>
|
||||||
|
{
|
||||||
|
timer.Stop();
|
||||||
|
applyFilter(box.Text);
|
||||||
|
};
|
||||||
|
box.TextChanged += (_, _) =>
|
||||||
|
{
|
||||||
|
timer.Stop();
|
||||||
|
timer.Start();
|
||||||
|
};
|
||||||
|
box.Disposed += (_, _) => timer.Dispose();
|
||||||
|
return box;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Panel CreateSearchHost(TextBox search, Control content)
|
||||||
|
{
|
||||||
|
var host = new Panel
|
||||||
|
{
|
||||||
|
Dock = DockStyle.Fill,
|
||||||
|
Margin = Padding.Empty,
|
||||||
|
};
|
||||||
|
content.Dock = DockStyle.Fill;
|
||||||
|
host.Controls.Add(content);
|
||||||
|
host.Controls.Add(search);
|
||||||
|
return host;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static TableLayoutPanel CreateBoolPanel(string name)
|
private static TableLayoutPanel CreateBoolPanel(string name)
|
||||||
|
|
|
||||||
|
|
@ -97,10 +97,12 @@ private void AddFlagList(EventLabelCollection list, bool[] values)
|
||||||
Name = $"Tab_F{group.Key}",
|
Name = $"Tab_F{group.Key}",
|
||||||
Text = WinFormsTranslator.TranslateEnum(group.Key, Main.CurrentLanguage),
|
Text = WinFormsTranslator.TranslateEnum(group.Key, Main.CurrentLanguage),
|
||||||
};
|
};
|
||||||
TC_Flags.TabPages.Add(tab);
|
|
||||||
|
|
||||||
var grid = CreateFlagGrid();
|
var grid = CreateFlagGrid();
|
||||||
tab.Controls.Add(grid);
|
var search = CreateSearchBox(text => ApplyGridFilter(grid, text));
|
||||||
|
var host = CreateSearchHost(search, grid);
|
||||||
|
tab.Controls.Add(host);
|
||||||
|
TC_Flags.TabPages.Add(tab);
|
||||||
|
|
||||||
var cFlag = new DataGridViewCheckBoxColumn
|
var cFlag = new DataGridViewCheckBoxColumn
|
||||||
{
|
{
|
||||||
|
|
@ -137,6 +139,8 @@ private void AddFlagList(EventLabelCollection list, bool[] values)
|
||||||
cells[1].Value = name;
|
cells[1].Value = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ApplyGridFilter(grid, string.Empty);
|
||||||
|
|
||||||
grid.CellValueChanged += (_, e) =>
|
grid.CellValueChanged += (_, e) =>
|
||||||
{
|
{
|
||||||
if (e.ColumnIndex != 0 || e.RowIndex == -1)
|
if (e.ColumnIndex != 0 || e.RowIndex == -1)
|
||||||
|
|
@ -172,6 +176,25 @@ private void AddFlagList(EventLabelCollection list, bool[] values)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void ApplyGridFilter(DataGridView grid, string text)
|
||||||
|
{
|
||||||
|
var query = text.Trim();
|
||||||
|
var hasQuery = query.Length != 0;
|
||||||
|
foreach (DataGridViewRow row in grid.Rows)
|
||||||
|
{
|
||||||
|
if (row.Cells.Count < 2)
|
||||||
|
continue;
|
||||||
|
if (!hasQuery)
|
||||||
|
{
|
||||||
|
row.Visible = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var value = row.Cells[1].Value?.ToString() ?? string.Empty;
|
||||||
|
row.Visible = value.Contains(query, StringComparison.CurrentCultureIgnoreCase);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static DoubleBufferedDataGridView CreateFlagGrid() => new()
|
private static DoubleBufferedDataGridView CreateFlagGrid() => new()
|
||||||
{
|
{
|
||||||
AllowUserToAddRows = false,
|
AllowUserToAddRows = false,
|
||||||
|
|
@ -214,10 +237,10 @@ private void AddConstList(EventLabelCollection list, ushort[] values)
|
||||||
};
|
};
|
||||||
|
|
||||||
var panel = CreateConstPanel();
|
var panel = CreateConstPanel();
|
||||||
tab.Controls.Add(panel);
|
|
||||||
TC_Const.TabPages.Add(tab);
|
TC_Const.TabPages.Add(tab);
|
||||||
|
|
||||||
var grouped = group.ToList();
|
var grouped = group.ToList();
|
||||||
|
var rows = new List<(string Search, Label Label, ComboBox Combo, NumericUpDown Numeric)>(grouped.Count);
|
||||||
for (var i = 0; i < grouped.Count; i++)
|
for (var i = 0; i < grouped.Count; i++)
|
||||||
{
|
{
|
||||||
var entry = grouped[i];
|
var entry = grouped[i];
|
||||||
|
|
@ -276,15 +299,78 @@ void ChangeConstValue(object? sender, EventArgs e)
|
||||||
if (mtb.Value == 0)
|
if (mtb.Value == 0)
|
||||||
ChangeConstValue(this, EventArgs.Empty);
|
ChangeConstValue(this, EventArgs.Empty);
|
||||||
|
|
||||||
panel.Controls.Add(lbl, 0, i);
|
rows.Add((entry.Name, lbl, cb, mtb));
|
||||||
panel.Controls.Add(cb, 1, i);
|
|
||||||
panel.Controls.Add(mtb, 2, i);
|
|
||||||
|
|
||||||
WorkDict.Add(entry.Index, mtb);
|
WorkDict.Add(entry.Index, mtb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ApplyConstFilter(panel, rows, string.Empty);
|
||||||
|
var search = CreateSearchBox(text => ApplyConstFilter(panel, rows, text));
|
||||||
|
var host = CreateSearchHost(search, panel);
|
||||||
|
tab.Controls.Add(host);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void ApplyConstFilter(TableLayoutPanel panel, IReadOnlyList<(string Search, Label Label, ComboBox Combo, NumericUpDown Numeric)> rows, string text)
|
||||||
|
{
|
||||||
|
var query = text.Trim();
|
||||||
|
var hasQuery = query.Length != 0;
|
||||||
|
|
||||||
|
panel.SuspendLayout();
|
||||||
|
panel.Controls.Clear();
|
||||||
|
var rowIndex = 0;
|
||||||
|
for (var i = 0; i < rows.Count; i++)
|
||||||
|
{
|
||||||
|
var row = rows[i];
|
||||||
|
if (hasQuery && !row.Search.Contains(query, StringComparison.CurrentCultureIgnoreCase))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
panel.Controls.Add(row.Label, 0, rowIndex);
|
||||||
|
panel.Controls.Add(row.Combo, 1, rowIndex);
|
||||||
|
panel.Controls.Add(row.Numeric, 2, rowIndex);
|
||||||
|
rowIndex++;
|
||||||
|
}
|
||||||
|
panel.ResumeLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
private TextBox CreateSearchBox(Action<string> applyFilter)
|
||||||
|
{
|
||||||
|
var box = new TextBox
|
||||||
|
{
|
||||||
|
PlaceholderText = "Search...",
|
||||||
|
Dock = DockStyle.Top,
|
||||||
|
Margin = Padding.Empty,
|
||||||
|
};
|
||||||
|
if (Application.IsDarkModeEnabled)
|
||||||
|
WinFormsTranslator.ReformatDark(box);
|
||||||
|
|
||||||
|
var timer = new Timer { Interval = 150 };
|
||||||
|
timer.Tick += (_, _) =>
|
||||||
|
{
|
||||||
|
timer.Stop();
|
||||||
|
applyFilter(box.Text);
|
||||||
|
};
|
||||||
|
box.TextChanged += (_, _) =>
|
||||||
|
{
|
||||||
|
timer.Stop();
|
||||||
|
timer.Start();
|
||||||
|
};
|
||||||
|
box.Disposed += (_, _) => timer.Dispose();
|
||||||
|
return box;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Panel CreateSearchHost(TextBox search, Control content)
|
||||||
|
{
|
||||||
|
var host = new Panel
|
||||||
|
{
|
||||||
|
Dock = DockStyle.Fill,
|
||||||
|
Margin = Padding.Empty,
|
||||||
|
};
|
||||||
|
content.Dock = DockStyle.Fill;
|
||||||
|
host.Controls.Add(content);
|
||||||
|
host.Controls.Add(search);
|
||||||
|
return host;
|
||||||
|
}
|
||||||
|
|
||||||
private static TableLayoutPanel CreateConstPanel()
|
private static TableLayoutPanel CreateConstPanel()
|
||||||
{
|
{
|
||||||
var panel = new TableLayoutPanel
|
var panel = new TableLayoutPanel
|
||||||
|
|
|
||||||
|
|
@ -104,7 +104,9 @@ private void AddFlagList(EventLabelCollection list, bool[] values)
|
||||||
};
|
};
|
||||||
|
|
||||||
var grid = CreateFlagGrid();
|
var grid = CreateFlagGrid();
|
||||||
tab.Controls.Add(grid);
|
var search = CreateSearchBox(text => ApplyGridFilter(grid, text));
|
||||||
|
var host = CreateSearchHost(search, grid);
|
||||||
|
tab.Controls.Add(host);
|
||||||
TC_Flags.TabPages.Add(tab);
|
TC_Flags.TabPages.Add(tab);
|
||||||
|
|
||||||
var cFlag = new DataGridViewCheckBoxColumn
|
var cFlag = new DataGridViewCheckBoxColumn
|
||||||
|
|
@ -177,6 +179,25 @@ private void AddFlagList(EventLabelCollection list, bool[] values)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void ApplyGridFilter(DataGridView grid, string text)
|
||||||
|
{
|
||||||
|
var query = text.Trim();
|
||||||
|
var hasQuery = query.Length != 0;
|
||||||
|
foreach (DataGridViewRow row in grid.Rows)
|
||||||
|
{
|
||||||
|
if (row.Cells.Count < 2)
|
||||||
|
continue;
|
||||||
|
if (!hasQuery)
|
||||||
|
{
|
||||||
|
row.Visible = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var value = row.Cells[1].Value?.ToString() ?? string.Empty;
|
||||||
|
row.Visible = value.Contains(query, StringComparison.CurrentCultureIgnoreCase);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static DoubleBufferedDataGridView CreateFlagGrid() => new()
|
private static DoubleBufferedDataGridView CreateFlagGrid() => new()
|
||||||
{
|
{
|
||||||
AllowUserToAddRows = false,
|
AllowUserToAddRows = false,
|
||||||
|
|
@ -219,10 +240,10 @@ private void AddConstList(EventLabelCollection list, ReadOnlySpan<byte> values)
|
||||||
};
|
};
|
||||||
|
|
||||||
var panel = CreateConstPanel();
|
var panel = CreateConstPanel();
|
||||||
tab.Controls.Add(panel);
|
|
||||||
TC_Const.TabPages.Add(tab);
|
TC_Const.TabPages.Add(tab);
|
||||||
|
|
||||||
var grouped = group.ToList();
|
var grouped = group.ToList();
|
||||||
|
var rows = new List<(string Search, Label Label, ComboBox Combo, NumericUpDown Numeric)>(grouped.Count);
|
||||||
for (var i = 0; i < grouped.Count; i++)
|
for (var i = 0; i < grouped.Count; i++)
|
||||||
{
|
{
|
||||||
var entry = grouped[i];
|
var entry = grouped[i];
|
||||||
|
|
@ -280,15 +301,78 @@ void ChangeConstValue(object? sender, EventArgs e)
|
||||||
if (mtb.Value == 0)
|
if (mtb.Value == 0)
|
||||||
ChangeConstValue(this, EventArgs.Empty);
|
ChangeConstValue(this, EventArgs.Empty);
|
||||||
|
|
||||||
panel.Controls.Add(lbl, 0, i);
|
rows.Add((entry.Name, lbl, cb, mtb));
|
||||||
panel.Controls.Add(cb, 1, i);
|
|
||||||
panel.Controls.Add(mtb, 2, i);
|
|
||||||
|
|
||||||
WorkDict.Add(entry.Index, mtb);
|
WorkDict.Add(entry.Index, mtb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ApplyConstFilter(panel, rows, string.Empty);
|
||||||
|
var search = CreateSearchBox(text => ApplyConstFilter(panel, rows, text));
|
||||||
|
var host = CreateSearchHost(search, panel);
|
||||||
|
tab.Controls.Add(host);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void ApplyConstFilter(TableLayoutPanel panel, IReadOnlyList<(string Search, Label Label, ComboBox Combo, NumericUpDown Numeric)> rows, string text)
|
||||||
|
{
|
||||||
|
var query = text.Trim();
|
||||||
|
var hasQuery = query.Length != 0;
|
||||||
|
|
||||||
|
panel.SuspendLayout();
|
||||||
|
panel.Controls.Clear();
|
||||||
|
var rowIndex = 0;
|
||||||
|
for (var i = 0; i < rows.Count; i++)
|
||||||
|
{
|
||||||
|
var row = rows[i];
|
||||||
|
if (hasQuery && !row.Search.Contains(query, StringComparison.CurrentCultureIgnoreCase))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
panel.Controls.Add(row.Label, 0, rowIndex);
|
||||||
|
panel.Controls.Add(row.Combo, 1, rowIndex);
|
||||||
|
panel.Controls.Add(row.Numeric, 2, rowIndex);
|
||||||
|
rowIndex++;
|
||||||
|
}
|
||||||
|
panel.ResumeLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
private TextBox CreateSearchBox(Action<string> applyFilter)
|
||||||
|
{
|
||||||
|
var box = new TextBox
|
||||||
|
{
|
||||||
|
PlaceholderText = "Search...",
|
||||||
|
Dock = DockStyle.Top,
|
||||||
|
Margin = Padding.Empty,
|
||||||
|
};
|
||||||
|
if (Application.IsDarkModeEnabled)
|
||||||
|
WinFormsTranslator.ReformatDark(box);
|
||||||
|
|
||||||
|
var timer = new Timer { Interval = 150 };
|
||||||
|
timer.Tick += (_, _) =>
|
||||||
|
{
|
||||||
|
timer.Stop();
|
||||||
|
applyFilter(box.Text);
|
||||||
|
};
|
||||||
|
box.TextChanged += (_, _) =>
|
||||||
|
{
|
||||||
|
timer.Stop();
|
||||||
|
timer.Start();
|
||||||
|
};
|
||||||
|
box.Disposed += (_, _) => timer.Dispose();
|
||||||
|
return box;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Panel CreateSearchHost(TextBox search, Control content)
|
||||||
|
{
|
||||||
|
var host = new Panel
|
||||||
|
{
|
||||||
|
Dock = DockStyle.Fill,
|
||||||
|
Margin = Padding.Empty,
|
||||||
|
};
|
||||||
|
content.Dock = DockStyle.Fill;
|
||||||
|
host.Controls.Add(content);
|
||||||
|
host.Controls.Add(search);
|
||||||
|
return host;
|
||||||
|
}
|
||||||
|
|
||||||
private static TableLayoutPanel CreateConstPanel()
|
private static TableLayoutPanel CreateConstPanel()
|
||||||
{
|
{
|
||||||
var panel = new TableLayoutPanel
|
var panel = new TableLayoutPanel
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ private void LoadFlags(IEnumerable<EventVarGroup> editorFlag)
|
||||||
{
|
{
|
||||||
var tlp = new TableLayoutPanel { Dock = DockStyle.Fill, Name = $"TLP_F{g.Type}", AutoScroll = true };
|
var tlp = new TableLayoutPanel { Dock = DockStyle.Fill, Name = $"TLP_F{g.Type}", AutoScroll = true };
|
||||||
tlp.SuspendLayout();
|
tlp.SuspendLayout();
|
||||||
int i = 0;
|
var rows = new List<(string Search, CheckBox Check, Label Label)>();
|
||||||
foreach (var f in g.Vars.OfType<EventFlag>())
|
foreach (var f in g.Vars.OfType<EventFlag>())
|
||||||
{
|
{
|
||||||
var lbl = new Label
|
var lbl = new Label
|
||||||
|
|
@ -98,16 +98,17 @@ private void LoadFlags(IEnumerable<EventVarGroup> editorFlag)
|
||||||
};
|
};
|
||||||
lbl.Click += (_, _) => chk.Checked ^= true;
|
lbl.Click += (_, _) => chk.Checked ^= true;
|
||||||
chk.CheckedChanged += (_, _) => f.Flag = chk.Checked;
|
chk.CheckedChanged += (_, _) => f.Flag = chk.Checked;
|
||||||
tlp.Controls.Add(chk, 0, i);
|
rows.Add((f.Name, chk, lbl));
|
||||||
tlp.Controls.Add(lbl, 1, i);
|
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
|
ApplyBoolFilter(tlp, rows, string.Empty);
|
||||||
var tab = new TabPage
|
var tab = new TabPage
|
||||||
{
|
{
|
||||||
Name = $"Tab_F{g.Type}",
|
Name = $"Tab_F{g.Type}",
|
||||||
Text = WinFormsTranslator.TranslateEnum(g.Type, Main.CurrentLanguage),
|
Text = WinFormsTranslator.TranslateEnum(g.Type, Main.CurrentLanguage),
|
||||||
};
|
};
|
||||||
tab.Controls.Add(tlp);
|
var search = CreateSearchBox(text => ApplyBoolFilter(tlp, rows, text));
|
||||||
|
var host = CreateSearchHost(search, tlp);
|
||||||
|
tab.Controls.Add(host);
|
||||||
TC_Flag.Controls.Add(tab);
|
TC_Flag.Controls.Add(tab);
|
||||||
tlp.ResumeLayout();
|
tlp.ResumeLayout();
|
||||||
}
|
}
|
||||||
|
|
@ -119,7 +120,7 @@ private void LoadWork(IEnumerable<EventVarGroup> editorWork)
|
||||||
{
|
{
|
||||||
var tlp = new TableLayoutPanel { Dock = DockStyle.Fill, Name = $"TLP_W{g.Type}", AutoScroll = true };
|
var tlp = new TableLayoutPanel { Dock = DockStyle.Fill, Name = $"TLP_W{g.Type}", AutoScroll = true };
|
||||||
tlp.SuspendLayout();
|
tlp.SuspendLayout();
|
||||||
int i = 0;
|
var rows = new List<(string Search, Label Label, ComboBox Combo, NumericUpDown Numeric)>();
|
||||||
foreach (var f in g.Vars.OfType<EventWork<int>>())
|
foreach (var f in g.Vars.OfType<EventWork<int>>())
|
||||||
{
|
{
|
||||||
var lbl = new Label
|
var lbl = new Label
|
||||||
|
|
@ -182,9 +183,6 @@ private void LoadWork(IEnumerable<EventVarGroup> editorWork)
|
||||||
NUD_Stat.Text = value.ToString();
|
NUD_Stat.Text = value.ToString();
|
||||||
editing = false;
|
editing = false;
|
||||||
};
|
};
|
||||||
tlp.Controls.Add(lbl, 0, i);
|
|
||||||
tlp.Controls.Add(cb, 1, i);
|
|
||||||
tlp.Controls.Add(nud, 2, i);
|
|
||||||
{
|
{
|
||||||
var match = f.Options.FirstOrDefault(z => z.Value == f.Value);
|
var match = f.Options.FirstOrDefault(z => z.Value == f.Value);
|
||||||
if (match is not null)
|
if (match is not null)
|
||||||
|
|
@ -193,19 +191,104 @@ private void LoadWork(IEnumerable<EventVarGroup> editorWork)
|
||||||
nud.Enabled = false;
|
nud.Enabled = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
i++;
|
rows.Add((f.Name, lbl, cb, nud));
|
||||||
}
|
}
|
||||||
|
ApplyWorkFilter(tlp, rows, string.Empty);
|
||||||
var tab = new TabPage
|
var tab = new TabPage
|
||||||
{
|
{
|
||||||
Name = $"Tab_W{g.Type}",
|
Name = $"Tab_W{g.Type}",
|
||||||
Text = WinFormsTranslator.TranslateEnum(g.Type, Main.CurrentLanguage),
|
Text = WinFormsTranslator.TranslateEnum(g.Type, Main.CurrentLanguage),
|
||||||
};
|
};
|
||||||
tab.Controls.Add(tlp);
|
var search = CreateSearchBox(text => ApplyWorkFilter(tlp, rows, text));
|
||||||
|
var host = CreateSearchHost(search, tlp);
|
||||||
|
tab.Controls.Add(host);
|
||||||
TC_Work.Controls.Add(tab);
|
TC_Work.Controls.Add(tab);
|
||||||
tlp.ResumeLayout();
|
tlp.ResumeLayout();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void ApplyBoolFilter(TableLayoutPanel panel, IReadOnlyList<(string Search, CheckBox Check, Label Label)> rows, string text)
|
||||||
|
{
|
||||||
|
var query = text.Trim();
|
||||||
|
var hasQuery = query.Length != 0;
|
||||||
|
|
||||||
|
panel.SuspendLayout();
|
||||||
|
panel.Controls.Clear();
|
||||||
|
var rowIndex = 0;
|
||||||
|
for (var i = 0; i < rows.Count; i++)
|
||||||
|
{
|
||||||
|
var row = rows[i];
|
||||||
|
if (hasQuery && !row.Search.Contains(query, StringComparison.CurrentCultureIgnoreCase))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
panel.Controls.Add(row.Check, 0, rowIndex);
|
||||||
|
panel.Controls.Add(row.Label, 1, rowIndex);
|
||||||
|
rowIndex++;
|
||||||
|
}
|
||||||
|
panel.ResumeLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ApplyWorkFilter(TableLayoutPanel panel, IReadOnlyList<(string Search, Label Label, ComboBox Combo, NumericUpDown Numeric)> rows, string text)
|
||||||
|
{
|
||||||
|
var query = text.Trim();
|
||||||
|
var hasQuery = query.Length != 0;
|
||||||
|
|
||||||
|
panel.SuspendLayout();
|
||||||
|
panel.Controls.Clear();
|
||||||
|
var rowIndex = 0;
|
||||||
|
for (var i = 0; i < rows.Count; i++)
|
||||||
|
{
|
||||||
|
var row = rows[i];
|
||||||
|
if (hasQuery && !row.Search.Contains(query, StringComparison.CurrentCultureIgnoreCase))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
panel.Controls.Add(row.Label, 0, rowIndex);
|
||||||
|
panel.Controls.Add(row.Combo, 1, rowIndex);
|
||||||
|
panel.Controls.Add(row.Numeric, 2, rowIndex);
|
||||||
|
rowIndex++;
|
||||||
|
}
|
||||||
|
panel.ResumeLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
private TextBox CreateSearchBox(Action<string> applyFilter)
|
||||||
|
{
|
||||||
|
var box = new TextBox
|
||||||
|
{
|
||||||
|
PlaceholderText = "Search...",
|
||||||
|
Dock = DockStyle.Top,
|
||||||
|
Margin = Padding.Empty,
|
||||||
|
};
|
||||||
|
if (Application.IsDarkModeEnabled)
|
||||||
|
WinFormsTranslator.ReformatDark(box);
|
||||||
|
|
||||||
|
var timer = new Timer { Interval = 150 };
|
||||||
|
timer.Tick += (_, _) =>
|
||||||
|
{
|
||||||
|
timer.Stop();
|
||||||
|
applyFilter(box.Text);
|
||||||
|
};
|
||||||
|
box.TextChanged += (_, _) =>
|
||||||
|
{
|
||||||
|
timer.Stop();
|
||||||
|
timer.Start();
|
||||||
|
};
|
||||||
|
box.Disposed += (_, _) => timer.Dispose();
|
||||||
|
return box;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Panel CreateSearchHost(TextBox search, Control content)
|
||||||
|
{
|
||||||
|
var host = new Panel
|
||||||
|
{
|
||||||
|
Dock = DockStyle.Fill,
|
||||||
|
Margin = Padding.Empty,
|
||||||
|
};
|
||||||
|
content.Dock = DockStyle.Fill;
|
||||||
|
host.Controls.Add(content);
|
||||||
|
host.Controls.Add(search);
|
||||||
|
return host;
|
||||||
|
}
|
||||||
|
|
||||||
private const string flagTag = "bool_";
|
private const string flagTag = "bool_";
|
||||||
private const string constTag = "const_";
|
private const string constTag = "const_";
|
||||||
private const string constCBTag = "cbconst_";
|
private const string constCBTag = "cbconst_";
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user