Skip to content

Commit 94d7580

Browse files
committed
refactor namespace
1 parent b519c0d commit 94d7580

148 files changed

Lines changed: 2039 additions & 2123 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/Lemon.ModuleNavigation.Avaloniaui/AssemblyInfo.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,4 @@
22

33
[assembly: XmlnsPrefix("https://github.com/NeverMorewd/Lemon.ModuleNavigation", "lm")]
44
[assembly: XmlnsDefinition("https://github.com/NeverMorewd/Lemon.ModuleNavigation", "Lemon.ModuleNavigation")]
5-
[assembly: XmlnsDefinition("https://github.com/NeverMorewd/Lemon.ModuleNavigation", "Lemon.ModuleNavigation.Avaloniaui")]
6-
[assembly: XmlnsDefinition("https://github.com/NeverMorewd/Lemon.ModuleNavigation", "Lemon.ModuleNavigation.Avaloniaui.Core")]
5+
[assembly: XmlnsDefinition("https://github.com/NeverMorewd/Lemon.ModuleNavigation", "Lemon.ModuleNavigation.Avaloniaui")]

src/Lemon.ModuleNavigation.Avaloniaui/Core/AvaModule{TView,TViewModel}.cs renamed to src/Lemon.ModuleNavigation.Avaloniaui/AvaModule{TView,TViewModel}.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
using Lemon.ModuleNavigation.Abstracts;
2-
using Lemon.ModuleNavigation.Core;
1+
using Lemon.ModuleNavigation.Abstractions;
32
using System.Diagnostics.CodeAnalysis;
43

5-
namespace Lemon.ModuleNavigation.Avaloniaui.Core;
4+
namespace Lemon.ModuleNavigation.Avaloniaui;
65

76
[Obsolete($"Use Module instead, they are equivalent.")]
87
public abstract class AvaModule<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TView,
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using Avalonia.Controls;
2+
using Avalonia.Controls.Templates;
3+
using Lemon.ModuleNavigation.Abstractions;
4+
using Lemon.ModuleNavigation.Core;
5+
using Microsoft.Extensions.DependencyInjection;
6+
using System.Collections.Concurrent;
7+
using System.Collections.ObjectModel;
8+
9+
namespace Lemon.ModuleNavigation.Avaloniaui;
10+
11+
public abstract class AvaloniauiRegion : IRegion
12+
{
13+
private readonly ConcurrentDictionary<string, IView> _viewCache = new();
14+
private readonly ConcurrentItem<(IView View, INavigationAware NavigationAware)> _current = new();
15+
16+
public AvaloniauiRegion()
17+
{
18+
RegionTemplate = CreateRegionDataTemplate();
19+
}
20+
21+
public abstract string Name { get; }
22+
public abstract ObservableCollection<NavigationContext> Contexts { get; }
23+
24+
public IDataTemplate? RegionTemplate { get; set; }
25+
26+
public abstract void Activate(NavigationContext target);
27+
public abstract void DeActivate(NavigationContext target);
28+
29+
private IDataTemplate CreateRegionDataTemplate()
30+
{
31+
return new FuncDataTemplate<NavigationContext>((context, np) =>
32+
{
33+
if (context == null)
34+
return null;
35+
36+
bool needNewView = context.RequestNew ||
37+
!_viewCache.TryGetValue(context.TargetViewName, out IView? view);
38+
39+
if (needNewView)
40+
{
41+
view = context.ServiceProvider.GetRequiredKeyedService<IView>(context.TargetViewName);
42+
var navigationAware = context.ServiceProvider.GetRequiredKeyedService<INavigationAware>(context.TargetViewName);
43+
44+
if (_current.TryTakeData(out var previousData))
45+
{
46+
previousData.NavigationAware.OnNavigatedFrom(context);
47+
}
48+
if (!navigationAware.IsNavigationTarget(context))
49+
return null;
50+
51+
view.DataContext = navigationAware;
52+
navigationAware.OnNavigatedTo(context);
53+
_current.SetData((view, navigationAware));
54+
_viewCache.TryAdd(context.TargetViewName, view);
55+
}
56+
else
57+
{
58+
view = _viewCache[context.TargetViewName];
59+
}
60+
61+
return view as Control;
62+
});
63+
}
64+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using Avalonia.Controls;
2+
using System.Collections.ObjectModel;
3+
using System.Collections.Specialized;
4+
5+
namespace Lemon.ModuleNavigation.Avaloniaui;
6+
7+
public class ContentRegion : AvaloniauiRegion
8+
{
9+
private readonly ContentControl _contentControl;
10+
public ContentRegion(ContentControl contentControl, string name) : base()
11+
{
12+
_contentControl = contentControl;
13+
_contentControl.ContentTemplate = RegionTemplate;
14+
Contexts = [];
15+
Contexts.CollectionChanged += ViewContents_CollectionChanged;
16+
Name = name;
17+
}
18+
19+
public override string Name
20+
{
21+
get;
22+
}
23+
public object? Content
24+
{
25+
get => _contentControl.Content;
26+
set
27+
{
28+
_contentControl.Content = value;
29+
}
30+
}
31+
public override ObservableCollection<NavigationContext> Contexts
32+
{
33+
get;
34+
}
35+
36+
public override void Activate(NavigationContext target)
37+
{
38+
if(Content is NavigationContext current)
39+
{
40+
if (target.TargetViewName == current.TargetViewName
41+
&& !target.RequestNew)
42+
{
43+
return;
44+
}
45+
}
46+
Content = target;
47+
}
48+
49+
public override void DeActivate(NavigationContext target)
50+
{
51+
Content = null;
52+
}
53+
private void ViewContents_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
54+
{
55+
if (e.Action == NotifyCollectionChangedAction.Add)
56+
{
57+
//
58+
}
59+
if (e.Action == NotifyCollectionChangedAction.Remove)
60+
{
61+
//
62+
}
63+
}
64+
}

src/Lemon.ModuleNavigation.Avaloniaui/Dialogs/DefaultDialogWindow.axaml renamed to src/Lemon.ModuleNavigation.Avaloniaui/DefaultDialogWindow.axaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
d:DesignHeight="450"
55
d:DesignWidth="800"
66
mc:Ignorable="d"
7-
x:Class="Lemon.ModuleNavigation.Avaloniaui.Dialogs.DefaultDialogWindow"
7+
x:Class="Lemon.ModuleNavigation.Avaloniaui.DefaultDialogWindow"
88
xmlns="https://github.com/avaloniaui"
99
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
1010
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

src/Lemon.ModuleNavigation.Avaloniaui/Dialogs/DefaultDialogWindow.axaml.cs renamed to src/Lemon.ModuleNavigation.Avaloniaui/DefaultDialogWindow.axaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using Avalonia.Controls;
22

3-
namespace Lemon.ModuleNavigation.Avaloniaui.Dialogs;
3+
namespace Lemon.ModuleNavigation.Avaloniaui;
44

55
public partial class DefaultDialogWindow : Window, IDialogWindow
66
{

src/Lemon.ModuleNavigation.Avaloniaui/Dialogs/DialogService.cs renamed to src/Lemon.ModuleNavigation.Avaloniaui/DialogService.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
using Avalonia;
22
using Avalonia.Controls.ApplicationLifetimes;
3-
using Lemon.ModuleNavigation.Abstracts;
4-
using Lemon.ModuleNavigation.Avaloniaui.Extensions;
3+
using Lemon.ModuleNavigation.Abstractions;
54
using Lemon.ModuleNavigation.Dialogs;
65
using Microsoft.Extensions.DependencyInjection;
76

8-
namespace Lemon.ModuleNavigation.Avaloniaui.Dialogs;
7+
namespace Lemon.ModuleNavigation.Avaloniaui;
98

109
public class DialogService : IDialogService
1110
{
Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
using Avalonia.Threading;
22

3-
namespace Lemon.ModuleNavigation.Avaloniaui.Extensions
3+
namespace Avalonia;
4+
5+
public static class AvaloniauiExtensions
46
{
5-
public static class AvaloniauiExtensions
7+
public static T WaitOnDispatcherFrame<T>(this Task<T> task)
68
{
7-
public static T WaitOnDispatcherFrame<T>(this Task<T> task)
9+
if (!task.IsCompleted)
810
{
9-
if (!task.IsCompleted)
10-
{
11-
var frame = new DispatcherFrame();
12-
task.ContinueWith(static (_, s) => ((DispatcherFrame)s!).Continue = false, frame);
13-
Dispatcher.UIThread.PushFrame(frame);
14-
}
15-
16-
return task.GetAwaiter().GetResult();
11+
var frame = new DispatcherFrame();
12+
task.ContinueWith(static (_, s) => ((DispatcherFrame)s!).Continue = false, frame);
13+
Dispatcher.UIThread.PushFrame(frame);
1714
}
15+
16+
return task.GetAwaiter().GetResult();
1817
}
1918
}
Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,22 @@
1-
using Lemon.ModuleNavigation.Abstracts;
2-
using Lemon.ModuleNavigation.Avaloniaui.Dialogs;
3-
using Microsoft.Extensions.DependencyInjection;
1+
using Lemon.ModuleNavigation.Abstractions;
2+
using Lemon.ModuleNavigation.Avaloniaui;
43

5-
namespace Lemon.ModuleNavigation.Avaloniaui.Extensions
4+
namespace Microsoft.Extensions.DependencyInjection;
5+
6+
public static class ServiceCollectionExtensions
67
{
7-
public static class ServiceCollectionExtensions
8+
public static IServiceCollection AddAvaNavigationSupport(this IServiceCollection serviceDescriptors)
89
{
9-
public static IServiceCollection AddAvaNavigationSupport(this IServiceCollection serviceDescriptors)
10-
{
11-
return serviceDescriptors
12-
.AddNavigationSupport()
13-
.AddSingleton(sp => sp.GetKeyedServices<IView>(typeof(IView)))
14-
.AddSingleton<IDialogService, DialogService>()
15-
.AddKeyedTransient<IDialogWindow, DefaultDialogWindow>(DefaultDialogWindow.Key);
16-
}
10+
return serviceDescriptors
11+
.AddNavigationSupport()
12+
.AddSingleton(sp => sp.GetKeyedServices<IView>(typeof(IView)))
13+
.AddSingleton<IDialogService, DialogService>()
14+
.AddKeyedTransient<IDialogWindow, DefaultDialogWindow>(DefaultDialogWindow.Key);
15+
}
1716

18-
public static IServiceCollection AddAvaDialogWindow<TDialogWindow>(this IServiceCollection serviceDescriptors, string windowKey)
19-
where TDialogWindow : class, IDialogWindow
20-
{
21-
return serviceDescriptors.AddKeyedTransient<IDialogWindow, TDialogWindow>(windowKey);
22-
}
17+
public static IServiceCollection AddAvaDialogWindow<TDialogWindow>(this IServiceCollection serviceDescriptors, string windowKey)
18+
where TDialogWindow : class, IDialogWindow
19+
{
20+
return serviceDescriptors.AddKeyedTransient<IDialogWindow, TDialogWindow>(windowKey);
2321
}
2422
}

src/Lemon.ModuleNavigation.Avaloniaui/Dialogs/IAvaDialogWindow.cs renamed to src/Lemon.ModuleNavigation.Avaloniaui/IDialogWindow.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using Avalonia.Controls;
2-
using Lemon.ModuleNavigation.Abstracts;
2+
using Lemon.ModuleNavigation.Abstractions;
33

4-
namespace Lemon.ModuleNavigation.Avaloniaui.Dialogs;
4+
namespace Lemon.ModuleNavigation.Avaloniaui;
55

66
public interface IDialogWindow : IDialogWindowBase
77
{

0 commit comments

Comments
 (0)