fenrir-runtime 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/App/App.axaml +8 -0
- package/App/App.axaml.cs +23 -0
- package/App/FenrirLinux.csproj +27 -0
- package/App/LICENSE +674 -0
- package/App/MainWindow.axaml +10 -0
- package/App/MainWindow.axaml.cs +16 -0
- package/App/Program.cs +19 -0
- package/App/README.md +24 -0
- package/App/Views/InstallationView.axaml +48 -0
- package/App/Views/InstallationView.axaml.cs +204 -0
- package/App/Views/PasswordView.axaml +34 -0
- package/App/Views/PasswordView.axaml.cs +62 -0
- package/App/Views/WelcomeView.axaml +63 -0
- package/App/Views/WelcomeView.axaml.cs +22 -0
- package/App/app.manifest +18 -0
- package/App/images/screenshot1.png +0 -0
- package/App/images/screenshot2.png +0 -0
- package/App/obj/Debug/net9.0/Avalonia/Resources.Inputs.cache +1 -0
- package/App/obj/Debug/net9.0/Avalonia/original.dll +0 -0
- package/App/obj/Debug/net9.0/Avalonia/original.pdb +0 -0
- package/App/obj/Debug/net9.0/Avalonia/original.ref.dll +0 -0
- package/App/obj/Debug/net9.0/Avalonia/references +202 -0
- package/App/obj/Debug/net9.0/Avalonia/resources +0 -0
- package/App/obj/Debug/net9.0/FenrirLi.7B98506C.Up2Date +0 -0
- package/App/obj/Debug/net9.0/FenrirLinux.AssemblyInfo.cs +22 -0
- package/App/obj/Debug/net9.0/FenrirLinux.AssemblyInfoInputs.cache +1 -0
- package/App/obj/Debug/net9.0/FenrirLinux.GeneratedMSBuildEditorConfig.editorconfig +35 -0
- package/App/obj/Debug/net9.0/FenrirLinux.assets.cache +0 -0
- package/App/obj/Debug/net9.0/FenrirLinux.csproj.AssemblyReference.cache +0 -0
- package/App/obj/Debug/net9.0/FenrirLinux.csproj.CoreCompileInputs.cache +1 -0
- package/App/obj/Debug/net9.0/FenrirLinux.csproj.FileListAbsolute.txt +135 -0
- package/App/obj/Debug/net9.0/FenrirLinux.dll +0 -0
- package/App/obj/Debug/net9.0/FenrirLinux.genruntimeconfig.cache +1 -0
- package/App/obj/Debug/net9.0/FenrirLinux.pdb +0 -0
- package/App/obj/Debug/net9.0/apphost +0 -0
- package/App/obj/Debug/net9.0/ref/FenrirLinux.dll +0 -0
- package/App/obj/Debug/net9.0/refint/FenrirLinux.dll +0 -0
- package/App/obj/FenrirLinux.csproj.nuget.dgspec.json +115 -0
- package/App/obj/FenrirLinux.csproj.nuget.g.props +26 -0
- package/App/obj/FenrirLinux.csproj.nuget.g.targets +9 -0
- package/App/obj/Release/net9.0/linux-x64/Avalonia/Resources.Inputs.cache +1 -0
- package/App/obj/Release/net9.0/linux-x64/Avalonia/original.dll +0 -0
- package/App/obj/Release/net9.0/linux-x64/Avalonia/original.pdb +0 -0
- package/App/obj/Release/net9.0/linux-x64/Avalonia/original.ref.dll +0 -0
- package/App/obj/Release/net9.0/linux-x64/Avalonia/references +194 -0
- package/App/obj/Release/net9.0/linux-x64/Avalonia/resources +0 -0
- package/App/obj/Release/net9.0/linux-x64/FenrirLi.7B98506C.Up2Date +0 -0
- package/App/obj/Release/net9.0/linux-x64/FenrirLinux.AssemblyInfo.cs +22 -0
- package/App/obj/Release/net9.0/linux-x64/FenrirLinux.AssemblyInfoInputs.cache +1 -0
- package/App/obj/Release/net9.0/linux-x64/FenrirLinux.GeneratedMSBuildEditorConfig.editorconfig +39 -0
- package/App/obj/Release/net9.0/linux-x64/FenrirLinux.assets.cache +0 -0
- package/App/obj/Release/net9.0/linux-x64/FenrirLinux.csproj.AssemblyReference.cache +0 -0
- package/App/obj/Release/net9.0/linux-x64/FenrirLinux.csproj.CoreCompileInputs.cache +1 -0
- package/App/obj/Release/net9.0/linux-x64/FenrirLinux.csproj.FileListAbsolute.txt +238 -0
- package/App/obj/Release/net9.0/linux-x64/FenrirLinux.deps.json +1317 -0
- package/App/obj/Release/net9.0/linux-x64/FenrirLinux.dll +0 -0
- package/App/obj/Release/net9.0/linux-x64/FenrirLinux.genbundle.cache +1 -0
- package/App/obj/Release/net9.0/linux-x64/FenrirLinux.genpublishdeps.cache +1 -0
- package/App/obj/Release/net9.0/linux-x64/FenrirLinux.genruntimeconfig.cache +1 -0
- package/App/obj/Release/net9.0/linux-x64/FenrirLinux.pdb +0 -0
- package/App/obj/Release/net9.0/linux-x64/PublishOutputs.fac9e24064.txt +4 -0
- package/App/obj/Release/net9.0/linux-x64/apphost +0 -0
- package/App/obj/Release/net9.0/linux-x64/ref/FenrirLinux.dll +0 -0
- package/App/obj/Release/net9.0/linux-x64/refint/FenrirLinux.dll +0 -0
- package/App/obj/Release/net9.0/linux-x64/singlefilehost +0 -0
- package/App/obj/project.assets.json +2463 -0
- package/App/obj/project.nuget.cache +47 -0
- package/LICENSE +674 -0
- package/Makefile +16 -0
- package/README.md +89 -0
- package/dist/archiveSystem.js +219 -0
- package/dist/cli.js +188 -0
- package/dist/packageManager.js +98 -0
- package/dist/parser.js +24 -0
- package/dist/runtime.js +99 -0
- package/dist/transformer.js +120 -0
- package/example/fenrir+aperium/aperium.json +17 -0
- package/example/fenrir+aperium/aperium_modules/hello-world/index.js +4 -0
- package/example/fenrir+aperium/aperium_modules/hello-world/module.json +6 -0
- package/example/fenrir+aperium/app.fnr +19 -0
- package/example/fenrir+aperium/package-lock.json +890 -0
- package/example/fenrir+aperium/package.json +17 -0
- package/example/fenrir.json +10 -0
- package/example/main.fnr +18 -0
- package/example/package-lock.json +867 -0
- package/example/package.json +17 -0
- package/package.json +32 -0
- package/src/archiveSystem.ts +264 -0
- package/src/cli.ts +216 -0
- package/src/packageManager.ts +119 -0
- package/src/parser.ts +36 -0
- package/src/runtime.ts +111 -0
- package/src/transformer.ts +147 -0
- package/tsconfig.json +15 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<Window xmlns="https://github.com/avaloniaui"
|
|
2
|
+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
3
|
+
xmlns:views="clr-namespace:FenrirLinux.Views"
|
|
4
|
+
x:Class="FenrirLinux.MainWindow"
|
|
5
|
+
Title="Fenrir Runtime Setup Wizard"
|
|
6
|
+
Width="600" Height="400">
|
|
7
|
+
<Grid>
|
|
8
|
+
<views:WelcomeView />
|
|
9
|
+
</Grid>
|
|
10
|
+
</Window>
|
package/App/Program.cs
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
using Avalonia;
|
|
2
|
+
using Avalonia.ReactiveUI;
|
|
3
|
+
using System;
|
|
4
|
+
|
|
5
|
+
namespace FenrirLinux;
|
|
6
|
+
|
|
7
|
+
class Program
|
|
8
|
+
{
|
|
9
|
+
[STAThread]
|
|
10
|
+
public static void Main(string[] args) => BuildAvaloniaApp()
|
|
11
|
+
.StartWithClassicDesktopLifetime(args);
|
|
12
|
+
|
|
13
|
+
public static AppBuilder BuildAvaloniaApp()
|
|
14
|
+
=> AppBuilder.Configure<App>()
|
|
15
|
+
.UsePlatformDetect()
|
|
16
|
+
.WithInterFont()
|
|
17
|
+
.LogToTrace()
|
|
18
|
+
.UseReactiveUI();
|
|
19
|
+
}
|
package/App/README.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
|
|
3
|
+
## Fenrir Runtime Setup Wizard (Linux)
|
|
4
|
+
|
|
5
|
+
This is the setup wizard for the **Fenrir Runtime**, an application designed to simplify the installation of the Fenrir Runtime environment on Linux distributions.
|
|
6
|
+
|
|
7
|
+
### Purpose
|
|
8
|
+
|
|
9
|
+
This wizard's primary function is to **automate the installation process** for Fenrir. It handles several key steps that typically require manual terminal input:
|
|
10
|
+
|
|
11
|
+
1. **SUDO Password Handling:** It securely collects the user's `sudo` password using a graphic interface (Avalonia UI).
|
|
12
|
+
2. **Repository Cloning:** It automatically clones the Fenrir source code from the official Git repository to the user's home directory.
|
|
13
|
+
3. **Build Process:** It executes the necessary compilation commands, including `npm run build` and `make`, using elevated (sudo) privileges to correctly install the runtime environment.
|
|
14
|
+
4. **Status Logging:** It provides real-time logs and status updates on the installation progress to the user.
|
|
15
|
+
|
|
16
|
+
**The goal is to provide a fast, easy, and reliable way to install Fenrir without relying on command-line expertise.**
|
|
17
|
+
|
|
18
|
+
## Download the Application
|
|
19
|
+
Due to Github's 25mb limit, I have to provide you with the download link via Mediafire.
|
|
20
|
+
[Install Fenrir Runtime Installer](https://www.mediafire.com/file/elsyvsm3unhrfnj/Fenrir.zip/file)
|
|
21
|
+
|
|
22
|
+
## Images
|
|
23
|
+
<img src="images/screenshot1.png">
|
|
24
|
+
<img src="images/screenshot2.png">
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<UserControl xmlns="https://github.com/avaloniaui"
|
|
2
|
+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
3
|
+
x:Class="FenrirLinux.Views.InstallationView"
|
|
4
|
+
Background="#1e1e1e">
|
|
5
|
+
<Grid RowDefinitions="Auto,Auto,*,Auto" Margin="20">
|
|
6
|
+
<TextBlock Text="Installation in progress..."
|
|
7
|
+
FontSize="24" FontWeight="Bold"
|
|
8
|
+
HorizontalAlignment="Center"
|
|
9
|
+
Foreground="White"
|
|
10
|
+
Margin="0,0,0,20"/>
|
|
11
|
+
|
|
12
|
+
<ProgressBar Name="ProgressBar"
|
|
13
|
+
Grid.Row="1"
|
|
14
|
+
IsIndeterminate="True"
|
|
15
|
+
Height="10"
|
|
16
|
+
Margin="0,0,0,10"
|
|
17
|
+
Foreground="#4285F4"/>
|
|
18
|
+
|
|
19
|
+
<TextBlock Name="StatusText"
|
|
20
|
+
Grid.Row="1"
|
|
21
|
+
Text="It's starting..."
|
|
22
|
+
HorizontalAlignment="Center"
|
|
23
|
+
Foreground="White"
|
|
24
|
+
Margin="0,20,0,0"/>
|
|
25
|
+
|
|
26
|
+
<ScrollViewer Grid.Row="2"
|
|
27
|
+
VerticalScrollBarVisibility="Auto"
|
|
28
|
+
Background="#2b2b2b"
|
|
29
|
+
Margin="0,10,0,10"
|
|
30
|
+
BorderBrush="#444" BorderThickness="1">
|
|
31
|
+
<TextBlock Name="LogOutput"
|
|
32
|
+
Foreground="White"
|
|
33
|
+
FontFamily="Courier New"
|
|
34
|
+
Margin="10"
|
|
35
|
+
TextWrapping="Wrap"/>
|
|
36
|
+
</ScrollViewer>
|
|
37
|
+
|
|
38
|
+
<Button Content="Close"
|
|
39
|
+
Name="CloseButton"
|
|
40
|
+
Grid.Row="3"
|
|
41
|
+
HorizontalAlignment="Center"
|
|
42
|
+
Margin="0,20,0,0"
|
|
43
|
+
IsEnabled="False"
|
|
44
|
+
Foreground="White"
|
|
45
|
+
Background="#4285F4"
|
|
46
|
+
Padding="20,10"/>
|
|
47
|
+
</Grid>
|
|
48
|
+
</UserControl>
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
using Avalonia.Controls;
|
|
2
|
+
using Avalonia.Interactivity;
|
|
3
|
+
using System;
|
|
4
|
+
using System.Diagnostics;
|
|
5
|
+
using System.IO;
|
|
6
|
+
using System.Threading.Tasks;
|
|
7
|
+
|
|
8
|
+
namespace FenrirLinux.Views;
|
|
9
|
+
|
|
10
|
+
public partial class InstallationView : UserControl
|
|
11
|
+
{
|
|
12
|
+
private bool _isInstallationStarted = false;
|
|
13
|
+
private string? _sudoPassword;
|
|
14
|
+
|
|
15
|
+
public InstallationView()
|
|
16
|
+
{
|
|
17
|
+
InitializeComponent();
|
|
18
|
+
var closeButton = this.FindControl<Button>("CloseButton");
|
|
19
|
+
if (closeButton != null)
|
|
20
|
+
{
|
|
21
|
+
closeButton.Click += OnCloseButtonClick;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
this.Loaded += OnLoaded;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
private async void OnLoaded(object? sender, RoutedEventArgs e)
|
|
28
|
+
{
|
|
29
|
+
if (!_isInstallationStarted)
|
|
30
|
+
{
|
|
31
|
+
_isInstallationStarted = true;
|
|
32
|
+
await StartInstallationAsync();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
private async Task StartInstallationAsync()
|
|
37
|
+
{
|
|
38
|
+
Log("The setup wizard is starting...");
|
|
39
|
+
|
|
40
|
+
_sudoPassword = await GetSudoPasswordAsync();
|
|
41
|
+
if (string.IsNullOrEmpty(_sudoPassword))
|
|
42
|
+
{
|
|
43
|
+
Log("The sudo password was not entered or the operation was canceled. Installation has been stopped.");
|
|
44
|
+
UpdateStatus("Error: Installation Cancelled.");
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
var packageManager = GetPackageManager();
|
|
49
|
+
if (string.IsNullOrEmpty(packageManager))
|
|
50
|
+
{
|
|
51
|
+
Log("An unsupported Linux distribution was detected.");
|
|
52
|
+
UpdateStatus("Error: Unsupported distribution.");
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
UpdateStatus("Cloning Git repository...");
|
|
59
|
+
var homeDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
|
|
60
|
+
var repoUrl = "https://github.com/yigitkabak/Fenrir.git";
|
|
61
|
+
var projectPath = Path.Combine(homeDirectory, "Fenrir");
|
|
62
|
+
|
|
63
|
+
if (Directory.Exists(projectPath))
|
|
64
|
+
{
|
|
65
|
+
Log("The project folder already exists, so it is skipped.");
|
|
66
|
+
}
|
|
67
|
+
else
|
|
68
|
+
{
|
|
69
|
+
await RunCommandAsync($"git clone {repoUrl} {projectPath}");
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
UpdateStatus("Running npm commands...");
|
|
73
|
+
await RunSudoCommandAsync($"cd {projectPath} && npm run build");
|
|
74
|
+
|
|
75
|
+
UpdateStatus("Running make commands...");
|
|
76
|
+
await RunSudoCommandAsync($"cd {projectPath} && make");
|
|
77
|
+
|
|
78
|
+
UpdateStatus("Setup completed successfully!");
|
|
79
|
+
Log("Setup completed successfully!");
|
|
80
|
+
|
|
81
|
+
var progressBar = this.FindControl<ProgressBar>("ProgressBar");
|
|
82
|
+
if (progressBar != null)
|
|
83
|
+
{
|
|
84
|
+
progressBar.IsIndeterminate = false;
|
|
85
|
+
progressBar.Value = 100;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
var closeButton = this.FindControl<Button>("CloseButton");
|
|
89
|
+
if (closeButton != null)
|
|
90
|
+
{
|
|
91
|
+
closeButton.IsEnabled = true;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private async Task<string?> GetSudoPasswordAsync()
|
|
96
|
+
{
|
|
97
|
+
var passwordView = new PasswordView();
|
|
98
|
+
var passwordWindow = new Window
|
|
99
|
+
{
|
|
100
|
+
Title = "Password Required",
|
|
101
|
+
Content = passwordView,
|
|
102
|
+
Width = 350,
|
|
103
|
+
Height = 200,
|
|
104
|
+
CanResize = false
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
var passwordTask = passwordView.GetPasswordAsync();
|
|
108
|
+
|
|
109
|
+
passwordWindow.Show();
|
|
110
|
+
var password = await passwordTask;
|
|
111
|
+
passwordWindow.Close();
|
|
112
|
+
return password;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private string? GetPackageManager()
|
|
116
|
+
{
|
|
117
|
+
if (File.Exists("/etc/debian_version")) return "apt";
|
|
118
|
+
if (File.Exists("/etc/fedora-release")) return "dnf";
|
|
119
|
+
if (File.Exists("/etc/redhat-release")) return "yum";
|
|
120
|
+
if (File.Exists("/etc/arch-release")) return "pacman -S";
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
private void UpdateStatus(string status)
|
|
125
|
+
{
|
|
126
|
+
var statusText = this.FindControl<TextBlock>("StatusText");
|
|
127
|
+
if (statusText != null)
|
|
128
|
+
{
|
|
129
|
+
statusText.Text = status;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
private void Log(string message)
|
|
134
|
+
{
|
|
135
|
+
var logBox = this.FindControl<TextBlock>("LogOutput");
|
|
136
|
+
if (logBox != null)
|
|
137
|
+
{
|
|
138
|
+
logBox.Text += $"{message}\n";
|
|
139
|
+
((ScrollViewer?)logBox.Parent)?.InvalidateVisual();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
private async Task RunCommandAsync(string command)
|
|
144
|
+
{
|
|
145
|
+
Log($"Command is running: {command}");
|
|
146
|
+
await ExecuteProcessAsync("/bin/bash", $"-c \"{command}\"");
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
private async Task RunSudoCommandAsync(string command)
|
|
150
|
+
{
|
|
151
|
+
Log($"The sudo command is being executed.: {command}");
|
|
152
|
+
|
|
153
|
+
await ExecuteProcessAsync("/bin/bash", $"-c \"echo {_sudoPassword} | sudo -S bash -c \\\"{command}\\\"\"");
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
private async Task ExecuteProcessAsync(string fileName, string arguments)
|
|
157
|
+
{
|
|
158
|
+
var process = new Process
|
|
159
|
+
{
|
|
160
|
+
StartInfo = new ProcessStartInfo
|
|
161
|
+
{
|
|
162
|
+
FileName = fileName,
|
|
163
|
+
Arguments = arguments,
|
|
164
|
+
RedirectStandardOutput = true,
|
|
165
|
+
RedirectStandardError = true,
|
|
166
|
+
UseShellExecute = false,
|
|
167
|
+
CreateNoWindow = true
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
process.Start();
|
|
172
|
+
|
|
173
|
+
var outputReader = process.StandardOutput;
|
|
174
|
+
var errorReader = process.StandardError;
|
|
175
|
+
|
|
176
|
+
var outputTask = Task.Run(() =>
|
|
177
|
+
{
|
|
178
|
+
string? line;
|
|
179
|
+
while ((line = outputReader.ReadLine()) != null)
|
|
180
|
+
{
|
|
181
|
+
Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(() => Log(line));
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
var errorTask = Task.Run(() =>
|
|
186
|
+
{
|
|
187
|
+
string? line;
|
|
188
|
+
while ((line = errorReader.ReadLine()) != null)
|
|
189
|
+
{
|
|
190
|
+
Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(() => Log($"ERROR: {line}"));
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
await Task.WhenAll(outputTask, errorTask);
|
|
195
|
+
await process.WaitForExitAsync();
|
|
196
|
+
Log($"Command completed. Exit Code: {process.ExitCode}");
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
private void OnCloseButtonClick(object? sender, RoutedEventArgs e)
|
|
200
|
+
{
|
|
201
|
+
var window = (Window?)this.VisualRoot;
|
|
202
|
+
window?.Close();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<UserControl xmlns="https://github.com/avaloniaui"
|
|
2
|
+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
3
|
+
x:Class="FenrirLinux.Views.PasswordView"
|
|
4
|
+
Width="350" Height="200"
|
|
5
|
+
Background="#1e1e1e">
|
|
6
|
+
<Grid RowDefinitions="*,Auto,Auto,*" Margin="20">
|
|
7
|
+
<TextBlock Grid.Row="1"
|
|
8
|
+
Text="Enter your sudo password:"
|
|
9
|
+
FontSize="18"
|
|
10
|
+
FontWeight="Bold"
|
|
11
|
+
Foreground="White"
|
|
12
|
+
HorizontalAlignment="Center"
|
|
13
|
+
Margin="0,0,0,10"/>
|
|
14
|
+
|
|
15
|
+
<TextBox Name="PasswordTextBox"
|
|
16
|
+
Grid.Row="2"
|
|
17
|
+
Watermark="password"
|
|
18
|
+
PasswordChar="*"
|
|
19
|
+
Width="250"
|
|
20
|
+
HorizontalAlignment="Center"
|
|
21
|
+
Margin="0,0,0,20"/>
|
|
22
|
+
|
|
23
|
+
<StackPanel Grid.Row="3"
|
|
24
|
+
Orientation="Horizontal"
|
|
25
|
+
HorizontalAlignment="Center"
|
|
26
|
+
Margin="0,10,0,0">
|
|
27
|
+
<Button Content="Confirm"
|
|
28
|
+
Name="ConfirmButton"
|
|
29
|
+
Margin="0,0,10,0"/>
|
|
30
|
+
<Button Content="Cancel"
|
|
31
|
+
Name="CancelButton"/>
|
|
32
|
+
</StackPanel>
|
|
33
|
+
</Grid>
|
|
34
|
+
</UserControl>
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
using Avalonia.Controls;
|
|
2
|
+
using Avalonia.Input;
|
|
3
|
+
using Avalonia.Interactivity;
|
|
4
|
+
using System.Threading.Tasks;
|
|
5
|
+
|
|
6
|
+
namespace FenrirLinux.Views;
|
|
7
|
+
|
|
8
|
+
public partial class PasswordView : UserControl
|
|
9
|
+
{
|
|
10
|
+
private TaskCompletionSource<string?> _tcs = new TaskCompletionSource<string?>();
|
|
11
|
+
|
|
12
|
+
public PasswordView()
|
|
13
|
+
{
|
|
14
|
+
InitializeComponent();
|
|
15
|
+
|
|
16
|
+
var confirmButton = this.FindControl<Button>("ConfirmButton");
|
|
17
|
+
var cancelButton = this.FindControl<Button>("CancelButton");
|
|
18
|
+
var passwordTextBox = this.FindControl<TextBox>("PasswordTextBox");
|
|
19
|
+
|
|
20
|
+
confirmButton!.Click += OnConfirmClick;
|
|
21
|
+
cancelButton!.Click += OnCancelClick;
|
|
22
|
+
|
|
23
|
+
passwordTextBox!.KeyDown += OnPasswordTextBoxKeyDown;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public Task<string?> GetPasswordAsync()
|
|
27
|
+
{
|
|
28
|
+
return _tcs.Task;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private void OnPasswordTextBoxKeyDown(object? sender, KeyEventArgs e)
|
|
32
|
+
{
|
|
33
|
+
if (e.Key == Key.Enter)
|
|
34
|
+
{
|
|
35
|
+
OnConfirmClick(sender, e);
|
|
36
|
+
e.Handled = true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
private void OnConfirmClick(object? sender, RoutedEventArgs e)
|
|
41
|
+
{
|
|
42
|
+
var passwordBox = this.FindControl<TextBox>("PasswordTextBox");
|
|
43
|
+
try
|
|
44
|
+
{
|
|
45
|
+
_tcs.SetResult(passwordBox?.Text);
|
|
46
|
+
}
|
|
47
|
+
catch (System.InvalidOperationException)
|
|
48
|
+
{
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private void OnCancelClick(object? sender, RoutedEventArgs e)
|
|
53
|
+
{
|
|
54
|
+
try
|
|
55
|
+
{
|
|
56
|
+
_tcs.SetResult(null);
|
|
57
|
+
}
|
|
58
|
+
catch (System.InvalidOperationException)
|
|
59
|
+
{
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<UserControl xmlns="https://github.com/avaloniaui"
|
|
2
|
+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
3
|
+
x:Class="FenrirLinux.Views.WelcomeView"
|
|
4
|
+
Background="#2E2E2E">
|
|
5
|
+
|
|
6
|
+
<UserControl.Styles>
|
|
7
|
+
<Style Selector="Button.accent">
|
|
8
|
+
<Setter Property="Background" Value="#3584E4" />
|
|
9
|
+
<Setter Property="Foreground" Value="White" />
|
|
10
|
+
<Setter Property="FontSize" Value="16" />
|
|
11
|
+
<Setter Property="FontWeight" Value="SemiBold" />
|
|
12
|
+
<Setter Property="Padding" Value="20,12" />
|
|
13
|
+
<Setter Property="CornerRadius" Value="20" />
|
|
14
|
+
<Setter Property="HorizontalAlignment" Value="Center" />
|
|
15
|
+
<Setter Property="BorderThickness" Value="0" />
|
|
16
|
+
<Setter Property="Cursor" Value="Hand" />
|
|
17
|
+
<Setter Property="Transitions">
|
|
18
|
+
<Transitions>
|
|
19
|
+
<BrushTransition Property="Background" Duration="0.2" Easing="CubicEaseOut"/>
|
|
20
|
+
</Transitions>
|
|
21
|
+
</Setter>
|
|
22
|
+
</Style>
|
|
23
|
+
|
|
24
|
+
<Style Selector="Button.accent:pointerover">
|
|
25
|
+
<Setter Property="Background" Value="#4A90E2" />
|
|
26
|
+
</Style>
|
|
27
|
+
|
|
28
|
+
<Style Selector="Button.accent:pressed">
|
|
29
|
+
<Setter Property="Background" Value="#2A73C8" />
|
|
30
|
+
</Style>
|
|
31
|
+
</UserControl.Styles>
|
|
32
|
+
|
|
33
|
+
<StackPanel HorizontalAlignment="Center"
|
|
34
|
+
VerticalAlignment="Center"
|
|
35
|
+
Spacing="25"
|
|
36
|
+
MaxWidth="500">
|
|
37
|
+
|
|
38
|
+
<PathIcon Data="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M11,16.5L6.5,12L7.91,10.59L11,13.67L16.59,8.09L18,9.5L11,16.5Z"
|
|
39
|
+
Width="64"
|
|
40
|
+
Height="64"
|
|
41
|
+
Foreground="#3584E4"
|
|
42
|
+
HorizontalAlignment="Center"/>
|
|
43
|
+
|
|
44
|
+
<TextBlock Text="Welcome to the Setup Wizard"
|
|
45
|
+
FontSize="32"
|
|
46
|
+
FontWeight="Bold"
|
|
47
|
+
TextAlignment="Center"
|
|
48
|
+
Foreground="White"/>
|
|
49
|
+
|
|
50
|
+
<TextBlock Text="This wizard will help you install the Fenrir Runtime on your system quickly and easily."
|
|
51
|
+
TextWrapping="Wrap"
|
|
52
|
+
TextAlignment="Center"
|
|
53
|
+
FontSize="16"
|
|
54
|
+
Foreground="#CFCFCF"
|
|
55
|
+
Margin="10,0"/>
|
|
56
|
+
|
|
57
|
+
<Button Content="Start Setup"
|
|
58
|
+
Name="NextButton"
|
|
59
|
+
Classes="accent"
|
|
60
|
+
Margin="0,20,0,0"/>
|
|
61
|
+
|
|
62
|
+
</StackPanel>
|
|
63
|
+
</UserControl>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
using Avalonia.Controls;
|
|
2
|
+
using Avalonia.Interactivity;
|
|
3
|
+
|
|
4
|
+
namespace FenrirLinux.Views;
|
|
5
|
+
|
|
6
|
+
public partial class WelcomeView : UserControl
|
|
7
|
+
{
|
|
8
|
+
public WelcomeView()
|
|
9
|
+
{
|
|
10
|
+
InitializeComponent();
|
|
11
|
+
this.FindControl<Button>("NextButton").Click += OnNextButtonClick;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
private void OnNextButtonClick(object? sender, RoutedEventArgs e)
|
|
15
|
+
{
|
|
16
|
+
var mainWindow = (Window)this.VisualRoot;
|
|
17
|
+
if (mainWindow is MainWindow window)
|
|
18
|
+
{
|
|
19
|
+
window.NavigateToView(new InstallationView());
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
package/App/app.manifest
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
|
|
3
|
+
<!-- This manifest is used on Windows only.
|
|
4
|
+
Don't remove it as it might cause problems with window transparency and embedded controls.
|
|
5
|
+
For more details visit https://learn.microsoft.com/en-us/windows/win32/sbscs/application-manifests -->
|
|
6
|
+
<assemblyIdentity version="1.0.0.0" name="FenrirLinux.Desktop"/>
|
|
7
|
+
|
|
8
|
+
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
|
9
|
+
<application>
|
|
10
|
+
<!-- A list of the Windows versions that this application has been tested on
|
|
11
|
+
and is designed to work with. Uncomment the appropriate elements
|
|
12
|
+
and Windows will automatically select the most compatible environment. -->
|
|
13
|
+
|
|
14
|
+
<!-- Windows 10 -->
|
|
15
|
+
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
|
|
16
|
+
</application>
|
|
17
|
+
</compatibility>
|
|
18
|
+
</assembly>
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
b72c61317eeb155711df0c897d354f3a706a798f74aef276044a6a2e20055d95
|
|
Binary file
|
|
Binary file
|
|
Binary file
|