/// <summary> /// Creates a square image and attaches an event handler to the layout changed event that /// adds the the square in the upper right-hand corner of the TextView via the adornment layer /// </summary> /// <param name="view">The <see cref="IWpfTextView"/> upon which the adornment will be drawn</param> public SaveAllTheTimeAdornment(IWpfTextView view, IVisualStudioOps vsOps) { _view = view; _adornmentLayer = view.GetAdornmentLayer("SaveAllTheTimeAdornment"); var filePath = getFilePathFromView(_view); if (shouldSuppressAdornment(filePath)) { _inner = Disposable.Empty; return; } var commitControl = new CommitHintView() { ViewModel = new CommitHintViewModel(filePath, vsOps, settings), }; var disp = new CompositeDisposable(); var sizeChanged = Observable.Merge( Observable.FromEventPattern <EventHandler, EventArgs>(x => _view.ViewportHeightChanged += x, x => _view.ViewportHeightChanged -= x), Observable.FromEventPattern <EventHandler, EventArgs>(x => _view.ViewportWidthChanged += x, x => _view.ViewportWidthChanged -= x)); var hasAdded = false; disp.Add(sizeChanged.Subscribe(__ => { if (!hasAdded) { _adornmentLayer.AddAdornment(AdornmentPositioningBehavior.ViewportRelative, null, null, commitControl, null); hasAdded = true; } // NB: The scheduling is to get around initialization where ActualXXX is zero var action = new Action <double>(_ => { Canvas.SetLeft(commitControl, _view.ViewportRight - commitControl.ActualWidth); Canvas.SetTop(commitControl, _view.ViewportBottom - commitControl.ActualHeight); }); if (commitControl.ActualWidth > 1) { action(commitControl.ActualWidth); } else { commitControl.WhenAny(x => x.ActualWidth, x => x.Value) .Where(x => x > 1) .Take(1) .Subscribe(action); } })); disp.Add(Disposable.Create(() => _adornmentLayer.RemoveAllAdornments())); disp.Add(Observable.FromEventPattern <EventHandler, EventArgs>(x => _view.Closed += x, x => _view.Closed -= x) .Subscribe(_ => Dispose())); _inner = disp; disp.Add(commitControl.ViewModel); }
/// <summary> /// Creates a square image and attaches an event handler to the layout changed event that /// adds the the square in the upper right-hand corner of the TextView via the adornment layer /// </summary> /// <param name="view">The <see cref="IWpfTextView"/> upon which the adornment will be drawn</param> public SaveAllTheTimeAdornment(IWpfTextView view, IVisualStudioOps vsOps) { _view = view; _adornmentLayer = view.GetAdornmentLayer("SaveAllTheTimeAdornment"); var filePath = getFilePathFromView(_view); if (shouldSuppressAdornment(filePath)) { _inner = Disposable.Empty; return; } var commitControl = new CommitHintView() { ViewModel = new CommitHintViewModel(filePath, vsOps, settings), }; var disp = new CompositeDisposable(); var sizeChanged = Observable.Merge( Observable.FromEventPattern<EventHandler, EventArgs>(x => _view.ViewportHeightChanged += x, x => _view.ViewportHeightChanged -= x), Observable.FromEventPattern<EventHandler, EventArgs>(x => _view.ViewportWidthChanged += x, x => _view.ViewportWidthChanged -= x)); var hasAdded = false; disp.Add(sizeChanged.Subscribe(__ => { if (!hasAdded) { _adornmentLayer.AddAdornment(AdornmentPositioningBehavior.ViewportRelative, null, null, commitControl, null); hasAdded = true; } // NB: The scheduling is to get around initialization where ActualXXX is zero var action = new Action<double>(_ => { Canvas.SetLeft(commitControl, _view.ViewportRight - commitControl.ActualWidth); Canvas.SetTop(commitControl, _view.ViewportBottom - commitControl.ActualHeight); }); if (commitControl.ActualWidth > 1) { action(commitControl.ActualWidth); } else { commitControl.WhenAny(x => x.ActualWidth, x => x.Value) .Where(x => x > 1) .Take(1) .Subscribe(action); } })); disp.Add(Disposable.Create(() => _adornmentLayer.RemoveAllAdornments())); disp.Add(Observable.FromEventPattern<EventHandler, EventArgs>(x => _view.Closed += x, x => _view.Closed -= x) .Subscribe(_ => Dispose())); _inner = disp; disp.Add(commitControl.ViewModel); }
/// <summary> /// Creates a square image and attaches an event handler to the layout changed event that /// adds the the square in the upper right-hand corner of the TextView via the adornment layer /// </summary> /// <param name="view">The <see cref="IWpfTextView"/> upon which the adornment will be drawn</param> public SaveAllTheTimeAdornment(IWpfTextView view, IVisualStudioOps vsOps) { _view = view; _adornmentLayer = view.GetAdornmentLayer("SaveAllTheTimeAdornment"); var commitControl = new CommitHintView() { ViewModel = new CommitHintViewModel(getFilePathFromView(_view), vsOps, settings), }; var disp = new CompositeDisposable(); var sizeChanged = Observable.Merge( Observable.FromEventPattern<EventHandler, EventArgs>(x => _view.ViewportHeightChanged += x, x => _view.ViewportHeightChanged -= x), Observable.FromEventPattern<EventHandler, EventArgs>(x => _view.ViewportWidthChanged += x, x => _view.ViewportWidthChanged -= x)); var hasAdded = false; disp.Add(sizeChanged.Subscribe(x => { if (!hasAdded) { _adornmentLayer.AddAdornment(AdornmentPositioningBehavior.ViewportRelative, null, null, commitControl, null); hasAdded = true; } // NB: The scheduling is to get around initialization where ActualXXX is zero var sched = (commitControl.ActualWidth > 0 ? ImmediateScheduler.Instance : RxApp.MainThreadScheduler); sched.Schedule(() => { Canvas.SetLeft(commitControl, _view.ViewportRight - commitControl.ActualWidth); Canvas.SetTop(commitControl, _view.ViewportBottom - commitControl.ActualHeight); }); })); disp.Add(Disposable.Create(() => _adornmentLayer.RemoveAllAdornments())); disp.Add(Observable.FromEventPattern<EventHandler, EventArgs>(x => _view.Closed += x, x => _view.Closed -= x) .Subscribe(_ => Dispose())); disp.Add(commitControl.ViewModel); _inner = disp; }