Example #1
0
        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 ImageScrollControlViewModel(IContainerExtension container, IRegionManager regionManager)
        {
            var mainImages   = container.Resolve <MainImages>();
            var viewSettings = container.Resolve <ViewSettings>();

            IsImageViewerInterlock = viewSettings.ObserveProperty(x => x.IsImageViewerInterlock).ToReadOnlyReactiveProperty();
            CanVisibleReducedImage = viewSettings.ObserveProperty(x => x.CanVisibleReducedImage).ToReadOnlyReactiveProperty();

            IsSamplingFrameOnImage = new[]
            {
                viewSettings.ObserveProperty(x => x.IsVisibleImageOverlapSamplingFrame),
                viewSettings.ObserveProperty(x => x.IsSamplingFrameOnImage)
            }
            .CombineLatestValuesAreAllTrue()
            .ToReadOnlyReactiveProperty();

            IsSamplingFrameOnScrollContent = new[]
            {
                viewSettings.ObserveProperty(x => x.IsVisibleImageOverlapSamplingFrame),
                viewSettings.ObserveProperty(x => x.IsSamplingFrameOnImage).Inverse()
            }
            .CombineLatestValuesAreAllTrue()
            .ToReadOnlyReactiveProperty();

            // 画像管理クラスのインデックスを取得
            int index = mainImages.GetImageIndex();

            LoadImageCommand.Subscribe(x => mainImages.LoadImage(index));

            ImageSource = mainImages.ImageSources[index].ObserveProperty(x => x.ImageSource)
                          .ToReadOnlyReactiveProperty(mode: ReactivePropertyMode.None);

            // View通知情報のデバッグ表示
            ImageZoomPayload
            .Subscribe(x => Console.WriteLine($"VM({index})-ZoomMagRatio: {x.IsEntire} => {(x.MagRatio * 100.0):f2} %"));

            ImageScrollOffsetCenterRatio
            .Subscribe(x => Console.WriteLine($"VM({index})-ScrollOffsetRatio: ({x.X:f2}, {x.Y:f2})"));

            SamplingFrameRect
            .Subscribe(x => Console.WriteLine($"VM({index})-SamplingFrameRect: ({x.X:f2}, {x.Y:f2}) {x.Width:f2} x {x.Height:f2}"));

            ZoomAllCommand
            .Subscribe(x =>
            {
                // 全画面の再要求を行うと、Viewで設定した倍率をクリアしてしまうので行わない
                if (!ImageZoomPayload.Value.IsEntire)
                {
                    ImageZoomPayload.Value = new ImageZoomPayload(true, double.NaN);
                }
            });

            ZoomX1Command
            .Subscribe(x => ImageZoomPayload.Value = new ImageZoomPayload(false, 1.0));

            OffsetCenterCommand
            .Subscribe(x => ImageScrollOffsetCenterRatio.Value = new Point(0.5, 0.5));


            //PointTest.Subscribe(x => Console.WriteLine($"VM-PointTest: {x}"));
        }
Example #3
0
        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);
        }