Exemple #1
0
        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);
        }
Exemple #5
0
        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());
        }
Exemple #8
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
        }
Exemple #9
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);
        }