mirror of
https://github.com/2dust/v2rayN.git
synced 2026-04-16 04:25:45 +00:00
Add json editor
This commit is contained in:
parent
214a09bc48
commit
d9c6307cb9
12 changed files with 193 additions and 0 deletions
|
|
@ -9,6 +9,7 @@
|
|||
<PackageVersion Include="Avalonia.Controls.DataGrid" Version="11.3.12" />
|
||||
<PackageVersion Include="Avalonia.Desktop" Version="11.3.12" />
|
||||
<PackageVersion Include="Avalonia.Diagnostics" Version="11.3.12" />
|
||||
<PackageVersion Include="AvaloniaEdit.TextMate" Version="11.4.1" />
|
||||
<PackageVersion Include="ReactiveUI.Avalonia" Version="11.4.12" />
|
||||
<PackageVersion Include="CliWrap" Version="3.10.0" />
|
||||
<PackageVersion Include="Downloader" Version="5.1.0" />
|
||||
|
|
@ -25,6 +26,7 @@
|
|||
<PackageVersion Include="NLog" Version="6.1.1" />
|
||||
<PackageVersion Include="sqlite-net-pcl" Version="1.9.172" />
|
||||
<PackageVersion Include="TaskScheduler" Version="2.12.2" />
|
||||
<PackageVersion Include="TextMateSharp.Grammars" Version="2.0.3" />
|
||||
<PackageVersion Include="WebDav.Client" Version="2.9.0" />
|
||||
<PackageVersion Include="YamlDotNet" Version="16.3.0" />
|
||||
<PackageVersion Include="ZXing.Net.Bindings.SkiaSharp" Version="0.16.14" />
|
||||
|
|
|
|||
36
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
36
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
|
|
@ -924,6 +924,42 @@ namespace ServiceLib.Resx {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Copy 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string menuEditCopy {
|
||||
get {
|
||||
return ResourceManager.GetString("menuEditCopy", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Format 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string menuEditFormat {
|
||||
get {
|
||||
return ResourceManager.GetString("menuEditFormat", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Paste 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string menuEditPaste {
|
||||
get {
|
||||
return ResourceManager.GetString("menuEditPaste", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Select all 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string menuEditSelectAll {
|
||||
get {
|
||||
return ResourceManager.GetString("menuEditSelectAll", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Edit 的本地化字符串。
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -1668,4 +1668,16 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
|
|||
<data name="menuGenRegionGroup" xml:space="preserve">
|
||||
<value>Group by Region</value>
|
||||
</data>
|
||||
<data name="menuEditCopy" xml:space="preserve">
|
||||
<value>کپی</value>
|
||||
</data>
|
||||
<data name="menuEditSelectAll" xml:space="preserve">
|
||||
<value>انتخاب همه</value>
|
||||
</data>
|
||||
<data name="menuEditPaste" xml:space="preserve">
|
||||
<value>Paste</value>
|
||||
</data>
|
||||
<data name="menuEditFormat" xml:space="preserve">
|
||||
<value>Format</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
@ -1665,4 +1665,16 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
|
|||
<data name="menuGenRegionGroup" xml:space="preserve">
|
||||
<value>Group by Region</value>
|
||||
</data>
|
||||
<data name="menuEditCopy" xml:space="preserve">
|
||||
<value>Copier</value>
|
||||
</data>
|
||||
<data name="menuEditSelectAll" xml:space="preserve">
|
||||
<value>Tout sélect</value>
|
||||
</data>
|
||||
<data name="menuEditPaste" xml:space="preserve">
|
||||
<value>Paste</value>
|
||||
</data>
|
||||
<data name="menuEditFormat" xml:space="preserve">
|
||||
<value>Format</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
@ -1668,4 +1668,16 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
|
|||
<data name="menuGenRegionGroup" xml:space="preserve">
|
||||
<value>Group by Region</value>
|
||||
</data>
|
||||
<data name="menuEditCopy" xml:space="preserve">
|
||||
<value>Másolás</value>
|
||||
</data>
|
||||
<data name="menuEditSelectAll" xml:space="preserve">
|
||||
<value>Összes kijelölése</value>
|
||||
</data>
|
||||
<data name="menuEditPaste" xml:space="preserve">
|
||||
<value>Paste</value>
|
||||
</data>
|
||||
<data name="menuEditFormat" xml:space="preserve">
|
||||
<value>Format</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
@ -1668,4 +1668,16 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
|
|||
<data name="menuGenRegionGroup" xml:space="preserve">
|
||||
<value>Group by Region</value>
|
||||
</data>
|
||||
<data name="menuEditCopy" xml:space="preserve">
|
||||
<value>Copy</value>
|
||||
</data>
|
||||
<data name="menuEditSelectAll" xml:space="preserve">
|
||||
<value>Select all</value>
|
||||
</data>
|
||||
<data name="menuEditPaste" xml:space="preserve">
|
||||
<value>Paste</value>
|
||||
</data>
|
||||
<data name="menuEditFormat" xml:space="preserve">
|
||||
<value>Format</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
@ -1668,4 +1668,16 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
|
|||
<data name="menuGenRegionGroup" xml:space="preserve">
|
||||
<value>Group by Region</value>
|
||||
</data>
|
||||
<data name="menuEditCopy" xml:space="preserve">
|
||||
<value>Скопировать</value>
|
||||
</data>
|
||||
<data name="menuEditSelectAll" xml:space="preserve">
|
||||
<value>Выбрать все</value>
|
||||
</data>
|
||||
<data name="menuEditPaste" xml:space="preserve">
|
||||
<value>Paste</value>
|
||||
</data>
|
||||
<data name="menuEditFormat" xml:space="preserve">
|
||||
<value>Format</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
@ -1665,4 +1665,16 @@
|
|||
<data name="menuGenRegionGroup" xml:space="preserve">
|
||||
<value>按地区分组</value>
|
||||
</data>
|
||||
<data name="menuEditCopy" xml:space="preserve">
|
||||
<value>复制</value>
|
||||
</data>
|
||||
<data name="menuEditSelectAll" xml:space="preserve">
|
||||
<value>全选</value>
|
||||
</data>
|
||||
<data name="menuEditPaste" xml:space="preserve">
|
||||
<value>粘贴</value>
|
||||
</data>
|
||||
<data name="menuEditFormat" xml:space="preserve">
|
||||
<value>格式化</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
@ -1665,4 +1665,16 @@
|
|||
<data name="menuGenRegionGroup" xml:space="preserve">
|
||||
<value>按區域分組</value>
|
||||
</data>
|
||||
<data name="menuEditCopy" xml:space="preserve">
|
||||
<value>複製</value>
|
||||
</data>
|
||||
<data name="menuEditSelectAll" xml:space="preserve">
|
||||
<value>全選</value>
|
||||
</data>
|
||||
<data name="menuEditPaste" xml:space="preserve">
|
||||
<value>Paste</value>
|
||||
</data>
|
||||
<data name="menuEditFormat" xml:space="preserve">
|
||||
<value>Format</value>
|
||||
</data>
|
||||
</root>
|
||||
23
v2rayN/v2rayN.Desktop/Views/JsonEditor.axaml
Normal file
23
v2rayN/v2rayN.Desktop/Views/JsonEditor.axaml
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
<UserControl
|
||||
x:Class="v2rayN.Desktop.Views.JsonEditor"
|
||||
xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:ae="clr-namespace:AvaloniaEdit;assembly=AvaloniaEdit"
|
||||
xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib">
|
||||
|
||||
<ae:TextEditor
|
||||
Name="Editor"
|
||||
FontFamily="Cascadia Code,Consolas,Monospace"
|
||||
FontSize="14"
|
||||
ShowLineNumbers="True">
|
||||
<ae:TextEditor.ContextMenu>
|
||||
<ContextMenu>
|
||||
<MenuItem Click="FormatJson_Click" Header="{x:Static resx:ResUI.menuEditFormat}" />
|
||||
<Separator />
|
||||
<MenuItem Click="Copy_Click" Header="{x:Static resx:ResUI.menuEditCopy}" />
|
||||
<MenuItem Click="Paste_Click" Header="{x:Static resx:ResUI.menuEditPaste}" />
|
||||
<MenuItem Click="SelectAll_Click" Header="{x:Static resx:ResUI.menuEditSelectAll}" />
|
||||
</ContextMenu>
|
||||
</ae:TextEditor.ContextMenu>
|
||||
</ae:TextEditor>
|
||||
</UserControl>
|
||||
46
v2rayN/v2rayN.Desktop/Views/JsonEditor.axaml.cs
Normal file
46
v2rayN/v2rayN.Desktop/Views/JsonEditor.axaml.cs
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
using System.Text.Json;
|
||||
using AvaloniaEdit.TextMate;
|
||||
using TextMateSharp.Grammars;
|
||||
|
||||
namespace v2rayN.Desktop.Views;
|
||||
|
||||
public partial class JsonEditor : UserControl
|
||||
{
|
||||
private static readonly JsonSerializerOptions SIndentedOptions = new() { WriteIndented = true };
|
||||
|
||||
public JsonEditor()
|
||||
{
|
||||
InitializeComponent();
|
||||
var currentTheme = Application.Current?.ActualThemeVariant;
|
||||
var themeName = currentTheme == ThemeVariant.Dark ? ThemeName.DarkPlus :
|
||||
currentTheme == ThemeVariant.Light ? ThemeName.LightPlus :
|
||||
ThemeName.DarkPlus;
|
||||
var jsonRegistryOptions = new RegistryOptions(themeName);
|
||||
var grammarScopeName = jsonRegistryOptions.GetScopeByLanguageId(jsonRegistryOptions.GetLanguageByExtension(".json").Id);
|
||||
Editor.InstallTextMate(jsonRegistryOptions).SetGrammar(grammarScopeName);
|
||||
Editor.TextArea.TextView.Options.EnableHyperlinks = false;
|
||||
}
|
||||
|
||||
public string Text
|
||||
{
|
||||
get => Editor.Text;
|
||||
set => Editor.Text = value;
|
||||
}
|
||||
|
||||
private void FormatJson_Click(object? sender, RoutedEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
var obj = JsonUtils.ParseJson(Editor.Text);
|
||||
Editor.Text = JsonUtils.Serialize(obj, SIndentedOptions);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// ignored
|
||||
}
|
||||
}
|
||||
|
||||
private void Copy_Click(object? sender, RoutedEventArgs e) => Editor.Copy();
|
||||
private void Paste_Click(object? sender, RoutedEventArgs e) => Editor.Paste();
|
||||
private void SelectAll_Click(object? sender, RoutedEventArgs e) => Editor.SelectAll();
|
||||
}
|
||||
|
|
@ -15,6 +15,7 @@
|
|||
</PackageReference>
|
||||
<PackageReference Include="Avalonia.Desktop" />
|
||||
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" />
|
||||
<PackageReference Include="AvaloniaEdit.TextMate" />
|
||||
<PackageReference Include="ReactiveUI.Avalonia" />
|
||||
<PackageReference Include="MessageBox.Avalonia" />
|
||||
<PackageReference Include="Semi.Avalonia" />
|
||||
|
|
@ -28,6 +29,7 @@
|
|||
<PackageReference Include="ReactiveUI.Fody">
|
||||
<TreatAsUsed>true</TreatAsUsed>
|
||||
</PackageReference>
|
||||
<PackageReference Include="TextMateSharp.Grammars" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
|||
Loading…
Reference in a new issue