WIn_RustTools/Editor/EditorTreeView.cs
muqing 80e402e386 优化标签页管理和事件处理逻辑
在 `EditorTreeView.cs` 文件中:
- 增加了检查是否存在相同标签页的逻辑,并在存在时选中该标签页。
- 增加了 `SelectedItem` 事件,用于在标签页已经存在时触发。
- 在添加新的 `TabViewItem` 时,增加了 `Tag` 属性以存储文件路径。

在 `EditorWin.xaml.cs` 文件中:
- 修改了 `TabViewList` 和 `DataSource` 的初始化方式,从 `new()` 改为 `[]`。
- 在 `EditorWin` 的构造函数中,增加了对 `treeView.SelectedItem` 事件的处理逻辑。
- 在 `TreeView_AddTabItem` 方法中,增加了对 `codeEditorControl.KeyDown` 事件的处理逻辑,当按下 `Ctrl + S` 时,保存当前文件内容并清空撤销缓冲区。

在 `wj.cs` 文件中:
- 修改了 `xrwb` 方法的签名,将 `name` 参数改为可空类型,并增加了对 `name` 为空的检查逻辑,如果 `name` 为空则返回 `false`。

修复标签页选择逻辑并添加快捷键支持

在 `EditorTreeView.cs` 文件中:
- 在 `else` 分支中添加了检查是否已存在标签页的逻辑,如果存在则选中该标签页并返回。
- 在 `AddTabItem` 事件后添加了 `SelectedItem` 事件。

在 `EditorWin.xaml.cs` 文件中:
- 添加了 `Microsoft.UI.Input` 和 `Windows.System` 的引用。
- 将 `TabViewList` 和 `DataSource` 的初始化从 `new()` 改为 `[]`。
- 在 `treeView.SelectedItem` 事件中添加了选中标签页的逻辑。
- 在 `TreeView_AddTabItem` 方法中添加了对 `codeEditorControl.KeyDown` 事件的处理,支持 `Ctrl + S` 快捷键保存文件。

在 `wj.cs` 文件中:
- 修改了 `xrwb` 方法的签名,参数 `name` 允许为空,并在方法内部添加了对 `name` 为空的检查。
2025-01-22 16:24:37 +08:00

125 lines
4.6 KiB
C#

using System.Diagnostics;
using Microsoft.UI.Xaml.Controls;
using RustTools.muqing;
using WinUIEditor;
namespace RustTools.Editor;
public class EditorTreeView : Microsoft.UI.Xaml.Controls.TreeView
{
public EditorTreeView()
{
//点击事件
ItemInvoked += TreeView_ItemInvoked;
// TreeView.Expanding
//当用户点击小箭头展开节点时触发。
//TreeView.Collapsed
//当用户点击小箭头折叠节点时触发。
Expanding += TreeView_Expanding;
Collapsed += TreeView_Collapsed;
}
private void TreeView_ItemInvoked(Microsoft.UI.Xaml.Controls.TreeView sender, TreeViewItemInvokedEventArgs args)
{
// 获取触发点击的 TreeViewItem
//var treeViewItem = sender.ContainerFromItem(args.InvokedItem) as TreeViewItem;
if (args.InvokedItem is FileItem invokedItem)
{
if (invokedItem.IsFolder)
{
}
else
{
//检查是否存在此标签了
var a = EditorWin.TabViewList.FirstOrDefault(tabItem => tabItem.Tag != null && tabItem.Tag.ToString().Equals(invokedItem.Dir));
if (a!=null)
{
SelectedItem?.Invoke(a);
return;
}
Debug.WriteLine($"File clicked: {invokedItem.Name}");
var wb = wj.dqwb(invokedItem.Dir);
var codeEditorControl = new CodeEditorControl();
codeEditorControl.Editor.SetText(wb);
//codeEditorControl.Editor.SyntaxHighlighting = fileName.EndsWith(".json") ? "Json" : "CSharp";
EditorWin.TabViewList.Add(new TabViewItem()
{
Header = invokedItem.Name,
IconSource = new SymbolIconSource() { Symbol = Symbol.Document },
Content = codeEditorControl,Tag=invokedItem.Dir
});
//codeEditorControl.Editor.CanUndo
codeEditorControl.Editor.EmptyUndoBuffer();
codeEditorControl.Editor.AutoCCancelled += (sender, args) =>
{
Debug.WriteLine("AutoCCancelled");
};
// DefaultColorsChanged 监听的是颜色设置的变化(如主题的变化)。
//SyntaxHighlightingApplied 监听的是语法高亮的应用,通常在文本解析后触发。
AddTabItem?.Invoke(EditorWin.TabViewList[^1],codeEditorControl);
}
}
}
public event Action<TabViewItem,CodeEditorControl> AddTabItem;
public event Action<TabViewItem> SelectedItem;
// TreeView.Expanding 事件
private async void TreeView_Expanding(Microsoft.UI.Xaml.Controls.TreeView sender, TreeViewExpandingEventArgs args)
{
if (args.Item is FileItem expandingItem)
{
Debug.WriteLine($"Expanding: {expandingItem.Name}");
// 如果需要动态加载子项(仅当没有加载过子项时)
if (expandingItem.IsFolder)
{
expandingItem.Children.Clear();
var newChildren = await Task.Run(() => EditorLoad.GetData(expandingItem.Dir));
// 更新 Children 集合
foreach (var child in newChildren)
{
expandingItem.Children.Add(child);
}
Debug.WriteLine($"Loaded children for: {expandingItem.Name}");
}
}
}
// TreeView.Collapsed 事件
private void TreeView_Collapsed(Microsoft.UI.Xaml.Controls.TreeView sender, TreeViewCollapsedEventArgs args)
{
if (args.Item is FileItem collapsedItem)
{
// 清空子节点集合
if (collapsedItem.IsFolder && collapsedItem.Children != null)
{
// 设置当前项的所有子节点的 IsExpanded 为 false
//SetIsExpandedForChildren(collapsedItem, false);
Debug.WriteLine($"Children cleared for: {collapsedItem.Name}");
}
// 处理折叠事件(例如,清理子项、节省资源等)
}
}
// 递归设置子节点的 IsExpanded 为 false
private void SetIsExpandedForChildren(FileItem item, bool isExpanded)
{
foreach (var child in item.Children)
{
// 设置每个子项的 IsExpanded 状态
child.IsExpanded = isExpanded;
// 如果子项有子节点,递归处理
if (child.IsFolder && child.Children.Count > 0)
{
SetIsExpandedForChildren(child, isExpanded);
}
}
}
}