1- using RevitDBExplorer . Domain . DataModel ;
1+ using System ;
2+ using System . Linq ;
3+ using System . Collections . ObjectModel ;
4+ using System . Windows ;
5+ using RevitDBExplorer . Domain . DataModel ;
26using RevitDBExplorer . UIComponents . Trees . Base ;
37using RevitDBExplorer . UIComponents . Trees . Base . Items ;
48using RevitDBExplorer . WPF ;
@@ -9,47 +13,82 @@ namespace RevitDBExplorer.UIComponents.Trees.Utility
913{
1014 internal class UtilityTreeViewModel : BaseTreeViewModel
1115 {
12- private static UtilityGroupTreeItem rootItem ;
16+ private static ObservableCollection < SnoopableObject > cache = new ObservableCollection < SnoopableObject > ( ) ;
17+ public static event EventHandler < RemoveItemsEventArgs > RemoveItemsEvent ;
18+ public static event EventHandler < AddObjectEventArgs > AddObjectEvent ;
19+ public static event EventHandler < MoveItemEventArgs > MoveItemEvent ;
20+
21+ private UtilityGroupTreeItem rootItem ;
1322
1423 public RelayCommand RemoveCommand { get ; }
1524
1625
1726 public UtilityTreeViewModel ( )
1827 {
1928 AllowToFrezeeItem = true ;
20- rootItem ?? = new UtilityGroupTreeItem ( TreeItemsCommands ) { IsExpanded = true } ;
29+ rootItem = new UtilityGroupTreeItem ( TreeItemsCommands , cache ) { IsExpanded = true } ;
2130 TreeItems . Add ( rootItem ) ;
2231 RemoveCommand = new RelayCommand ( RemoveItems ) ;
32+
33+ WeakEventManager < UtilityTreeViewModel , RemoveItemsEventArgs > . AddHandler ( null , nameof ( UtilityTreeViewModel . RemoveItemsEvent ) , RemoveItemsEventHandler ) ;
34+ WeakEventManager < UtilityTreeViewModel , AddObjectEventArgs > . AddHandler ( null , nameof ( UtilityTreeViewModel . AddObjectEvent ) , AddObjectEventHandler ) ;
35+ WeakEventManager < UtilityTreeViewModel , MoveItemEventArgs > . AddHandler ( null , nameof ( UtilityTreeViewModel . MoveItemEvent ) , MoveItemEventHandler ) ;
2336 }
2437
2538
39+ public void AddObject ( SnoopableObject inputObject )
40+ {
41+ var objectCopy = new SnoopableObject ( inputObject . Context . Document , inputObject . Object ) ;
42+ cache . Add ( objectCopy ) ;
43+ AddObjectEvent ? . Invoke ( null , new AddObjectEventArgs ( objectCopy ) ) ;
44+ }
45+ private void AddObjectEventHandler ( object sender , AddObjectEventArgs evntArgs )
46+ {
47+ var vm = new SnoopableObjectTreeItem ( evntArgs . Object , TreeItemsCommands ) ;
48+ rootItem . Items . Add ( vm ) ;
49+ }
50+
2651 private void RemoveItems ( object item )
2752 {
2853 if ( item is SnoopableObjectTreeItem snoopableObjectTreeItem )
2954 {
30- rootItem . Items . Remove ( snoopableObjectTreeItem ) ;
55+ var index = cache . IndexOf ( snoopableObjectTreeItem . Object ) ;
56+ cache . Remove ( snoopableObjectTreeItem . Object ) ;
57+ RemoveItemsEvent ? . Invoke ( null , new RemoveItemsEventArgs ( index ) ) ;
3158 }
3259 else
33- {
34- if ( SelectedItem != null )
35- {
36- SelectedItem . IsSelected = false ;
37- }
38- rootItem . Items . Clear ( ) ;
39- }
60+ {
61+ cache . Clear ( ) ;
62+ RemoveItemsEvent ? . Invoke ( null , new RemoveItemsEventArgs ( null ) ) ;
63+ }
4064 }
41- public void AddObject ( SnoopableObject inputObject )
65+ private void RemoveItemsEventHandler ( object sender , RemoveItemsEventArgs evntArgs )
4266 {
43- var objectCopy = new SnoopableObject ( inputObject . Context . Document , inputObject . Object ) ;
44- var vmCopy = new SnoopableObjectTreeItem ( objectCopy , TreeItemsCommands ) ;
45- rootItem . Items . Add ( vmCopy ) ;
67+ if ( evntArgs . Index is not null )
68+ {
69+ rootItem . Items . RemoveAt ( evntArgs . Index . Value ) ;
70+ }
71+ else
72+ {
73+ rootItem . Items . Clear ( ) ;
74+ }
4675 }
76+
4777 public void MoveItem ( SnoopableObjectTreeItem item , SnoopableObjectTreeItem target )
4878 {
49- var oldIndex = rootItem . Items . IndexOf ( item ) ;
50- var newIndex = rootItem . Items . IndexOf ( target ) ;
79+ var o1 = item . Object ;
80+ var o2 = target . Object ;
81+
82+ var oldIndex = cache . IndexOf ( o1 ) ;
83+ var newIndex = cache . IndexOf ( o2 ) ;
5184
52- rootItem . Items . Move ( oldIndex , newIndex ) ;
85+ cache . Move ( oldIndex , newIndex ) ;
86+
87+ MoveItemEvent ? . Invoke ( null , new MoveItemEventArgs ( oldIndex , newIndex ) ) ;
88+ }
89+ private void MoveItemEventHandler ( object sender , MoveItemEventArgs evntArgs )
90+ {
91+ rootItem . Items . Move ( evntArgs . OldIndex , evntArgs . NewIndex ) ;
5392 }
5493
5594
@@ -69,5 +108,37 @@ void RemoveSelection(TreeItem item)
69108 }
70109 }
71110 }
111+
112+
113+ internal class RemoveItemsEventArgs : EventArgs
114+ {
115+ public int ? Index { get ; }
116+
117+ public RemoveItemsEventArgs ( int ? index )
118+ {
119+ Index = index ;
120+ }
121+ }
122+ internal class AddObjectEventArgs : EventArgs
123+ {
124+ public SnoopableObject Object { get ; }
125+
126+ public AddObjectEventArgs ( SnoopableObject @object )
127+ {
128+ Object = @object ;
129+ }
130+ }
131+ internal class MoveItemEventArgs : EventArgs
132+ {
133+ public int OldIndex { get ; }
134+ public int NewIndex { get ; }
135+
136+
137+ public MoveItemEventArgs ( int item , int target )
138+ {
139+ OldIndex = item ;
140+ NewIndex = target ;
141+ }
142+ }
72143 }
73144}
0 commit comments