Skip to content

Commit e5f08d2

Browse files
committed
Feature: Add about window
1 parent f63a82b commit e5f08d2

File tree

5 files changed

+226
-42
lines changed

5 files changed

+226
-42
lines changed

Avalonia.CpuLimiter/ViewModels/MainWindowViewModel.cs

Lines changed: 69 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
using Avalonia.Interactivity;
2-
using Microsoft.Extensions.DependencyInjection;
1+
using Microsoft.Extensions.DependencyInjection;
32
using ReactiveUI;
43
using System.Threading.Tasks;
54
using System.Windows.Input;
65
using System;
7-
using Avalonia.Controls;
6+
using System.Diagnostics;
7+
using System.Runtime.InteropServices;
88
using Avalonia.CpuLimiter.Models;
99
using Avalonia.CpuLimiter.Services;
10+
using Avalonia.CpuLimiter.Views;
1011

1112
namespace Avalonia.CpuLimiter.ViewModels
1213
{
@@ -22,12 +23,16 @@ public MainWindowViewModel()
2223
// Environment.Exit(0);
2324
// }
2425
// }
25-
26+
2627

2728
ChooseExeFileCommand = ReactiveCommand.CreateFromTask(ChooseExeFile);
2829
RunGameCommand = ReactiveCommand.Create(RunGame);
2930
ExitProgramCommand = ReactiveCommand.Create(ExitProgram);
30-
31+
OpenAboutWindowCommand = ReactiveCommand.CreateFromTask(OpenAboutWindowAsync);
32+
OpenProjWebsiteCommand = ReactiveCommand.CreateFromTask(OpenProjWebsiteAsync);
33+
OpenDocsCommand = ReactiveCommand.CreateFromTask(OpenDocsAsync);
34+
this.WhenAnyValue(x => x.CpuCoreCount)
35+
.Subscribe(x => Console.WriteLine($"CPU core count: {x}"));
3136
}
3237

3338
public void RunGame() => AdminRunner.RunAsAdmin(4, GamePath);
@@ -61,8 +66,12 @@ private async Task ChooseExeFile()
6166

6267
var file = await fileService.OpenFileAsync();
6368
if (file != null)
64-
GamePath = file.Path.ToString();
65-
69+
GamePath = file.Path.AbsolutePath;
70+
71+
// extension judgement
72+
if(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && !GamePath.EndsWith(".exe"))
73+
throw new PlatformNotSupportedException("File extension is not supported on windows");
74+
6675
}
6776
catch (Exception e)
6877
{
@@ -72,14 +81,64 @@ private async Task ChooseExeFile()
7281
}
7382
}
7483

75-
// menu command
84+
// Exit command
7685

7786
public ICommand ExitProgramCommand { get; }
7887

7988
private void ExitProgram()
8089
{
81-
Environment.Exit(0);
82-
90+
Environment.Exit(0);
91+
}
92+
93+
//slider cpu core
94+
95+
private int _CpuCoreCount = 4;
96+
97+
public int CpuCoreCount
98+
{
99+
get => _CpuCoreCount;
100+
101+
set => this.RaiseAndSetIfChanged(ref _CpuCoreCount, value);
102+
}
103+
104+
// about button
105+
106+
public ICommand OpenAboutWindowCommand { get; }
107+
108+
public Interaction<object, object> ShowAboutDialog { get; }
109+
110+
public async Task OpenAboutWindowAsync()
111+
{
112+
await MainWindow.DoOpenAboutWindowAsync();
113+
}
114+
115+
// project website button
116+
117+
public ICommand OpenProjWebsiteCommand { get; }
118+
119+
private async Task OpenProjWebsiteAsync()
120+
{
121+
string url = "https://github.com/hiddenblue/Avalonia.CpuLimiter";
122+
123+
Process.Start(new ProcessStartInfo
124+
{
125+
FileName = url,
126+
UseShellExecute = true
127+
});
128+
}
129+
130+
public ICommand OpenDocsCommand { get; }
131+
132+
private async Task OpenDocsAsync()
133+
{
134+
string url = "https://github.com/hiddenblue/Avalonia.CpuLimiter";
135+
136+
Process.Start(new ProcessStartInfo
137+
{
138+
FileName = url,
139+
UseShellExecute = true
140+
141+
});
83142
}
84143
}
85144
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<Window xmlns="https://github.com/avaloniaui"
2+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
4+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5+
mc:Ignorable="d" d:DesignWidth="400" d:DesignHeight="250"
6+
Width="400" Height="250"
7+
x:Class="Avalonia.CpuLimiter.Views.AboutWindow"
8+
Icon="/Assets/avalonia-logo.ico"
9+
Title="About Game Launcher"
10+
TransparencyLevelHint="AcrylicBlur"
11+
Background="Transparent"
12+
ExtendClientAreaToDecorationsHint="False"
13+
WindowStartupLocation="CenterOwner"
14+
CornerRadius="10">
15+
16+
17+
<Panel>
18+
<!-- the windows sytle -->
19+
<ExperimentalAcrylicBorder IsHitTestVisible="False">
20+
<ExperimentalAcrylicBorder.Material>
21+
<ExperimentalAcrylicMaterial
22+
BackgroundSource="Digger"
23+
TintColor="Black"
24+
TintOpacity="1"
25+
MaterialOpacity="0.25" />
26+
</ExperimentalAcrylicBorder.Material>
27+
</ExperimentalAcrylicBorder>
28+
<StackPanel HorizontalAlignment="Center">
29+
<!-- Title -->
30+
31+
<TextBlock Text="Game Launcher 1.0" FontSize="16"
32+
FontWeight="Bold"
33+
Padding="20"
34+
HorizontalAlignment="Center"></TextBlock>
35+
<Grid RowDefinitions="Auto * * * *" ColumnDefinitions="Auto *" ShowGridLines="False">
36+
<TextBlock Grid.Row="1" Padding="20 0 20 0">Author:</TextBlock>
37+
<TextBlock Grid.Row="1" Grid.Column="1" Padding="10 0 20 0">Hiddenblue</TextBlock>
38+
<TextBlock Grid.Row="2" Padding="20 0 20 0">Dotnet version:</TextBlock>
39+
<TextBlock Grid.Row="2" Grid.Column="1" Padding="10 0 20 0">8.0</TextBlock>
40+
<TextBlock Grid.Row="3" Padding="20 0 20 0">AvaloniaUI version:</TextBlock>
41+
<TextBlock Grid.Row="3" Grid.Column="1" Padding="10 0 20 0">11.10</TextBlock>
42+
43+
<TextBlock Grid.Row="4" Padding="20 0 20 0">License:</TextBlock>
44+
<TextBlock Grid.Row="4" Grid.Column="1" Padding="10 0 20 0">GPLV2</TextBlock>
45+
</Grid>
46+
47+
</StackPanel>
48+
49+
50+
51+
<StackPanel Orientation="Horizontal" VerticalAlignment="Bottom"
52+
Margin="180 40 0 20">
53+
<Button Content="Copy and Close" FontSize="16" FontWeight="Bold"
54+
Margin="0 0 6 0"
55+
Padding="4"
56+
Background="DodgerBlue"/>
57+
<Button Content="Close" FontSize="16" FontWeight="Normal"
58+
Margin="0 0 6 0"
59+
Padding="4"/>
60+
</StackPanel>
61+
</Panel>
62+
63+
64+
</Window>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using Avalonia;
2+
using Avalonia.Controls;
3+
using Avalonia.Markup.Xaml;
4+
5+
namespace Avalonia.CpuLimiter.Views;
6+
7+
public partial class AboutWindow : Window
8+
{
9+
public AboutWindow()
10+
{
11+
InitializeComponent();
12+
}
13+
14+
// Add singleton AboutWindow
15+
public static AboutWindow Instance;
16+
17+
18+
public static AboutWindow GetInstance()
19+
{
20+
Instance = new AboutWindow();
21+
return Instance;
22+
}
23+
}

Avalonia.CpuLimiter/Views/MainWindow.axaml

Lines changed: 60 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
xmlns:vm="using:Avalonia.CpuLimiter.ViewModels"
44
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
55
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6-
mc:Ignorable="d" d:DesignWidth="600" d:DesignHeight="350"
6+
mc:Ignorable="d" d:DesignWidth="600" d:DesignHeight="400"
77
Width="600" Height="400"
88
x:Class="Avalonia.CpuLimiter.Views.MainWindow"
99
x:DataType="vm:MainWindowViewModel"
1010
Icon="/Assets/avalonia-logo.ico"
11-
Title="Avalonia.CpuLimiter"
11+
Title="Game Launcher"
1212
TransparencyLevelHint="AcrylicBlur"
1313
Background="Transparent"
1414
ExtendClientAreaToDecorationsHint="False"
@@ -36,60 +36,91 @@
3636
<DockPanel>
3737
<Menu DockPanel.Dock="Top">
3838
<MenuItem Header="File">
39-
<MenuItem Header="Open" Command="{Binding ChooseExeFileCommand}"/>
40-
<MenuItem Header="Exit" Command="{Binding ExitProgramCommand}"/>
39+
<MenuItem Header="Open" Command="{Binding ChooseExeFileCommand}" FontSize="13"/>
40+
<MenuItem Header="Save" Command="{Binding}" FontSize="13"/>
41+
<Separator/>
42+
<MenuItem Header="Exit" Command="{Binding ExitProgramCommand}" FontSize="13"/>
4143
</MenuItem>
4244

4345
<MenuItem Header="_Edit">
44-
<MenuItem Header="Cut"/>
45-
<MenuItem Header="Copy"/>
46-
<MenuItem Header="Paste"/>
46+
<MenuItem Header="Cut" FontSize="13"/>
47+
<MenuItem Header="Copy" FontSize="13"/>
48+
<MenuItem Header="Paste" FontSize="13"/>
4749
</MenuItem>
4850

4951
<MenuItem Header="_Setting">
50-
<MenuItem Header="View"/>
51-
<MenuItem Header="Config"/>
52+
<MenuItem Header="View" FontSize="13"/>
53+
<MenuItem Header="Config" FontSize="13"/>
5254
</MenuItem>
5355

5456
<MenuItem Header="_Run">
55-
<MenuItem Header="Run Game" Command="{Binding RunGameCommand}"/>
57+
<MenuItem Header="Launch Game" Command="{Binding RunGameCommand}" FontSize="13"/>
5658
</MenuItem>
5759

5860
<MenuItem Header="_Help">
59-
<MenuItem Header="Docs"/>
60-
<MenuItem Header="About Author"/>
61-
<MenuItem Header="Project website"></MenuItem>
61+
<MenuItem Header="Docs" FontSize="13" Command="{Binding OpenDocsCommand}"
62+
ToolTip.Tip="Click to open docs in browser"/>
63+
<Separator/>
64+
<MenuItem Header="Project website" FontSize="13" Command="{Binding OpenProjWebsiteCommand}"/>
65+
<MenuItem Header="About" FontSize="13" Command="{Binding OpenAboutWindowCommand}"/>
6266
</MenuItem>
6367

6468
</Menu>
6569

6670
<!-- content -->
6771
<StackPanel>
72+
73+
<TextBlock FontSize="18" FontWeight="Bold" Foreground="DodgerBlue"
74+
HorizontalAlignment="Center" Padding="20">
75+
Exe File Path
76+
</TextBlock>
6877

69-
<Button Content="Select Executable File" HorizontalAlignment="Center"
70-
Background="Beige" Foreground="Black" Margin="20 20 20 20"
71-
Command="{Binding ChooseExeFileCommand}"/>
72-
73-
<StackPanel Orientation="Horizontal">
74-
75-
<TextBlock FontSize="18" FontWeight="Bold" Foreground="Fuchsia"
76-
HorizontalAlignment="Center" Padding="15">
77-
Exe File Path
78-
</TextBlock>
79-
78+
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
8079
<TextBox Text="{Binding GamePath}" Name="GamePathTextBox"
8180
HorizontalAlignment="Center"
82-
Padding="15" FontSize="16"/>
83-
81+
Padding="30 8 30 0" FontSize="16"/>
82+
83+
<Button Content=" ... " HorizontalAlignment="Center"
84+
Background="Beige" Foreground="Black"
85+
Margin="5 0 0 0"
86+
Padding="10"
87+
Width="40"
88+
BorderBrush="Black"
89+
ToolTip.Tip="Open the file explorer to select exe file"
90+
Command="{Binding ChooseExeFileCommand}"/>
8491
</StackPanel>
8592

93+
94+
<Separator Margin="0 20"/>
95+
<Slider Name="slider" BorderBrush="Orange"
96+
Minimum="1" Maximum="16" IsSnapToTickEnabled="True" TickFrequency="1" TickPlacement="TopLeft"
97+
Width="400" Value="{Binding CpuCoreCount}"
98+
ToolTip.Tip="Adjust the cpu core numbers used by the Game program">
99+
</Slider>
100+
101+
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
102+
<TextBlock FontSize="18" FontWeight="Bold" Margin="10 6 10 0"
103+
HorizontalAlignment="Center">Cpu Core Number:</TextBlock>
104+
<!-- <TextBlock Text="{Binding #slider.Value}" -->
105+
<!-- HorizontalAlignment="Center" FontSize="20" FontWeight="Bold" Padding="0"/> -->
106+
107+
<TextBox Margin="10 0 0 0" HorizontalAlignment="Center"
108+
Padding="10 10 10 10"
109+
Width="1"
110+
TextAlignment="Center"
111+
Text="{Binding CpuCoreCount}" FontSize="18"
112+
FontWeight="Bold" IsReadOnly="False"></TextBox>
113+
</StackPanel>
86114
<Button FontStyle="Normal"
87115
Foreground="Orange" Command="{Binding RunGameCommand}"
88116
HorizontalAlignment="Center" VerticalAlignment="Center"
89-
Margin="10" Padding="15"
90-
ToolTip.Tip="Run the selected Game">
91-
<PathIcon Data="{StaticResource GamesRegular}"/>
117+
FontSize="16" FontWeight="Bold"
118+
Margin="10 20" Padding="14"
119+
ToolTip.Tip="Run the selected Game"
120+
Content="Launch the Game">
121+
<!-- <PathIcon Data="{StaticResource GamesRegular}"/> -->
92122
</Button>
123+
93124
</StackPanel>
94125
</DockPanel>
95126

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
1-
using Avalonia.Controls;
2-
using ReactiveUI;
1+
using System.Threading.Tasks;
2+
using Avalonia.CpuLimiter.ViewModels;
3+
using Avalonia.ReactiveUI;
34

45
namespace Avalonia.CpuLimiter.Views
56
{
6-
public partial class MainWindow : Window
7+
public partial class MainWindow : ReactiveWindow<MainWindowViewModel>
78
{
89
public MainWindow()
910
{
1011
InitializeComponent();
1112
}
13+
14+
public static async Task DoOpenAboutWindowAsync()
15+
{
16+
var aboutWindow = AboutWindow.GetInstance();
17+
aboutWindow.Show();
18+
}
1219
}
1320
}

0 commit comments

Comments
 (0)