public DoneCommitVm(RepositoryVm repos, Model.Git.Commit model, TwoPaneLayoutVm twoPaneLayout) { Debug.Assert(model != null); _repos = repos; _model = model; TwoPaneLayout = twoPaneLayout ?? new TwoPaneLayoutVm().AddTo(MultipleDisposable); MultipleDisposable.AddFirst(() => { lock (_isDownloadingLockObj) { if (_isDownloading) _disposeResetEvent = new ManualResetEventSlim(); } }); }
public WipCommitVm(RepositoryVm repos, TwoPaneLayoutVm twoPaneLayout) { Debug.Assert(repos != null); _repos = repos; TwoPaneLayout = twoPaneLayout ?? new TwoPaneLayoutVm().AddTo(MultipleDisposable); SelectedWipFiles = new ObservableCollection<WipFileVm>(); SelectedWipFiles.CollectionChangedAsObservable() .Subscribe(_ => { var count = SelectedWipFiles.Count; if (count == 0) DiffFileViewSource = WipFiles.Value.FirstOrDefault(); else if (count == 1) DiffFileViewSource = SelectedWipFiles.FirstOrDefault(); else DiffFileViewSource = SelectedWipFiles; }) .AddTo(MultipleDisposable); SummaryRemaining = this.ObserveProperty(x => x.Summary) .Select(x => 80 - x.Length) .ToReadOnlyReactiveProperty() .AddTo(MultipleDisposable); SummaryRemainingBrush = SummaryRemaining .Select(x => { if (x < 0) return Brushes.Red; if (x < 20) return Brushes.DarkRed; return Brushes.Gray; }) .ToReadOnlyReactiveProperty() .AddTo(MultipleDisposable); CommitCommand = this.ObserveProperty(x => x.Summary) .Select(x => string.IsNullOrWhiteSpace(x) == false) .ToReactiveCommand() .AddTo(MultipleDisposable); CommitCommand.Subscribe(_ => repos.Commit((Summary + "\n\n" + Description).Trim())) .AddTo(MultipleDisposable); DiscardChangesCommand = SelectedWipFiles.CollectionChangedAsObservable() .Select(x => SelectedWipFiles.Any()) .ToReactiveCommand() .AddTo(MultipleDisposable); DiscardChangesCommand.Subscribe(_ => repos.DiscardChanges(SelectedWipFiles.Select(x => x.Path.Value)) ).AddTo(MultipleDisposable); // IsAllSelected 関係 { IsAllSelected = new ReactiveProperty<bool?>().AddTo(MultipleDisposable); IsAllSelected.Subscribe(i => { // UI からの操作では on/off のどちらかに設定する if (_isInUpdateIsAllSelected == false) { if (i.HasValue == false) { IsAllSelected.Value = false; return; } } if (i.HasValue == false) return; WipFiles.Value.ForEach(x => x.IsInStaging.Value = i.Value); }).AddTo(MultipleDisposable); this.ObserveProperty(x => x.WipFiles) .Subscribe(x => { _isInStageingDisposer?.Dispose(); _isInStageingDisposer = new MultipleDisposable(); x.Value.ForEach(y => y.IsInStaging.Subscribe(_ => UpdateIsAllSelected()).AddTo(_isInStageingDisposer)); }) .AddTo(MultipleDisposable); MultipleDisposable.Add(() => _isInStageingDisposer?.Dispose()); } }