Skip to content

Commit ad2e69a

Browse files
committed
a new way of synchronizing pinned objects for comparison
1 parent 7f551d0 commit ad2e69a

File tree

3 files changed

+95
-38
lines changed

3 files changed

+95
-38
lines changed

sources/RevitDBExplorer/MainWindow.xaml.cs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
using RevitDBExplorer.UIComponents.List.ViewModels;
2323
using RevitDBExplorer.UIComponents.QueryEditor;
2424
using RevitDBExplorer.UIComponents.QueryVisualization;
25-
using RevitDBExplorer.UIComponents.Trees.Base;
2625
using RevitDBExplorer.UIComponents.Trees.Base.Items;
2726
using RevitDBExplorer.UIComponents.Workspaces;
2827
using RevitDBExplorer.Utils;
@@ -214,24 +213,12 @@ private void SnoopEvents_Click(object sender, RoutedEventArgs e)
214213
private void Workspaces_SelectedItemChanged(SelectedItemChangedEventArgs obj)
215214
{
216215
UpdateRDV();
217-
}
218-
private async void Tree_SelectedItemChanged(TreeSelectedItemChangedEventArgs eventArgs)
219-
{
220-
if ((!IsActive && IsLoaded) || ignoreEvents)
221-
return;
222-
223-
224-
225-
226216
}
227-
bool ignoreEvents = false;
228217
void IAmWindowOpener.Open(SourceOfObjects sourceOfObjects)
229218
{
230-
ignoreEvents = true;
231219
var window = new MainWindow(sourceOfObjects);
232220
window.Owner = this;
233-
window.Show();
234-
ignoreEvents = false;
221+
window.Show();
235222
}
236223
private async void TryQueryDatabase(string query)
237224
{
Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
1-
using System;
2-
using System.Collections.Generic;
1+
using System.Collections.Generic;
2+
using System.Collections.ObjectModel;
33
using System.Linq;
4-
using System.Text;
5-
using System.Threading.Tasks;
4+
using RevitDBExplorer.Domain.DataModel;
65

76
// (c) Revit Database Explorer https://github.com/NeVeSpl/RevitDBExplorer/blob/main/license.md
87

98
namespace RevitDBExplorer.UIComponents.Trees.Base.Items
109
{
1110
internal class UtilityGroupTreeItem : TreeItem
1211
{
13-
public UtilityGroupTreeItem(TreeItemsCommands commands) : base(commands)
12+
public UtilityGroupTreeItem(TreeItemsCommands commands, IEnumerable<SnoopableObject> snoopableObjects) : base(commands)
1413
{
15-
Items = new System.Collections.ObjectModel.ObservableCollection<TreeItem>();
14+
Items = new ObservableCollection<TreeItem>(snoopableObjects.Select(x => new SnoopableObjectTreeItem(x, commands)));
1615
}
1716
}
1817
}
Lines changed: 89 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
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;
26
using RevitDBExplorer.UIComponents.Trees.Base;
37
using RevitDBExplorer.UIComponents.Trees.Base.Items;
48
using 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

Comments
 (0)