mirror of
https://github.com/2dust/v2rayN.git
synced 2026-04-18 13:35:47 +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.Controls.DataGrid" Version="11.3.12" />
|
||||||
<PackageVersion Include="Avalonia.Desktop" Version="11.3.12" />
|
<PackageVersion Include="Avalonia.Desktop" Version="11.3.12" />
|
||||||
<PackageVersion Include="Avalonia.Diagnostics" 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="ReactiveUI.Avalonia" Version="11.4.12" />
|
||||||
<PackageVersion Include="CliWrap" Version="3.10.0" />
|
<PackageVersion Include="CliWrap" Version="3.10.0" />
|
||||||
<PackageVersion Include="Downloader" Version="5.1.0" />
|
<PackageVersion Include="Downloader" Version="5.1.0" />
|
||||||
|
|
@ -25,6 +26,7 @@
|
||||||
<PackageVersion Include="NLog" Version="6.1.1" />
|
<PackageVersion Include="NLog" Version="6.1.1" />
|
||||||
<PackageVersion Include="sqlite-net-pcl" Version="1.9.172" />
|
<PackageVersion Include="sqlite-net-pcl" Version="1.9.172" />
|
||||||
<PackageVersion Include="TaskScheduler" Version="2.12.2" />
|
<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="WebDav.Client" Version="2.9.0" />
|
||||||
<PackageVersion Include="YamlDotNet" Version="16.3.0" />
|
<PackageVersion Include="YamlDotNet" Version="16.3.0" />
|
||||||
<PackageVersion Include="ZXing.Net.Bindings.SkiaSharp" Version="0.16.14" />
|
<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>
|
/// <summary>
|
||||||
/// 查找类似 Edit 的本地化字符串。
|
/// 查找类似 Edit 的本地化字符串。
|
||||||
/// </summary>
|
/// </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">
|
<data name="menuGenRegionGroup" xml:space="preserve">
|
||||||
<value>Group by Region</value>
|
<value>Group by Region</value>
|
||||||
</data>
|
</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>
|
</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">
|
<data name="menuGenRegionGroup" xml:space="preserve">
|
||||||
<value>Group by Region</value>
|
<value>Group by Region</value>
|
||||||
</data>
|
</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>
|
</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">
|
<data name="menuGenRegionGroup" xml:space="preserve">
|
||||||
<value>Group by Region</value>
|
<value>Group by Region</value>
|
||||||
</data>
|
</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>
|
</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">
|
<data name="menuGenRegionGroup" xml:space="preserve">
|
||||||
<value>Group by Region</value>
|
<value>Group by Region</value>
|
||||||
</data>
|
</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>
|
</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">
|
<data name="menuGenRegionGroup" xml:space="preserve">
|
||||||
<value>Group by Region</value>
|
<value>Group by Region</value>
|
||||||
</data>
|
</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>
|
</root>
|
||||||
|
|
@ -1665,4 +1665,16 @@
|
||||||
<data name="menuGenRegionGroup" xml:space="preserve">
|
<data name="menuGenRegionGroup" xml:space="preserve">
|
||||||
<value>按地区分组</value>
|
<value>按地区分组</value>
|
||||||
</data>
|
</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>
|
</root>
|
||||||
|
|
@ -1665,4 +1665,16 @@
|
||||||
<data name="menuGenRegionGroup" xml:space="preserve">
|
<data name="menuGenRegionGroup" xml:space="preserve">
|
||||||
<value>按區域分組</value>
|
<value>按區域分組</value>
|
||||||
</data>
|
</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>
|
</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>
|
||||||
<PackageReference Include="Avalonia.Desktop" />
|
<PackageReference Include="Avalonia.Desktop" />
|
||||||
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" />
|
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" />
|
||||||
|
<PackageReference Include="AvaloniaEdit.TextMate" />
|
||||||
<PackageReference Include="ReactiveUI.Avalonia" />
|
<PackageReference Include="ReactiveUI.Avalonia" />
|
||||||
<PackageReference Include="MessageBox.Avalonia" />
|
<PackageReference Include="MessageBox.Avalonia" />
|
||||||
<PackageReference Include="Semi.Avalonia" />
|
<PackageReference Include="Semi.Avalonia" />
|
||||||
|
|
@ -28,6 +29,7 @@
|
||||||
<PackageReference Include="ReactiveUI.Fody">
|
<PackageReference Include="ReactiveUI.Fody">
|
||||||
<TreatAsUsed>true</TreatAsUsed>
|
<TreatAsUsed>true</TreatAsUsed>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
|
<PackageReference Include="TextMateSharp.Grammars" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue