Fix textboxes
This commit is contained in:
parent
5f047866d9
commit
86dcb439ee
|
@ -4,6 +4,7 @@
|
|||
*.7z
|
||||
*.pdn
|
||||
*.user
|
||||
*launchSettings.json
|
||||
*Thumbs.db
|
||||
|
||||
PbpResign/bin/*
|
||||
|
|
|
@ -42,11 +42,11 @@
|
|||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Avalonia" Version="0.10.18" />
|
||||
<PackageReference Include="Avalonia.Desktop" Version="0.10.18" />
|
||||
<PackageReference Include="Avalonia" Version="0.10.19" />
|
||||
<PackageReference Include="Avalonia.Desktop" Version="0.10.19" />
|
||||
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
|
||||
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="0.10.18" />
|
||||
<PackageReference Include="XamlNameReferenceGenerator" Version="1.5.1" />
|
||||
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="0.10.19" />
|
||||
<PackageReference Include="XamlNameReferenceGenerator" Version="1.6.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||
x:Class="ChovySign_GUI.Global.FilteredTextBox">
|
||||
<TextBox Name="txtBox" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
|
||||
</UserControl>
|
|
@ -0,0 +1,149 @@
|
|||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Input;
|
||||
using Avalonia.Interactivity;
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ChovySign_GUI.Global
|
||||
{
|
||||
public partial class FilteredTextBox : UserControl
|
||||
{
|
||||
|
||||
private string? allowedChars = null;
|
||||
|
||||
public event EventHandler<EventArgs>? TextChanged;
|
||||
protected virtual void OnTextChanged(EventArgs e)
|
||||
{
|
||||
if (TextChanged is not null)
|
||||
TextChanged(this, e);
|
||||
}
|
||||
|
||||
public int MaxLength
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.txtBox.MaxLength;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.txtBox.MaxLength = value;
|
||||
}
|
||||
}
|
||||
|
||||
public bool Password
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.txtBox.PasswordChar == default(char);
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value) this.txtBox.PasswordChar = 'X';
|
||||
else this.txtBox.PasswordChar = default(char);
|
||||
}
|
||||
}
|
||||
|
||||
public string Watermark
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.txtBox.Watermark;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.txtBox.Watermark = value;
|
||||
}
|
||||
}
|
||||
public string? AllowedChars
|
||||
{
|
||||
get
|
||||
{
|
||||
if (allowedChars is null) return "";
|
||||
else return allowedChars;
|
||||
}
|
||||
set
|
||||
{
|
||||
allowedChars = value;
|
||||
}
|
||||
}
|
||||
public string Text
|
||||
{
|
||||
get
|
||||
{
|
||||
if (this.txtBox.Text is null) return "";
|
||||
return this.txtBox.Text;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.txtBox.Text = value;
|
||||
}
|
||||
}
|
||||
public FilteredTextBox()
|
||||
{
|
||||
InitializeComponent();
|
||||
this.txtBox.PastingFromClipboard += onPaste;
|
||||
this.txtBox.AddHandler(TextInputEvent, onTxtInput, RoutingStrategies.Tunnel);
|
||||
}
|
||||
|
||||
|
||||
private string filter(string original)
|
||||
{
|
||||
if (allowedChars is not null)
|
||||
{
|
||||
StringBuilder str = new StringBuilder();
|
||||
|
||||
for (int i = 0; i < original.Length; i++)
|
||||
{
|
||||
if (allowedChars.Contains(original[i]))
|
||||
str.Append(original[i]);
|
||||
}
|
||||
|
||||
return str.ToString();
|
||||
}
|
||||
return original;
|
||||
}
|
||||
private async Task<bool> setClipboardText(string text)
|
||||
{
|
||||
if (Application.Current is null) return false;
|
||||
if (Application.Current.Clipboard is null) return false;
|
||||
await Application.Current.Clipboard.SetTextAsync(text);
|
||||
return true;
|
||||
}
|
||||
private async Task<string> getClipboardText()
|
||||
{
|
||||
if (Application.Current is null) return "";
|
||||
if (Application.Current.Clipboard is null) return "";
|
||||
string? clipboard = await Application.Current.Clipboard.GetTextAsync();
|
||||
if (clipboard is null) return "";
|
||||
return clipboard;
|
||||
}
|
||||
|
||||
private async void onPaste(object? sender, RoutedEventArgs e)
|
||||
{
|
||||
TextBox? txt = sender as TextBox;
|
||||
if (txt is null) return;
|
||||
|
||||
string clipboard = getClipboardText().Result;
|
||||
clipboard = filter(clipboard);
|
||||
_ = setClipboardText(clipboard).Result;
|
||||
|
||||
// annoyingly, the text being pasted isnt actually in the textbox yet
|
||||
// and it wont trigger a textInput event when pasting; t-this really is the best can do
|
||||
await Task.Delay(100);
|
||||
OnTextChanged(new EventArgs());
|
||||
}
|
||||
|
||||
private void onTxtInput(object? sender, TextInputEventArgs e)
|
||||
{
|
||||
string? newTxt = e.Text;
|
||||
if (newTxt is null) newTxt = "";
|
||||
|
||||
newTxt = filter(newTxt);
|
||||
e.Text = newTxt;
|
||||
|
||||
OnTextChanged(new EventArgs());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -2,6 +2,7 @@
|
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:Global="clr-namespace:ChovySign_GUI.Global"
|
||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="40"
|
||||
x:Class="ChovySign_GUI.Global.KeySelector">
|
||||
<!-- key selector -->
|
||||
|
@ -18,7 +19,7 @@
|
|||
<ColumnDefinition Width="1*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<Label HorizontalAlignment="Left" VerticalAlignment="Center" Content="Rif:" Grid.Column="0"/>
|
||||
<TextBox HorizontalAlignment="Stretch" Watermark="GAME.RIF" Name="zRif" Grid.Column="1"/>
|
||||
<Global:FilteredTextBox Name="zRif" AllowedChars="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=+/" HorizontalAlignment="Stretch" Watermark="LICENSE ZRIF" Grid.Column="1"/>
|
||||
</Grid>
|
||||
<Grid HorizontalAlignment="Stretch" Grid.Column="1">
|
||||
<Grid.ColumnDefinitions>
|
||||
|
@ -26,7 +27,7 @@
|
|||
<ColumnDefinition Width="1*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<Label HorizontalAlignment="Left" VerticalAlignment="Center" Content="Key:" Grid.Column="0"/>
|
||||
<TextBox HorizontalAlignment="Stretch" MaxLength="32" Watermark="Version Key" Name="vKey" Grid.Column="1"/>
|
||||
<Global:FilteredTextBox AllowedChars="1234567890ABCDEFabcdef" HorizontalAlignment="Stretch" MaxLength="32" Watermark="Version Key" Name="vKey" Grid.Column="1"/>
|
||||
</Grid>
|
||||
<Button Name="getKeys" Click="getKeysClick" Content="Get Keys" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="2"/>
|
||||
|
||||
|
|
|
@ -60,7 +60,6 @@ namespace ChovySign_GUI.Global
|
|||
if (zRif.Text is null) return false;
|
||||
if (zRif.Text.Length <= 0) return false;
|
||||
|
||||
byte[] key = MathUtil.StringToByteArray(vKey.Text);
|
||||
byte[] rif = new NpDrmRif(zRif.Text).Rif;
|
||||
if (rif.Length <= 0) return false;
|
||||
return (VersionKey is not null && Rif is not null);
|
||||
|
@ -245,15 +244,13 @@ namespace ChovySign_GUI.Global
|
|||
reloadCfg();
|
||||
lastValid = IsValid;
|
||||
|
||||
zRif.KeyDown += onZrifKeyDown;
|
||||
zRif.KeyUp += onZrifKeyDown;
|
||||
vKey.KeyDown += onVkeyKeyDown;
|
||||
vKey.KeyUp += onVkeyKeyDown;
|
||||
zRif.TextChanged += onZrifChanged;
|
||||
vKey.TextChanged += onVkeyChanged;
|
||||
}
|
||||
|
||||
private void onVkeyKeyDown(object? sender, Avalonia.Input.KeyEventArgs e)
|
||||
private void onVkeyChanged(object? sender, EventArgs e)
|
||||
{
|
||||
TextBox? txt = sender as TextBox;
|
||||
FilteredTextBox? txt = sender as FilteredTextBox;
|
||||
if (txt is null) return;
|
||||
|
||||
if (lastValid != IsValid)
|
||||
|
@ -269,9 +266,9 @@ namespace ChovySign_GUI.Global
|
|||
catch { };
|
||||
}
|
||||
|
||||
private void onZrifKeyDown(object? sender, KeyEventArgs e)
|
||||
private void onZrifChanged(object? sender, EventArgs e)
|
||||
{
|
||||
TextBox? txt = sender as TextBox;
|
||||
FilteredTextBox? txt = sender as FilteredTextBox;
|
||||
if (txt is null) return;
|
||||
|
||||
if (lastValid != IsValid)
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:Global="clr-namespace:ChovySign_GUI.Global"
|
||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="80"
|
||||
x:Class="ChovySign_GUI.Global.LabeledTextBox"
|
||||
Height="60">
|
||||
|
@ -11,6 +12,6 @@
|
|||
<RowDefinition Height="1*" />
|
||||
</Grid.RowDefinitions>
|
||||
<Label Name="lblTxt" Content="Label:" VerticalAlignment="Bottom" Grid.Row="0"/>
|
||||
<TextBox Name="txtBox" HorizontalAlignment="Stretch" VerticalAlignment="Center" Grid.Row="1"/>
|
||||
<Global:FilteredTextBox Name="txtBox" HorizontalAlignment="Stretch" VerticalAlignment="Center" Grid.Row="1"/>
|
||||
</Grid>
|
||||
</UserControl>
|
||||
|
|
|
@ -2,17 +2,16 @@
|
|||
using Avalonia.Controls;
|
||||
using Avalonia.Input;
|
||||
using Avalonia.Interactivity;
|
||||
using JetBrains.Annotations;
|
||||
using Org.BouncyCastle.Asn1.X509;
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ChovySign_GUI.Global
|
||||
{
|
||||
|
||||
public partial class LabeledTextBox : UserControl
|
||||
{
|
||||
private string lastTxt;
|
||||
private string? allowedChars = null;
|
||||
|
||||
public event EventHandler<EventArgs>? TextChanged;
|
||||
protected virtual void OnTextChanged(EventArgs e)
|
||||
|
@ -20,7 +19,6 @@ namespace ChovySign_GUI.Global
|
|||
if (TextChanged is not null)
|
||||
TextChanged(this, e);
|
||||
}
|
||||
|
||||
public int MaxLength
|
||||
{
|
||||
get
|
||||
|
@ -37,25 +35,11 @@ namespace ChovySign_GUI.Global
|
|||
{
|
||||
get
|
||||
{
|
||||
return this.txtBox.PasswordChar == default(char);
|
||||
return this.txtBox.Password;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value) this.txtBox.PasswordChar = 'X';
|
||||
else this.txtBox.PasswordChar = default(char);
|
||||
}
|
||||
}
|
||||
public string Label
|
||||
{
|
||||
get
|
||||
{
|
||||
string? lbl = this.lblTxt.Content as string;
|
||||
if (lbl is null) return "";
|
||||
else return lbl;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.lblTxt.Content = value;
|
||||
this.txtBox.Password = value;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -74,19 +58,17 @@ namespace ChovySign_GUI.Global
|
|||
{
|
||||
get
|
||||
{
|
||||
if (allowedChars is null) return "";
|
||||
else return allowedChars;
|
||||
return this.txtBox.AllowedChars;
|
||||
}
|
||||
set
|
||||
{
|
||||
allowedChars = value;
|
||||
this.txtBox.AllowedChars = value;
|
||||
}
|
||||
}
|
||||
public string Text
|
||||
{
|
||||
get
|
||||
{
|
||||
if (this.txtBox.Text is null) return "";
|
||||
return this.txtBox.Text;
|
||||
}
|
||||
set
|
||||
|
@ -94,63 +76,29 @@ namespace ChovySign_GUI.Global
|
|||
this.txtBox.Text = value;
|
||||
}
|
||||
}
|
||||
public string Label
|
||||
{
|
||||
get
|
||||
{
|
||||
string? lbl = this.lblTxt.Content as string;
|
||||
if (lbl is null) return "";
|
||||
else return lbl;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.lblTxt.Content = value;
|
||||
}
|
||||
}
|
||||
|
||||
public LabeledTextBox()
|
||||
{
|
||||
InitializeComponent();
|
||||
lastTxt = this.txtBox.Text;
|
||||
|
||||
this.txtBox.PastingFromClipboard += onPaste;
|
||||
this.txtBox.AddHandler(TextInputEvent, onTxtInput, RoutingStrategies.Tunnel);
|
||||
this.txtBox.TextChanged += onTxtBoxTextChange;
|
||||
}
|
||||
|
||||
private string filter(string original)
|
||||
private void onTxtBoxTextChange(object? sender, EventArgs e)
|
||||
{
|
||||
if (allowedChars is not null)
|
||||
{
|
||||
string newTxt = original.ToUpperInvariant();
|
||||
for (int i = 0; i < newTxt.Length; i++)
|
||||
{
|
||||
if (!allowedChars.Contains(newTxt[i]))
|
||||
{
|
||||
newTxt = newTxt.Replace(newTxt[i].ToString(), "");
|
||||
}
|
||||
}
|
||||
return newTxt;
|
||||
}
|
||||
else
|
||||
{
|
||||
return original;
|
||||
}
|
||||
}
|
||||
|
||||
private async void onPaste(object? sender, RoutedEventArgs e)
|
||||
{
|
||||
TextBox? txt = sender as TextBox;
|
||||
if (txt is null) return;
|
||||
if (Application.Current is null) return;
|
||||
if (Application.Current.Clipboard is null) return;
|
||||
|
||||
e.Handled = true;
|
||||
|
||||
string? newTxt = await Application.Current.Clipboard.GetTextAsync();
|
||||
if (newTxt is null) newTxt = "";
|
||||
|
||||
/*TextInputEventArgs txtInput = new TextInputEventArgs();
|
||||
txtInput.Text = filter(newTxt);*/
|
||||
|
||||
//txt.RaiseEvent(new RoutedEventArgs(txtInput));
|
||||
}
|
||||
|
||||
private void onTxtInput(object? sender, TextInputEventArgs e)
|
||||
{
|
||||
string? newTxt = e.Text;
|
||||
if (newTxt is null) newTxt = "";
|
||||
|
||||
newTxt = filter(newTxt);
|
||||
e.Text = newTxt;
|
||||
|
||||
if (newTxt != lastTxt) OnTextChanged(new EventArgs());
|
||||
lastTxt = newTxt;
|
||||
OnTextChanged(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
<RowDefinition Height="1*"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Global:LabeledTextBox Name="idpsInput" MaxLength="32" AllowedChars="1234567890ABCDEF" Label="IDPS / ConsoleID:" Watermark="00000001010200140C00000000000000" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Stretch"/>
|
||||
<Global:BrowseButton Name="rifFile" Extension="rif" FileTypeName="Rights Information" Label="LICENSE.RIF: (found @ ux0:/pspemu/PSP/LICENSE)" Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Stretch"/>
|
||||
<Global:LabeledTextBox Name="idpsInput" MaxLength="32" AllowedChars="1234567890ABCDEFabcdef" Label="IDPS / ConsoleID:" Watermark="00000001010200140C00025753578942" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Stretch"/>
|
||||
<Global:BrowseButton Name="rifFile" Extension="rif" FileTypeName="Rights Information File" Label="LICENSE.RIF: (found @ ux0:/pspemu/PSP/LICENSE)" Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Stretch"/>
|
||||
<Global:BrowseButton Name="actFile" Extension="dat" FileTypeName="Activation Data" Label="ACT.DAT: (found @ tm0:/npdrm/act.dat)" Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Stretch"/>
|
||||
|
||||
<Button Name="keyGen" Click="keyGenClick" Content="Generate Keys" Grid.Row="3" HorizontalAlignment="Center"/>
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<Grid>
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="0.2*" />
|
||||
<RowDefinition Height="40" />
|
||||
<RowDefinition Height="1.5*" />
|
||||
<RowDefinition Height="1.3*" />
|
||||
<RowDefinition Height="0.6*" />
|
||||
|
|
|
@ -57,7 +57,7 @@ namespace LibChovy.VersionKey
|
|||
{
|
||||
line = line.ReplaceLineEndings("");
|
||||
string[] data = line.Split(' ');
|
||||
if (data.Length != 4) continue;
|
||||
if (data.Length != 5) continue;
|
||||
|
||||
if (data[0].Equals(contentId, StringComparison.InvariantCultureIgnoreCase))
|
||||
return new NpDrmInfo(MathUtil.StringToByteArray(data[1 + keyIndex]), contentId, keyIndex);
|
||||
|
|
Loading…
Reference in New Issue