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); }
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(); } }