コード例 #1
0
        /// <inheritdoc/>
        public override int Remove(T item, Action <int> actionBeforeRemove = null)
        {
            if (!PassesFilter(item))
            {
                var isRemoved = FilteredItems.Remove(item);
                Debug.Assert(isRemoved);
                RemoveLiveShapingItemFor(item);
                return(-1);
            }

            return(base.Remove(item, actionBeforeRemove));
        }
コード例 #2
0
        public GenericSelectorDialogViewModel(IEnumerable <ColumnDescriptor> columns,
                                              IEnumerable <T> collection,
                                              Func <T, int> entryGetter,
                                              Func <T, string> index)
        {
            this.entryGetter = entryGetter;
            this.index       = index;
            items            = new SourceList <T>();
            ReadOnlyObservableCollection <T> l;
            var currentFilter = this.WhenValueChanged(t => t.SearchText).Select <string?, Func <T, bool> >(val =>
            {
                if (string.IsNullOrEmpty(val))
                {
                    return(model => true);
                }
                var lowerCase = val.ToLower();
                return(model => index(model).ToLower().Contains(lowerCase));
            });

            items
            .Connect()
            .Filter(currentFilter, ListFilterPolicy.ClearAndReplace)
            .Sort(Comparer <T> .Create((x, y) => entryGetter(x).CompareTo(entryGetter(y))))
            .Bind(out l)
            .Subscribe();
            FilteredItems = l;

            Columns = new ObservableCollection <ColumnDescriptor>();

            foreach (var column in columns)
            {
                Columns.Add(column);
            }

            items.AddRange(collection);

            Accept = new DelegateCommand(() =>
            {
                if (SelectedItem == null && FilteredItems.Count == 1)
                {
                    SelectedItem = FilteredItems[0];
                }
                CloseOk?.Invoke();
            }, () => SelectedItem != null || FilteredItems.Count == 1 || int.TryParse(SearchText, out _));
            Cancel = new DelegateCommand(() => CloseCancel?.Invoke());

            FilteredItems.ObserveCollectionChanges().Subscribe(_ => Accept.RaiseCanExecuteChanged());
            this.WhenPropertyChanged(t => t.SearchText).Subscribe(_ => Accept.RaiseCanExecuteChanged());
            this.WhenPropertyChanged(t => t.SelectedItem).Subscribe(_ => Accept.RaiseCanExecuteChanged());
        }
コード例 #3
0
        private void FilterByGameVersion(CoreConstants.GameVersion versionsToUse)
        {
            foreach (var curGameItem in FilteredItems.OfType <GameHeaderTreeItem>())
            {
                if (versionsToUse == CoreConstants.GameVersion.All)
                {
                    curGameItem.IsVisible = true;

                    continue;
                }

                curGameItem.IsVisible = versionsToUse.HasFlag(curGameItem.GameVersion);
            }
        }
コード例 #4
0
        public int FilterItemsByMediaType(MediaType mediaType = MediaType.Unknown)
        {
            IsBusy = true;
            ResetFilteredItems();

            if (mediaType == MediaType.Movie)
                FilteredItems = new ObservableCollection<LetsWatchItemViewModel>(FilteredItems.Where(item => item.Item.MediaType == MediaType.Movie));

            if (mediaType == MediaType.Tv)
                FilteredItems = new ObservableCollection<LetsWatchItemViewModel>(FilteredItems.Where(item => item.Item.MediaType == MediaType.Tv));

            IsBusy = false;
            return FilteredItems.Count;
        }
コード例 #5
0
 private void UpdateSearchResultsForSearchController(object sender, EventArgs e)
 {
     FilteredItems = PerformSearch(_searchBar.Text);
     if (!FilteredItems.Any())
     {
         ShowNoResultPage(_searchBar.Text);
     }
     else
     {
         HideNoResultPage();
     }
     ConfigureMegaSection();
     TableView.ReloadData();
 }
コード例 #6
0
        public InstalledItemsViewModel(InstalledItemsView view)
        {
            _logger.Info("Startup");
            _view = view;

            UninstallCommand       = new DelegateCommand(Uninstall);
            CancelUninstallCommand = new DelegateCommand(CancelUninstall);
            SelectCommand          = new DelegateCommand(SelectForUninstall);

            LoadUninstallableItems();

            Observable.FromEventPattern <PropertyChangedEventArgs>(this, "PropertyChanged")
            .Where(x => x.EventArgs.PropertyName == "FilterText")
            .Subscribe(_ => FilteredItems.Refresh());
        }
コード例 #7
0
ファイル: AutoComplete.cs プロジェクト: ichttt/Twice
        private void InsertText()
        {
            var filter       = FilterText ?? string.Empty;
            var insertText   = filter + FilteredItems.ElementAt(AutoCompleteBox.SelectedIndex).Substring(filter.Length);
            var currentCaret = AssociatedObject.CaretIndex;

            string newText = AssociatedObject.Text;

            newText       = newText.Remove(currentCaret - filter.Length, filter.Length);
            currentCaret -= filter.Length;
            newText       = newText.Insert(currentCaret, insertText);

            AssociatedObject.Text       = newText;
            AssociatedObject.CaretIndex = currentCaret + insertText.Length;
        }
コード例 #8
0
        public MainViewModel()
        {
            LoadData();
            filter = "allValues"; //Set default filter
            FilterData();

            /*
             * currencies.Add("EUR");
             * currencies.Add("USD");
             * currencies.Add("GBP");
             */

            BtnDeleteClicked = new RelayCommand(() => FilteredItems.Remove(selectedItem), () => { return(selectedItem != null); });
            BtnFilterClicked = new RelayCommand(FilterData);
        }
コード例 #9
0
        public void NotifyBoundingBoxColourDidChange(CGColor previousColour, CGColor changedColour, string category)
        {
            if (previousColour != null)
            {
                RemovePreviousColour(ColoursInUse, previousColour);
            }

            if (ColoursInUse.Contains(changedColour))
            {
                FilteredItems.FirstOrDefault(x => x.Label.Equals(category)).Color = changedColour.ToSKColor();
                ParentResultsViewController.NotifyColourDuplicated(changedColour);
            }
            else
            {
                ColoursInUse.Add(changedColour);
            }
        }
コード例 #10
0
        private void FilterItems()
        {
            FilteredItems.Clear();
            var query = Items.AsEnumerable();

            if (EventType == EventTypeFilter.Paid)
            {
                query = Items.Where(it => !it.IsFree);
            }
            else if (EventType == EventTypeFilter.Free)
            {
                query = Items.Where(it => it.IsFree);
            }
            foreach (var item in query)
            {
                FilteredItems.Add(item);
            }
        }
コード例 #11
0
        /// <summary>
        /// Removes the data object from the filtered items
        /// </summary>
        /// <param name="value">Data object to be removed</param>
        public void Remove(object value)
        {
            bool wasRemoved = false;

            foreach (FilterableContentListItem item in FilteredItems.ToArray())
            {
                if (item.DataObject.Equals(value))
                {
                    FilteredItems.Remove(item);
                    wasRemoved = true;
                    break;
                }
            }
            if (!wasRemoved)
            {
                Debug.WriteLine("BasecodeLib warning: Cannot remove item. Doesn't exist in the collection.");
            }
        }
コード例 #12
0
        protected virtual void OnFilterItemsForDisplay(string filterString)
        {
            bool shouldRefresh = false;

            if (string.IsNullOrEmpty(filterString))
            {
                foreach (ListViewItemWrapper wrapper in Items)
                {
                    if (!wrapper.Visible)
                    {
                        wrapper.Visible = true;
                        shouldRefresh   = true;
                    }
                }
            }
            else
            {
                foreach (ListViewItemWrapper wrapper in Items)
                {
                    string sourceText = (!string.IsNullOrEmpty(wrapper.SearchText)) ? wrapper.SearchText : wrapper.Name;
                    if (Contains(sourceText, filterString, StringComparison.CurrentCultureIgnoreCase))
                    {
                        if (!wrapper.Visible)
                        {
                            wrapper.Visible = true;
                            shouldRefresh   = true;
                        }
                    }
                    else
                    {
                        if (wrapper.Visible)
                        {
                            wrapper.Visible = false;
                            shouldRefresh   = true;
                        }
                    }
                }
            }

            if (shouldRefresh)
            {
                FilteredItems.Refresh();
            }
        }
コード例 #13
0
        /// <summary>
        /// Filtruoja helpRequest pagal įvestą String, pasirinką kategoriją,
        /// bei per profili gali pasirinkti kad žiūrėtų tik savo
        /// </summary>
        /// <param name="search">Įvestas raktas</param>
        /// <param name="category">Pasirinkta kategorija</param>
        /// <param name="own">Ar tai mano HelpRequest</param>
        void Filter(string search = null, string category = null, bool own = false)
        {
            if (Items == null || LocalUserManager.LocalUser == null) // Dar nėra informacijos
            {
                return;
            }
            List <HelpRequestModel> filtered = Items.ToList();

            FilteredItems.Clear();
            filtered.ForEach((helpRequest) =>
            {
                if ((String.IsNullOrEmpty(category) || category == helpRequest.Category) &&
                    (String.IsNullOrEmpty(search) || helpRequest.Title.ToLower().Contains(search) || helpRequest.Description.ToLower().Contains(search)) &&
                    (!own || helpRequest.Username == LocalUserManager.LocalUser.Username))
                {
                    FilteredItems.Add(helpRequest);
                }
            });
        }
コード例 #14
0
        private void FilterNodes()
        {
            var nodeAsync = nodeList.ToArray();

            // unfilter obsolete
            foreach (var node in nodeAsync
                     .Where(node => !FilteredItems.Contains(node.Title
                                                            .Replace("__", "_"))))
            {
                node.IsFiltered = false;
            }

            // filter new
            foreach (var node in nodeAsync
                     .Where(node => !node.IsFiltered && FilteredItems.Contains(node.Title.Replace("__", "_"))))
            {
                node.IsFiltered = true;
            }
        }
コード例 #15
0
        public new void Filter(string search)
        {
            string[] filter = search?.Split(" ");

            FilteredItems.Clear();
            FilteredSymbolItems.Clear();

            foreach (IconItem item in Items)
            {
                if (item.FitsFilter(filter))
                {
                    FilteredItems.Add(item);
                    if (item.IsSymbol)
                    {
                        FilteredSymbolItems.Add(item);
                    }
                }
            }
        }
コード例 #16
0
ファイル: AutoComplete.cs プロジェクト: ichttt/Twice
        private void AssociatedObject_TextInput(object sender, TextCompositionEventArgs e)
        {
            var text = e.Text;

            if (text.StartsWith(Constants.Twitter.HashTag, StringComparison.Ordinal))
            {
                FilterText = string.Empty;
                AutoCompletePopup.IsOpen      = true;
                AutoCompleteBox.ItemsSource   = FilteredHashtags;
                AutoCompleteBox.SelectedIndex = 0;
                Mode = SourceMode.Hashtags;
            }
            else if (text.StartsWith(Constants.Twitter.Mention, StringComparison.Ordinal))
            {
                FilterText = string.Empty;
                AutoCompletePopup.IsOpen      = true;
                AutoCompleteBox.ItemsSource   = FilteredUsers;
                AutoCompleteBox.SelectedIndex = 0;
                Mode = SourceMode.Users;
            }
            else if (AutoCompletePopup.IsOpen)
            {
                string selectedText = (string)AutoCompleteBox.SelectedItem;

                FilterText += text;

                var items = FilteredItems.ToList();

                Debug.WriteLine(string.Join(" - ", items));

                AutoCompleteBox.ItemsSource   = items;
                AutoCompleteBox.SelectedIndex = items.IndexOf(selectedText);
                if (AutoCompleteBox.SelectedIndex < 0)
                {
                    AutoCompleteBox.SelectedIndex = 0;
                }
                AutoCompleteBox.InvalidateProperty(ItemsControl.ItemsSourceProperty);
            }
        }
コード例 #17
0
        public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
        {
            if (tableView == null || indexPath == null)
            {
                throw new ArgumentNullException();
            }
            var cell = new UITableViewCell(UITableViewCellStyle.Default, (NSString)Constants.FilterCellIdentifier);

            var categoryString = _indexedTableItems.ElementAt(indexPath.Section).Value.ElementAt(indexPath.Row);
            var classCategory  = FilteredItems.FirstOrDefault(category => category.Label.Equals(categoryString));

            if (classCategory != null)
            {
                ConfigureCell(cell, classCategory);
            }
            else
            {
                TableView.ReloadRows(new[] { indexPath }, UITableViewRowAnimation.Fade);
            }

            return(cell);
        }
コード例 #18
0
        protected override async Task buildViewModelPosts(IEnumerable <IPost> posts)
        {
            clear(UnfilteredItems);
            clear(FilteredItems);

            Debug.WriteLine($"--- HISTORY BUILD POSTS. THREAD {Thread.CurrentThread.ManagedThreadId}");

            var vms      = new List <HistoryPostViewModel>();
            var freshVms = await _postBuilder.BuildAsync(posts);

            vms.AddRange(freshVms.Cast <HistoryPostViewModel>());

            UnfilteredItems.Clear();
            UnfilteredItems.AddRange(vms);
            filterOut(vms);

            var lastPost = FilteredItems.FirstOrDefault() as HistoryPostViewModel;

            if (lastPost != null)
            {
                _settings.Hidden.SetLastSeenFor(_pullersController.SharedWallHolder.ID, lastPost.Post.Date);
            }
        }
コード例 #19
0
        public void RecalculateFilter()
        {
            if (Filter == null)
            {
                FilteredItems.ForEach(item => InternalAdd(item));
                FilteredItems.Clear();
            }
            else
            {
                // Remove the items that no longer pass the filter
                var itemsRemovedByNewFilter = new List <T>();
                for (int i = BackingList.Count - 1; i >= 0; i--)
                {
                    if (!PassesFilter(BackingList[i]))
                    {
                        itemsRemovedByNewFilter.Add(BackingList[i]);
                        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, BackingList[i], i));
                        base.RemoveAt(i);
                    }
                }

                // Add the previously filtered items that that now pass
                FilteredItems.RemoveWhere(item => {
                    var insertionIndex = InternalAdd(item);
                    if (insertionIndex >= 0)
                    {
                        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, insertionIndex));
                        return(true);
                    }

                    return(false);
                });

                // Don't move items into the filtered list until it has been iterated over
                FilteredItems.UnionWith(itemsRemovedByNewFilter);
            }
        }
コード例 #20
0
        private void LoadUninstallableItems()
        {
            var installations = ProductInstallation.GetProducts(null, "s-1-1-0", UserContexts.All)
                                .Where(ins => ins.ProductName != null)
                                .Select(ins => new InstalledItem(ins.ProductName,
                                                                 ins.ProductCode,
                                                                 ins.InstallDate,
                                                                 ins.InstallLocation,
                                                                 ins.UrlInfoAbout,
                                                                 ins.ProductVersion))
                                .OrderBy(ins => ins.Product);

            _logger.Info("Found {0} installed items", installations.Count());
            Items                = new ObservableCollection <InstalledItem>(installations);
            FilteredItems        = CollectionViewSource.GetDefaultView(Items);
            FilteredItems.Filter = ItemFilter();
            FilteredItems.Refresh();

            Cancelling          = false;
            UninstallInProgress = false;
            UninstallCurrent    = 0;
            UninstallTotal      = 0;
            UninstallProgress   = 0;
        }
コード例 #21
0
 /// <summary>
 /// Get's an enumerator for the filtered items
 /// </summary>
 /// <returns>FilteredItems enumerator</returns>
 public IEnumerator GetFilteredEnumerator()
 {
     return(FilteredItems.GetEnumerator());
 }
コード例 #22
0
        public MainViewModel()
        {
            // タイトルに表示する文字列を指定
            var asm = Assembly.GetExecutingAssembly().GetName();

            AppName.Value = asm.Name + " - " + asm.Version.Major + "." + asm.Version.Minor;

            // 表示するリスト(filteredItemsSource)のソースとフィルタの設定
            FilteredItemsSource = new CollectionViewSource {
                Source = MemoList
            };
            FilteredItemsSource.Filter += (s, e) =>
            {
                var item = e.Item as SelfMemoItem;
                e.Accepted = CheckFilterStr(FilterStr.Value, item) && CheckCategoryFilter(item);
            };

            // ファイルが有ればロードしてMemoListを更新
            if (File.Exists(MemoFileName))
            {
                SelfMemoList.LoadMemoFile(MemoList, MemoFileName);
            }

            // MemoListが空なら、ヘルプメッセージ的な項目を追加する
            if (SelfMemoList.ItemsList.Count == 0)
            {
                MemoList.Add(new SelfMemoItem("用語", "正式名称、別名、訳語など", "用語の解説", "カテゴリ"));
                MemoList.Add(new SelfMemoItem("SelfMemo", "概要", "キーワードと関連情報(訳語、正式名称、説明など)を登録し、ど忘れした時に見返しやすくするアプリです。", "本アプリの説明"));
                MemoList.Add(new SelfMemoItem("SelfMemo", "検索機能", "検索フォームからキーワード検索ができます。", "本アプリの説明"));
                MemoList.Add(new SelfMemoItem("SelfMemo", "ショートカット", "グローバルホットキー(デフォルトでAlt+Shift+F2)でいつでもアプリ起動します。", "本アプリの説明"));
                MemoList.Add(new SelfMemoItem("SelfMemo", "項目追加", "メニューの「登録ダイアログを開く(Ctrl+R)」からキーワードの追加ができます。", "本アプリの説明"));
                MemoList.Add(new SelfMemoItem("SelfMemo", "項目編集", "編集ビューから登録内容の編集ができます。", "本アプリの説明"));
                MemoList.Add(new SelfMemoItem("SelfMemo", "カテゴリフィルタ", "「カテゴリ」メニューでカテゴリ毎の表示フィルタリングができます。", "本アプリの説明"));
            }

            // Filter文字列が更新されたら、Filterされたアイテムリストを更新
            FilterStr.Subscribe(_ =>
            {
                // 既にタイマーが走ってたら、一旦止める
                if (FilteredItemsRefreshTimer.IsEnabled)
                {
                    FilteredItemsRefreshTimer.Stop();
                }

                // タイマー開始
                FilteredItemsRefreshTimer.Interval = TimeSpan.FromMilliseconds(300);
                FilteredItemsRefreshTimer.Tick    += (s, e) =>
                {
                    FilteredItems.Refresh();
                    FilteredItemsRefreshTimer.Stop();
                };
                FilteredItemsRefreshTimer.Start();
            });

            // Filter文字列の有無フラグを連動
            UseFilterStr = FilterStr.Select(x => !string.IsNullOrWhiteSpace(x)).ToReadOnlyReactivePropertySlim();

            // カテゴリ選択ComboBoxが更新されたら、Filterされたアイテムリスト更新
            CategoryListSelected.Subscribe(_ =>
            {
                if (!FilteredItemsRefreshTimer.IsEnabled)
                {
                    FilteredItemsRefreshTimer.Interval = TimeSpan.FromMilliseconds(300);
                    FilteredItemsRefreshTimer.Tick    += (s, e) =>
                    {
                        FilteredItems.Refresh();
                        FilteredItemsRefreshTimer.Stop();
                    };
                    FilteredItemsRefreshTimer.Start();
                }
            });

            // 選択項目をSelectedItemに入れる処理
            FilteredItems.CurrentChanged += (s, e) =>
            {
                SelectedItem.Value = FilteredItems.CurrentItem as SelfMemoItem;
            };

            // UseCategoryListはカテゴリリストからなんか選択されてたらTrue
            UseCategoryList = CategoryListSelected.Select(x => !string.IsNullOrEmpty(x)).ToReadOnlyReactivePropertySlim();

            // カテゴリリストのON/OFFを切り替えるタイミングでもカテゴリリストの内容更新
            UseCategoryList.Subscribe(_ =>
            {
                SelfMemoList.UpdateCategoryList();
            });

            // MemoListのコレクションが更新されたらファイルに保存
            MemoList.CollectionChanged += (s, e) =>
            {
                SelfMemoList.SaveMemoFile(MemoList, MemoFileName);
            };

            WindowWidth.Subscribe(_ =>
            {
                ExpanderWidth.Value = Math.Max(400, WindowWidth.Value / 2);
            });
        }
コード例 #23
0
 private void OnSelectedMenuItemChanged()
 {
     FilteredItems.RemoveRange(0, FilteredItems.Count);
     FilteredItems.Merge(TopItems.Where(topItem => topItem.Type == SelectedMenuItem));
 }
コード例 #24
0
        public ItemFromListProviderViewModel(Dictionary <long, SelectOption> items, bool asFlags, long?current = null)
        {
            this.asFlags = asFlags;

            this.items = AutoDispose(new SourceList <CheckableSelectOption>());
            ReadOnlyObservableCollection <CheckableSelectOption> outFilteredList;

            currentFilter = AutoDispose(new ReactiveProperty <Func <CheckableSelectOption, bool> >(_ => true,
                                                                                                   Compare.Create <Func <CheckableSelectOption, bool> >((_, _) => false, _ => 0)));
            AutoDispose(this.items.Connect()
                        .Filter(currentFilter)
                        .Sort(Comparer <CheckableSelectOption> .Create((x, y) => x.Entry.CompareTo(y.Entry)))
                        .Bind(out outFilteredList)
                        .Subscribe());
            FilteredItems = outFilteredList;

            this.items.Edit(list =>
            {
                foreach (long key in items.Keys)
                {
                    bool isSelected = current.HasValue && ((current == 0 && key == 0) || (key > 0) && (current & key) == key);
                    var item        = new CheckableSelectOption(key, items[key], isSelected);
                    if (isSelected)
                    {
                        SelectedItem = item;
                    }
                    list.Add(item);
                }
            });

            Columns = new ObservableCollection <ColumnDescriptor>
            {
                new("Key", "Entry", 50),
                new("Name", "Name"),
                new("Description", "Description")
            };

            if (asFlags)
            {
                Columns.Insert(0, new ColumnDescriptor("", "IsChecked", 35, true));
            }

            if (items.Count == 0)
            {
                SearchText = current.HasValue ? current.Value.ToString() : "";
            }

            ShowItemsList = items.Count > 0;
            DesiredHeight = ShowItemsList ? 470 : 130;
            Accept        = new DelegateCommand(() =>
            {
                if (SelectedItem == null && FilteredItems.Count == 1)
                {
                    SelectedItem = FilteredItems[0];
                }
                CloseOk?.Invoke();
            }, () => asFlags || SelectedItem != null || FilteredItems.Count == 1 || int.TryParse(SearchText, out _));
            Cancel = new DelegateCommand(() => CloseCancel?.Invoke());

            FilteredItems.ObserveCollectionChanges().Subscribe(_ => Accept.RaiseCanExecuteChanged());
            this.WhenPropertyChanged(t => t.SearchText).Subscribe(_ => Accept.RaiseCanExecuteChanged());
            this.WhenPropertyChanged(t => t.SelectedItem).Subscribe(_ => Accept.RaiseCanExecuteChanged());
        }
コード例 #25
0
 public void RefreshItems()
 {
     FilteredItems.Clear();
     FilteredItems = filter.RestoreItemList(FilteredItems);
 }
コード例 #26
0
 private void AddFilteredItem(T item) => FilteredItems.Add(item);
コード例 #27
0
        private void OnDependencyPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
        {
            T item = (T)(LiveShapingItem <T>)dependencyObject;

            switch (GetCategoryOfDependencyProperty(args.Property))
            {
            case LiveShapingCategory.Sorting:
                int originalBinarySearchIndex = InternalBinarySearchWithEqualityCheck(item);
                int actualIndex;
                int targetIndex;

                if (originalBinarySearchIndex >= 0)
                {
                    Debug.Assert(BackingList[originalBinarySearchIndex].Equals(item));

                    actualIndex = originalBinarySearchIndex;
                    targetIndex = FindCorrectLocation(item);
                }
                else
                {
                    actualIndex = LinearSearch(item);
                    targetIndex = ~originalBinarySearchIndex;
                }

                LiveShapingItems[item].IsSortDirty = false;
                if (actualIndex >= 0)
                {
                    // adjust targetIndex if the item at actualIndex will no longer be there
                    if (actualIndex < targetIndex)
                    {
                        targetIndex--;
                    }
                    if (targetIndex != actualIndex)
                    {
                        BackingList.Move(actualIndex, targetIndex);
                        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Move, item, targetIndex,
                                                                                 actualIndex));
                    }
                }
                break;

            case LiveShapingCategory.Filtering:
                var passesFilter = PassesFilter(item);

                if (passesFilter)
                {
                    if (FilteredItems.Remove(item))
                    {
                        var insertionIndex = base.Add(item);
                        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, insertionIndex));
                    }
                }
                else
                {
                    if (!FilteredItems.Contains(item))
                    {
                        var removalIndex = IndexOf(item);

                        // It is possible that the liveshapingitem has been registered but the item has not yet been added to this collection (causing index = -1), in which case this is a noop
                        if (removalIndex >= 0)
                        {
                            base.RemoveAt(removalIndex);
                            OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item, removalIndex));
                            FilteredItems.Add(item);
                        }
                    }
                }
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            /* Debug.WriteLine(args.Property + "  " + string.Join(", ",
             *                   BackingList.OfType<GameFolderPair>()
             *                              .Select(
             *                                  folderPair => {
             *                                      if (folderPair.DestinationEntry == null) return "-99";
             *
             *                                      return SizeToStringConverter.Instance.Convert(folderPair.DestinationEntry?.Size)
             + (LiveShapingItems[folderPair as T].IsSortDirty ? "" : "✓");
             +                                  })
             +               ));*/
        }
コード例 #28
0
        public ItemFromListProviderViewModel(Dictionary <T, SelectOption>?items,
                                             IComparer <CheckableSelectOption <T> > comparer,
                                             Func <T, bool> shouldBeSelected,
                                             bool asFlags,
                                             T?current = default)
        {
            Items        = items;
            this.asFlags = asFlags;

            this.items = AutoDispose(new SourceList <CheckableSelectOption <T> >());
            ReadOnlyObservableCollection <CheckableSelectOption <T> > outFilteredList;

            currentFilter = AutoDispose(new ReactiveProperty <Func <CheckableSelectOption <T>, bool> >(_ => true,
                                                                                                       Compare.Create <Func <CheckableSelectOption <T>, bool> >((_, _) => false, _ => 0)));
            AutoDispose(this.items.Connect()
                        .Filter(currentFilter)
                        .Sort(comparer)
                        .Bind(out outFilteredList)
                        .Subscribe());
            FilteredItems = outFilteredList;

            if (items != null)
            {
                this.items.Edit(list =>
                {
                    foreach (T key in items.Keys)
                    {
                        bool isSelected = shouldBeSelected(key);
                        var item        = new CheckableSelectOption <T>(key, items[key], isSelected);
                        if (isSelected)
                        {
                            SelectedItem = item;
                        }
                        list.Add(item);
                    }
                });
            }

            Columns = new ObservableCollection <ColumnDescriptor>
            {
                new("Key", "Entry", 80),
                new("Name", "Name", 220),
                new("Description", "Description", 320)
            };

            if (asFlags)
            {
                Columns.Insert(0, new ColumnDescriptor("", "IsChecked", 35, true));
            }

            if (items == null || items.Count == 0)
            {
                SearchText = current != null?current.ToString() ?? "" : "";
            }

            ShowItemsList = items?.Count > 0;
            DesiredHeight = ShowItemsList ? 670 : 130;
            DesiredWidth  = ShowItemsList ? 800 : 400;
            Accept        = new DelegateCommand(() =>
            {
                if (SelectedItem == null && FilteredItems.Count == 1)
                {
                    SelectedItem = FilteredItems[0];
                }
                CloseOk?.Invoke();
            }, () => asFlags || SelectedItem != null || FilteredItems.Count == 1 || int.TryParse(SearchText, out _));
            Cancel = new DelegateCommand(() => CloseCancel?.Invoke());

            FilteredItems.ObserveCollectionChanges().Subscribe(_ => Accept.RaiseCanExecuteChanged());
            this.WhenPropertyChanged(t => t.SearchText).Subscribe(_ => Accept.RaiseCanExecuteChanged());
            this.WhenPropertyChanged(t => t.SelectedItem).Subscribe(_ => Accept.RaiseCanExecuteChanged());
        }
コード例 #29
0
 public void Clear()
 {
     FilteredItems.Clear();
     TotalItemsCount = 0;
 }