Add Avalonia server-host launcher (MVP scaffold)

Cross-platform C# GUI to replace the Qt/C++ Host GUI, on the same dotnet
toolchain as the server. MVP: load/save commonwealth-server.json, Start/Stop
the CommonwealthOnline.Server process (published exe, then dll, then source
run), and stream its output to a live log. Themed to the Commonwealth Online
brand (near-black + amber). Builds clean on net8.0.

Next: player list + kick/ban via the admin port, then retire the Qt host.
This commit is contained in:
NomadsReach
2026-08-16 18:15:40 -04:00
parent 6861fa4276
commit 1f01e68794
11 changed files with 431 additions and 0 deletions
+73
View File
@@ -0,0 +1,73 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:CommonwealthOnline.Host.ViewModels"
x:Class="CommonwealthOnline.Host.Views.MainWindow"
x:DataType="vm:MainWindowViewModel"
Width="920" Height="640"
MinWidth="760" MinHeight="520"
Title="Commonwealth Online — Server Host"
Background="{StaticResource CoBackgroundBrush}">
<Grid RowDefinitions="Auto,*,Auto" Margin="18">
<Image Grid.Row="0" Source="/Assets/logo.png" Height="88"
HorizontalAlignment="Left" Margin="0,0,0,14" />
<Grid Grid.Row="1" ColumnDefinitions="330,*">
<StackPanel Grid.Column="0" Spacing="9" Margin="0,0,18,0">
<TextBlock Text="SERVER" Foreground="{StaticResource CoAccentBrush}"
FontWeight="Bold" FontSize="13" />
<TextBox Watermark="Server name" Text="{Binding ServerName}" />
<Grid ColumnDefinitions="*,*">
<TextBox Grid.Column="0" Watermark="Host" Text="{Binding Host}" Margin="0,0,4,0" />
<TextBox Grid.Column="1" Watermark="Port" Text="{Binding Port}" Margin="4,0,0,0" />
</Grid>
<Grid ColumnDefinitions="*,*">
<TextBox Grid.Column="0" Watermark="Max players" Text="{Binding MaxPlayers}" Margin="0,0,4,0" />
<TextBox Grid.Column="1" Watermark="Admin port" Text="{Binding AdminPort}" Margin="4,0,0,0" />
</Grid>
<TextBlock Text="LOG VERBOSITY" Foreground="{StaticResource CoAccentBrush}"
FontWeight="Bold" FontSize="12" Margin="0,4,0,0" />
<ComboBox HorizontalAlignment="Stretch"
ItemsSource="{Binding VerbosityOptions}"
SelectedItem="{Binding LogVerbosity}" />
<CheckBox Content="Enable GNS transport" IsChecked="{Binding EnableGnsTransport}"
Foreground="{StaticResource CoTextBrush}" />
<Button Content="Save config" Command="{Binding SaveCommand}"
HorizontalAlignment="Stretch" />
</StackPanel>
<Border Grid.Column="1" Background="{StaticResource CoSurfaceBrush}"
CornerRadius="4" Padding="10">
<ScrollViewer>
<ItemsControl ItemsSource="{Binding Log}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" Foreground="{StaticResource CoTextBrush}"
FontFamily="Cascadia Mono,Consolas,monospace" FontSize="12"
TextWrapping="Wrap" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Border>
</Grid>
<Grid Grid.Row="2" ColumnDefinitions="Auto,*,Auto,Auto" Margin="0,14,0,0">
<TextBlock Grid.Column="0" Text="Status:" Foreground="{StaticResource CoTextBrush}"
VerticalAlignment="Center" Margin="0,0,6,0" />
<TextBlock Grid.Column="1" Text="{Binding StatusText}"
Foreground="{StaticResource CoAccentBrush}" FontWeight="Bold"
VerticalAlignment="Center" />
<Button Grid.Column="2" Content="Start" Command="{Binding StartCommand}"
Margin="0,0,8,0" Padding="26,7"
Background="{StaticResource CoAccentBrush}" Foreground="#0E120B" FontWeight="Bold" />
<Button Grid.Column="3" Content="Stop" Command="{Binding StopCommand}"
Padding="26,7"
Background="{StaticResource CoDangerBrush}" Foreground="White" FontWeight="Bold" />
</Grid>
</Grid>
</Window>