22using Rampastring . XNAUI ;
33using Rampastring . XNAUI . XNAControls ;
44using System ;
5+ using System . Collections . Generic ;
6+ using System . Linq ;
57using TSMapEditor . Models ;
68using TSMapEditor . UI . Controls ;
79
810namespace 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 ++ )
0 commit comments