public StoreCategoryViewModel(TreeViewModelBase parent, StoreCategoryInfo model)
            : base(parent)
        {
            this.Model = model;

            this.Name                = model.ToReactivePropertyAsSynchronized(n => n.Name).AddTo(_disposable);
            this.IsSelected          = new ReactiveProperty <bool>().AddTo(_disposable);
            this.IsExpanded          = model.ToReactivePropertyAsSynchronized(n => n.IsExpanded).AddTo(_disposable);
            this.SignatureViewModels = model.SignatureInfos.ToReadOnlyReactiveCollection(n => new StoreSignatureViewModel(this, n)).AddTo(_disposable);
            this.CategoryViewModels  = model.CategoryInfos.ToReadOnlyReactiveCollection(n => new StoreCategoryViewModel(this, n)).AddTo(_disposable);
        }
Example #2
0
        private void Init()
        {
            {
                IObservable <object> clipboardObservable;
                {
                    var returnObservable = Observable.Return((object)null);
                    var watchObservable  = Observable.FromEventPattern <EventHandler, EventArgs>(h => Clipboard.ClipboardChanged += h, h => Clipboard.ClipboardChanged -= h).Select(n => (object)null);
                    clipboardObservable = Observable.Merge(returnObservable, watchObservable);
                }

                this.TabViewModel = new ReactiveProperty <StoreCategoryViewModel>().AddTo(_disposable);

                this.TabSelectedItem = new ReactiveProperty <TreeViewModelBase>().AddTo(_disposable);
                this.TabSelectedItem.Subscribe((viewModel) => this.TabSelectChanged(viewModel)).AddTo(_disposable);

                this.TabClickCommand = new ReactiveCommand().AddTo(_disposable);
                this.TabClickCommand.Where(n => n == this.TabSelectedItem.Value).Subscribe((_) => this.Refresh()).AddTo(_disposable);

                this.TabNewCategoryCommand = this.TabSelectedItem.Select(n => n is StoreCategoryViewModel).ToReactiveCommand().AddTo(_disposable);
                this.TabNewCategoryCommand.Subscribe(() => this.TabNewCategory()).AddTo(_disposable);

                this.TabEditCommand = this.TabSelectedItem.Select(n => n is StoreCategoryViewModel).ToReactiveCommand().AddTo(_disposable);
                this.TabEditCommand.Subscribe(() => this.TabEdit()).AddTo(_disposable);

                this.TabDeleteCommand = this.TabSelectedItem.Select(n => n != this.TabViewModel.Value && (n is StoreCategoryViewModel || n is StoreSignatureViewModel)).ToReactiveCommand().AddTo(_disposable);
                this.TabDeleteCommand.Subscribe(() => this.TabDelete()).AddTo(_disposable);

                this.TabCutCommand = this.TabSelectedItem.Select(n => n != this.TabViewModel.Value && (n is StoreCategoryViewModel || n is StoreSignatureViewModel)).ToReactiveCommand().AddTo(_disposable);
                this.TabCutCommand.Subscribe(() => this.TabCut()).AddTo(_disposable);

                this.TabCopyCommand = new ReactiveCommand().AddTo(_disposable);
                this.TabCopyCommand.Subscribe(() => this.TabCopy()).AddTo(_disposable);

                this.TabPasteCommand = this.TabSelectedItem.Select(n => n is StoreCategoryViewModel)
                                       .CombineLatest(clipboardObservable.Select(n => Clipboard.ContainsStoreCategoryInfo() || Clipboard.ContainsStoreSignatureInfo() || Clipboard.ContainsSignatures()), (r1, r2) => (r1 && r2)).ToReactiveCommand().AddTo(_disposable);
                this.TabPasteCommand.Subscribe(() => this.TabPaste()).AddTo(_disposable);

                this.SortCommand = new ReactiveCommand <string>().AddTo(_disposable);
                this.SortCommand.Subscribe((propertyName) => this.Sort(propertyName)).AddTo(_disposable);

                this.ListViewDoubleClickCommand = new ReactiveCommand <StoreListViewItemInfo>().AddTo(_disposable);
                this.ListViewDoubleClickCommand.Subscribe((target) => this.ListViewDoubleClick(target));

                this.UpMoveCommand = this.TabSelectedItem.Select(n => n?.Parent != null).ToReactiveCommand().AddTo(_disposable);
                this.UpMoveCommand.Subscribe(() => this.UpMove()).AddTo(_disposable);

                this.NewCategoryCommand = this.TabSelectedItem.Select(n => n is StoreCategoryViewModel)
                                          .CombineLatest(this.SelectedItems.ObserveProperty(n => n.Count).Select(n => n == 0 || n == 1 && SelectedMatch(typeof(StoreCategoryInfo))), (r1, r2) => (r1 && r2)).ToReactiveCommand().AddTo(_disposable);
                this.NewCategoryCommand.Subscribe(() => this.NewCategory()).AddTo(_disposable);

                this.EditCommand = this.SelectedItems.ObserveProperty(n => n.Count)
                                   .Select(n => n == 1 && SelectedMatch(typeof(StoreCategoryInfo))).ToReactiveCommand().AddTo(_disposable);
                this.EditCommand.Subscribe(() => this.Edit()).AddTo(_disposable);

                this.DeleteCommand = this.SelectedItems.ObserveProperty(n => n.Count)
                                     .Select(n => n != 0 && (this.TabSelectedItem.Value is StoreCategoryViewModel)).ToReactiveCommand().AddTo(_disposable);
                this.DeleteCommand.Subscribe(() => this.Delete()).AddTo(_disposable);

                this.CutCommand = this.SelectedItems.ObserveProperty(n => n.Count)
                                  .Select(n => n != 0 && (this.TabSelectedItem.Value is StoreCategoryViewModel)).ToReactiveCommand().AddTo(_disposable);
                this.CutCommand.Subscribe(() => this.Cut()).AddTo(_disposable);

                this.CopyCommand = this.SelectedItems.ObserveProperty(n => n.Count)
                                   .Select(n => n != 0 && SelectedMatch(typeof(StoreCategoryInfo), typeof(Seed))).ToReactiveCommand().AddTo(_disposable);
                this.CopyCommand.Subscribe(() => this.Copy()).AddTo(_disposable);

                this.PasteCommand = this.TabSelectedItem.Select(n => n is StoreCategoryViewModel)
                                    .CombineLatest(this.SelectedItems.ObserveProperty(n => n.Count).Select(n => n == 0 || n == 1 && SelectedMatch(typeof(StoreCategoryInfo))), (r1, r2) => (r1 && r2))
                                    .CombineLatest(clipboardObservable.Select(n => Clipboard.ContainsStoreCategoryInfo() || Clipboard.ContainsStoreSignatureInfo() || Clipboard.ContainsSignatures()), (r1, r2) => (r1 && r2)).ToReactiveCommand().AddTo(_disposable);
                this.PasteCommand.Subscribe(() => this.Paste()).AddTo(_disposable);

                this.DownloadCommand = this.SelectedItems.ObserveProperty(n => n.Count)
                                       .Select(n => n != 0).ToReactiveCommand().AddTo(_disposable);
                this.DownloadCommand.Subscribe(() => this.Download()).AddTo(_disposable);

                this.AdvancedCommand = this.SelectedItems.ObserveProperty(n => n.Count).Select(n => n != 0)
                                       .ToReactiveCommand().AddTo(_disposable);

                this.AdvancedCopyCommand = new ReactiveCommand <string>().AddTo(_disposable);
                this.AdvancedCopyCommand.Subscribe((type) => this.AdvancedCopy(type)).AddTo(_disposable);

                bool SelectedMatch(params Type[] types)
                {
                    object selectedModel = this.SelectedItems.OfType <StoreListViewItemInfo>().First().Model;

                    return(types.Any(n => n == selectedModel.GetType()));
                }
            }

            {
                string configPath = Path.Combine(AmoebaEnvironment.Paths.ConfigDirectoryPath, "View", nameof(StoreControl));
                if (!Directory.Exists(configPath))
                {
                    Directory.CreateDirectory(configPath);
                }

                _settings = new Settings(configPath);
                int version = _settings.Load("Version", () => 0);

                {
                    var model = _settings.Load("StoreCategoryInfo", () =>
                    {
                        var categoryInfo = new StoreCategoryInfo()
                        {
                            Name = "Category", IsExpanded = true
                        };
                        categoryInfo.SignatureInfos.Add(new StoreSignatureInfo()
                        {
                            AuthorSignature = Signature.Parse("Lyrise@i-2IpSdusn_TKfn6NSECLYRVO4r51cpHZ5wFgBo_0eU")
                        });

                        return(categoryInfo);
                    });

                    this.TabViewModel.Value = new StoreCategoryViewModel(null, model);
                }

                _sortInfo = _settings.Load("SortInfo", () => new ListSortInfo()
                {
                    Direction = ListSortDirection.Ascending, PropertyName = "Name"
                });
                this.DynamicOptions.SetProperties(_settings.Load(nameof(this.DynamicOptions), () => Array.Empty <DynamicOptions.DynamicPropertyInfo>()));
            }

            {
                EventHooks.Instance.SaveEvent += this.Save;
            }

            {
                this.Refresh();
            }
        }