public TailViewModelFactory([NotNull] IObjectProvider objectProvider,
            [NotNull] ISchedulerProvider schedulerProvider, 
            [NotNull] IColourProvider colourProvider,
            [NotNull] ISearchMetadataFactory searchMetadataFactory, 
            [NotNull] IIconProvider iconProvider,
            [NotNull] ITailViewStateControllerFactory tailViewStateControllerFactory,
            [NotNull] ITextAssociationCollection textAssociationCollection,
            [NotNull]  IThemeProvider themeProvider)
        {
            if (objectProvider == null) throw new ArgumentNullException(nameof(objectProvider));
            if (schedulerProvider == null) throw new ArgumentNullException(nameof(schedulerProvider));
            if (colourProvider == null) throw new ArgumentNullException(nameof(colourProvider));
            if (searchMetadataFactory == null) throw new ArgumentNullException(nameof(searchMetadataFactory));
            if (iconProvider == null) throw new ArgumentNullException(nameof(iconProvider));
            if (tailViewStateControllerFactory == null)
                throw new ArgumentNullException(nameof(tailViewStateControllerFactory));

            _objectProvider = objectProvider;
            _schedulerProvider = schedulerProvider;
            _colourProvider = colourProvider;
            _searchMetadataFactory = searchMetadataFactory;
            _iconProvider = iconProvider;
            _tailViewStateControllerFactory = tailViewStateControllerFactory;
            _textAssociationCollection = textAssociationCollection;
            _themeProvider = themeProvider;
        }
Esempio n. 2
0
        public SearchOptionsProxy([NotNull] SearchMetadata searchMetadata,
                                  [NotNull] Action <SearchMetadata> changeScopeAction,
                                  [NotNull] IColourProvider colourProvider,
                                  [NotNull] IThemeProvider themeProvider,
                                  [NotNull] IconSelector iconSelector,
                                  [NotNull] Action <SearchMetadata> removeAction,
                                  [NotNull] IDefaultIconSelector defaultIconSelector,
                                  Guid parentId)
        {
            if (changeScopeAction == null)
            {
                throw new ArgumentNullException(nameof(changeScopeAction));
            }
            if (colourProvider == null)
            {
                throw new ArgumentNullException(nameof(colourProvider));
            }
            if (themeProvider == null)
            {
                throw new ArgumentNullException(nameof(themeProvider));
            }
            if (removeAction == null)
            {
                throw new ArgumentNullException(nameof(removeAction));
            }

            _searchMetadata      = searchMetadata ?? throw new ArgumentNullException(nameof(searchMetadata));
            _defaultIconSelector = defaultIconSelector ?? throw new ArgumentNullException(nameof(defaultIconSelector));

            IconSelector  = iconSelector ?? throw new ArgumentNullException(nameof(iconSelector));
            ParentId      = parentId;
            Highlight     = _searchMetadata.Highlight;
            Filter        = _searchMetadata.Filter;
            UseRegex      = searchMetadata.UseRegex;
            CaseSensitive = !searchMetadata.IgnoreCase;
            Position      = searchMetadata.Position;
            Hues          = colourProvider.Hues;
            HighlightHue  = searchMetadata.HighlightHue;
            IsGlobal      = searchMetadata.IsGlobal;
            IsExclusion   = searchMetadata.IsExclusion;

            ShowIconSelectorCommand = new Command(async() => await ShowIconSelector());
            RemoveCommand           = new Command(() => removeAction(searchMetadata));
            ChangeScopeCommand      = new Command(() => changeScopeAction((SearchMetadata)this));
            HighlightCommand        = new Command <Hue>(newHue => { HighlightHue = newHue; });

            IconKind = _searchMetadata.IconKind.ParseEnum <PackIconKind>()
                       .ValueOr(() => PackIconKind.ArrowRightBold);

            //combine system with user choice.
            var defaultHue = this.WhenValueChanged(vm => vm.HighlightHue)
                             .CombineLatest(themeProvider.Accent, (user, system) => user == Hue.NotSpecified ? system : user)
                             .Publish();

            Foreground = defaultHue.Select(h => h.ForegroundBrush).ForBinding();
            Background = defaultHue.Select(h => h.BackgroundBrush).ForBinding();

            _cleanUp = new CompositeDisposable(IconSelector, Foreground, Background, defaultHue.Connect());
        }
 public SearchMetadataFactory(IDefaultIconSelector defaultIconSelector,
                              IColourProvider colourProvider,
                              IDefaultColourSelector defaultColourSelector)
 {
     _defaultIconSelector   = defaultIconSelector;
     _colourProvider        = colourProvider;
     _defaultColourSelector = defaultColourSelector;
 }
Esempio n. 4
0
        public DefaultColourSelector(IColourProvider colourProvider)
        {
            _hues             = colourProvider.Hues.ToDictionary(h => h.Key);
            _defaultHighlight = colourProvider.Hues
                                .Last(s => s.Swatch.Equals("amber", StringComparison.OrdinalIgnoreCase));

            _defaults = Load().ToArray();
        }
 public SearchMetadataFactory(IDefaultIconSelector defaultIconSelector,
                              IColourProvider colourProvider,
                              IDefaultColourSelector defaultColourSelector,
                              ITextAssociationCollection textAssociationCollection)
 {
     _defaultIconSelector       = defaultIconSelector;
     _defaultColourSelector     = defaultColourSelector;
     _textAssociationCollection = textAssociationCollection;
 }
 public SearchMetadataFactory(IDefaultIconSelector defaultIconSelector, 
     IColourProvider colourProvider,
     IDefaultColourSelector defaultColourSelector,
     ITextAssociationCollection textAssociationCollection)
 {
     _defaultIconSelector = defaultIconSelector;
     _defaultColourSelector = defaultColourSelector;
     _textAssociationCollection = textAssociationCollection;
 }
 public TailViewModelFactory(IObjectProvider objectProvider,
                             ISchedulerProvider schedulerProvider,
                             IColourProvider colourProvider,
                             ISearchMetadataFactory searchMetadataFactory,
                             IIconProvider iconProvider)
 {
     _objectProvider        = objectProvider;
     _schedulerProvider     = schedulerProvider;
     _colourProvider        = colourProvider;
     _searchMetadataFactory = searchMetadataFactory;
     _iconProvider          = iconProvider;
 }
Esempio n. 8
0
 public SearchProxyCollectionFactory([NotNull] ISearchMetadataFactory searchMetadataFactory,
                                     [NotNull] ISchedulerProvider schedulerProvider,
                                     [NotNull] IColourProvider colourProvider,
                                     [NotNull] IIconProvider iconsProvider,
                                     [NotNull] ITextAssociationCollection textAssociationCollection,
                                     [NotNull] IThemeProvider themeProvider)
 {
     SearchMetadataFactory     = searchMetadataFactory ?? throw new ArgumentNullException(nameof(searchMetadataFactory));
     SchedulerProvider         = schedulerProvider ?? throw new ArgumentNullException(nameof(schedulerProvider));
     ColourProvider            = colourProvider ?? throw new ArgumentNullException(nameof(colourProvider));
     IconsProvider             = iconsProvider ?? throw new ArgumentNullException(nameof(iconsProvider));
     TextAssociationCollection = textAssociationCollection ?? throw new ArgumentNullException(nameof(textAssociationCollection));
     ThemeProvider             = themeProvider ?? throw new ArgumentNullException(nameof(themeProvider));
 }
        public TailViewModelFactory([NotNull] IObjectProvider objectProvider,
                                    [NotNull] ISchedulerProvider schedulerProvider,
                                    [NotNull] IColourProvider colourProvider,
                                    [NotNull] ISearchMetadataFactory searchMetadataFactory,
                                    [NotNull] IIconProvider iconProvider,
                                    [NotNull] ITailViewStateControllerFactory tailViewStateControllerFactory,
                                    [NotNull] ITextAssociationCollection textAssociationCollection,
                                    [NotNull]  IThemeProvider themeProvider)
        {
            if (objectProvider == null)
            {
                throw new ArgumentNullException(nameof(objectProvider));
            }
            if (schedulerProvider == null)
            {
                throw new ArgumentNullException(nameof(schedulerProvider));
            }
            if (colourProvider == null)
            {
                throw new ArgumentNullException(nameof(colourProvider));
            }
            if (searchMetadataFactory == null)
            {
                throw new ArgumentNullException(nameof(searchMetadataFactory));
            }
            if (iconProvider == null)
            {
                throw new ArgumentNullException(nameof(iconProvider));
            }
            if (tailViewStateControllerFactory == null)
            {
                throw new ArgumentNullException(nameof(tailViewStateControllerFactory));
            }

            _objectProvider                 = objectProvider;
            _schedulerProvider              = schedulerProvider;
            _colourProvider                 = colourProvider;
            _searchMetadataFactory          = searchMetadataFactory;
            _iconProvider                   = iconProvider;
            _tailViewStateControllerFactory = tailViewStateControllerFactory;
            _textAssociationCollection      = textAssociationCollection;
            _themeProvider                  = themeProvider;
        }
Esempio n. 10
0
        public ThemeProvider([NotNull] ISetting <GeneralOptions> setting, [NotNull] IColourProvider colourProvider)
        {
            if (setting == null)
            {
                throw new ArgumentNullException(nameof(setting));
            }
            if (colourProvider == null)
            {
                throw new ArgumentNullException(nameof(colourProvider));
            }

            Theme = setting.Value
                    .Select(options => options.Theme)
                    .Replay(1).RefCount();

            Accent = setting.Value
                     .Select(options => colourProvider.GetAccent(options.Theme))
                     .Replay(1).RefCount();
        }
        public SearchInfoCollection(ISearchMetadataCollection searchMetadataCollection,
                                    ISearchMetadataFactory searchMetadataFactory,
                                    IColourProvider colourProvider,
                                    IEnumerable <IFileWatcher> filesWatcher,
                                    IDefaultIconSelector defaultIconSelector)
        {
            _metadataCollection    = searchMetadataCollection;
            _searchMetadataFactory = searchMetadataFactory;
            _colourProvider        = colourProvider;
            _filesWatcher          = filesWatcher;
            _defaultIconSelector   = defaultIconSelector;

            //Add a complete file display
            All = _filesWatcher.Select(t => t.Latest).Index();

            //create a collection with 1 item, which is used to show entire file
            var systemSearches = new SourceCache <SearchInfo, string>(t => t.SearchText);

            systemSearches.AddOrUpdate(new SearchInfo("<All>", All, SearchType.All));

            //create a collection of all possible user filters
            var userSearches = searchMetadataCollection.Metadata
                               .Connect(meta => meta.Filter)
                               .IgnoreUpdateWhen((current, previous) => SearchMetadata.EffectsFilterComparer.Equals(current, previous))
                               .Transform(meta =>
            {
                var latest = _filesWatcher
                             .Select(t => t.Latest)
                             .Merge()
                             .Search(meta.BuildPredicate());

                return(new SearchInfo(meta.SearchText, latest, SearchType.User));
            });

            //combine te results into a single collection
            Searches = systemSearches.Connect()
                       .Or(userSearches)
                       .AsObservableCache();

            _cleanUp = new CompositeDisposable(Searches, systemSearches);
        }
 public SearchStateToMetadataMapper(IColourProvider colourProvider)
 {
     _colourProvider = colourProvider;
 }
        public SearchOptionsViewModel(ISearchMetadataCollection metadataCollection,
                                      ISearchMetadataFactory searchMetadataFactory,
                                      ISchedulerProvider schedulerProvider,
                                      IColourProvider colourProvider,
                                      IIconProvider iconsProvider,
                                      SearchHints searchHints)
        {
            SearchHints = searchHints;

            var proxyItems = metadataCollection.Metadata.Connect()
                             .WhereReasonsAre(ChangeReason.Add, ChangeReason.Remove) //ignore updates because we update from here
                             .Transform(meta =>
            {
                return(new SearchOptionsProxy(meta,
                                              colourProvider,
                                              new IconSelector(iconsProvider, schedulerProvider),
                                              m => metadataCollection.Remove(m.SearchText),
                                              iconsProvider.DefaultIconSelector,
                                              Id));
            })
                             .SubscribeMany(so =>
            {
                //when a value changes, write the original value back to the cache
                return(so.WhenAnyPropertyChanged()
                       .Select(_ => (SearchMetadata)so)
                       .Subscribe(metadataCollection.AddorUpdate));
            })
                             .AsObservableCache();

            var monitor = MonitorPositionalChanges()
                          .Subscribe(positionChangedArgs =>
            {
                positionChangedArgs.ForEach(metadataCollection.AddorUpdate);
            });


            //load data onto grid
            var collection = new ObservableCollectionExtended <SearchOptionsProxy>();

            var userOptions = proxyItems.Connect()
                              .Sort(SortExpressionComparer <SearchOptionsProxy> .Ascending(proxy => proxy.Position))
                              .ObserveOn(schedulerProvider.MainThread)
                              //force reset for each new or removed item dues to a bug in the underlying dragablz control which inserts in an incorrect position
                              .Bind(collection, new ObservableCollectionAdaptor <SearchOptionsProxy, string>(0))
                              .DisposeMany()
                              .Subscribe();

            Data = new ReadOnlyObservableCollection <SearchOptionsProxy>(collection);

            //command to add the current search to the tail collection
            var searchInvoker = SearchHints.SearchRequested.Subscribe(request =>
            {
                schedulerProvider.Background.Schedule(() =>
                {
                    var meta = searchMetadataFactory.Create(request.Text,
                                                            request.UseRegEx,
                                                            metadataCollection.NextIndex(),
                                                            false);
                    metadataCollection.AddorUpdate(meta);
                });
            });

            _cleanUp = new CompositeDisposable(searchInvoker,
                                               userOptions,
                                               searchInvoker,
                                               monitor,
                                               SearchHints);
        }
Esempio n. 14
0
 public DefaultColourSelector(IColourProvider colourProvider)
 {
     _colourProvider = colourProvider;
     _hues = colourProvider.Hues.ToDictionary(h => h.Key);
     _defaults = Load().ToArray();
 }
 public SearchStateToMetadataMapper(IColourProvider colourProvider)
 {
     _colourProvider = colourProvider;
 }
Esempio n. 16
0
 public DefaultColourSelector(IColourProvider colourProvider)
 {
     _colourProvider = colourProvider;
     _hues           = colourProvider.Hues.ToDictionary(h => h.Key);
     _defaults       = Load().ToArray();
 }
Esempio n. 17
0
        public SearchProxyCollection(ISearchMetadataCollection metadataCollection,
            Guid id,
            Action<SearchMetadata> changeScopeAction,
            ISchedulerProvider schedulerProvider,
            IColourProvider colourProvider,
            IIconProvider iconsProvider,
            ITextAssociationCollection textAssociationCollection,
            IThemeProvider themeProvider)
        {
            var proxyItems = metadataCollection.Metadata.Connect()
                .WhereReasonsAre(ChangeReason.Add, ChangeReason.Remove) //ignore updates because we update from here
                .Transform(meta =>
                {
                    return new SearchOptionsProxy(meta,
                        changeScopeAction,
                        colourProvider,
                        themeProvider,
                        new IconSelector(iconsProvider, schedulerProvider),
                        m => metadataCollection.Remove(m.SearchText),
                        iconsProvider.DefaultIconSelector,
                        id);
                })
                .SubscribeMany(so =>
                {
                    //when a value changes, write the original value back to the metadata collection
                    var anyPropertyHasChanged = so.WhenAnyPropertyChanged()
                        .Select(_ => (SearchMetadata) so)
                        .Subscribe(metadataCollection.AddorUpdate);

                    //when an icon or colour has changed we need to record user choice so
                    //the same choice can be used again
                    var iconChanged = so.WhenValueChanged(proxy => proxy.IconKind, false).ToUnit();
                    var colourChanged = so.WhenValueChanged(proxy => proxy.HighlightHue, false).ToUnit();
                    var ignoreCaseChanged = so.WhenValueChanged(proxy => proxy.CaseSensitive, false).ToUnit();

                    var textAssociationChanged = iconChanged.Merge(colourChanged).Merge(ignoreCaseChanged)
                        .Throttle(TimeSpan.FromMilliseconds(250))
                        .Select(_ => new TextAssociation(so.Text, so.CaseSensitive, so.UseRegex, so.HighlightHue.Swatch,
                            so.IconKind.ToString(), so.HighlightHue.Name, DateTime.UtcNow))
                        .Subscribe(textAssociationCollection.MarkAsChanged);

                    return new CompositeDisposable(anyPropertyHasChanged, textAssociationChanged);
                })
                .AsObservableCache();

            Count = proxyItems.CountChanged.StartWith(0).ForBinding();

            var monitor = MonitorPositionalChanges().Subscribe(metadataCollection.Add);

            //load data onto grid
            var collection = new ObservableCollectionExtended<SearchOptionsProxy>();

            var includedLoader = proxyItems
                .Connect(proxy => !proxy.IsExclusion)
                .Sort(SortExpressionComparer<SearchOptionsProxy>.Ascending(proxy => proxy.Position))
                .ObserveOn(schedulerProvider.MainThread)
                //force reset for each new or removed item dues to a bug in the underlying dragablz control which inserts in an incorrect position
                .Bind(collection, new ObservableCollectionAdaptor<SearchOptionsProxy, string>(0))
                .DisposeMany()
                .Subscribe();

            ReadOnlyObservableCollection<SearchOptionsProxy> excluded;
            var excludedLoader = proxyItems
                .Connect(proxy => proxy.IsExclusion)
                .Sort(SortExpressionComparer<SearchOptionsProxy>.Ascending(proxy => proxy.Text))
                .ObserveOn(schedulerProvider.MainThread)
                //force reset for each new or removed item dues to a bug in the underlying dragablz control which inserts in an incorrect position
                .Bind(out excluded)
                .DisposeMany()
                .Subscribe();

            Excluded = excluded;
            Included = new ReadOnlyObservableCollection<SearchOptionsProxy>(collection);

            _cleanUp = new CompositeDisposable(proxyItems, includedLoader, excludedLoader, monitor);
        }
Esempio n. 18
0
        public SearchProxyCollection(ISearchMetadataCollection metadataCollection,
            Guid id,
            Action<SearchMetadata> changeScopeAction,
            ISchedulerProvider schedulerProvider,
            IColourProvider colourProvider,
            IIconProvider iconsProvider,
            ITextAssociationCollection textAssociationCollection,
            IThemeProvider themeProvider)
        {
            var proxyItems = metadataCollection.Metadata.Connect()
                .WhereReasonsAre(ChangeReason.Add, ChangeReason.Remove) //ignore updates because we update from here
                .Transform(meta =>
                {
                    return new SearchOptionsProxy(meta,
                        changeScopeAction,
                        colourProvider,
                        themeProvider,
                        new IconSelector(iconsProvider, schedulerProvider),
                        m => metadataCollection.Remove(m.SearchText),
                        iconsProvider.DefaultIconSelector,
                        id);
                })
                .SubscribeMany(so =>
                {
                    //when a value changes, write the original value back to the metadata collection
                    var anyPropertyHasChanged = so.WhenAnyPropertyChanged()
                        .Select(_ => (SearchMetadata) so)
                        .Subscribe(metadataCollection.AddorUpdate);

                    //when an icon or colour has changed we need to record user choice so 
                    //the same choice can be used again
                    var iconChanged = so.WhenValueChanged(proxy => proxy.IconKind, false).ToUnit();
                    var colourChanged = so.WhenValueChanged(proxy => proxy.HighlightHue, false).ToUnit();
                    var ignoreCaseChanged = so.WhenValueChanged(proxy => proxy.CaseSensitive, false).ToUnit();

                    var textAssociationChanged = iconChanged.Merge(colourChanged).Merge(ignoreCaseChanged)
                        .Throttle(TimeSpan.FromMilliseconds(250))
                        .Select(_ => new TextAssociation(so.Text, so.CaseSensitive, so.UseRegex, so.HighlightHue.Swatch,
                            so.IconKind.ToString(), so.HighlightHue.Name, DateTime.UtcNow))
                        .Subscribe(textAssociationCollection.MarkAsChanged);

                    return new CompositeDisposable(anyPropertyHasChanged, textAssociationChanged);
                })
                .AsObservableCache();

            Count = proxyItems.CountChanged.StartWith(0).ForBinding();

            var monitor = MonitorPositionalChanges().Subscribe(metadataCollection.Add);
            
            //load data onto grid
            var collection = new ObservableCollectionExtended<SearchOptionsProxy>();

            var includedLoader = proxyItems
                .Connect(proxy => !proxy.IsExclusion)
                .Sort(SortExpressionComparer<SearchOptionsProxy>.Ascending(proxy => proxy.Position))
                .ObserveOn(schedulerProvider.MainThread)
                //force reset for each new or removed item dues to a bug in the underlying dragablz control which inserts in an incorrect position
                .Bind(collection, new ObservableCollectionAdaptor<SearchOptionsProxy, string>(0))
                .DisposeMany()
                .Subscribe();

            var excludedLoader = proxyItems
                .Connect(proxy => proxy.IsExclusion)
                .Sort(SortExpressionComparer<SearchOptionsProxy>.Ascending(proxy => proxy.Text))
                .ObserveOn(schedulerProvider.MainThread)
                //force reset for each new or removed item dues to a bug in the underlying dragablz control which inserts in an incorrect position
                .Bind(out var excluded)
                .DisposeMany()
                .Subscribe();


            Excluded = excluded;
            Included = new ReadOnlyObservableCollection<SearchOptionsProxy>(collection);

            _cleanUp = new CompositeDisposable(proxyItems, includedLoader, excludedLoader, monitor);
        }
        public SearchOptionsViewModel(ISearchMetadataCollection metadataCollection,
            ISearchMetadataFactory searchMetadataFactory,
            ISchedulerProvider schedulerProvider,
            IColourProvider colourProvider,
            IIconProvider iconsProvider,
            ITextAssociationCollection textAssociationCollection,
            SearchHints searchHints,
            IThemeProvider themeProvider)
        {
            SearchHints = searchHints;

            var proxyItems = metadataCollection.Metadata.Connect()
                .WhereReasonsAre(ChangeReason.Add, ChangeReason.Remove) //ignore updates because we update from here
                .Transform(meta =>
                {
                    return new SearchOptionsProxy(meta,
                        colourProvider,
                        themeProvider,
                        new IconSelector(iconsProvider, schedulerProvider),
                        m => metadataCollection.Remove(m.SearchText),
                        iconsProvider.DefaultIconSelector,
                        Id);
                })
                .SubscribeMany(so =>
                {
                    //when a value changes, write the original value back to the metadata collection
                    var anyPropertyHasChanged = so.WhenAnyPropertyChanged()
                        .Select(_ => (SearchMetadata) so)
                        .Subscribe(metadataCollection.AddorUpdate);

                    //when an icon or colour has changed we need to record user choice so
                    //the same choice can be used again
                    var iconChanged = so.WhenValueChanged(proxy => proxy.IconKind,false).ToUnit();
                    var colourChanged = so.WhenValueChanged(proxy => proxy.HighlightHue, false).ToUnit();
                    var ignoreCaseChanged = so.WhenValueChanged(proxy => proxy.IgnoreCase, false).ToUnit();

                    var textAssociationChanged = iconChanged.Merge(colourChanged).Merge(ignoreCaseChanged)
                                .Throttle(TimeSpan.FromMilliseconds(250))
                                .Select(_=> new TextAssociation(so.Text, so.IgnoreCase, so.UseRegex, so.HighlightHue.Swatch, so.IconKind.ToString(), so.HighlightHue.Name, DateTime.Now))
                                .Subscribe(textAssociationCollection.MarkAsChanged);

                    return new CompositeDisposable(anyPropertyHasChanged, textAssociationChanged);
                })
                .AsObservableCache();

            var monitor = MonitorPositionalChanges()
                .Subscribe(metadataCollection.Add);

            //load data onto grid
            var collection = new ObservableCollectionExtended<SearchOptionsProxy>();

            var userOptions = proxyItems.Connect()
                .Sort(SortExpressionComparer<SearchOptionsProxy>.Ascending(proxy => proxy.Position))
                .ObserveOn(schedulerProvider.MainThread)
                //force reset for each new or removed item dues to a bug in the underlying dragablz control which inserts in an incorrect position
                .Bind(collection, new ObservableCollectionAdaptor<SearchOptionsProxy, string>(0))
                .DisposeMany()
                .Subscribe();

            Data = new ReadOnlyObservableCollection<SearchOptionsProxy>(collection);

            //command to add the current search to the tail collection
            var searchInvoker = SearchHints.SearchRequested
                .ObserveOn(schedulerProvider.Background)
                .Subscribe(request =>
                {
                    var meta = searchMetadataFactory.Create(request.Text,
                        request.UseRegEx,
                        metadataCollection.NextIndex(),
                        false);
                    metadataCollection.AddorUpdate(meta);
                });

            _cleanUp = new CompositeDisposable(searchInvoker,
                userOptions,
                searchInvoker,
                monitor,
                SearchHints);
        }
Esempio n. 20
0
        public SearchOptionsViewModel(ISearchMetadataCollection metadataCollection,
                                      ISearchMetadataFactory searchMetadataFactory,
                                      ISchedulerProvider schedulerProvider,
                                      IColourProvider colourProvider,
                                      IIconProvider iconsProvider,
                                      ITextAssociationCollection textAssociationCollection,
                                      SearchHints searchHints)
        {
            SearchHints = searchHints;

            var proxyItems = metadataCollection.Metadata.Connect()
                             .WhereReasonsAre(ChangeReason.Add, ChangeReason.Remove) //ignore updates because we update from here
                             .Transform(meta =>
            {
                return(new SearchOptionsProxy(meta,
                                              colourProvider,
                                              new IconSelector(iconsProvider, schedulerProvider),
                                              m => metadataCollection.Remove(m.SearchText),
                                              iconsProvider.DefaultIconSelector,
                                              Id));
            })
                             .SubscribeMany(so =>
            {
                //when a value changes, write the original value back to the metadata collection
                var anyPropertyHasChanged = so.WhenAnyPropertyChanged()
                                            .Select(_ => (SearchMetadata)so)
                                            .Subscribe(metadataCollection.AddorUpdate);

                //when an icon or colour has changed we need to record user choice so
                //the same choice can be used again
                var iconChanged       = so.WhenValueChanged(proxy => proxy.IconKind, false).ToUnit();
                var colourChanged     = so.WhenValueChanged(proxy => proxy.HighlightHue, false).ToUnit();
                var ignoreCaseChanged = so.WhenValueChanged(proxy => proxy.IgnoreCase, false).ToUnit();

                var textAssociationChanged = iconChanged.Merge(colourChanged).Merge(ignoreCaseChanged)
                                             .Throttle(TimeSpan.FromMilliseconds(250))
                                             .Select(_ => new TextAssociation(so.Text, so.IgnoreCase, so.UseRegex, so.HighlightHue.Swatch, so.IconKind.ToString(), so.HighlightHue.Name, DateTime.Now))
                                             .Subscribe(textAssociationCollection.MarkAsChanged);

                return(new CompositeDisposable(anyPropertyHasChanged, textAssociationChanged));
            })
                             .AsObservableCache();

            var monitor = MonitorPositionalChanges()
                          .Subscribe(metadataCollection.Add);


            //load data onto grid
            var collection = new ObservableCollectionExtended <SearchOptionsProxy>();

            var userOptions = proxyItems.Connect()
                              .Sort(SortExpressionComparer <SearchOptionsProxy> .Ascending(proxy => proxy.Position))
                              .ObserveOn(schedulerProvider.MainThread)
                              //force reset for each new or removed item dues to a bug in the underlying dragablz control which inserts in an incorrect position
                              .Bind(collection, new ObservableCollectionAdaptor <SearchOptionsProxy, string>(0))
                              .DisposeMany()
                              .Subscribe();

            Data = new ReadOnlyObservableCollection <SearchOptionsProxy>(collection);

            //command to add the current search to the tail collection
            var searchInvoker = SearchHints.SearchRequested
                                .ObserveOn(schedulerProvider.Background)
                                .Subscribe(request =>
            {
                var meta = searchMetadataFactory.Create(request.Text,
                                                        request.UseRegEx,
                                                        metadataCollection.NextIndex(),
                                                        false);
                metadataCollection.AddorUpdate(meta);
            });

            _cleanUp = new CompositeDisposable(searchInvoker,
                                               userOptions,
                                               searchInvoker,
                                               monitor,
                                               SearchHints);
        }
Esempio n. 21
0
        public SearchOptionsProxy([NotNull] SearchMetadata searchMetadata,
                                  [NotNull] IColourProvider colourProvider,
                                  [NotNull] IconSelector iconSelector,
                                  [NotNull] Action <SearchMetadata> removeAction,
                                  [NotNull] IDefaultIconSelector defaultIconSelector,
                                  Guid parentId)
        {
            if (searchMetadata == null)
            {
                throw new ArgumentNullException(nameof(searchMetadata));
            }
            if (colourProvider == null)
            {
                throw new ArgumentNullException(nameof(colourProvider));
            }
            if (iconSelector == null)
            {
                throw new ArgumentNullException(nameof(iconSelector));
            }
            if (removeAction == null)
            {
                throw new ArgumentNullException(nameof(removeAction));
            }
            if (defaultIconSelector == null)
            {
                throw new ArgumentNullException(nameof(defaultIconSelector));
            }


            _searchMetadata      = searchMetadata;
            _defaultIconSelector = defaultIconSelector;
            IconSelector         = iconSelector;

            ShowIconSelectorCommand = new Command(ShowIconSelector);
            RemoveCommand           = new Command(() => removeAction(searchMetadata));
            HighlightCommand        = new Command <Hue>(newHue =>
            {
                HighlightHue = newHue;
            });

            ParentId     = parentId;
            Highlight    = _searchMetadata.Highlight;
            Filter       = _searchMetadata.Filter;
            UseRegex     = searchMetadata.UseRegex;
            IgnoreCase   = searchMetadata.IgnoreCase;
            Position     = searchMetadata.Position;
            Hues         = colourProvider.Hues;
            HighlightHue = searchMetadata.HighlightHue;

            IconKind = _searchMetadata.IconKind.ParseEnum <PackIconKind>()
                       .ValueOr(() => PackIconKind.ArrowRightBold);

            Foreground = this.WhenValueChanged(vm => vm.HighlightHue)
                         .Select(h => h.ForegroundBrush)
                         .ForBinding();

            Background = this.WhenValueChanged(vm => vm.HighlightHue)
                         .Select(h => h.BackgroundBrush)
                         .ForBinding();

            _cleanUp = new CompositeDisposable(IconSelector, Foreground, Background);
        }
Esempio n. 22
0
 public SearchStateToMetadataMapper(IColourProvider colourProvider,
                                    IIconProvider iconProvider)
 {
     _colourProvider = colourProvider;
     _iconProvider   = iconProvider;
 }
Esempio n. 23
0
 public DefaultColourSelector(IColourProvider colourProvider)
 {
     _colourProvider = colourProvider;
     _defaults       = Load().ToArray();
 }