using System.Collections.ObjectModel; using System.Diagnostics; using System.Text.Encodings.Web; using System.Text.Json; using Microsoft.UI; using Microsoft.UI.Input; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Input; using Microsoft.UI.Xaml.Media; using RustTools.Helpers; using RustTools.muqing; using Windows.System; using Windows.UI.Core; using WinRT.Interop; using WinUIEditor; namespace RustTools.Editor; /// /// 编辑器主窗口 /// public sealed partial class EditorWin : WindowEx { public static ObservableCollection TabViewList = []; //目录列表 public ObservableCollection DataSource = []; /// /// 编辑器主窗口 /// 传入路径 /// /// public EditorWin(string path) { InitializeComponent(); gj.SetBackTheme(this); ExtendsContentIntoTitleBar = true; var frame = App.AppTitlebar as FrameworkElement; if (frame != null) { gj.UpdateTitleBar(this, frame.ActualTheme); page.RequestedTheme = frame.ActualTheme; } //Debug.WriteLine(path); var directoryInfo = new DirectoryInfo(path); Title = directoryInfo.Name; TitleText.Text = directoryInfo.Name; DataSource = EditorLoad.GetData(directoryInfo.FullName); treeView.ItemsSource = DataSource; Closed += EditorWin_Closed; //设置TabView的高度 gridedit.SizeChanged += (sender, args) => { tabview.Height = gridedit.ActualHeight - 10; }; tabview.TabItemsSource = TabViewList; treeView.AddTabItem += TreeView_AddTabItem; treeView.SelectedItem += (a) => { tabview.SelectedItem = a; }; } private void TreeView_AddTabItem(TabViewItem obj,CodeEditorControl codeEditorControl){ tabview.SelectedItem = obj; var title = obj.Header.ToString(); if (title == null) { return; } //修改了编辑器的内容 codeEditorControl.Editor.SavePointLeft += (sender, args) => { //是否有可以撤销的历史记录 obj.Header = $"{title} *"; }; codeEditorControl.PreviewKeyDown+= (sender, e) => { // 检查是否按下了 Ctrl 键 var isCtrlPressed = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Control) == CoreVirtualKeyStates.Down; var isALtPressed = InputKeyboardSource.GetKeyStateForCurrentThread(VirtualKey.Control) == CoreVirtualKeyStates.Down; // 检查是否按下了 Alt 键 // 检查是否按下了 J 键 if (e.Key == VirtualKey.S && isCtrlPressed) { // 执行 Ctrl + S 组合键对应的操作 //Debug.WriteLine("Ctrl + S pressed"); if (obj == null || string.IsNullOrEmpty(obj.Tag.ToString())) { return; } //Debug.WriteLine($"保存文件 {codeEditorControl.Editor.GetText(codeEditorControl.Editor.Length)}"); wj.xrwb(obj.Tag.ToString(), codeEditorControl.Editor.GetText(codeEditorControl.Editor.Length)); codeEditorControl.Editor.EmptyUndoBuffer(); obj.Header = title; e.Handled = true; // 标记事件已处理 } else if (e.Key == VirtualKey.L && isCtrlPressed && isALtPressed) { try { var text = codeEditorControl.Editor.GetText(codeEditorControl.Editor.Length); if (title.EndsWith(".json")) { // 格式化 JSON var jsonElement = JsonSerializer.Deserialize(text); var formattedJson = JsonSerializer.Serialize(jsonElement, new JsonSerializerOptions { WriteIndented = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping // 保留 UTF-8 字符 }); codeEditorControl.Editor.SetText(formattedJson); } } catch (Exception ex) { Debug.WriteLine(ex.ToString()); } e.Handled = true; // 标记事件已处理 } }; } //用户有没有保存 private bool IsSave = true; private ContentDialog? ClosedDialog = null; private async void EditorWin_Closed(object sender, WindowEventArgs e) { if (IsSave == false) { // 防止窗口关闭 e.Handled = true; } if (ClosedDialog != null) { return; } // 显示一个对话框,告知用户窗口不能关闭 ClosedDialog = new ContentDialog { XamlRoot = page.XamlRoot, Title = "警告", Content = "你还有未保存的文件在编译器中。", PrimaryButtonText = "保存关闭", PrimaryButtonStyle = Application.Current.Resources["AccentButtonStyle"] as Style, SecondaryButtonText = "直接关闭", CloseButtonText = "取消" }; var result = await ClosedDialog.ShowAsync(); if (result == ContentDialogResult.Primary) { IsSave = true; Application.Current.Exit(); return; } else if (result == ContentDialogResult.Secondary) { IsSave = true; Application.Current.Exit(); return; } ClosedDialog = null; } // 关闭选项卡 private void MyTabView_TabCloseRequested(TabView sender, TabViewTabCloseRequestedEventArgs args) { if (args.Tab is TabViewItem tab) { TabViewList.Remove(tab); } } }