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