Skip to content

Commit 616ad5a

Browse files
committed
add a new feature: Favourite members
1 parent 3e00f64 commit 616ad5a

File tree

16 files changed

+231
-66
lines changed

16 files changed

+231
-66
lines changed

sources/RevitDBExplorer/Domain/DataModel/Members/Base/MemberOverride.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Linq.Expressions;
34
using Autodesk.Revit.DB;
45
using RevitDBExplorer.Domain.DataModel.Accessors;
@@ -39,5 +40,25 @@ public static IMemberOverride ByFunc<TReturnType>(Expression<Func<Document, TFor
3940
}
4041
};
4142
}
43+
44+
public static IMemberOverride ByFunc<TParam0Type, TReturnType>(Expression<Func<Document, TForType, TParam0Type, TReturnType>> getter, IEnumerable<TParam0Type> param_0_arguments)
45+
{
46+
var compiledGetter = getter.Compile();
47+
string syntax = getter.ToCeSharp();
48+
var uniqueId = getter.GetUniqueId();
49+
50+
var param_0_name = getter.Parameters[2].Name;
51+
52+
return new MemberOverride<TForType>()
53+
{
54+
UniqueId = uniqueId,
55+
MemberAccessorFactory = () =>
56+
{
57+
var accessor = new MemberAccessorByFuncUltra<TForType, TParam0Type, TReturnType>(compiledGetter, param_0_arguments, param_0_name);
58+
accessor.DefaultInvocation.Syntax = syntax;
59+
return accessor;
60+
}
61+
};
62+
}
4263
}
4364
}

sources/RevitDBExplorer/Domain/DataModel/MembersOverrides/Element/Element.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ internal class Element_Overrides : IHaveMembersOverrides
1111
{
1212
public IEnumerable<IMemberOverride> GetOverrides() =>
1313
[
14-
MemberOverride<Element>.ByFunc((document, element) => element.GetDependentElements(null)),
14+
MemberOverride<Element>.ByFunc((document, element) => element.GetDependentElements(null)),
1515
];
1616
}
1717
}

sources/RevitDBExplorer/Domain/DataModel/SnoopableItem.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using RevitDBExplorer.Domain.DataModel.ValueViewModels.Base;
88
using RevitDBExplorer.Domain.RevitDatabaseScripting;
99
using RevitDBExplorer.WPF;
10+
using RevitExplorer.Visualizations.DrawingVisuals;
1011

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

@@ -19,7 +20,7 @@ internal abstract class SnoopableItem : BaseViewModel, IAmSourceOfEverything, IC
1920
private readonly IValueViewModel itemValueViewModel;
2021

2122
public event Action ParentObjectChanged;
22-
public string AccessorName { get; private set; }
23+
2324
public virtual string Name { get; }
2425
public IValueViewModel ValueViewModel { get; private set; } = EmptyPresenter.Instance;
2526
public bool CanBeSnooped
@@ -33,6 +34,7 @@ public bool CanBeSnooped
3334
return false;
3435
}
3536
}
37+
public bool CanBeVisualized => (ValueViewModel as DefaultPresenter)?.CanBeVisualized == true;
3638
public virtual bool CanGenerateCode { get; }
3739

3840

@@ -69,9 +71,9 @@ private void Read(SnoopableContext context, object @object)
6971
{
7072
ValueViewModel = new ErrorPresenter(Labeler.GetLabelForException(valueAccessException));
7173
}
72-
OnPropertyChanged(nameof(ValueViewModel));
73-
OnPropertyChanged(nameof(AccessorName));
74+
OnPropertyChanged(nameof(ValueViewModel));
7475
OnPropertyChanged(nameof(CanBeSnooped));
76+
OnPropertyChanged(nameof(CanBeVisualized));
7577
}
7678
private void RaiseParentObjectChanged()
7779
{
@@ -92,6 +94,16 @@ IEnumerable<SnoopableObject> IAmSourceOfEverything.Snoop(UIApplication app)
9294
}
9395

9496

97+
public IEnumerable<DrawingVisual> GetVisualization()
98+
{
99+
if (ValueViewModel is DefaultPresenter defaultPresenter)
100+
{
101+
return defaultPresenter.GetVisualization(parent.Context, parent.Object);
102+
}
103+
return [];
104+
}
105+
106+
95107

96108
private bool isFrozen = false;
97109
private IList<SnoopableObject> frozenSnooopResult;
@@ -120,5 +132,9 @@ public string GenerateScript(TemplateInputsKind inputsKind)
120132

121133
return new MemberInvocationTemplateSelector().Evaluate(parent.Object.GetType(), invocation, TemplateCmdKind.Select, inputsKind);
122134
}
135+
public string GetUniqueId()
136+
{
137+
return accessor?.UniqueId;
138+
}
123139
}
124140
}

sources/RevitDBExplorer/Domain/DataModel/SnoopableMember.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System.Collections.Generic;
22
using System.Windows.Documents;
33
using RevitDBExplorer.Domain.DataModel.Members.Base;
4-
using RevitDBExplorer.Domain.DataModel.ValueViewModels;
54

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

@@ -17,7 +16,7 @@ internal sealed class SnoopableMember : SnoopableItem
1716
public override string Name => memberDescriptor.Name;
1817
public DocXml Documentation => memberDescriptor.Documentation;
1918
public override bool CanGenerateCode => memberDescriptor.Kind != MemberKind.None;
20-
public bool CanBeVisualized => (ValueViewModel as DefaultPresenter)?.ValueContainer?.CanBeVisualized == true;
19+
2120

2221

2322
public SnoopableMember(SnoopableObject parent, MemberDescriptor memberDescriptor) : base(parent, memberDescriptor.MemberAccessor)

sources/RevitDBExplorer/Domain/DataModel/ValueViewModels/DefaultPresenter.cs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using RevitDBExplorer.Domain.DataModel.ValueContainers.Base;
55
using RevitDBExplorer.Domain.DataModel.ValueViewModels.Base;
66
using RevitDBExplorer.WPF;
7+
using RevitExplorer.Visualizations.DrawingVisuals;
78

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

@@ -22,7 +23,7 @@ public IValueContainer ValueContainer
2223
{
2324
return valueContainer;
2425
}
25-
set
26+
private set
2627
{
2728
valueContainer = value;
2829
OnPropertyChanged();
@@ -41,28 +42,33 @@ public string Label
4142
}
4243
}
4344
public bool CanBeSnooped { get; private set; }
45+
public bool CanBeVisualized { get; private set; }
46+
public string ToolTip => ValueContainer?.ToolTip;
4447

4548

4649
public DefaultPresenter(IAccessorForDefaultPresenter accessor)
4750
{
4851
this.accessor = accessor;
4952
}
5053

54+
5155
public void Read(SnoopableContext context, object @object)
5256
{
5357
var result = accessor.Read(context, @object);
5458
ValueContainer = result.State;
5559
Label = result.Label;
5660
CanBeSnooped = result.CanBeSnooped;
61+
CanBeVisualized = result.CanBeVisualized;
5762
}
5863

5964
public IEnumerable<SnoopableObject> Snoop(SnoopableContext context, object @object)
60-
{
61-
if (accessor is IAccessorForDefaultPresenter snooper)
62-
{
63-
return snooper.Snoop(context, @object, valueContainer);
64-
}
65-
return Enumerable.Empty<SnoopableObject>();
65+
{
66+
return accessor.Snoop(context, @object, valueContainer) ?? [];
67+
}
68+
69+
public IEnumerable<DrawingVisual> GetVisualization(SnoopableContext context, object @object)
70+
{
71+
return accessor.GetVisualization(context, @object, valueContainer) ?? [];
6672
}
6773
}
6874
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
5+
using System.Text.Json;
6+
7+
// (c) Revit Database Explorer https://github.com/NeVeSpl/RevitDBExplorer/blob/main/license.md
8+
9+
namespace RevitDBExplorer.Domain
10+
{
11+
internal class FavoriteMembersManager
12+
{
13+
private static readonly string FilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "_RDBE_\\FavoriteMembers.json");
14+
private static List<FavoriteMemberDTO> favorites = new List<FavoriteMemberDTO>();
15+
private static HashSet<string> favoriteIds = new HashSet<string>()
16+
{
17+
"Element.get_Geometry(Options)",
18+
"Element.get_Parameters()",
19+
"Rebar.GetCenterlineCurves(Boolean,Boolean,Boolean,MultiplanarOption,Int32)",
20+
};
21+
22+
static FavoriteMembersManager()
23+
{
24+
Load();
25+
}
26+
27+
private static void Load()
28+
{
29+
if (File.Exists(FilePath))
30+
{
31+
string jsonString = File.ReadAllText(FilePath);
32+
favorites = JsonSerializer.Deserialize<List<FavoriteMemberDTO>>(jsonString);
33+
favoriteIds = new HashSet<string>(favorites.Select(x => x.Id));
34+
}
35+
}
36+
private static void Save()
37+
{
38+
Directory.CreateDirectory(Path.GetDirectoryName(FilePath));
39+
string jsonString = JsonSerializer.Serialize(favorites);
40+
File.WriteAllText(FilePath, jsonString);
41+
}
42+
43+
44+
public static bool IsFavorite(string id)
45+
{
46+
if (string.IsNullOrEmpty(id)) return false;
47+
return favoriteIds.Contains(id);
48+
}
49+
public static void AddFavorite(string id)
50+
{
51+
favorites.Add(new FavoriteMemberDTO { Id = id });
52+
favoriteIds.Add(id);
53+
Save();
54+
}
55+
public static void RemoveFavorite(string id)
56+
{
57+
favorites.RemoveAll(x => x.Id == id);
58+
favoriteIds.Remove(id);
59+
Save();
60+
}
61+
}
62+
63+
64+
internal class FavoriteMemberDTO : IEquatable<FavoriteMemberDTO>
65+
{
66+
public string Id { get; set; }
67+
68+
69+
public bool Equals(FavoriteMemberDTO other)
70+
{
71+
return Id == other.Id;
72+
}
73+
public override int GetHashCode()
74+
{
75+
return Id.GetHashCode();
76+
}
77+
}
78+
}

sources/RevitDBExplorer/Domain/RevitDatabaseQuery/Autocompletion/FavoritesManager.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace RevitDBExplorer.Domain.RevitDatabaseQuery.Autocompletion
1212
{
1313
internal class FavoritesManager
1414
{
15-
private static readonly string FilePath;
15+
private static readonly string FilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "_RDBE_\\FavoriteQueries.json");
1616
private static List<FavoriteQueryDTO> favoriteQueries = new List<FavoriteQueryDTO>()
1717
{
1818
new FavoriteQueryDTO() { Query = "t: ParameterElement", Description = "User defined parameters" }
@@ -33,9 +33,7 @@ public static List<FavoriteQueryDTO> FavoriteQueries
3333

3434

3535
static FavoritesManager()
36-
{
37-
var lad = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
38-
FilePath = Path.Combine(lad, "_RDBE_\\FavoriteQueries.json");
36+
{
3937
Load();
4038
}
4139

sources/RevitDBExplorer/MainWindow.xaml.cs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -264,14 +264,8 @@ private void UpdateRDV()
264264
drawingVisuals.AddRange(snoopableObjectTreeItem.Object.GetVisualization());
265265
}
266266
if (selectedItem is ListItemForMember listItemForMember)
267-
{
268-
var leftOne = listItemForMember[0];
269-
var righttOne = listItemForMember[1];
270-
271-
if (leftOne?.ValueViewModel is DefaultPresenter { ValueContainer: { } } presenter)
272-
{
273-
drawingVisuals.AddRange(presenter.ValueContainer.GetVisualization());
274-
}
267+
{
268+
drawingVisuals.AddRange(listItemForMember.GetVisualization());
275269
}
276270
}
277271

@@ -364,7 +358,7 @@ private void GlobalKeyboardHook_KeyDown(object sender, System.Windows.Forms.KeyE
364358
var snoopableObjectTreeItem = selectedItems.OfType<SnoopableObjectTreeItem>().FirstOrDefault();
365359
if (listItemForMember != null)
366360
{
367-
CHMService.OpenCHM(listItemForMember[0] ?? listItemForMember[1]);
361+
listItemForMember.OpenCHM();
368362
return;
369363
}
370364
if (snoopableObjectTreeItem != null)

sources/RevitDBExplorer/Resources/Templates/ListViewItem.xaml

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,12 @@
2929
<Setter.Value>
3030
<ControlTemplate TargetType="{x:Type ListViewItem}">
3131
<Border x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
32-
<GridViewRowPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
32+
<GridViewRowPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
3333
<GridViewRowPresenter.Resources>
3434
<Style TargetType="ContentPresenter">
35+
<Setter Property="Margin" Value="0"/>
3536
<Setter Property="VerticalAlignment" Value="Stretch"/>
36-
<Style.Triggers>
37-
<EventTrigger RoutedEvent="Loaded">
38-
<BeginStoryboard>
39-
<Storyboard >
40-
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="VerticalAlignment">
41-
<DiscreteObjectKeyFrame KeyTime="0:0:0">
42-
<DiscreteObjectKeyFrame.Value>
43-
<VerticalAlignment>Center</VerticalAlignment>
44-
</DiscreteObjectKeyFrame.Value>
45-
</DiscreteObjectKeyFrame>
46-
</ObjectAnimationUsingKeyFrames>
47-
</Storyboard>
48-
</BeginStoryboard>
49-
</EventTrigger>
50-
</Style.Triggers>
37+
5138
</Style>
5239
</GridViewRowPresenter.Resources>
5340
</GridViewRowPresenter>

sources/RevitDBExplorer/Resources/Themes/Dark.Colors.xaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@
101101
<SolidColorBrush x:Key="Query.BorderBrush" Color="{StaticResource Primary}"/>
102102

103103
<SolidColorBrush x:Key="List.Highlighted" Color="{StaticResource Error}"/>
104+
<SolidColorBrush x:Key="List.Favourite" Color="#B97C2F"/>
104105

105106
<SolidColorBrush x:Key="TabItem.Selected" Color="{StaticResource PrimaryLight}"/>
106107

0 commit comments

Comments
 (0)