Skip to content

Commit 88a4a97

Browse files
authored
feat: integrate the tray app with RPC (#19)
- Modularizes the tray window to use multiple Pages for the three different states: signed out, disconnected from RPC, normal - Adds the two new aforementioned pages - Adds a CredentialManager service for storing credentials in Windows Credential Manager - Adds a RpcController service for managing the connection to the backend service and reporting state changes to the ViewModel - Switches to using separate ViewModels in the Views - Switches to using Dependency Injection for instantiating Views, ViewModels and Services - Integrates the tray window into the new RpcController on Start/Stop interactions. Workspace agent updates will be handled in a separate PR Relates to #5 (I will do agent updates immediately after this)
1 parent 4c6d2bd commit 88a4a97

Some content is hidden

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

51 files changed

+1677
-454
lines changed

.idea/.idea.Coder.Desktop/.idea/codeStyles/Project.xml

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/.idea.Coder.Desktop/.idea/codeStyles/codeStyleConfig.xml

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

App/App.csproj

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
<Nullable>enable</Nullable>
1313
<EnableMsixTooling>true</EnableMsixTooling>
1414
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
15+
<!-- To use CommunityToolkit.Mvvm.ComponentModel.ObservablePropertyAttribute: -->
16+
<LangVersion>preview</LangVersion>
1517
</PropertyGroup>
1618

1719
<ItemGroup>
@@ -37,22 +39,11 @@
3739
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
3840
</PackageReference>
3941
<PackageReference Include="H.NotifyIcon.WinUI" Version="2.2.0" />
42+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.1" />
4043
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.1742" />
4144
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.6.250108002" />
4245
</ItemGroup>
4346

44-
<ItemGroup>
45-
<Page Update="TrayIcon.xaml">
46-
<Generator>MSBuild:Compile</Generator>
47-
</Page>
48-
</ItemGroup>
49-
50-
<ItemGroup>
51-
<Page Update="HorizontalRule.xaml">
52-
<Generator>MSBuild:Compile</Generator>
53-
</Page>
54-
</ItemGroup>
55-
5647
<!--
5748
Defining the "Msix" ProjectCapability here allows the Single-project MSIX Packaging
5849
Tools extension to be activated for this project even if the Windows App SDK Nuget
@@ -61,6 +52,11 @@
6152
<ItemGroup Condition="'$(DisableMsixProjectCapabilityAddedByProject)'!='true' and '$(EnableMsixTooling)'=='true'">
6253
<ProjectCapability Include="Msix" />
6354
</ItemGroup>
55+
<ItemGroup>
56+
<ProjectReference Include="..\CoderSdk\CoderSdk.csproj" />
57+
<ProjectReference Include="..\Vpn.Proto\Vpn.Proto.csproj" />
58+
<ProjectReference Include="..\Vpn\Vpn.csproj" />
59+
</ItemGroup>
6460

6561
<!--
6662
Defining the "HasPackageAndPublishMenuAddedByProject" property here allows the Solution

App/App.xaml.cs

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,55 @@
1+
using System;
2+
using System.Diagnostics;
3+
using Coder.Desktop.App.Services;
4+
using Coder.Desktop.App.ViewModels;
5+
using Coder.Desktop.App.Views;
6+
using Coder.Desktop.App.Views.Pages;
7+
using Microsoft.Extensions.DependencyInjection;
18
using Microsoft.UI.Xaml;
29

310
namespace Coder.Desktop.App;
411

512
public partial class App : Application
613
{
7-
private TrayWindow? TrayWindow;
14+
private readonly IServiceProvider _services;
15+
private TrayWindow? _trayWindow;
16+
private readonly bool _handleClosedEvents = true;
817

918
public App()
1019
{
20+
var services = new ServiceCollection();
21+
services.AddSingleton<ICredentialManager, CredentialManager>();
22+
services.AddSingleton<IRpcController, RpcController>();
23+
24+
services.AddTransient<TrayWindowDisconnectedViewModel>();
25+
services.AddTransient<TrayWindowDisconnectedPage>();
26+
services.AddTransient<TrayWindowLoginRequiredViewModel>();
27+
services.AddTransient<TrayWindowLoginRequiredPage>();
28+
services.AddTransient<TrayWindowLoginRequiredViewModel>();
29+
services.AddTransient<TrayWindowLoginRequiredPage>();
30+
services.AddTransient<TrayWindowViewModel>();
31+
services.AddTransient<TrayWindowMainPage>();
32+
services.AddTransient<TrayWindow>();
33+
34+
_services = services.BuildServiceProvider();
35+
36+
#if DEBUG
37+
UnhandledException += (_, e) => { Debug.WriteLine(e.Exception.ToString()); };
38+
#endif
39+
1140
InitializeComponent();
1241
}
1342

14-
private bool HandleClosedEvents { get; } = true;
15-
1643
protected override void OnLaunched(LaunchActivatedEventArgs args)
1744
{
18-
TrayWindow = new TrayWindow();
19-
TrayWindow.Closed += (sender, args) =>
45+
_trayWindow = _services.GetRequiredService<TrayWindow>();
46+
_trayWindow.Closed += (sender, args) =>
2047
{
2148
// TODO: wire up HandleClosedEvents properly
22-
if (HandleClosedEvents)
49+
if (_handleClosedEvents)
2350
{
2451
args.Handled = true;
25-
TrayWindow.AppWindow.Hide();
52+
_trayWindow.AppWindow.Hide();
2653
}
2754
};
2855
}

App/HorizontalRule.xaml renamed to App/Controls/HorizontalRule.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22

33
<UserControl
4-
x:Class="Coder.Desktop.App.HorizontalRule"
4+
x:Class="Coder.Desktop.App.Controls.HorizontalRule"
55
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
66
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
77
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

App/HorizontalRule.xaml.cs renamed to App/Controls/HorizontalRule.xaml.cs

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

3-
namespace Coder.Desktop.App;
3+
namespace Coder.Desktop.App.Controls;
44

55
public sealed partial class HorizontalRule : UserControl
66
{

App/TrayIcon.xaml renamed to App/Controls/TrayIcon.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22

33
<UserControl
4-
x:Class="Coder.Desktop.App.TrayIcon"
4+
x:Class="Coder.Desktop.App.Controls.TrayIcon"
55
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
66
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
77
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

App/TrayIcon.xaml.cs renamed to App/Controls/TrayIcon.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
using Microsoft.UI.Xaml.Controls;
77
using Microsoft.UI.Xaml.Media.Imaging;
88

9-
namespace Coder.Desktop.App;
9+
namespace Coder.Desktop.App.Controls;
1010

1111
[DependencyProperty<ICommand>("OpenCommand")]
1212
[DependencyProperty<ICommand>("ExitCommand")]
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System;
2+
using Windows.UI;
3+
using Coder.Desktop.App.ViewModels;
4+
using Microsoft.UI.Xaml.Data;
5+
using Microsoft.UI.Xaml.Media;
6+
7+
namespace Coder.Desktop.App.Converters;
8+
9+
public class AgentStatusToColorConverter : IValueConverter
10+
{
11+
private static readonly SolidColorBrush Green = new(Color.FromArgb(255, 52, 199, 89));
12+
private static readonly SolidColorBrush Red = new(Color.FromArgb(255, 255, 59, 48));
13+
private static readonly SolidColorBrush Gray = new(Color.FromArgb(255, 142, 142, 147));
14+
15+
public object Convert(object value, Type targetType, object parameter, string language)
16+
{
17+
if (value is not AgentConnectionStatus status) return Gray;
18+
19+
return status switch
20+
{
21+
AgentConnectionStatus.Green => Green,
22+
AgentConnectionStatus.Red => Red,
23+
_ => Gray,
24+
};
25+
}
26+
27+
public object ConvertBack(object value, Type targetType, object parameter, string language)
28+
{
29+
throw new NotImplementedException();
30+
}
31+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
using DependencyPropertyGenerator;
3+
using Microsoft.UI.Xaml;
4+
using Microsoft.UI.Xaml.Data;
5+
6+
namespace Coder.Desktop.App.Converters;
7+
8+
[DependencyProperty<object>("TrueValue", DefaultValue = true)]
9+
[DependencyProperty<object>("FalseValue", DefaultValue = true)]
10+
public partial class BoolToObjectConverter : DependencyObject, IValueConverter
11+
{
12+
public object Convert(object value, Type targetType, object parameter, string language)
13+
{
14+
return value is true ? TrueValue : FalseValue;
15+
}
16+
17+
public object ConvertBack(object value, Type targetType, object parameter, string language)
18+
{
19+
throw new NotImplementedException();
20+
}
21+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy