ava: Fixes regressions from refactoring (#4237)

* ava: Fix regressions from #4178

* Remove duplicated code

* real fix for right click menu

Co-Authored-By: Isaac Marovitz <42140194+IsaacMarovitz@users.noreply.github.com>

* Remove ContentDialogOverlay

Co-authored-by: Isaac Marovitz <42140194+IsaacMarovitz@users.noreply.github.com>
This commit is contained in:
Ac_K 2023-01-09 04:37:20 +01:00 committed by GitHub
parent 492056abf6
commit 610eecc1c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 427 additions and 399 deletions

View File

@ -38,9 +38,9 @@ namespace Ryujinx.Ava.UI.Controls
{ {
if (sender is ListBox listBox) if (sender is ListBox listBox)
{ {
var selected = listBox.SelectedItem as ApplicationData; _selectedApplication = listBox.SelectedItem as ApplicationData;
_selectedApplication = selected; (DataContext as MainWindowViewModel).GridSelectedApplication = _selectedApplication;
} }
} }

View File

@ -38,9 +38,9 @@ namespace Ryujinx.Ava.UI.Controls
{ {
if (sender is ListBox listBox) if (sender is ListBox listBox)
{ {
var selected = listBox.SelectedItem as ApplicationData; _selectedApplication = listBox.SelectedItem as ApplicationData;
_selectedApplication = selected; (DataContext as MainWindowViewModel).ListSelectedApplication = _selectedApplication;
} }
} }

View File

@ -19,7 +19,56 @@ namespace Ryujinx.Ava.UI.Helpers
{ {
private static bool _isChoiceDialogOpen; private static bool _isChoiceDialogOpen;
private async static Task<UserResult> ShowContentDialog( public async static Task<UserResult> ShowContentDialog(
string title,
object content,
string primaryButton,
string secondaryButton,
string closeButton,
UserResult primaryButtonResult = UserResult.Ok,
ManualResetEvent deferResetEvent = null,
Func<Window, Task> doWhileDeferred = null,
TypedEventHandler<ContentDialog, ContentDialogButtonClickEventArgs> deferCloseAction = null)
{
UserResult result = UserResult.None;
ContentDialog contentDialog = new()
{
Title = title,
PrimaryButtonText = primaryButton,
SecondaryButtonText = secondaryButton,
CloseButtonText = closeButton,
Content = content
};
contentDialog.PrimaryButtonCommand = MiniCommand.Create(() =>
{
result = primaryButtonResult;
});
contentDialog.SecondaryButtonCommand = MiniCommand.Create(() =>
{
result = UserResult.No;
contentDialog.PrimaryButtonClick -= deferCloseAction;
});
contentDialog.CloseButtonCommand = MiniCommand.Create(() =>
{
result = UserResult.Cancel;
contentDialog.PrimaryButtonClick -= deferCloseAction;
});
if (deferResetEvent != null)
{
contentDialog.PrimaryButtonClick += deferCloseAction;
}
await ShowAsync(contentDialog);
return result;
}
private async static Task<UserResult> ShowTextDialog(
string title, string title,
string primaryText, string primaryText,
string secondaryText, string secondaryText,
@ -32,119 +81,9 @@ namespace Ryujinx.Ava.UI.Helpers
Func<Window, Task> doWhileDeferred = null, Func<Window, Task> doWhileDeferred = null,
TypedEventHandler<ContentDialog, ContentDialogButtonClickEventArgs> deferCloseAction = null) TypedEventHandler<ContentDialog, ContentDialogButtonClickEventArgs> deferCloseAction = null)
{ {
UserResult result = UserResult.None; Grid content = CreateTextDialogContent(primaryText, secondaryText, iconSymbol);
bool useOverlay = false; return await ShowContentDialog(title, content, primaryButton, secondaryButton, closeButton, primaryButtonResult, deferResetEvent, doWhileDeferred, deferCloseAction);
Window mainWindow = null;
if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime al)
{
foreach (var item in al.Windows)
{
if (item.IsActive && item is MainWindow window && window.ViewModel.IsGameRunning)
{
mainWindow = window;
useOverlay = true;
break;
}
}
}
ContentDialog contentDialog = null;
ContentDialogOverlayWindow overlay = null;
if (useOverlay)
{
overlay = new ContentDialogOverlayWindow()
{
Height = mainWindow.Bounds.Height,
Width = mainWindow.Bounds.Width,
Position = mainWindow.PointToScreen(new Point())
};
mainWindow.PositionChanged += OverlayOnPositionChanged;
void OverlayOnPositionChanged(object sender, PixelPointEventArgs e)
{
overlay.Position = mainWindow.PointToScreen(new Point());
}
contentDialog = overlay.ContentDialog;
bool opened = false;
overlay.Opened += OverlayOnActivated;
async void OverlayOnActivated(object sender, EventArgs e)
{
if (opened)
{
return;
}
opened = true;
overlay.Position = mainWindow.PointToScreen(new Point());
await ShowDialog();
}
await overlay.ShowDialog(mainWindow);
}
else
{
contentDialog = new ContentDialog();
await ShowDialog();
}
async Task ShowDialog()
{
contentDialog.Title = title;
contentDialog.PrimaryButtonText = primaryButton;
contentDialog.SecondaryButtonText = secondaryButton;
contentDialog.CloseButtonText = closeButton;
contentDialog.Content = CreateDialogTextContent(primaryText, secondaryText, iconSymbol);
contentDialog.PrimaryButtonCommand = MiniCommand.Create(() =>
{
result = primaryButtonResult;
});
contentDialog.SecondaryButtonCommand = MiniCommand.Create(() =>
{
result = UserResult.No;
contentDialog.PrimaryButtonClick -= deferCloseAction;
});
contentDialog.CloseButtonCommand = MiniCommand.Create(() =>
{
result = UserResult.Cancel;
contentDialog.PrimaryButtonClick -= deferCloseAction;
});
if (deferResetEvent != null)
{
contentDialog.PrimaryButtonClick += deferCloseAction;
}
if (useOverlay)
{
await contentDialog.ShowAsync(overlay, ContentDialogPlacement.Popup);
overlay!.Close();
}
else
{
await contentDialog.ShowAsync(ContentDialogPlacement.Popup);
}
}
if (useOverlay)
{
overlay.Content = null;
overlay.Close();
}
return result;
} }
public async static Task<UserResult> ShowDeferredContentDialog( public async static Task<UserResult> ShowDeferredContentDialog(
@ -162,7 +101,7 @@ namespace Ryujinx.Ava.UI.Helpers
bool startedDeferring = false; bool startedDeferring = false;
UserResult result = UserResult.None; UserResult result = UserResult.None;
return await ShowContentDialog( return await ShowTextDialog(
title, title,
primaryText, primaryText,
secondaryText, secondaryText,
@ -192,8 +131,7 @@ namespace Ryujinx.Ava.UI.Helpers
sender.PrimaryButtonClick -= DeferClose; sender.PrimaryButtonClick -= DeferClose;
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed _ = Task.Run(() =>
Task.Run(() =>
{ {
deferResetEvent.WaitOne(); deferResetEvent.WaitOne();
@ -202,7 +140,6 @@ namespace Ryujinx.Ava.UI.Helpers
deferral.Complete(); deferral.Complete();
}); });
}); });
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
if (doWhileDeferred != null) if (doWhileDeferred != null)
{ {
@ -213,34 +150,42 @@ namespace Ryujinx.Ava.UI.Helpers
} }
} }
private static Grid CreateDialogTextContent(string primaryText, string secondaryText, int symbol) private static Grid CreateTextDialogContent(string primaryText, string secondaryText, int symbol)
{ {
Grid content = new Grid(); Grid content = new()
content.RowDefinitions = new RowDefinitions() { new RowDefinition(), new RowDefinition() }; {
content.ColumnDefinitions = new ColumnDefinitions() { new ColumnDefinition(GridLength.Auto), new ColumnDefinition() }; RowDefinitions = new RowDefinitions() { new RowDefinition(), new RowDefinition() },
ColumnDefinitions = new ColumnDefinitions() { new ColumnDefinition(GridLength.Auto), new ColumnDefinition() },
content.MinHeight = 80; MinHeight = 80
};
SymbolIcon icon = new()
{
Symbol = (Symbol)symbol,
Margin = new Thickness(10),
FontSize = 40,
VerticalAlignment = Avalonia.Layout.VerticalAlignment.Center
};
SymbolIcon icon = new SymbolIcon { Symbol = (Symbol)symbol, Margin = new Thickness(10) };
icon.FontSize = 40;
icon.VerticalAlignment = Avalonia.Layout.VerticalAlignment.Center;
Grid.SetColumn(icon, 0); Grid.SetColumn(icon, 0);
Grid.SetRowSpan(icon, 2); Grid.SetRowSpan(icon, 2);
Grid.SetRow(icon, 0); Grid.SetRow(icon, 0);
TextBlock primaryLabel = new TextBlock() TextBlock primaryLabel = new()
{ {
Text = primaryText, Text = primaryText,
Margin = new Thickness(5), Margin = new Thickness(5),
TextWrapping = TextWrapping.Wrap, TextWrapping = TextWrapping.Wrap,
MaxWidth = 450 MaxWidth = 450
}; };
TextBlock secondaryLabel = new TextBlock()
TextBlock secondaryLabel = new()
{ {
Text = secondaryText, Text = secondaryText,
Margin = new Thickness(5), Margin = new Thickness(5),
TextWrapping = TextWrapping.Wrap, TextWrapping = TextWrapping.Wrap,
MaxWidth = 450 MaxWidth = 450
}; };
Grid.SetColumn(primaryLabel, 1); Grid.SetColumn(primaryLabel, 1);
@ -262,7 +207,7 @@ namespace Ryujinx.Ava.UI.Helpers
string closeButton, string closeButton,
string title) string title)
{ {
return await ShowContentDialog( return await ShowTextDialog(
title, title,
primary, primary,
secondaryText, secondaryText,
@ -280,7 +225,7 @@ namespace Ryujinx.Ava.UI.Helpers
string title, string title,
UserResult primaryButtonResult = UserResult.Yes) UserResult primaryButtonResult = UserResult.Yes)
{ {
return await ShowContentDialog( return await ShowTextDialog(
string.IsNullOrWhiteSpace(title) ? LocaleManager.Instance[LocaleKeys.DialogConfirmationTitle] : title, string.IsNullOrWhiteSpace(title) ? LocaleManager.Instance[LocaleKeys.DialogConfirmationTitle] : title,
primaryText, primaryText,
secondaryText, secondaryText,
@ -298,7 +243,7 @@ namespace Ryujinx.Ava.UI.Helpers
internal static async Task CreateUpdaterInfoDialog(string primary, string secondaryText) internal static async Task CreateUpdaterInfoDialog(string primary, string secondaryText)
{ {
await ShowContentDialog( await ShowTextDialog(
LocaleManager.Instance[LocaleKeys.DialogUpdaterTitle], LocaleManager.Instance[LocaleKeys.DialogUpdaterTitle],
primary, primary,
secondaryText, secondaryText,
@ -310,7 +255,7 @@ namespace Ryujinx.Ava.UI.Helpers
internal static async Task CreateWarningDialog(string primary, string secondaryText) internal static async Task CreateWarningDialog(string primary, string secondaryText)
{ {
await ShowContentDialog( await ShowTextDialog(
LocaleManager.Instance[LocaleKeys.DialogWarningTitle], LocaleManager.Instance[LocaleKeys.DialogWarningTitle],
primary, primary,
secondaryText, secondaryText,
@ -324,7 +269,7 @@ namespace Ryujinx.Ava.UI.Helpers
{ {
Logger.Error?.Print(LogClass.Application, errorMessage); Logger.Error?.Print(LogClass.Application, errorMessage);
await ShowContentDialog( await ShowTextDialog(
LocaleManager.Instance[LocaleKeys.DialogErrorTitle], LocaleManager.Instance[LocaleKeys.DialogErrorTitle],
LocaleManager.Instance[LocaleKeys.DialogErrorMessage], LocaleManager.Instance[LocaleKeys.DialogErrorMessage],
errorMessage, errorMessage,
@ -343,16 +288,15 @@ namespace Ryujinx.Ava.UI.Helpers
_isChoiceDialogOpen = true; _isChoiceDialogOpen = true;
UserResult response = UserResult response = await ShowTextDialog(
await ShowContentDialog( title,
title, primary,
primary, secondaryText,
secondaryText, LocaleManager.Instance[LocaleKeys.InputDialogYes],
LocaleManager.Instance[LocaleKeys.InputDialogYes], "",
"", LocaleManager.Instance[LocaleKeys.InputDialogNo],
LocaleManager.Instance[LocaleKeys.InputDialogNo], (int)Symbol.Help,
(int)Symbol.Help, UserResult.Yes);
UserResult.Yes);
_isChoiceDialogOpen = false; _isChoiceDialogOpen = false;
@ -396,5 +340,98 @@ namespace Ryujinx.Ava.UI.Helpers
return string.Empty; return string.Empty;
} }
public static async Task<ContentDialogResult> ShowAsync(ContentDialog contentDialog)
{
ContentDialogResult result;
ContentDialogOverlayWindow contentDialogOverlayWindow = null;
Window parent = GetMainWindow();
if (parent.IsActive && parent is MainWindow window && window.ViewModel.IsGameRunning)
{
contentDialogOverlayWindow = new()
{
Height = parent.Bounds.Height,
Width = parent.Bounds.Width,
Position = parent.PointToScreen(new Point()),
ShowInTaskbar = false
};
parent.PositionChanged += OverlayOnPositionChanged;
void OverlayOnPositionChanged(object sender, PixelPointEventArgs e)
{
contentDialogOverlayWindow.Position = parent.PointToScreen(new Point());
}
contentDialogOverlayWindow.ContentDialog = contentDialog;
bool opened = false;
contentDialogOverlayWindow.Opened += OverlayOnActivated;
async void OverlayOnActivated(object sender, EventArgs e)
{
if (opened)
{
return;
}
opened = true;
contentDialogOverlayWindow.Position = parent.PointToScreen(new Point());
result = await ShowDialog();
}
result = await contentDialogOverlayWindow.ShowDialog<ContentDialogResult>(parent);
}
else
{
result = await ShowDialog();
}
async Task<ContentDialogResult> ShowDialog()
{
if (contentDialogOverlayWindow is not null)
{
result = await contentDialog.ShowAsync(contentDialogOverlayWindow);
contentDialogOverlayWindow!.Close();
}
else
{
result = await contentDialog.ShowAsync();
}
return result;
}
if (contentDialogOverlayWindow is not null)
{
contentDialogOverlayWindow.Content = null;
contentDialogOverlayWindow.Close();
}
return result;
}
private static Window GetMainWindow()
{
if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime al)
{
foreach (Window item in al.Windows)
{
if (item.IsActive && item is MainWindow window)
{
return window;
}
}
}
return null;
}
} }
} }

View File

@ -87,8 +87,6 @@ namespace Ryujinx.Ava.UI.ViewModels
private float _volume; private float _volume;
private string _backendText; private string _backendText;
public ApplicationData ListSelectedApplication;
public ApplicationData GridSelectedApplication;
private bool _canUpdate; private bool _canUpdate;
private Cursor _cursor; private Cursor _cursor;
private string _title; private string _title;
@ -97,6 +95,9 @@ namespace Ryujinx.Ava.UI.ViewModels
private WindowState _windowState; private WindowState _windowState;
private bool _isActive; private bool _isActive;
public ApplicationData ListSelectedApplication;
public ApplicationData GridSelectedApplication;
public event Action ReloadGameList; public event Action ReloadGameList;
private string TitleName { get; set; } private string TitleName { get; set; }

View File

@ -36,10 +36,7 @@ namespace Ryujinx.Ava.UI.Views.Main
private async void StopEmulation_Click(object sender, RoutedEventArgs e) private async void StopEmulation_Click(object sender, RoutedEventArgs e)
{ {
await Task.Run(() => await Window.ViewModel.AppHost?.ShowExitPrompt();
{
Window.ViewModel.AppHost?.ShowExitPrompt();
});
} }
private async void PauseEmulation_Click(object sender, RoutedEventArgs e) private async void PauseEmulation_Click(object sender, RoutedEventArgs e)

View File

@ -22,7 +22,7 @@ namespace Ryujinx.Ava.UI.Views.Main
{ {
base.OnAttachedToVisualTree(e); base.OnAttachedToVisualTree(e);
if (this.VisualRoot is MainWindow window) if (VisualRoot is MainWindow window)
{ {
Window = window; Window = window;
} }

View File

@ -22,7 +22,7 @@ namespace Ryujinx.Ava.UI.Views.Main
{ {
base.OnAttachedToVisualTree(e); base.OnAttachedToVisualTree(e);
if (this.VisualRoot is MainWindow window) if (VisualRoot is MainWindow window)
{ {
ViewModel = window.ViewModel; ViewModel = window.ViewModel;
} }

View File

@ -1,253 +1,247 @@
<UserControl <UserControl
x:Class="Ryujinx.Ava.UI.Windows.AboutWindow"
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
xmlns:flex="clr-namespace:Avalonia.Flexbox;assembly=Avalonia.Flexbox" xmlns:flex="clr-namespace:Avalonia.Flexbox;assembly=Avalonia.Flexbox"
xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
xmlns:viewModel="clr-namespace:Ryujinx.Ava.UI.ViewModels" xmlns:viewModel="clr-namespace:Ryujinx.Ava.UI.ViewModels"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Width="550"
mc:Ignorable="d" Height="260"
Margin="0,-12,0,0"
d:DesignHeight="260" d:DesignHeight="260"
d:DesignWidth="550" d:DesignWidth="550"
Height="260"
Width="550"
x:Class="Ryujinx.Ava.UI.Windows.AboutWindow"
x:DataType="viewModel:AboutWindowViewModel"
x:CompileBindings="True" x:CompileBindings="True"
Margin="0 -12 0 0" x:DataType="viewModel:AboutWindowViewModel"
Focusable="True"> Focusable="True"
<Design.DataContext> mc:Ignorable="d">
<viewModel:AboutWindowViewModel /> <Design.DataContext>
</Design.DataContext> <viewModel:AboutWindowViewModel />
<Grid </Design.DataContext>
HorizontalAlignment="Stretch" <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
VerticalAlignment="Stretch"> <Grid.ColumnDefinitions>
<Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" />
<ColumnDefinition Width="*" /> </Grid.ColumnDefinitions>
</Grid.ColumnDefinitions> <Grid
<Grid
Grid.Column="0" Grid.Column="0"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"> VerticalAlignment="Stretch">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<StackPanel <StackPanel
Grid.Row="0" Grid.Row="0"
Spacing="10" HorizontalAlignment="Stretch"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
VerticalAlignment="Stretch"> Spacing="10">
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Image <Image
Grid.Column="0" Grid.Column="0"
Height="80" Height="80"
Source="resm:Ryujinx.Ui.Common.Resources.Logo_Ryujinx.png?assembly=Ryujinx.Ui.Common" /> Source="resm:Ryujinx.Ui.Common.Resources.Logo_Ryujinx.png?assembly=Ryujinx.Ui.Common" />
<flex:FlexPanel <flex:FlexPanel
Grid.Column="2" Grid.Column="2"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" VerticalAlignment="Stretch"
Direction="Column" Direction="Column"
JustifyContent="SpaceAround" JustifyContent="SpaceAround"
RowSpacing="2"> RowSpacing="2">
<TextBlock <TextBlock
FontSize="28" FontSize="28"
FontWeight="Bold" FontWeight="Bold"
Text="Ryujinx" Text="Ryujinx"
TextAlignment="Left" /> TextAlignment="Left" />
<TextBlock <TextBlock Text="(REE-YOU-JINX)" TextAlignment="Left" />
Text="(REE-YOU-JINX)" </flex:FlexPanel>
TextAlignment="Left" /> </Grid>
</flex:FlexPanel> <TextBlock
</Grid> HorizontalAlignment="Center"
<TextBlock VerticalAlignment="Center"
HorizontalAlignment="Center" FontSize="10"
VerticalAlignment="Center" LineHeight="12"
Text="{Binding Version}" Text="{Binding Version}"
TextAlignment="Center" TextAlignment="Center" />
FontSize="10" </StackPanel>
LineHeight="12" /> <StackPanel
</StackPanel> Grid.Row="2"
<StackPanel HorizontalAlignment="Stretch"
Grid.Row="2" VerticalAlignment="Stretch"
Spacing="10" Spacing="10">
HorizontalAlignment="Stretch" <TextBlock
VerticalAlignment="Stretch"> Width="200"
<TextBlock HorizontalAlignment="Center"
HorizontalAlignment="Center" FontSize="10"
Width="200" LineHeight="12"
Text="{locale:Locale AboutDisclaimerMessage}" Text="{locale:Locale AboutDisclaimerMessage}"
TextAlignment="Center" TextAlignment="Center"
TextWrapping="Wrap" TextWrapping="Wrap" />
FontSize="10" <TextBlock
LineHeight="12" /> Name="AmiiboLabel"
<TextBlock Width="200"
Name="AmiiboLabel" HorizontalAlignment="Center"
HorizontalAlignment="Center" FontSize="10"
Width="200" LineHeight="12"
PointerPressed="AmiiboLabel_OnPointerPressed" PointerPressed="AmiiboLabel_OnPointerPressed"
Text="{locale:Locale AboutAmiiboDisclaimerMessage}" Text="{locale:Locale AboutAmiiboDisclaimerMessage}"
TextAlignment="Center" TextAlignment="Center"
TextWrapping="Wrap" TextWrapping="Wrap" />
FontSize="10" <StackPanel
LineHeight="12" /> HorizontalAlignment="Center"
<StackPanel Orientation="Horizontal"
HorizontalAlignment="Center" Spacing="10">
Orientation="Horizontal" <Button
Spacing="10"> MinWidth="30"
<Button MinHeight="30"
MaxHeight="30" MaxWidth="30"
MaxWidth="30" MaxHeight="30"
MinHeight="30" Padding="8"
MinWidth="30" Background="Transparent"
Padding="8" Click="Button_OnClick"
CornerRadius="15" CornerRadius="15"
Background="Transparent" Tag="https://www.patreon.com/ryujinx"
Click="Button_OnClick" ToolTip.Tip="{locale:Locale AboutPatreonUrlTooltipMessage}">
Tag="https://www.patreon.com/ryujinx" <Image Source="{Binding PatreonLogo}" />
ToolTip.Tip="{locale:Locale AboutPatreonUrlTooltipMessage}"> </Button>
<Image Source="{Binding PatreonLogo}" /> <Button
</Button> MinWidth="30"
<Button MinHeight="30"
MaxHeight="30" MaxWidth="30"
MaxWidth="30" MaxHeight="30"
MinHeight="30" Padding="8"
MinWidth="30" Background="Transparent"
Padding="8" Click="Button_OnClick"
CornerRadius="15" CornerRadius="15"
Background="Transparent" Tag="https://github.com/Ryujinx/Ryujinx"
Click="Button_OnClick" ToolTip.Tip="{locale:Locale AboutGithubUrlTooltipMessage}">
Tag="https://github.com/Ryujinx/Ryujinx" <Image Source="{Binding GithubLogo}" />
ToolTip.Tip="{locale:Locale AboutGithubUrlTooltipMessage}"> </Button>
<Image Source="{Binding GithubLogo}" /> <Button
</Button> MinWidth="30"
<Button MinHeight="30"
MaxHeight="30" MaxWidth="30"
MaxWidth="30" MaxHeight="30"
MinHeight="30" Padding="8"
MinWidth="30" Background="Transparent"
Padding="8" Click="Button_OnClick"
CornerRadius="15" CornerRadius="15"
Background="Transparent" Tag="https://discordapp.com/invite/N2FmfVc"
Click="Button_OnClick" ToolTip.Tip="{locale:Locale AboutDiscordUrlTooltipMessage}">
Tag="https://discordapp.com/invite/N2FmfVc" <Image Source="{Binding DiscordLogo}" />
ToolTip.Tip="{locale:Locale AboutDiscordUrlTooltipMessage}"> </Button>
<Image Source="{Binding DiscordLogo}" /> <Button
</Button> MinWidth="30"
<Button MinHeight="30"
MaxHeight="30" MaxWidth="30"
MaxWidth="30" MaxHeight="30"
MinHeight="30" Padding="8"
MinWidth="30" Background="Transparent"
Padding="8" Click="Button_OnClick"
CornerRadius="15" CornerRadius="15"
Background="Transparent" Tag="https://twitter.com/RyujinxEmu"
Click="Button_OnClick" ToolTip.Tip="{locale:Locale AboutTwitterUrlTooltipMessage}">
Tag="https://twitter.com/RyujinxEmu" <Image Source="{Binding TwitterLogo}" />
ToolTip.Tip="{locale:Locale AboutTwitterUrlTooltipMessage}"> </Button>
<Image Source="{Binding TwitterLogo}" /> <Button
</Button> MinWidth="30"
<Button MinHeight="30"
MaxHeight="30" MaxWidth="30"
MaxWidth="30" MaxHeight="30"
MinHeight="30" Padding="8"
MinWidth="30" Background="Transparent"
Padding="8" Click="Button_OnClick"
CornerRadius="15" CornerRadius="15"
Background="Transparent" Tag="https://www.ryujinx.org"
Click="Button_OnClick" ToolTip.Tip="{locale:Locale AboutUrlTooltipMessage}">
Tag="https://www.ryujinx.org" <ui:SymbolIcon Foreground="{DynamicResource ThemeForegroundColor}" Symbol="Link" />
ToolTip.Tip="{locale:Locale AboutUrlTooltipMessage}"> </Button>
<ui:SymbolIcon </StackPanel>
Symbol="Link" </StackPanel>
Foreground="{DynamicResource ThemeForegroundColor}" /> </Grid>
</Button> <Border
</StackPanel>
</StackPanel>
</Grid>
<Border
Grid.Column="1" Grid.Column="1"
Width="1" Width="1"
Margin="20,0"
VerticalAlignment="Stretch" VerticalAlignment="Stretch"
BorderBrush="{DynamicResource ThemeControlBorderColor}" BorderBrush="{DynamicResource ThemeControlBorderColor}"
BorderThickness="1,0,0,0" BorderThickness="1,0,0,0" />
Margin="20 0"/> <Grid
<Grid
Grid.Column="2" Grid.Column="2"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"> VerticalAlignment="Stretch">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<StackPanel <StackPanel
Grid.Row="0" Grid.Row="0"
Margin="0 10 0 0" Margin="0,10,0,0"
Spacing="2"> Spacing="2">
<TextBlock <TextBlock
FontWeight="Bold" FontSize="15"
FontSize="15" FontWeight="Bold"
Text="{locale:Locale AboutRyujinxAboutTitle}" /> Text="{locale:Locale AboutRyujinxAboutTitle}" />
<TextBlock <TextBlock
FontSize="10" FontSize="10"
TextWrapping="Wrap" Text="{locale:Locale AboutRyujinxAboutContent}"
Text="{locale:Locale AboutRyujinxAboutContent}" /> TextWrapping="Wrap" />
</StackPanel> </StackPanel>
<StackPanel <StackPanel
Grid.Row="1" Grid.Row="1"
Margin="0 10 0 0" Margin="0,10,0,0"
Spacing="2"> Spacing="2">
<TextBlock <TextBlock
FontWeight="Bold" FontSize="15"
FontSize="15" FontWeight="Bold"
Text="{locale:Locale AboutRyujinxMaintainersTitle}" /> Text="{locale:Locale AboutRyujinxMaintainersTitle}" />
<TextBlock <TextBlock
FontSize="10" FontSize="10"
TextWrapping="Wrap" Text="{Binding Developers}"
Text="{Binding Developers}" /> TextWrapping="Wrap" />
<Button <Button
HorizontalAlignment="Left" Padding="5"
Background="Transparent" HorizontalAlignment="Left"
Click="Button_OnClick" Background="Transparent"
Padding="5" Click="Button_OnClick"
Tag="https://github.com/Ryujinx/Ryujinx/graphs/contributors?type=a"> Tag="https://github.com/Ryujinx/Ryujinx/graphs/contributors?type=a">
<TextBlock <TextBlock
FontSize="10" FontSize="10"
Text="{locale:Locale AboutRyujinxContributorsButtonHeader}" Text="{locale:Locale AboutRyujinxContributorsButtonHeader}"
TextAlignment="Right" TextAlignment="Right"
ToolTip.Tip="{locale:Locale AboutRyujinxMaintainersContentTooltipMessage}" /> ToolTip.Tip="{locale:Locale AboutRyujinxMaintainersContentTooltipMessage}" />
</Button> </Button>
</StackPanel> </StackPanel>
<StackPanel <StackPanel
Grid.Row="2" Grid.Row="2"
Margin="0 10 0 0" Margin="0,10,0,0"
Spacing="2"> Spacing="2">
<TextBlock <TextBlock
FontWeight="Bold" FontSize="15"
FontSize="15" FontWeight="Bold"
Text="{locale:Locale AboutRyujinxSupprtersTitle}" /> Text="{locale:Locale AboutRyujinxSupprtersTitle}" />
<ScrollViewer <ScrollViewer
VerticalScrollBarVisibility="Visible" Height="70"
HorizontalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Disabled"
Height="70"> VerticalScrollBarVisibility="Visible">
<TextBlock <TextBlock
Name="SupportersTextBlock" Name="SupportersTextBlock"
VerticalAlignment="Top" VerticalAlignment="Top"
FontSize="10" FontSize="10"
TextWrapping="Wrap" Text="{Binding Supporters}"
Text="{Binding Supporters}" /> TextWrapping="Wrap" />
</ScrollViewer> </ScrollViewer>
</StackPanel> </StackPanel>
</Grid> </Grid>
</Grid> </Grid>
</UserControl> </UserControl>

View File

@ -4,6 +4,7 @@ using Avalonia.Interactivity;
using Avalonia.Styling; using Avalonia.Styling;
using FluentAvalonia.UI.Controls; using FluentAvalonia.UI.Controls;
using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.Ui.Common.Helper; using Ryujinx.Ui.Common.Helper;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -22,14 +23,12 @@ namespace Ryujinx.Ava.UI.Windows
public static async Task Show() public static async Task Show()
{ {
var content = new AboutWindow();
ContentDialog contentDialog = new() ContentDialog contentDialog = new()
{ {
PrimaryButtonText = "", PrimaryButtonText = "",
SecondaryButtonText = "", SecondaryButtonText = "",
CloseButtonText = LocaleManager.Instance[LocaleKeys.UserProfilesClose], CloseButtonText = LocaleManager.Instance[LocaleKeys.UserProfilesClose],
Content = content Content = new AboutWindow()
}; };
Style closeButton = new(x => x.Name("CloseButton")); Style closeButton = new(x => x.Name("CloseButton"));
@ -41,7 +40,7 @@ namespace Ryujinx.Ava.UI.Windows
contentDialog.Styles.Add(closeButton); contentDialog.Styles.Add(closeButton);
contentDialog.Styles.Add(closeButtonParent); contentDialog.Styles.Add(closeButtonParent);
await contentDialog.ShowAsync(); await ContentDialogHelper.ShowAsync(contentDialog);
} }
private void Button_OnClick(object sender, RoutedEventArgs e) private void Button_OnClick(object sender, RoutedEventArgs e)