修复错误和交互问题

This commit is contained in:
ShrlAlgo
2025-09-04 10:18:07 +08:00
parent 5f24922f54
commit 647d72afab
2 changed files with 98 additions and 108 deletions

View File

@@ -1,8 +1,8 @@
using System;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq;
using System.Reflection; using System.Reflection;
using AddInManager.Properties; using AddInManager.Properties;
@@ -114,9 +114,9 @@ namespace AddInManager
Applications.Save(RevitIniFile); Applications.Save(RevitIniFile);
} }
public void SaveToLocal() public void SaveToLocal(AddinType addinTypeToSave)
{ {
SaveToLocalManifest(); SaveToLocalManifest(addinTypeToSave);
} }
public void SaveToLocalRevitIni() public void SaveToLocalRevitIni()
@@ -166,44 +166,37 @@ namespace AddInManager
return false; return false;
} }
public string SaveToAllUserManifest() public string SaveToAllUserManifest(AddinType addinTypeToSave)
{ {
var folderPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); var folderPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
var currentAddinFolder = Path.Combine(folderPath, $"Autodesk\\Revit\\Addins\\{App.RevitVersion}"); var currentAddinFolder = Path.Combine(folderPath, $"Autodesk\\Revit\\Addins\\{App.RevitVersion}");
var manifestFile = new ManifestFile(false); var manifestFile = new ManifestFile(false);
var numCmdAddins = 0; var numCmdAddins = 0;
Addin savedCmdAddin = null; Addin savedCmdAddin = null;
foreach (var cmdAddin in Commands.AddinDict.Values) if (addinTypeToSave == AddinType.Command)
{ {
if (cmdAddin.Save) foreach (var cmdAddin in Commands.AddinDict.Values.Where(a => a.Save))
{ {
numCmdAddins++; numCmdAddins++;
savedCmdAddin = cmdAddin; savedCmdAddin = cmdAddin;
} foreach (var addinItem in cmdAddin.ItemList.Where(i => i.Save))
foreach (var addinItem in cmdAddin.ItemList)
{
if (addinItem.Save)
{ {
manifestFile.Commands.Add(addinItem); manifestFile.Commands.Add(addinItem);
} }
} }
} }
var numAppAddins = 0; var numAppAddins = 0;
Addin savedAppAddin = null; Addin savedAppAddin = null;
foreach (var appAddin in Applications.AddinDict.Values) if (addinTypeToSave == AddinType.Application)
{ {
if (appAddin.Save) foreach (var appAddin in Applications.AddinDict.Values.Where(a => a.Save))
{ {
numCmdAddins++; numAppAddins++;
savedAppAddin = appAddin; savedAppAddin = appAddin;
} foreach (var appAddinItem in appAddin.ItemList.Where(i => i.Save))
foreach (var appAddinItem in appAddin.ItemList)
{
if (appAddinItem.Save)
{ {
manifestFile.Applications.Add(appAddinItem); manifestFile.Applications.Add(appAddinItem);
numAppAddins++;
savedAppAddin = appAddin;
} }
} }
} }
@@ -236,67 +229,37 @@ namespace AddInManager
return addinFilePath; return addinFilePath;
} }
public void SaveToLocalManifest() public void SaveToLocalManifest(AddinType addinTypeToSave)
{ {
var dictionary = new Dictionary<string, Addin>(); if (addinTypeToSave == AddinType.Command)
var dictionary2 = new Dictionary<string, Addin>();
foreach (var cmdKeyValuePair in Commands.AddinDict)
{ {
var key = cmdKeyValuePair.Key; foreach (var cmdKeyValuePair in Commands.AddinDict.Where(kv => kv.Value.Save))
var value = cmdKeyValuePair.Value;
var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(value.FilePath);
var directoryName = Path.GetDirectoryName(value.FilePath);
var text = Path.Combine(directoryName, $"{fileNameWithoutExtension}.addin");
var manifestFile = new ManifestFile(true);
foreach (var addinItem in value.ItemList)
{ {
if (addinItem.Save) var value = cmdKeyValuePair.Value;
var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(value.FilePath);
var directoryName = Path.GetDirectoryName(value.FilePath);
var text = Path.Combine(directoryName, $"{fileNameWithoutExtension}.addin");
var manifestFile = new ManifestFile(true);
foreach (var addinItem in value.ItemList.Where(i => i.Save))
{ {
manifestFile.Commands.Add(addinItem); manifestFile.Commands.Add(addinItem);
} }
manifestFile.SaveAs(text);
} }
if (Applications.AddinDict.ContainsKey(key))
{
var addin = Applications.AddinDict[key];
foreach (var addinItem2 in addin.ItemList)
{
if (addinItem2.Save)
{
manifestFile.Applications.Add(addinItem2);
}
}
dictionary.Add(key, Applications.AddinDict[key]);
}
manifestFile.SaveAs(text);
} }
foreach (var appKeyValuePair in Applications.AddinDict)
if (addinTypeToSave == AddinType.Application)
{ {
var key2 = appKeyValuePair.Key; foreach (var appKeyValuePair in Applications.AddinDict.Where(kv => kv.Value.Save))
var value2 = appKeyValuePair.Value;
if (!dictionary.ContainsKey(key2))
{ {
var value2 = appKeyValuePair.Value;
var fileNameWithoutExtension2 = Path.GetFileNameWithoutExtension(value2.FilePath); var fileNameWithoutExtension2 = Path.GetFileNameWithoutExtension(value2.FilePath);
var directoryName2 = Path.GetDirectoryName(value2.FilePath); var directoryName2 = Path.GetDirectoryName(value2.FilePath);
var text2 = Path.Combine(directoryName2, $"{fileNameWithoutExtension2}.addin"); var text2 = Path.Combine(directoryName2, $"{fileNameWithoutExtension2}.addin");
var manifestFile2 = new ManifestFile(true); var manifestFile2 = new ManifestFile(true);
foreach (var addinItem3 in value2.ItemList) foreach (var addinItem3 in value2.ItemList.Where(i => i.Save))
{ {
if (addinItem3.Save) manifestFile2.Applications.Add(addinItem3);
{
manifestFile2.Applications.Add(addinItem3);
}
}
if (Commands.AddinDict.ContainsKey(key2))
{
var addin2 = Commands.AddinDict[key2];
foreach (var addinItem4 in addin2.ItemList)
{
if (addinItem4.Save)
{
manifestFile2.Commands.Add(addinItem4);
}
}
dictionary2.Add(key2, Commands.AddinDict[key2]);
} }
manifestFile2.SaveAs(text2); manifestFile2.SaveAs(text2);
} }

View File

@@ -330,61 +330,70 @@ namespace AddInManager.Wpf
private void TreeViewCheckBox_Changed(object sender, RoutedEventArgs e) private void TreeViewCheckBox_Changed(object sender, RoutedEventArgs e)
{ {
if (sender is CheckBox checkBox) if (!(sender is CheckBox checkBox)) return;
var item = FindTreeViewItemFromCheckBox(checkBox);
if (item?.Tag == null) return;
// 区分是父节点还是子节点
if (item.Tag is Addin addin)
{ {
var item = FindTreeViewItemFromCheckBox(checkBox); // --- 父节点逻辑 ---
if (item == null) return; var newState = checkBox.IsChecked;
// 仅当父节点被用户明确点击为“选中”或“未选中”时,才更新所有子节点
var isChecked = checkBox.IsChecked == true; // 如果状态变为 null不确定则不执行任何操作因为它是由子节点更新引起的
if (newState.HasValue)
// 更新对应的数据模型
if (item.Tag is Addin addin)
{ {
var isChecked = newState.Value;
addin.Save = isChecked; addin.Save = isChecked;
// 父节点状态变化时,同步更新所有子节点
UpdateChildrenCheckBoxes(item, isChecked); UpdateChildrenCheckBoxes(item, isChecked);
} }
else if (item.Tag is AddinItem addinItem) else
{ {
addinItem.Save = isChecked; // 当状态为不确定时,我们认为它仍然有需要保存的项
addin.Save = true;
// 子节点状态变化时,检查是否需要更新父节点状态
UpdateParentCheckBoxState(item);
} }
// 保存更改
m_aim.AddinManager.SaveToAimIni();
} }
else if (item.Tag is AddinItem addinItem)
{
// --- 子节点逻辑 ---
var isChecked = checkBox.IsChecked == true;
addinItem.Save = isChecked;
// 更新父节点的状态
UpdateParentCheckBoxState(item);
}
// 保存更改到配置文件
m_aim.AddinManager.SaveToAimIni();
} }
private void UpdateChildrenCheckBoxes(TreeViewItem parentItem, bool isChecked) private void UpdateChildrenCheckBoxes(TreeViewItem parentItem, bool isChecked)
{ {
// 遍历所有子项并更新它们的状态
foreach (TreeViewItem childItem in parentItem.Items) foreach (TreeViewItem childItem in parentItem.Items)
{ {
// 更新子节点CheckBox状态
var childCheckBox = FindCheckBoxInTreeViewItem(childItem);
if (childCheckBox != null)
{
// 临时移除事件处理,避免递归调用
childCheckBox.Checked -= TreeViewCheckBox_Changed;
childCheckBox.Unchecked -= TreeViewCheckBox_Changed;
childCheckBox.IsChecked = isChecked;
// 重新添加事件处理
childCheckBox.Checked += TreeViewCheckBox_Changed;
childCheckBox.Unchecked += TreeViewCheckBox_Changed;
}
// 更新子节点数据模型
if (childItem.Tag is AddinItem addinItem) if (childItem.Tag is AddinItem addinItem)
{ {
// 更新数据模型
addinItem.Save = isChecked; addinItem.Save = isChecked;
// 更新UICheckBox
var childCheckBox = FindCheckBoxInTreeViewItem(childItem);
if (childCheckBox != null)
{
// 临时移除事件处理程序,防止无限递归
childCheckBox.Checked -= TreeViewCheckBox_Changed;
childCheckBox.Unchecked -= TreeViewCheckBox_Changed;
childCheckBox.IsChecked = isChecked;
// 重新附加事件处理程序
childCheckBox.Checked += TreeViewCheckBox_Changed;
childCheckBox.Unchecked += TreeViewCheckBox_Changed;
}
} }
} }
} }
private void UpdateParentCheckBoxState(TreeViewItem childItem) private void UpdateParentCheckBoxState(TreeViewItem childItem)
{ {
if (childItem.Parent is TreeViewItem parentItem) if (childItem.Parent is TreeViewItem parentItem)
@@ -443,7 +452,6 @@ namespace AddInManager.Wpf
} }
} }
} }
#endregion #endregion
private void LoadButton_Click(object sender, RoutedEventArgs e) private void LoadButton_Click(object sender, RoutedEventArgs e)
@@ -831,12 +839,14 @@ namespace AddInManager.Wpf
private void CommandsTreeView_MouseDoubleClick(object sender, MouseButtonEventArgs e) private void CommandsTreeView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{ {
if (e.ChangedButton != MouseButton.Left) return; if (e.ChangedButton != MouseButton.Left) return;
// 使用辅助方法 FindTreeViewItem 查找被双击的 TreeViewItem
var clickedItem = FindTreeViewItem(e.OriginalSource as DependencyObject);
var selectedItem = commandsTreeView.SelectedItem as TreeViewItem; // 确保双击的是一个有效的 TreeViewItem并且它是一个子节点没有子项
if (selectedItem != null && !HasChildren(selectedItem)) if (clickedItem != null && !HasChildren(clickedItem))
{ {
// 确保选中的是可执行的命令项 // 确保选中的是可执行的命令项 (AddinItem)
if (m_aim.ActiveCmdItem != null) if (clickedItem.Tag is AddinItem)
{ {
Run(); Run();
} }
@@ -845,6 +855,21 @@ namespace AddInManager.Wpf
ShowStatusError("选中的项目不是可执行的命令"); ShowStatusError("选中的项目不是可执行的命令");
} }
} }
// 如果双击的是空白区域或父节点,则不执行任何操作
//var selectedItem = commandsTreeView.SelectedItem as TreeViewItem;
//if (selectedItem != null && !HasChildren(selectedItem))
//{
// // 确保选中的是可执行的命令项
// if (m_aim.ActiveCmdItem != null)
// {
// Run();
// }
// else
// {
// ShowStatusError("选中的项目不是可执行的命令");
// }
//}
} }
private void SaveToAddinMenuItem_Click(object sender, RoutedEventArgs e) private void SaveToAddinMenuItem_Click(object sender, RoutedEventArgs e)
@@ -854,7 +879,8 @@ namespace AddInManager.Wpf
MessageBox.Show(Properties.Resources.NoItemsSelected, Properties.Resources.AppName, MessageBoxButton.OK, MessageBoxImage.Exclamation); MessageBox.Show(Properties.Resources.NoItemsSelected, Properties.Resources.AppName, MessageBoxButton.OK, MessageBoxImage.Exclamation);
return; return;
} }
m_aim.AddinManager.SaveToAllUserManifest(); var typeToSave = externalToolsTabControl.SelectedItem == commandsTabPage ? AddinType.Command : AddinType.Application;
m_aim.AddinManager.SaveToAllUserManifest(typeToSave);
ShowStatusLabel("保存成功,请关闭窗口加载插件"); ShowStatusLabel("保存成功,请关闭窗口加载插件");
} }
@@ -865,7 +891,8 @@ namespace AddInManager.Wpf
MessageBox.Show(Properties.Resources.NoItemsSelected, Properties.Resources.AppName, MessageBoxButton.OK, MessageBoxImage.Exclamation); MessageBox.Show(Properties.Resources.NoItemsSelected, Properties.Resources.AppName, MessageBoxButton.OK, MessageBoxImage.Exclamation);
return; return;
} }
m_aim.AddinManager.SaveToLocal(); var typeToSave = externalToolsTabControl.SelectedItem == commandsTabPage ? AddinType.Command : AddinType.Application;
m_aim.AddinManager.SaveToLocal(typeToSave);
ShowStatusLabel("保存成功"); ShowStatusLabel("保存成功");
} }