Esempio n. 1
0
        /// <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);
        }
Esempio n. 3
0
        ///<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();
        }