Skip to content

Commit 208d9c4

Browse files
authored
Add search box and sort button to AITriggersWindow
1 parent 3fb4cac commit 208d9c4

File tree

6 files changed

+107
-19
lines changed

6 files changed

+107
-19
lines changed

src/TSMapEditor/Config/Default/UI/Windows/AITriggersWindow.ini

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,16 @@ $CC03=btnNew:EditorButton
1212
$CC04=btnDelete:EditorButton
1313
$CC05=btnClone:EditorButton
1414
$CC06=ddActions:XNADropDown
15-
$CC07=lbAITriggers:EditorListBox
16-
$CC08=lblSelectedAITrigger:XNALabel
17-
$CC09=tbName:EditorTextBox
18-
$CC10=lblName:XNALabel
19-
$CC11=ddSide:XNADropDown
20-
$CC12=lblSide:XNALabel
21-
$CC13=ddHouseType:XNADropDown
22-
$CC14=lblHouse:XNALabel
15+
$CC07=tbFilter:EditorSuggestionTextBox
16+
$CC08=btnSortOptions:SortButton
17+
$CC09=lbAITriggers:EditorListBox
18+
$CC10=lblSelectedAITrigger:XNALabel
19+
$CC11=tbName:EditorTextBox
20+
$CC12=lblName:XNALabel
21+
$CC13=ddSide:XNADropDown
22+
$CC14=lblSide:XNALabel
23+
$CC15=ddHouseType:XNADropDown
24+
$CC16=lblHouse:XNALabel
2325
$CCline1=panelLine1:XNAPanel
2426
$CCc1=lblConditionHeader:XNALabel
2527
$CCc2=ddConditionType:XNADropDown
@@ -97,9 +99,20 @@ $X=getX(lblAITriggers)
9799
$Y=getBottom(btnClone) + VERTICAL_SPACING
98100
$Width=getWidth(btnNew)
99101

100-
[lbAITriggers]
102+
[tbFilter]
101103
$X=getX(lblAITriggers)
102104
$Y=getBottom(ddActions) + VERTICAL_SPACING
105+
$Width=getWidth(btnNew) - BUTTON_HEIGHT
106+
$Height=BUTTON_HEIGHT
107+
$Suggestion=translate(Search AI trigger...)
108+
109+
[btnSortOptions]
110+
$X=getRight(tbFilter)
111+
$Y=getY(tbFilter)
112+
113+
[lbAITriggers]
114+
$X=getX(lblAITriggers)
115+
$Y=getBottom(tbFilter)
103116
$Width=getWidth(btnNew)
104117
$Height=450
105118

src/TSMapEditor/UI/Windows/AITriggersWindow.cs

Lines changed: 79 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,21 @@
22
using Rampastring.XNAUI;
33
using Rampastring.XNAUI.XNAControls;
44
using System;
5+
using System.Collections.Generic;
6+
using System.Linq;
57
using TSMapEditor.Models;
68
using TSMapEditor.UI.Controls;
79

810
namespace TSMapEditor.UI.Windows
911
{
12+
public enum AITriggerSortMode
13+
{
14+
ID,
15+
Name,
16+
Color,
17+
ColorThenName,
18+
}
19+
1020
public class TeamTypeEventArgs : EventArgs
1121
{
1222
public TeamTypeEventArgs(TeamType teamType)
@@ -29,6 +39,7 @@ public AITriggersWindow(WindowManager windowManager, Map map) : base(windowManag
2939
public event EventHandler<TeamTypeEventArgs> TeamTypeOpened;
3040

3141
private EditorListBox lbAITriggers;
42+
private EditorSuggestionTextBox tbFilter;
3243
private XNADropDown ddActions;
3344
private EditorTextBox tbName;
3445
private XNADropDown ddSide;
@@ -51,6 +62,20 @@ public AITriggersWindow(WindowManager windowManager, Map map) : base(windowManag
5162

5263
private AITriggerType editedAITrigger;
5364

65+
private AITriggerSortMode _aiTriggerSortMode;
66+
private AITriggerSortMode AiTriggerSortMode
67+
{
68+
get => _aiTriggerSortMode;
69+
set
70+
{
71+
if (value != _aiTriggerSortMode)
72+
{
73+
_aiTriggerSortMode = value;
74+
}
75+
ListAITriggers();
76+
}
77+
}
78+
5479
public override void Initialize()
5580
{
5681
Name = nameof(AITriggersWindow);
@@ -74,6 +99,9 @@ public override void Initialize()
7499
chkEnabledOnMedium = FindChild<XNACheckBox>(nameof(chkEnabledOnMedium));
75100
chkEnabledOnHard = FindChild<XNACheckBox>(nameof(chkEnabledOnHard));
76101

102+
tbFilter = FindChild<EditorSuggestionTextBox>(nameof(tbFilter));
103+
tbFilter.TextChanged += TbFilter_TextChanged;
104+
77105
FindChild<EditorButton>("btnNew").LeftClick += BtnNew_LeftClick;
78106
FindChild<EditorButton>("btnDelete").LeftClick += BtnDelete_LeftClick;
79107
FindChild<EditorButton>("btnClone").LeftClick += BtnClone_LeftClick;
@@ -94,7 +122,18 @@ public override void Initialize()
94122
ddActions.AddItem(Translate(this, "Actions.Advanced", "Advanced..."));
95123
ddActions.AddItem(new XNADropDownItem() { Text = Translate(this, "Actions.CloneForEasierDiffs", "Clone for Easier Difficulties"), Tag = new Action(CloneForEasierDifficulties) });
96124
ddActions.SelectedIndex = 0;
97-
ddActions.SelectedIndexChanged += DdActions_SelectedIndexChanged;
125+
ddActions.SelectedIndexChanged += DdActions_SelectedIndexChanged;
126+
127+
var sortContextMenu = new EditorContextMenu(WindowManager);
128+
sortContextMenu.Name = nameof(sortContextMenu);
129+
sortContextMenu.Width = lbAITriggers.Width;
130+
sortContextMenu.AddItem(Translate(this, "SortByID", "Sort by ID"), () => AiTriggerSortMode = AITriggerSortMode.ID);
131+
sortContextMenu.AddItem(Translate(this, "SortByName", "Sort by Name"), () => AiTriggerSortMode = AITriggerSortMode.Name);
132+
sortContextMenu.AddItem(Translate(this, "SortByColor", "Sort by Color"), () => AiTriggerSortMode = AITriggerSortMode.Color);
133+
sortContextMenu.AddItem(Translate(this, "SortByColorName", "Sort by Color, then by Name"), () => AiTriggerSortMode = AITriggerSortMode.ColorThenName);
134+
AddChild(sortContextMenu);
135+
136+
FindChild<EditorButton>("btnSortOptions").LeftClick += (s, e) => sortContextMenu.Open(GetCursorPoint());
98137

99138
lbAITriggers.SelectedIndexChanged += LbAITriggers_SelectedIndexChanged;
100139
}
@@ -393,6 +432,8 @@ private void EditAITrigger(AITriggerType aiTriggerType)
393432
chkEnabledOnHard.CheckedChanged += ChkEnabledOnHard_CheckedChanged;
394433
}
395434

435+
private void TbFilter_TextChanged(object sender, EventArgs e) => ListAITriggers();
436+
396437
private void TbName_TextChanged(object sender, EventArgs e)
397438
{
398439
editedAITrigger.Name = tbName.Text;
@@ -485,10 +526,44 @@ private void ListAITriggers()
485526
ddSide.Items.Clear();
486527
ddHouseType.Items.Clear();
487528

488-
map.AITriggerTypes.ForEach(aitt =>
529+
IEnumerable<AITriggerType> sortedAITriggers = map.AITriggerTypes;
530+
531+
var shouldViewTop = false; // when filtering the scroll bar should update so we use a flag here
532+
if (tbFilter.Text != string.Empty && tbFilter.Text != tbFilter.Suggestion)
533+
{
534+
sortedAITriggers = sortedAITriggers.Where(sortedAITrigger => sortedAITrigger.Name.Contains(tbFilter.Text, StringComparison.CurrentCultureIgnoreCase));
535+
shouldViewTop = true;
536+
}
537+
538+
switch (AiTriggerSortMode)
489539
{
490-
lbAITriggers.AddItem(new XNAListBoxItem() { Text = aitt.Name, Tag = aitt, TextColor = GetAITriggerUIColor(aitt) });
491-
});
540+
case AITriggerSortMode.Color:
541+
sortedAITriggers = sortedAITriggers.OrderBy(aiTrigger => GetAITriggerUIColor(aiTrigger).ToString()).ThenBy(aiTrigger => aiTrigger.ININame);
542+
break;
543+
case AITriggerSortMode.Name:
544+
sortedAITriggers = sortedAITriggers.OrderBy(aiTrigger => aiTrigger.Name).ThenBy(aiTrigger => aiTrigger.ININame);
545+
break;
546+
case AITriggerSortMode.ColorThenName:
547+
sortedAITriggers = sortedAITriggers.OrderBy(aiTrigger => GetAITriggerUIColor(aiTrigger).ToString()).ThenBy(aiTrigger => aiTrigger.Name);
548+
break;
549+
case AITriggerSortMode.ID:
550+
default:
551+
sortedAITriggers = sortedAITriggers.OrderBy(aiTrigger => aiTrigger.ININame);
552+
break;
553+
}
554+
555+
foreach (AITriggerType aiTriggerType in sortedAITriggers)
556+
{
557+
lbAITriggers.AddItem(new XNAListBoxItem()
558+
{
559+
Text = aiTriggerType.Name,
560+
Tag = aiTriggerType,
561+
TextColor = GetAITriggerUIColor(aiTriggerType)
562+
});
563+
}
564+
565+
if (shouldViewTop)
566+
lbAITriggers.TopIndex = 0;
492567

493568
ddSide.AddItem("0 all sides");
494569
for (int i = 0; i < map.Rules.Sides.Count; i++)

src/TSMapEditor/UI/Windows/ScriptsWindow.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ private ScriptSortMode ScriptSortMode
7676
{
7777
if (value != _scriptSortMode)
7878
{
79-
_scriptSortMode = value;
80-
ListScripts();
79+
_scriptSortMode = value;
8180
}
81+
ListScripts();
8282
}
8383
}
8484

src/TSMapEditor/UI/Windows/TaskforcesWindow.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ private TaskForceSortMode TaskForceSortMode
5555
if (value != _taskForceSortMode)
5656
{
5757
_taskForceSortMode = value;
58-
ListTaskForces();
5958
}
59+
ListTaskForces();
6060
}
6161
}
6262

src/TSMapEditor/UI/Windows/TeamTypesWindow.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ private TeamTypeSortMode TeamTypeSortMode
8383
{
8484
if (value != _teamTypeSortMode)
8585
{
86-
_teamTypeSortMode = value;
87-
ListTeamTypes();
86+
_teamTypeSortMode = value;
8887
}
88+
ListTeamTypes();
8989
}
9090
}
9191

src/TSMapEditor/UI/Windows/TriggersWindow.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,8 @@ private TriggerSortMode TriggerSortMode
127127
if (value != _triggerSortMode)
128128
{
129129
_triggerSortMode = value;
130-
ListTriggers();
131130
}
131+
ListTriggers();
132132
}
133133
}
134134

0 commit comments

Comments
 (0)