public ChatCategoryViewModel(TreeViewModelBase parent, ChatCategoryInfo 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.Threads = model.ThreadInfos.ToReadOnlyReactiveCollection(n => new ChatThreadViewModel(this, n)).AddTo(_disposable); this.Categories = model.CategoryInfos.ToReadOnlyReactiveCollection(n => new ChatCategoryViewModel(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 <ChatCategoryViewModel>().AddTo(_disposable); this.TabSelectedItem = new ReactiveProperty <TreeViewModelBase>().AddTo(_disposable); this.TabSelectedItem.Subscribe((viewModel) => this.TabSelectChanged(viewModel)).AddTo(_disposable); this.Info = new ReactiveProperty <AvalonEditChatMessagesInfo>().AddTo(_disposable); this.SelectedText = new ReactiveProperty <string>().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 ChatCategoryViewModel).ToReactiveCommand().AddTo(_disposable); this.TabNewCategoryCommand.Subscribe(() => this.TabNewCategory()).AddTo(_disposable); this.TabEditCommand = this.TabSelectedItem.Select(n => n is ChatCategoryViewModel).ToReactiveCommand().AddTo(_disposable); this.TabEditCommand.Subscribe(() => this.TabEdit()).AddTo(_disposable); this.TabDeleteCommand = this.TabSelectedItem.Select(n => n != this.TabViewModel.Value).ToReactiveCommand().AddTo(_disposable); this.TabDeleteCommand.Subscribe(() => this.TabDelete()).AddTo(_disposable); this.TabCutCommand = new ReactiveCommand().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 ChatCategoryViewModel) .CombineLatest(clipboardObservable.Select(n => Clipboard.ContainsTags() || Clipboard.ContainsChatCategoryInfo() || Clipboard.ContainsChatThreadInfo()), (r1, r2) => r1 && r2).ToReactiveCommand().AddTo(_disposable); this.TabPasteCommand.Subscribe(() => this.TabPaste()).AddTo(_disposable); this.TabTagListCommand = this.TabSelectedItem.Select(n => n is ChatCategoryViewModel).ToReactiveCommand().AddTo(_disposable); this.TabTagListCommand.Subscribe(() => this.TabTagList()).AddTo(_disposable); this.TrustFilterCommand = this.TabSelectedItem.Select(n => n is ChatThreadViewModel).ToReactiveCommand().AddTo(_disposable); this.TrustFilterCommand.Subscribe(() => this.TrustFilter()).AddTo(_disposable); this.IsTrustFilterEnable = new ReactiveProperty <bool>().AddTo(_disposable); this.NewFilterCommand = this.TabSelectedItem.Select(n => n is ChatThreadViewModel).ToReactiveCommand().AddTo(_disposable); this.NewFilterCommand.Subscribe(() => this.NewFilter()).AddTo(_disposable); this.IsNewFilterEnable = new ReactiveProperty <bool>().AddTo(_disposable); this.MiningLimits = new ObservableCollection <int>(Enumerable.Range(0, 256 + 1)); this.SelectedMiningLimit = new ReactiveProperty <int>().AddTo(_disposable); this.SelectedMiningLimit.Subscribe((_) => this.Refresh()).AddTo(_disposable); this.NewMessageCommand = this.TabSelectedItem.Select(n => n is ChatThreadViewModel).ToReactiveCommand().AddTo(_disposable); this.NewMessageCommand.Subscribe(() => this.NewMessage()).AddTo(_disposable); this.CopyCommand = this.SelectedText.Select(n => !string.IsNullOrEmpty(n)).ToReactiveCommand().AddTo(_disposable); this.CopyCommand.Subscribe(() => this.Copy()).AddTo(_disposable); this.ResponseCommand = this.SelectedText.Select(n => !string.IsNullOrEmpty(n)).ToReactiveCommand().AddTo(_disposable); this.ResponseCommand.Subscribe(() => this.Response()).AddTo(_disposable); } { string configPath = Path.Combine(AmoebaEnvironment.Paths.ConfigPath, "View", nameof(ChatControl)); if (!Directory.Exists(configPath)) { Directory.CreateDirectory(configPath); } _settings = new Settings(configPath); int version = _settings.Load("Version", () => 0); { var model = _settings.Load("ChatCategoryInfo", () => { var categoryInfo = new ChatCategoryInfo() { Name = "Category", IsExpanded = true }; categoryInfo.ThreadInfos.Add(new ChatThreadInfo() { Tag = new Tag("Amoeba", Sha256.Compute("Amoeba")) }); categoryInfo.ThreadInfos.Add(new ChatThreadInfo() { Tag = new Tag("Random", Sha256.Compute("Random")) }); return(categoryInfo); }); this.TabViewModel.Value = new ChatCategoryViewModel(null, model); } this.SelectedMiningLimit.Value = _settings.Load("MiningLimit", () => 0); this.DynamicOptions.SetProperties(_settings.Load(nameof(DynamicOptions), () => Array.Empty <DynamicOptions.DynamicPropertyInfo>())); } { Backup.Instance.SaveEvent += this.Save; } }