mirror of
https://github.com/MCCTeam/Minecraft-Console-Client
synced 2026-08-15 13:04:36 +00:00
189 lines
7.7 KiB
C#
189 lines
7.7 KiB
C#
using Avalonia;
|
||
using Avalonia.Controls;
|
||
using Avalonia.Controls.Documents;
|
||
using Avalonia.Layout;
|
||
using Avalonia.Media;
|
||
|
||
namespace MinecraftClient.Tui
|
||
{
|
||
internal static class MccBannerPanelBuilder
|
||
{
|
||
internal static Border Build(string? buildInfo)
|
||
{
|
||
var contentPanel = new DockPanel { Background = Brushes.Black };
|
||
|
||
var icon = BuildIcon();
|
||
icon.VerticalAlignment = VerticalAlignment.Center;
|
||
DockPanel.SetDock(icon, Dock.Left);
|
||
contentPanel.Children.Add(icon);
|
||
|
||
var infoPanel = new StackPanel
|
||
{
|
||
Orientation = Orientation.Vertical,
|
||
Margin = new Thickness(1, 0, 0, 0),
|
||
VerticalAlignment = VerticalAlignment.Center,
|
||
};
|
||
|
||
AddTitle(infoPanel);
|
||
AddVersionRange(infoPanel);
|
||
AddGithub(infoPanel);
|
||
|
||
if (Settings.Config.Main.Advanced.ShowGithubStarReminder)
|
||
AddStarReminder(infoPanel);
|
||
|
||
if (buildInfo is not null)
|
||
AddBuildInfo(infoPanel, buildInfo);
|
||
|
||
contentPanel.Children.Add(infoPanel);
|
||
|
||
return new Border
|
||
{
|
||
BorderBrush = new SolidColorBrush(Color.FromRgb(80, 80, 80)),
|
||
BorderThickness = new Thickness(1),
|
||
Background = new SolidColorBrush(Color.FromArgb(240, 20, 20, 20)),
|
||
Padding = new Thickness(1, 0),
|
||
Child = contentPanel,
|
||
Margin = new Thickness(0),
|
||
};
|
||
}
|
||
|
||
private static void AddTitle(StackPanel panel)
|
||
{
|
||
var row = new TextBlock();
|
||
row.Inlines!.Add(new Run("Minecraft Console Client")
|
||
{ Foreground = Pal.Gold, FontWeight = FontWeight.Bold });
|
||
row.Inlines.Add(new Run($" v{Program.Version}") { Foreground = Pal.Aqua });
|
||
panel.Children.Add(row);
|
||
}
|
||
|
||
private static void AddVersionRange(StackPanel panel)
|
||
{
|
||
var row = new TextBlock();
|
||
row.Inlines!.Add(Lbl(Translations.mcc_banner_label_mc_versions));
|
||
row.Inlines.Add(Val(Program.MCLowestVersion, Pal.Green));
|
||
row.Inlines.Add(new Run(" - ") { Foreground = Pal.Gray });
|
||
row.Inlines.Add(Val(Program.MCHighestVersion, Pal.Green));
|
||
panel.Children.Add(row);
|
||
}
|
||
|
||
private static void AddGithub(StackPanel panel)
|
||
{
|
||
var row = new TextBlock();
|
||
row.Inlines!.Add(Val("Github.com/MCCTeam", Pal.Gray));
|
||
panel.Children.Add(row);
|
||
}
|
||
|
||
private static void AddStarReminder(StackPanel panel)
|
||
{
|
||
var row = new TextBlock();
|
||
row.Inlines!.Add(new Run("\u2b50 ") { Foreground = Pal.Gold });
|
||
row.Inlines.Add(Val("Star us on GitHub!", Pal.Gold));
|
||
panel.Children.Add(row);
|
||
}
|
||
|
||
private static void AddBuildInfo(StackPanel panel, string buildInfo)
|
||
{
|
||
panel.Children.Add(new TextBlock
|
||
{
|
||
Text = buildInfo,
|
||
Foreground = Pal.DarkGray,
|
||
});
|
||
}
|
||
|
||
#region Icon
|
||
|
||
private static readonly Color B1 = Color.FromRgb(200, 200, 200); // bezel bright
|
||
private static readonly Color B2 = Color.FromRgb(160, 160, 160); // bezel mid
|
||
private static readonly Color B3 = Color.FromRgb(120, 120, 120); // bezel dark
|
||
private static readonly Color S = Color.FromRgb(20, 20, 20); // screen bg
|
||
private static readonly Color C = Color.FromRgb(55, 200, 55); // creeper green
|
||
|
||
// @formatter:off
|
||
private static readonly Color[,] Pixels =
|
||
{
|
||
{ B1, B1, B1, B1, B1, B1, B1, B1, B1, B1, B1, B1, B1, B1, B1, B1, B2 },
|
||
{ B1, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, B3 },
|
||
{ B1, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, B3 },
|
||
{ B1, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, B3 },
|
||
{ B1, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, B3 },
|
||
{ B1, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, B3 },
|
||
{ B1, S, S, S, S, S, S, S, S, C, C, S, S, C, C, S, B3 },
|
||
{ B1, S, S, S, S, S, S, S, S, C, C, S, S, C, C, S, B3 },
|
||
{ B1, S, S, S, S, S, S, S, S, S, S, C, C, S, S, S, B3 },
|
||
{ B1, S, S, S, S, S, S, S, S, S, C, C, C, C, S, S, B3 },
|
||
{ B1, S, S, S, S, S, S, S, S, S, C, C, C, C, S, S, B3 },
|
||
{ B1, S, S, S, S, S, S, S, S, S, C, S, S, C, S, S, B3 },
|
||
{ B1, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, B3 },
|
||
{ B2, B3, B3, B3, B3, B3, B3, B3, B3, B3, B3, B3, B3, B3, B3, B3, B3 },
|
||
};
|
||
// @formatter:on
|
||
|
||
private static Control BuildIcon()
|
||
{
|
||
int cols = Pixels.GetLength(1);
|
||
int textRows = Pixels.GetLength(0) / 2;
|
||
|
||
var pixelGrid = new Grid();
|
||
for (int c = 0; c < cols; c++)
|
||
pixelGrid.ColumnDefinitions.Add(new ColumnDefinition(1, GridUnitType.Auto));
|
||
for (int r = 0; r < textRows; r++)
|
||
pixelGrid.RowDefinitions.Add(new RowDefinition(1, GridUnitType.Auto));
|
||
|
||
for (int row = 0; row < textRows; row++)
|
||
{
|
||
for (int col = 0; col < cols; col++)
|
||
{
|
||
var topColor = Pixels[row * 2, col];
|
||
var bottomColor = Pixels[row * 2 + 1, col];
|
||
|
||
var cell = new TextBlock
|
||
{
|
||
Text = "\u2580",
|
||
Foreground = new SolidColorBrush(topColor),
|
||
Background = new SolidColorBrush(bottomColor),
|
||
Padding = new Thickness(0),
|
||
Margin = new Thickness(0),
|
||
};
|
||
|
||
Grid.SetRow(cell, row);
|
||
Grid.SetColumn(cell, col);
|
||
pixelGrid.Children.Add(cell);
|
||
}
|
||
}
|
||
|
||
var prompt = new TextBlock
|
||
{
|
||
Text = " >_",
|
||
Foreground = new SolidColorBrush(Color.FromRgb(255, 255, 255)),
|
||
Background = new SolidColorBrush(S),
|
||
Padding = new Thickness(0),
|
||
Margin = new Thickness(0),
|
||
HorizontalAlignment = HorizontalAlignment.Left,
|
||
VerticalAlignment = VerticalAlignment.Top,
|
||
};
|
||
Grid.SetRow(prompt, 1);
|
||
Grid.SetColumn(prompt, 1);
|
||
Grid.SetColumnSpan(prompt, 4);
|
||
pixelGrid.Children.Add(prompt);
|
||
|
||
return pixelGrid;
|
||
}
|
||
|
||
#endregion
|
||
|
||
private static Run Lbl(string text) =>
|
||
new(text + " ") { Foreground = Pal.Gray };
|
||
|
||
private static Run Val(string text, IBrush color) =>
|
||
new(text) { Foreground = color };
|
||
|
||
private static class Pal
|
||
{
|
||
public static readonly IBrush Gray = new SolidColorBrush(Color.FromRgb(170, 170, 170));
|
||
public static readonly IBrush DarkGray = new SolidColorBrush(Color.FromRgb(85, 85, 85));
|
||
public static readonly IBrush Aqua = new SolidColorBrush(Color.FromRgb(85, 255, 255));
|
||
public static readonly IBrush Green = new SolidColorBrush(Color.FromRgb(85, 255, 85));
|
||
public static readonly IBrush Gold = new SolidColorBrush(Color.FromRgb(255, 170, 0));
|
||
}
|
||
}
|
||
}
|