/// <summary> Перезаполнение плитками панель. </summary> private void FillPlates(GroupModes grpMode, bool ascend = true, string atrName = "") { // зачищаем имеющееся ClearPanel(); // группируем var readyMap = FilterSorterModule.GroupProcess(srcList, grpMode, ascend, atrName); bool isSeparable = readyMap.Count() > 1; // заполняем в соотвествии с группами foreach (var dirEnt in readyMap) { UniformGrid newGrid = new UniformGrid(); newGrid.VerticalAlignment = VerticalAlignment.Top; newGrid.Margin = new Thickness(0, 2, 0, 15); // разделитель с названием подпапки if (isSeparable) { entPlates.Children.Add(CreateSeparator(dirEnt.Key, newGrid)); } if (ListMode) { newGrid.Columns = 1; foreach (var entry in dirEnt.Value) { entry.CreateListPlate(); entry.ListHeight = (int)(oneLineHeight * sliderListHeight.Value) + 4; if (entry.lp.Parent != null) { MainWindow.RemoveChild(entry.lp.Parent, entry.lp); } newGrid.Children.Add(entry.lp); } } else { newGrid.Columns = (int)sliderGridCol.Value; foreach (var entry in dirEnt.Value) { entry.CreatePlate(); if (entry.vp.Parent != null) { MainWindow.RemoveChild(entry.vp.Parent, entry.vp); } newGrid.Children.Add(entry.vp); } } entPlates.Children.Add(newGrid); } readyMap.Clear(); Application.Current.Dispatcher.BeginInvoke((Action)(() => { SetTotalCountText($"Total: {srcList.Count()}"); })); }
///<summary> Формирование групп для списка элементов. </summary> public static List <KeyValuePair <string, List <AbstractEntry> > > GroupProcess( IEnumerable <AbstractEntry> srcList, GroupModes grpMode, bool ascend = true, string atrName = "") { var subListsMap = new SortedDictionary <string, List <AbstractEntry> >(new AlphanumComparatorFast()); var readyMap = new List <KeyValuePair <string, List <AbstractEntry> > >(); //? по умолчанию - сортировка Alphanumeric, но для дат - сортируем вручную через парсинг. switch (grpMode) { case GroupModes.NONE: { subListsMap.Add("", srcList as List <AbstractEntry>); readyMap = subListsMap.ToList(); break; } case GroupModes.FIRST_CHAR: { foreach (var ent in srcList) { var ch = ent.Name.First().ToString().ToUpper(); if (!subListsMap.ContainsKey(ch)) { subListsMap.Add(ch, new List <AbstractEntry>()); } subListsMap[ch].Add(ent); } readyMap = subListsMap.ToList(); break; } case GroupModes.DATE_CREATE: { foreach (var ent in srcList) { var date = ent.GetDateCreate(!ascend).ToString("d"); if (!subListsMap.ContainsKey(date)) { subListsMap.Add(date, new List <AbstractEntry>()); } subListsMap[date].Add(ent); } // правильная сортировка дат readyMap = subListsMap.ToList().OrderBy(kv => DateTime.Parse(kv.Key)).ToList(); break; } case GroupModes.DATE_MODIFIED: { foreach (var ent in srcList) { var date = ent.GetDateModify(!ascend).ToString("d"); if (!subListsMap.ContainsKey(date)) { subListsMap.Add(date, new List <AbstractEntry>()); } subListsMap[date].Add(ent); } // правильная сортировка дат readyMap = subListsMap.ToList().OrderBy(kv => DateTime.Parse(kv.Key)).ToList(); break; } case GroupModes.DATE_ADD: { foreach (var ent in srcList) { var date = ent.GetDateAdded().ToString("d"); if (!subListsMap.ContainsKey(date)) { subListsMap.Add(date, new List <AbstractEntry>()); } subListsMap[date].Add(ent); } // правильная сортировка дат readyMap = subListsMap.ToList().OrderBy(kv => DateTime.Parse(kv.Key)).ToList(); break; } case GroupModes.ATTRIBUTE: { foreach (var ent in srcList) { var atrData = ent.GetAttribute(atrName); if (!subListsMap.ContainsKey(atrData)) { subListsMap.Add(atrData, new List <AbstractEntry>()); } subListsMap[atrData].Add(ent); } readyMap = subListsMap.ToList(); break; } case GroupModes.RESOLUTION: { foreach (var ent in srcList) { var resStr = ent.GetMaxRes().ToString(); if (!subListsMap.ContainsKey(resStr)) { subListsMap.Add(resStr, new List <AbstractEntry>()); } subListsMap[resStr].Add(ent); } readyMap = subListsMap.ToList(); break; } case GroupModes.ENTRYS_COUNT: { foreach (var ent in srcList) { var resStr = ent.GetEntrysCount().ToString(); if (!subListsMap.ContainsKey(resStr)) { subListsMap.Add(resStr, new List <AbstractEntry>()); } subListsMap[resStr].Add(ent); } readyMap = subListsMap.ToList(); break; } case GroupModes.FOLDER: { // не работает для корневого if (!(srcList.FirstOrDefault() is CatalogEntry)) { goto case GroupModes.NONE; } foreach (var ent in srcList) { var catEnt = ent as CatalogEntry; // отрезаем путь от папки альбома string subPath = catEnt.EntAbsFile.Directory.FullName.Replace(catEnt.catAlb.AlbAbsDir.FullName, "").TrimStart('/', '\\'); if (!subListsMap.ContainsKey(subPath)) { subListsMap.Add(subPath, new List <AbstractEntry>()); } subListsMap[subPath].Add(ent); } readyMap = subListsMap.ToList(); break; } default: { break; } } // обращаем порядок if (!ascend) { readyMap.Reverse(); } subListsMap.Clear(); return(readyMap); }
///<summary> Обновление после изменения одного из контролов фильтра. </summary> private void FilterChanged(object sender, RoutedEventArgs e) { Stopwatch sw = new Stopwatch(); sw.Start(); string atrName = ""; // для проброса имени атрибута из названия пункта комбобокса сортировки GroupModes grpMode = GroupModes.NONE; switch (filterPanel.sortModeComBox.SelectedIndex) { case 0: { sortMode = FilterSorterModule.SortMode.NAME; grpMode = GroupModes.FIRST_CHAR; break; } case 1: { sortMode = FilterSorterModule.SortMode.DATE_ADD; grpMode = GroupModes.DATE_ADD; break; } case 2: { sortMode = FilterSorterModule.SortMode.DATE_CREATE; grpMode = GroupModes.DATE_CREATE; break; } case 3: { sortMode = FilterSorterModule.SortMode.DATE_MODIFIED; grpMode = GroupModes.DATE_MODIFIED; break; } case 4: { sortMode = FilterSorterModule.SortMode.RESOLUTION; grpMode = GroupModes.RESOLUTION; break; } case 5: { sortMode = FilterSorterModule.SortMode.ENTRYS_COUNT; grpMode = GroupModes.ENTRYS_COUNT; break; } case -1: goto case 0; default: { sortMode = FilterSorterModule.SortMode.ATTRIBUTE; grpMode = GroupModes.ATTRIBUTE; string selItemName = (filterPanel.sortModeComBox.SelectedItem as TextBlock).Text; atrName = selItemName.Substring(selItemName.IndexOf(" ") + 1); // отрезаем слово аттрибут break; } } bool grpEnabled = filterPanel.grpChkBox.IsChecked ?? false; bool ascend = filterPanel.ascendChkBox.IsChecked ?? false; bool broken = filterPanel.brokenChkBox.IsChecked ?? false; bool excepted = filterPanel.exceptedChkBox.IsChecked ?? false; if (!grpEnabled) { grpMode = GroupModes.FOLDER; } loadingPanel.Visibility = Visibility.Visible; Application.Current.Dispatcher.BeginInvoke((Action)(() => SetInfoText("Loading Plates!"))); pBar.Value = 50d; var filtStr = filterPanel.filterBox.Text; BackgroundWorker bw = new BackgroundWorker(); bw.WorkerReportsProgress = true; bw.DoWork += (s, a) => { srcList = FilterSorterModule.FilterAndSort(baseList, filtStr, CatalogRoot.tagsList, sortMode, ascend, broken, excepted, atrName); }; bw.RunWorkerCompleted += (s, a) => { FillPlates(grpMode, ascend, atrName); filterPanel.FillSortCombo(); SetUiStateOpened(); Console.WriteLine($"FilterChanged {sw.ElapsedMilliseconds}ms"); sw.Stop(); }; bw.RunWorkerAsync(); }