Skip to content

Commit b9f406a

Browse files
committed
新增从类中移除的功能;修复了有些菜单不会出现的BUG;修复了分类速度慢的BUG
1 parent ec5f21e commit b9f406a

6 files changed

Lines changed: 78 additions & 28 deletions

File tree

ChangeLog.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -571,4 +571,12 @@ UIFileDisplay部分属性将延迟初始化,几乎解决了文件及将显示
571571

572572
修复了当没有任何类时,在显示全部文件时右键菜单会崩溃的BUG
573573

574-
新增支持删除物理文件功能
574+
新增支持删除物理文件功能
575+
576+
## 20200827
577+
578+
新增从类中移除的功能
579+
580+
修复了有些菜单不会出现的BUG
581+
582+
修复了分类速度慢的BUG

ClassifyFiles.WPFCore/Config.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ public static bool ClearThumbsAfterExiting
278278

279279
public static bool ShowRing
280280
{
281-
get => Get(ref showRing, GetBool, true, nameof(ShowRing));
281+
get => Get(ref showRing, GetBool, false, nameof(ShowRing));
282282
set => Set(ref showRing, value, nameof(ShowRing));
283283
}
284284

ClassifyFiles.WPFCore/UI/Model/UIClass.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,14 @@ public void UpdateProperties()
1818
int count = GetFilesCountOfClass(Class);
1919
FileCount = count;
2020
MatchConditionsCount = Class.MatchConditions.Count;
21+
}
2122

23+
public async Task UpdatePropertiesAsync()
24+
{
25+
int count = 0;
26+
await Task.Run(() => count = GetFilesCountOfClass(Class));
27+
FileCount = count;
28+
MatchConditionsCount = Class.MatchConditions.Count;
2229
}
2330

2431
public Class Class { get; private set; }

ClassifyFiles.WPFCore/UI/Page/FileBrowserPanel.xaml.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ async Task Do()
168168
Debug.WriteLine("Set Files, Project Hashcode is " + Project.GetHashCode()
169169
+ ", Class is " + (classPanel.SelectedUIClass == null ? "null" : classPanel.SelectedUIClass.Class.Name));
170170
IEnumerable<UIFile> uiFiles = null;
171-
Class c = classPanel.SelectedUIClass?.Class;
171+
UIClass c = classPanel.SelectedUIClass;
172172
await Task.Run(() =>
173173
{
174174
try
@@ -189,7 +189,7 @@ await Task.Run(() =>
189189
Regex r = new Regex(FilterPattern);
190190
uiFiles = uiFiles.Where(p => r.IsMatch(p.File.Name));
191191
}
192-
uiFiles.ForEach(p => p.Class = c);
192+
uiFiles.ForEach(p => p.Class = c?.Class);
193193
result = true;
194194
});
195195
await filesViewer.SetFilesAsync(uiFiles, c, type);
@@ -220,7 +220,7 @@ await Task.Run(() =>
220220
{
221221
files = rawFiles;
222222
}
223-
await filesViewer.SetFilesAsync(files, classPanel.SelectedUIClass?.Class, filesViewer.FileCollectionType);
223+
await filesViewer.SetFilesAsync(files, classPanel.SelectedUIClass, filesViewer.FileCollectionType);
224224
await ApplyDirs();
225225
}
226226
}

ClassifyFiles.WPFCore/UI/Panel/FIlesViewer.xaml.cs

Lines changed: 54 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,9 @@ public ItemsControl FilesContent
126126
}
127127
}
128128

129-
private Class currentClass;
129+
private UIClass currentClass;
130130

131-
public Class CurrentClass
131+
public UIClass CurrentClass
132132
{
133133
get => currentClass; private set
134134
{
@@ -185,17 +185,20 @@ public ObservableCollection<UIFile> FileTree
185185

186186
#region 文件相关
187187

188+
/// <summary>
189+
/// 当前文件集合的类型
190+
/// </summary>
188191
public FileCollectionType FileCollectionType { get; private set; }
189192

190193
/// <summary>
191194
/// 设置文件
192195
/// </summary>
193196
/// <param name="files"></param>
194197
/// <returns></returns>
195-
public async Task SetFilesAsync(IEnumerable<UIFile> files, Class currentClass, FileCollectionType type)
198+
public async Task SetFilesAsync(IEnumerable<UIFile> files, UIClass currentClass, FileCollectionType type)
196199
{
197200
CurrentClass = currentClass;
198-
FileCollectionType = FileCollectionType;
201+
FileCollectionType = type;
199202
if (files == null || !files.Any())
200203
{
201204
//如果为空
@@ -217,7 +220,7 @@ await Task.Run(() =>
217220
}
218221
});
219222
await Dispatcher.InvokeAsync(() =>
220-
Files = uiFiles, System.Windows.Threading.DispatcherPriority.ApplicationIdle);
223+
Files = uiFiles, DispatcherPriority.ApplicationIdle);
221224
}
222225
if (CurrentFileView == FileView.Tree)
223226
{
@@ -945,12 +948,32 @@ private void ContextMenu_Opened(object sender, RoutedEventArgs e)
945948
menuCopy.Click += MenuCopy_Click;
946949
menu.Items.Add(menuCopy);
947950

948-
if (!IsSingleWindow)
951+
if (files.Count == 1)
952+
{
953+
MenuItem menuShowExifs = new MenuItem() { Header = "查看文件元数据" };
954+
menuShowExifs.Click += (p1, p2) =>
955+
new FileMetadataDialog(files[0].File.GetAbsolutePath()) { Owner = Window.GetWindow(this) }.ShowDialog();
956+
menu.Items.Add(menuShowExifs);
957+
958+
MenuItem menuShowProperties = new MenuItem() { Header = "属性" };
959+
menuShowProperties.Click += (p1, p2) =>
960+
FileProperty.ShowFileProperties(files[0].File.GetAbsolutePath());
961+
menu.Items.Add(menuShowProperties);
962+
}
963+
if (!IsSingleWindow)//位于主窗体
949964
{
965+
menu.Items.Add(new Separator());
950966
MenuItem menuDelete = new MenuItem() { Header = "删除文件" };
951967
menuDelete.Click += MenuDelete_Click;
952968
menu.Items.Add(menuDelete);
953969

970+
if (FileCollectionType == FileCollectionType.Class && CurrentClass != null)
971+
{
972+
MenuItem menuRemoveFromClass = new MenuItem() { Header = "从当前类中移出" };
973+
menuRemoveFromClass.Click += MenuRemoveFromClass_Click;
974+
menu.Items.Add(menuRemoveFromClass);
975+
}
976+
954977
if (FileCollectionType == FileCollectionType.Disabled || FileCollectionType == FileCollectionType.Manual)
955978
{
956979
MenuItem menuRecover = new MenuItem() { Header = "恢复为正常状态", ToolTip = "这将使文件被再次自动分类,剔除手动的任何成分" };
@@ -959,18 +982,6 @@ private void ContextMenu_Opened(object sender, RoutedEventArgs e)
959982
}
960983
}
961984

962-
if (files.Count == 1)
963-
{
964-
MenuItem menuShowExifs = new MenuItem() { Header = "查看文件元数据" };
965-
menuShowExifs.Click += (p1, p2) =>
966-
new FileMetadataDialog(files[0].File.GetAbsolutePath()) { Owner = Window.GetWindow(this) }.ShowDialog();
967-
menu.Items.Add(menuShowExifs);
968-
969-
MenuItem menuShowProperties = new MenuItem() { Header = "属性" };
970-
menuShowProperties.Click += (p1, p2) =>
971-
FileProperty.ShowFileProperties(files[0].File.GetAbsolutePath());
972-
menu.Items.Add(menuShowProperties);
973-
}
974985
var classesMenus = new List<CheckBox>();
975986
if (!IsSingleWindow && Project.Classes != null && Project.Classes.Count > 0)
976987
{
@@ -1010,14 +1021,14 @@ private void ContextMenu_Opened(object sender, RoutedEventArgs e)
10101021
int maxClassesMenuCount = 6;
10111022
if (CurrentClass != null && classesMenus.Count > maxClassesMenuCount)
10121023
{
1013-
if (classesMenus.All(p => (p.Tag as Class).GroupName == CurrentClass.GroupName))
1024+
if (classesMenus.All(p => (p.Tag as Class).GroupName == CurrentClass.Class.GroupName))
10141025
{
10151026
AddWithoutDiscrimination();
10161027
}
10171028
else
10181029
{
1019-
var sameGroup = classesMenus.Where(p => (p.Tag as Class).GroupName == CurrentClass.GroupName);
1020-
var otherGroup = classesMenus.Where(p => (p.Tag as Class).GroupName != CurrentClass.GroupName);
1030+
var sameGroup = classesMenus.Where(p => (p.Tag as Class).GroupName == CurrentClass.Class.GroupName);
1031+
var otherGroup = classesMenus.Where(p => (p.Tag as Class).GroupName != CurrentClass.Class.GroupName);
10211032
sameGroup.ForEach(p => menu.Items.Add(p));
10221033
MenuItem menuItem = new MenuItem() { Header = "其它分类" };
10231034
otherGroup.ForEach(p => menuItem.Items.Add(p));
@@ -1044,6 +1055,28 @@ void AddWithoutDiscrimination()
10441055
}
10451056
}
10461057

1058+
private async void MenuRemoveFromClass_Click(object sender, RoutedEventArgs e)
1059+
{
1060+
await MainWindow.Current.DoProcessAsync(Do());
1061+
async Task Do()
1062+
{
1063+
var files = GetSelectedFiles();
1064+
1065+
//从类中删除
1066+
await Task.Run(() => RemoveFilesFromClass(files.Select(p => p.File), CurrentClass.Class));
1067+
foreach (var file in files)
1068+
{
1069+
//var c = file.Classes.FirstOrDefault(p => p.ID == CurrentClass.ID);
1070+
//if (c != null)
1071+
//{
1072+
// file.Classes.Remove(c);
1073+
//}
1074+
Files.Remove(file);
1075+
}
1076+
await CurrentClass.UpdatePropertiesAsync();
1077+
}
1078+
}
1079+
10471080
private async void MenuRecover_Click(object sender, RoutedEventArgs e)
10481081
{
10491082
var files = GetSelectedFiles();

ClassifyFiles/Util/FileClassUtility.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ public static bool RemoveFilesFromClass(IEnumerable<File> files, Class c)
195195
{
196196
var existed = db.FileClasses
197197
.FirstOrDefault(p => p.File == file && p.Class == c && p.Status != FileClassStatus.Disabled);
198-
var test = db.FileClasses.Where(p => p.FileID == file.ID).ToList();
198+
// var test = db.FileClasses.Where(p => p.FileID == file.ID).ToList();
199199
if (existed != null)
200200
{
201201
//如果是手动添加的,那么直接删除记录
@@ -205,6 +205,7 @@ public static bool RemoveFilesFromClass(IEnumerable<File> files, Class c)
205205
}
206206
else
207207
{
208+
existed.Status = FileClassStatus.Disabled;
208209
db.Entry(existed).State = EntityState.Modified;
209210
}
210211
}
@@ -253,6 +254,7 @@ public static void UpdateFilesOfClasses(UpdateFilesArgs args)
253254
int index = 0;
254255
int count = files.Count;
255256
DateTime lastCallbackTime = DateTime.MinValue;
257+
var classes = db.Classes.ToList();
256258
foreach (var file in files)
257259
{
258260
File f = null;// new File(file, args.Project);
@@ -290,7 +292,7 @@ public static void UpdateFilesOfClasses(UpdateFilesArgs args)
290292
}
291293
if (args.Reclassify)
292294
{
293-
foreach (var c in db.Classes.Where(p => p.ProjectID == args.Project.ID).AsEnumerable())
295+
foreach (var c in classes.Where(p => p.ProjectID == args.Project.ID))
294296
{
295297
FileClass fc = IncludeAll(db.FileClasses)
296298
.FirstOrDefault(p => p.Class == c && p.File == f);

0 commit comments

Comments
 (0)