public ThumbnailList(IContainerExtension container, ImageViewParameter parameter) { // VMに引数を渡したいので自前でインスタンス作る DataContext = new ThumbnailListViewModel(container, parameter); InitializeComponent(); }
public ZoomableImage(IContainerExtension container, ImageViewParameter parameter) { // VMに引数を渡したいので自前でインスタンス作る DataContext = new ZoomableImageViewModel(container, parameter); InitializeComponent(); }
public ExplorerAddressBar(IContainerExtension container, ImageViewParameter parameter) { // VMに引数を渡したいので自前でインスタンス作る DataContext = new ExplorerAddressBarViewModel(container, parameter); InitializeComponent(); }
public ImagePanelViewModel(IContainerExtension container, ImageViewParameter parameter) { ContentIndex = parameter.ContentIndex; ContentCount = parameter.ContentCount; var applicationCommands = container.Resolve <IApplicationCommands>(); var compositeDirectory = container.Resolve <ICompositeImageDirectory>(); var imageDirectory = compositeDirectory.ImageDirectries[ContentIndex]; // ドロップファイル通知(ドロップ数に応じたTabに移行する) DropEvent .Subscribe(paths => { var tabImageUpdate = compositeDirectory.SetDroppedPaths(ContentIndex, paths); applicationCommands.NavigateImageTabContent.Execute(tabImageUpdate); }) .AddTo(CompositeDisposable); // 読み出しディレクトリ購読(デバッグ用) DirectoryPath = imageDirectory .ObserveProperty(x => x.DirectoryPath) .ToReadOnlyReactiveProperty(mode: ReactivePropertyMode.None) .AddTo(CompositeDisposable); // 選択ファイル購読(デバッグ用) SelectedImagePath = imageDirectory .ObserveProperty(x => x.SelectedFilePath) .ToReadOnlyReactiveProperty(mode: ReactivePropertyMode.DistinctUntilChanged) .AddTo(CompositeDisposable); }
public ThumbnailListViewModel(IContainerExtension container, ImageViewParameter parameter) { var compositeDirectory = container.Resolve <ICompositeImageDirectory>(); var imageDirectory = compositeDirectory.ImageDirectries[parameter.ContentIndex]; // 選択候補サムネイル要素の作成 ThumbnailSources = imageDirectory.ImageFiles .ToReadOnlyReactiveCollection(x => new Thumbnail(x.FilePath), scheduler: Scheduler.CurrentThread) .AddTo(CompositeDisposable); // 選択中画像 from Model SelectedItem = imageDirectory .ObserveProperty(x => x.SelectedFilePath) .Select(x => (x is null) ? default : ThumbnailSources.FirstOrDefault(y => y.FilePath == x))
public MinimapViewModel(IContainerExtension container, ImageViewParameter parameter) { var compositeDirectory = container.Resolve <ICompositeImageDirectory>(); var imageDirectory = compositeDirectory.ImageDirectries[parameter.ContentIndex]; var imageSourceObservable = imageDirectory .ObserveProperty(x => x.SelectedImage) .Publish() .RefCount(); ImageSource = imageSourceObservable .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); ImageSourceSize = imageSourceObservable .Select(x => (x is null) ? default : new Size(x.Width, x.Height))
public ExplorerAddressBarViewModel(IContainerExtension container, ImageViewParameter parameter) { var compositeDirectory = container.Resolve <ICompositeImageDirectory>(); var imageDirectory = compositeDirectory.ImageDirectries[parameter.ContentIndex]; // ディレクトリPATHをModelに通知するAction(子View用) _sendSerectedDirectoryPathAction = path => TargetDirectory.Value = path; VisibleTextBoxCommand = new DelegateCommand(() => IsVisibleDirectoryNode.TurnOff()); CollapsedTextBoxCommand = new DelegateCommand(() => IsVisibleDirectoryNode.TurnOn()); // directory from model imageDirectory .ObserveProperty(x => x.DirectoryPath) .Where(path => path != null) .Subscribe(path => UpdateViewsSource(path)) .AddTo(CompositeDisposable); // directory to model TargetDirectory .Subscribe(path => imageDirectory.SetSelectedDictionaryPath(DirectoryNode.EmendFullPathFromViewModel(path))) .AddTo(CompositeDisposable); // TextBox入力確定時のディレクトリ通知 TextEnterCommand = new DelegateCommand <string>(path => { if (Directory.Exists(path)) { TargetDirectory.Value = path; } IsVisibleDirectoryNode.TurnOn(); }); // キャンセル時は表示切替のみ(テキストボックスに入力中の文字は残している) TextCancelCommand = new DelegateCommand(() => IsVisibleDirectoryNode.TurnOn()); }
public ScrollImageViewerViewModel(IContainerExtension container, ImageViewParameter parameter) { var compositeDirectory = container.Resolve <ICompositeImageDirectory>(); var imageDirectory = compositeDirectory.ImageDirectries[parameter.ContentIndex]; #region ImageSource ImageSource = imageDirectory .ObserveProperty(x => x.SelectedImage) .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); IsLoadingImage = ImageSource .Select(x => x != null) .ToReadOnlyReactiveProperty(mode: ReactivePropertyMode.DistinctUntilChanged) .AddTo(CompositeDisposable); #endregion #region Zoom imageDirectory .ObserveProperty(x => x.ZoomMagRatio) .Subscribe(x => ImageZoomMagPayload.Value = double.IsNaN(x) ? ImageZoomMag.Entire : new ImageZoomMag(false, x)) .AddTo(CompositeDisposable); ImageZoomMagPayload .Select(x => x.IsEntire ? double.NaN : x.MagRatio) .Subscribe(mag => compositeDirectory.SetImageZoomMagRatioToAll(parameter.ContentIndex, mag)) .AddTo(CompositeDisposable); IsImageZoomingIn //.Do(b => Debug.WriteLine($"IsImageZoomingIn({parameter.ContentIndex}): {b}")) .Subscribe(b => imageDirectory.IsZoomingIn = b) .AddTo(CompositeDisposable); #endregion #region Offset imageDirectory .ObserveProperty(x => x.OffsetCenterRatio) //.Do(x => Debug.WriteLine($"{indexMessage}-FromM ({x.X:f4}, {x.Y:f4})")) .Subscribe(p => ImageScrollOffsetCenterRatio.Value = p) .AddTo(CompositeDisposable); ImageScrollOffsetCenterRatio //.Do(x => Debug.WriteLine($"{indexMessage}-ToM: ({x.X:f4}, {x.Y:f4})")) .Subscribe(p => imageDirectory.OffsetCenterRatio = p) .AddTo(CompositeDisposable); #endregion // 自分以外の画像ディレクトリに変更を通知する(自身は適用済み) ImageScrollVectorRatio .Subscribe(v => compositeDirectory.SetImageShiftRatioToOthers(parameter.ContentIndex, v)) .AddTo(CompositeDisposable); ImageViewport .Subscribe(v => compositeDirectory.SetImageViewportToAll(parameter.ContentIndex, v)) .AddTo(CompositeDisposable); var viewSettings = container.Resolve <ViewSettings>(); IsImageViewerInterlock = viewSettings .ObserveProperty(x => x.IsImageViewerInterlock) .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); CanVisibleReducedImage = viewSettings .ObserveProperty(x => x.CanVisibleReducedImage) .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); IsVisibleSamplingFrameOnImage = new[] { IsLoadingImage, viewSettings.ObserveProperty(x => x.IsVisibleImageOverlapSamplingFrame), viewSettings.ObserveProperty(x => x.IsVisibleSamplingFrameOnImage) } .CombineLatestValuesAreAllTrue() .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); IsVisibleSamplingFrameOnScroll = new[] { IsLoadingImage, viewSettings.ObserveProperty(x => x.IsVisibleImageOverlapSamplingFrame), viewSettings.ObserveProperty(x => x.IsVisibleSamplingFrameOnImage).Inverse() } .CombineLatestValuesAreAllTrue() .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); #region forDebug // View通知情報のデバッグ表示 var indexMessage = $"VM({parameter.ContentIndex}/{parameter.ContentCount})"; ImageZoomMagPayload .Subscribe(x => Debug.WriteLine($"{indexMessage}-ImageZoomPayload: {x.IsEntire} => {(x.MagRatio * 100.0):f4} %")) .AddTo(CompositeDisposable); ImageScrollOffsetCenterRatio .Subscribe(x => Debug.WriteLine($"{indexMessage}-ImageScrollOffsetCenterRatio: ({x.X:f4}, {x.Y:f4})")) .AddTo(CompositeDisposable); SamplingFrameRect .Subscribe(x => Debug.WriteLine($"{indexMessage}-SamplingFrameRect: ({x.X:f2}, {x.Y:f2}) {x.Width:f2} x {x.Height:f2}")) .AddTo(CompositeDisposable); ZoomAllCommand .Subscribe(x => { // 全画面の再要求を行うと、Viewで設定した倍率をクリアしてしまうので行わない if (!ImageZoomMagPayload.Value.IsEntire) { ImageZoomMagPayload.Value = new ImageZoomMag(true, double.NaN); } }) .AddTo(CompositeDisposable); ZoomX1Command .Subscribe(x => ImageZoomMagPayload.Value = new ImageZoomMag(false, 1.0)) .AddTo(CompositeDisposable); OffsetCenterCommand .Subscribe(x => ImageScrollOffsetCenterRatio.Value = new Point(0.5, 0.5)) .AddTo(CompositeDisposable); //PointTest.Subscribe(x => Debug.WriteLine($"VM-PointTest: {x}")).AddTo(CompositeDisposable); #endregion }
public ZoomableImageViewModel(IContainerExtension container, ImageViewParameter parameter) { var compositeDirectory = container.Resolve <ICompositeImageDirectory>(); var imageDirectory = compositeDirectory.ImageDirectries[parameter.ContentIndex]; ImageSource = imageDirectory.ObserveProperty(x => x.SelectedImage) .ToReadOnlyReactiveProperty(mode: ReactivePropertyMode.None) .AddTo(CompositeDisposable); IsLoadingImage = ImageSource.Select(x => x != null) .ToReadOnlyReactiveProperty(mode: ReactivePropertyMode.DistinctUntilChanged) .AddTo(CompositeDisposable); var viewSettings = container.Resolve <ViewSettings>(); IsImageViewerInterlock = viewSettings.ObserveProperty(x => x.IsImageViewerInterlock) .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); CanVisibleReducedImage = viewSettings.ObserveProperty(x => x.CanVisibleReducedImage) .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); IsVisibleSamplingFrameOnImage = new[] { IsLoadingImage, viewSettings.ObserveProperty(x => x.IsVisibleImageOverlapSamplingFrame), viewSettings.ObserveProperty(x => x.IsVisibleSamplingFrameOnImage) } .CombineLatestValuesAreAllTrue() .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); IsVisibleSamplingFrameOnScroll = new[] { IsLoadingImage, viewSettings.ObserveProperty(x => x.IsVisibleImageOverlapSamplingFrame), viewSettings.ObserveProperty(x => x.IsVisibleSamplingFrameOnImage).Inverse() } .CombineLatestValuesAreAllTrue() .ToReadOnlyReactiveProperty() .AddTo(CompositeDisposable); // View通知情報のデバッグ表示 var indexMessage = $"VM({parameter.ContentIndex}/{parameter.ContentCount})"; ImageZoomPayload .Subscribe(x => Debug.WriteLine($"{indexMessage}-ImageZoomPayload: {x.IsEntire} => {(x.MagRatio * 100.0):f2} %")) .AddTo(CompositeDisposable); ImageScrollOffsetCenterRatio .Subscribe(x => Debug.WriteLine($"{indexMessage}-ImageScrollOffsetCenterRatio: ({x.X:f2}, {x.Y:f2})")) .AddTo(CompositeDisposable); SamplingFrameRect .Subscribe(x => Debug.WriteLine($"{indexMessage}-SamplingFrameRect: ({x.X:f2}, {x.Y:f2}) {x.Width:f2} x {x.Height:f2}")) .AddTo(CompositeDisposable); ZoomAllCommand .Subscribe(x => { // 全画面の再要求を行うと、Viewで設定した倍率をクリアしてしまうので行わない if (!ImageZoomPayload.Value.IsEntire) { ImageZoomPayload.Value = new ImageZoomPayload(true, double.NaN); } }) .AddTo(CompositeDisposable); ZoomX1Command .Subscribe(x => ImageZoomPayload.Value = new ImageZoomPayload(false, 1.0)) .AddTo(CompositeDisposable); OffsetCenterCommand .Subscribe(x => ImageScrollOffsetCenterRatio.Value = new Point(0.5, 0.5)) .AddTo(CompositeDisposable); //PointTest.Subscribe(x => Debug.WriteLine($"VM-PointTest: {x}")).AddTo(CompositeDisposable); }