From 86dacf6e73cdbc63ecc6baf8c9982754edc47612 Mon Sep 17 00:00:00 2001 From: Paddy Xu Date: Sat, 22 Jul 2017 23:51:39 +0300 Subject: [PATCH] pinch zoom gesture; rewrite zoomviewer --- .../ImagePanel.xaml | 6 +- .../ImagePanel.xaml.cs | 220 ++++++++++++++--- .../QuickLook.Plugin.ImageViewer/Plugin.cs | 26 +- .../MouseWheelMonitor.cs | 130 ---------- .../PdfViewerControl.xaml | 6 +- .../PdfViewerControl.xaml.cs | 228 ++++-------------- .../QuickLook.Plugin.PdfViewer.csproj | 6 +- 7 files changed, 270 insertions(+), 352 deletions(-) delete mode 100644 QuickLook.Plugin/QuickLook.Plugin.PDFViewer/MouseWheelMonitor.cs diff --git a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/ImagePanel.xaml b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/ImagePanel.xaml index 670bf8d..b7e7ce1 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/ImagePanel.xaml +++ b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/ImagePanel.xaml @@ -5,11 +5,13 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:QuickLook.Plugin.ImageViewer" mc:Ignorable="d" + x:Name="imagePanel" d:DesignHeight="300" d:DesignWidth="300"> - + VerticalScrollBarVisibility="Auto" Focusable="False" IsManipulationEnabled="True"> + \ No newline at end of file diff --git a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/ImagePanel.xaml.cs b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/ImagePanel.xaml.cs index 688919b..b1f051a 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/ImagePanel.xaml.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/ImagePanel.xaml.cs @@ -16,58 +16,141 @@ // along with this program. If not, see . using System; -using System.IO; +using System.ComponentModel; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Threading; +using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; -using ImageMagick; -using XamlAnimatedGif; +using System.Windows.Media.Imaging; +using System.Windows.Threading; +using QuickLook.Annotations; namespace QuickLook.Plugin.ImageViewer { /// /// Interaction logic for ImagePanel.xaml /// - public partial class ImagePanel : UserControl + public partial class ImagePanel : UserControl, INotifyPropertyChanged { private Point? _dragInitPos; - private double _minZoomFactor = 1d; + private DateTime _lastZoomTime = DateTime.MinValue; + private double _maxZoomFactor = 3d; + private double _minZoomFactor = 0.1d; + private BitmapScalingMode _renderMode = BitmapScalingMode.HighQuality; + private BitmapSource _source; private double _zoomFactor = 1d; - public ImagePanel(string path) + private bool _zoomToFit = true; + + public ImagePanel() { InitializeComponent(); - LoadImage(path); - - Loaded += (sender, e) => { ZoomToFit(); }; + SizeChanged += ImagePanel_SizeChanged; viewPanel.PreviewMouseWheel += ViewPanel_PreviewMouseWheel; - viewPanel.MouseLeftButtonDown += ViewPanel_MouseLeftButtonDown; viewPanel.MouseMove += ViewPanel_MouseMove; + + viewPanel.ManipulationStarting += ViewPanel_ManipulationStarting; + viewPanel.ManipulationDelta += ViewPanel_ManipulationDelta; } - private void LoadImage(string path) + public BitmapScalingMode RenderMode { - if (Path.GetExtension(path).ToLower() == ".gif") - AnimationBehavior.SetSourceUri(viewPanelImage, new Uri(path)); - - using (var image = new MagickImage(path)) + get => _renderMode; + set { - image.Rotate(image.Orientation == OrientationType.RightTop - ? 90 - : image.Orientation == OrientationType.BottomRight - ? 180 - : image.Orientation == OrientationType.LeftBotom - ? 270 - : 0); - - viewPanelImage.Source = image.ToBitmapSource(); + _renderMode = value; + OnPropertyChanged(); } } + public bool ZoomToFit + { + get => _zoomToFit; + set + { + _zoomToFit = value; + OnPropertyChanged(); + } + } + + public double MinZoomFactor + { + get => _minZoomFactor; + set + { + _minZoomFactor = value; + OnPropertyChanged(); + } + } + + public double MaxZoomFactor + { + get => _maxZoomFactor; + set + { + _maxZoomFactor = value; + OnPropertyChanged(); + } + } + + public double ZoomFactor + { + get => _zoomFactor; + private set + { + _zoomFactor = value; + OnPropertyChanged(); + } + } + + public BitmapSource Source + { + get => _source; + set + { + _source = value; + OnPropertyChanged(); + } + } + + public event PropertyChangedEventHandler PropertyChanged; + + public event EventHandler ImageScrolled; + public event EventHandler DelayedReRender; + + private void ImagePanel_SizeChanged(object sender, SizeChangedEventArgs e) + { + if (ZoomToFit) + DoZoomToFit(false); + } + + private void ViewPanel_ManipulationStarting(object sender, ManipulationStartingEventArgs e) + { + e.ManipulationContainer = viewPanel; + e.Mode = ManipulationModes.Scale | ManipulationModes.Translate; + } + + private void ViewPanel_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) + { + var delta = e.DeltaManipulation; + + var newZoom = ZoomFactor + ZoomFactor * (delta.Scale.X - 1); + + Zoom(newZoom, false); + + viewPanel.ScrollToHorizontalOffset(viewPanel.HorizontalOffset - delta.Translation.X); + viewPanel.ScrollToVerticalOffset(viewPanel.VerticalOffset - delta.Translation.Y); + + e.Handled = true; + } + private void ViewPanel_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { e.MouseDevice.Capture(viewPanel); @@ -95,6 +178,8 @@ namespace QuickLook.Plugin.ImageViewer var delta = _dragInitPos.Value - e.GetPosition(viewPanel); + Debug.WriteLine(_dragInitPos.Value); + viewPanel.ScrollToHorizontalOffset(delta.X); viewPanel.ScrollToVerticalOffset(delta.Y); } @@ -108,33 +193,63 @@ namespace QuickLook.Plugin.ImageViewer // normal scroll viewPanel.ScrollToVerticalOffset(viewPanel.VerticalOffset - e.Delta); + ImageScrolled?.Invoke(this, e.Delta); + return; } // zoom - var newZoom = _zoomFactor + (double) e.Delta / 120 * 0.1; - - newZoom = Math.Max(newZoom, _minZoomFactor); - newZoom = Math.Min(newZoom, 3); + var newZoom = ZoomFactor + ZoomFactor * e.Delta / 120 * 0.1; Zoom(newZoom, false); } - private void ZoomToFit() + public Size GetScrollSize() { + return new Size(viewPanel.ScrollableWidth, viewPanel.ScrollableHeight); + } + + public Point GetScrollPosition() + { + return new Point(viewPanel.HorizontalOffset, viewPanel.VerticalOffset); + } + + public void SetScrollPosition(Point point) + { + viewPanel.ScrollToHorizontalOffset(point.X); + viewPanel.ScrollToVerticalOffset(point.Y); + } + + public void DoZoomToFit(bool suppressEvent) + { + if (viewPanelImage.Source == null) + return; + var factor = Math.Min(viewPanel.ActualWidth / viewPanelImage.Source.Width, viewPanel.ActualHeight / viewPanelImage.Source.Height); - _minZoomFactor = factor; - - Zoom(factor, true); + Zoom(factor, true, suppressEvent); } - private void Zoom(double factor, bool fromCenter) + public void ResetZoom() { - _zoomFactor = factor; + Zoom(1d, false, true); + } - var position = fromCenter + public void Zoom(double factor, bool toFit, bool suppressEvent = false) + { + if (viewPanelImage.Source == null) + return; + + factor = Math.Max(factor, MinZoomFactor); + factor = Math.Min(factor, MaxZoomFactor); + + ZoomFactor = factor; + + if (!toFit) + ZoomToFit = false; + + var position = toFit ? new Point(viewPanelImage.Source.Width / 2, viewPanelImage.Source.Height / 2) : Mouse.GetPosition(viewPanelImage); @@ -151,6 +266,41 @@ namespace QuickLook.Plugin.ImageViewer viewPanel.ScrollToHorizontalOffset(offset.X); viewPanel.ScrollToVerticalOffset(offset.Y); UpdateLayout(); + + if (!suppressEvent) + ProcessDelayed(); + } + + private void ProcessDelayed() + { + _lastZoomTime = DateTime.Now; + + Task.Delay(500).ContinueWith(t => + { + if (DateTime.Now - _lastZoomTime < TimeSpan.FromSeconds(0.5)) + return; + + Debug.WriteLine($"ProcessDelayed fired: {Thread.CurrentThread.ManagedThreadId}"); + + Dispatcher.BeginInvoke(new Action(() => DelayedReRender?.Invoke(this, new EventArgs())), + DispatcherPriority.Background); + }); + } + + [NotifyPropertyChangedInvocator] + protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + public void ScrollToTop() + { + viewPanel.ScrollToTop(); + } + + public void ScrollToBottom() + { + viewPanel.ScrollToBottom(); } } } \ No newline at end of file diff --git a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/Plugin.cs b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/Plugin.cs index e327963..244f63b 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/Plugin.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/Plugin.cs @@ -15,11 +15,13 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using System; using System.IO; using System.Linq; using System.Reflection; using System.Windows; using ImageMagick; +using XamlAnimatedGif; namespace QuickLook.Plugin.ImageViewer { @@ -69,12 +71,15 @@ namespace QuickLook.Plugin.ImageViewer public void View(string path, ContextObject context) { - _ip = new ImagePanel(path); + _ip = new ImagePanel(); + context.ViewerContent = _ip; context.Title = _imageSize.IsEmpty ? $"{Path.GetFileName(path)}" : $"{Path.GetFileName(path)} ({_imageSize.Width}×{_imageSize.Height})"; + LoadImage(_ip, path); + context.IsBusy = false; } @@ -83,5 +88,24 @@ namespace QuickLook.Plugin.ImageViewer Directory.SetCurrentDirectory(App.AppPath); _ip = null; } + + private void LoadImage(ImagePanel ui, string path) + { + if (Path.GetExtension(path).ToLower() == ".gif") + AnimationBehavior.SetSourceUri(ui.viewPanelImage, new Uri(path)); + + using (var image = new MagickImage(path)) + { + image.Rotate(image.Orientation == OrientationType.RightTop + ? 90 + : image.Orientation == OrientationType.BottomRight + ? 180 + : image.Orientation == OrientationType.LeftBotom + ? 270 + : 0); + + ui.Source = image.ToBitmapSource(); + } + } } } \ No newline at end of file diff --git a/QuickLook.Plugin/QuickLook.Plugin.PDFViewer/MouseWheelMonitor.cs b/QuickLook.Plugin/QuickLook.Plugin.PDFViewer/MouseWheelMonitor.cs deleted file mode 100644 index a0a3e48..0000000 --- a/QuickLook.Plugin/QuickLook.Plugin.PDFViewer/MouseWheelMonitor.cs +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright © 2017 Paddy Xu -// -// This file is part of QuickLook program. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -using System; -using System.Linq; -using System.Threading; -using System.Windows; -using System.Windows.Input; -using System.Windows.Threading; - -namespace QuickLook.Plugin.PDFViewer -{ - public sealed class PreviewMouseWheelMonitor : IDisposable - { - private readonly UIElement _canvas; - private readonly Dispatcher _dispatcher; - private readonly int _sensitivity; - - private bool _disposed; - private volatile bool _inactive; - private AutoResetEvent _resetMonitorEvent; - private volatile bool _stopped; - - public PreviewMouseWheelMonitor(UIElement canvas, int sensitivity) - { - _canvas = canvas; - _canvas.PreviewMouseWheel += (s, e) => RaisePreviewMouseWheel(e); - - _sensitivity = sensitivity; - _dispatcher = Dispatcher.CurrentDispatcher; - _resetMonitorEvent = new AutoResetEvent(false); - - _disposed = false; - _inactive = true; - _stopped = true; - - var monitor = new Thread(Monitor) {IsBackground = true}; - monitor.Start(); - } - - public void Dispose() - { - if (!_disposed) - { - _disposed = true; - DetachEventHandlers(); - if (_resetMonitorEvent != null) - { - _resetMonitorEvent.Close(); - _resetMonitorEvent = null; - } - } - } - - public event EventHandler PreviewMouseWheel; - public event EventHandler PreviewMouseWheelStarted; - public event EventHandler PreviewMouseWheelStopped; - - private void Monitor() - { - while (!_disposed) - { - if (_inactive) // if wheel is still inactive... - { - _resetMonitorEvent.WaitOne(_sensitivity / 10); // ...wait negligibly small quantity of time... - continue; // ...and check again - } - // otherwise, if wheel is active... - _inactive = true; // ...purposely change the state to inactive - _resetMonitorEvent.WaitOne(_sensitivity); // wait... - if (_inactive - ) // ...and after specified time check if the state is still not re-activated inside mouse wheel event - RaiseMouseWheelStopped(); - } - } - - private void RaisePreviewMouseWheel(MouseWheelEventArgs args) - { - if (_stopped) - RaiseMouseWheelStarted(); - - _inactive = false; - if (PreviewMouseWheel != null) - PreviewMouseWheel(_canvas, args); - } - - private void RaiseMouseWheelStarted() - { - _stopped = false; - if (PreviewMouseWheelStarted != null) - PreviewMouseWheelStarted(_canvas, new EventArgs()); - } - - private void RaiseMouseWheelStopped() - { - _stopped = true; - if (PreviewMouseWheelStopped != null) - _dispatcher.Invoke(() => PreviewMouseWheelStopped(_canvas, - new - EventArgs())); // invoked on cached dispatcher for convenience (because fired from non-UI thread) - } - - private void DetachEventHandlers() - { - if (PreviewMouseWheel != null) - foreach (var handler in PreviewMouseWheel.GetInvocationList().Cast>()) - PreviewMouseWheel -= handler; - if (PreviewMouseWheelStarted != null) - foreach (var handler in PreviewMouseWheelStarted.GetInvocationList().Cast>()) - PreviewMouseWheelStarted -= handler; - if (PreviewMouseWheelStopped != null) - foreach (var handler in PreviewMouseWheelStopped.GetInvocationList().Cast>()) - PreviewMouseWheelStopped -= handler; - } - } -} \ No newline at end of file diff --git a/QuickLook.Plugin/QuickLook.Plugin.PDFViewer/PdfViewerControl.xaml b/QuickLook.Plugin/QuickLook.Plugin.PDFViewer/PdfViewerControl.xaml index d55cc6d..4a455ad 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.PDFViewer/PdfViewerControl.xaml +++ b/QuickLook.Plugin/QuickLook.Plugin.PDFViewer/PdfViewerControl.xaml @@ -4,6 +4,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:QuickLook.Plugin.PDFViewer" + xmlns:imageViewer="clr-namespace:QuickLook.Plugin.ImageViewer;assembly=QuickLook.Plugin.ImageViewer" mc:Ignorable="d" x:Name="thisPdfViewer" UseLayoutRounding="True" @@ -69,10 +70,7 @@ - - - + \ No newline at end of file diff --git a/QuickLook.Plugin/QuickLook.Plugin.PDFViewer/PdfViewerControl.xaml.cs b/QuickLook.Plugin/QuickLook.Plugin.PDFViewer/PdfViewerControl.xaml.cs index 30699d8..dc70034 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.PDFViewer/PdfViewerControl.xaml.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.PDFViewer/PdfViewerControl.xaml.cs @@ -18,12 +18,12 @@ using System; using System.Collections.ObjectModel; using System.ComponentModel; +using System.Diagnostics; using System.Linq; using System.Runtime.CompilerServices; using System.Windows; using System.Windows.Controls; -using System.Windows.Input; -using System.Windows.Media; +using QuickLook.ExtensionMethods; namespace QuickLook.Plugin.PDFViewer { @@ -32,30 +32,27 @@ namespace QuickLook.Plugin.PDFViewer /// public partial class PdfViewerControl : UserControl, INotifyPropertyChanged, IDisposable { - private Point? _dragInitPos; - private PreviewMouseWheelMonitor _whellMonitor; + private const double MinZoomFactor = 0.1d; + private const double MaxZoomFactor = 3d; + private bool _pdfLoaded; + private double _viewRenderFactor = 1d; public PdfViewerControl() { InitializeComponent(); - DataContext = this; + listThumbnails.SelectionChanged += UpdatePageViewWhenSelectionChanged; - PageIds = new ObservableCollection(); + pagePanel.DelayedReRender += ReRenderCurrentPageDelayed; + pagePanel.ImageScrolled += NavigatePage; } - public ObservableCollection PageIds { get; set; } + public ObservableCollection PageIds { get; set; } = new ObservableCollection(); public PdfFile PdfHandleForThumbnails { get; private set; } public PdfFile PdfHandle { get; private set; } - public bool PdfLoaded { get; private set; } - - public double ZoomFactor { get; set; } - - public double MinZoomFactor { get; set; } - public int TotalPages => PdfHandle.TotalPages; public int CurrentPage @@ -67,6 +64,7 @@ namespace QuickLook.Plugin.PDFViewer listThumbnails.ScrollIntoView(listThumbnails.SelectedItem); CurrentPageChanged?.Invoke(this, new EventArgs()); + OnPropertyChanged(); } } @@ -74,13 +72,20 @@ namespace QuickLook.Plugin.PDFViewer { GC.SuppressFinalize(this); - _whellMonitor?.Dispose(); + _pdfLoaded = false; PdfHandleForThumbnails?.Dispose(); + PdfHandleForThumbnails = null; PdfHandle?.Dispose(); + PdfHandle = null; } public event PropertyChangedEventHandler PropertyChanged; + private void ReRenderCurrentPageDelayed(object sender, EventArgs e) + { + ReRenderCurrentPage(); + } + ~PdfViewerControl() { Dispose(); @@ -88,37 +93,19 @@ namespace QuickLook.Plugin.PDFViewer public event EventHandler CurrentPageChanged; - private void NavigatePage(object sender, MouseWheelEventArgs e) + private void NavigatePage(object sender, int delta) { - if (!PdfLoaded) + if (!_pdfLoaded) return; - if (Keyboard.Modifiers != ModifierKeys.None) - return; - - e.Handled = true; - - if (e.Delta > 0) // up - { - if (pageViewPanel.VerticalOffset != 0) - { - pageViewPanel.ScrollToVerticalOffset(pageViewPanel.VerticalOffset - e.Delta); // normal scroll - return; - } - + var pos = pagePanel.GetScrollPosition(); + var size = pagePanel.GetScrollSize(); + const double tolerance = 0.0001d; + if (Math.Abs(pos.Y) < tolerance && delta > 0) PrevPage(); - } - else // down - { - if (pageViewPanel.VerticalOffset != pageViewPanel.ScrollableHeight) - { - pageViewPanel.ScrollToVerticalOffset(pageViewPanel.VerticalOffset - e.Delta); // normal scroll - return; - } - + else if (Math.Abs(pos.Y - size.Height) < tolerance && delta < 0) NextPage(); - } } private void NextPage() @@ -126,7 +113,7 @@ namespace QuickLook.Plugin.PDFViewer if (CurrentPage < PdfHandle.TotalPages - 1) { CurrentPage++; - pageViewPanel.ScrollToTop(); + pagePanel.ScrollToTop(); } } @@ -135,59 +122,42 @@ namespace QuickLook.Plugin.PDFViewer if (CurrentPage > 0) { CurrentPage--; - pageViewPanel.ScrollToBottom(); + pagePanel.ScrollToBottom(); } } - private void ReRenderCurrentPageLowQuality(double viewZoom, bool fromCenter) - { - if (pageViewPanelImage.Source == null) - return; - - var position = fromCenter - ? new Point(pageViewPanelImage.Source.Width / 2, pageViewPanelImage.Source.Height / 2) - : Mouse.GetPosition(pageViewPanelImage); - - pageViewPanelImage.LayoutTransform = new ScaleTransform(viewZoom, viewZoom); - - pageViewPanel.InvalidateMeasure(); - - // critical for calcuating offset - pageViewPanel.ScrollToHorizontalOffset(0); - pageViewPanel.ScrollToVerticalOffset(0); - UpdateLayout(); - - var offset = pageViewPanelImage.TranslatePoint(position, pageViewPanel) - Mouse.GetPosition(pageViewPanel); - pageViewPanel.ScrollToHorizontalOffset(offset.X); - pageViewPanel.ScrollToVerticalOffset(offset.Y); - UpdateLayout(); - } - - private void ReRenderCurrentPage() { - if (!PdfLoaded) + if (!_pdfLoaded) return; - var bitmap = PdfHandle.GetPage(CurrentPage, ZoomFactor); + Debug.WriteLine($"Renrendering page {CurrentPage}"); + + var pos = pagePanel.GetScrollPosition(); + + var factor = pagePanel.ZoomFactor * _viewRenderFactor; + factor = Math.Max(factor, MinZoomFactor); + factor = Math.Min(factor, MaxZoomFactor); + pagePanel.MinZoomFactor = MinZoomFactor / factor; + pagePanel.MaxZoomFactor = MaxZoomFactor / factor; + + var bitmap = PdfHandle.GetPage(CurrentPage, factor); var image = bitmap.ToBitmapSource(); bitmap.Dispose(); - pageViewPanelImage.Source = image; - pageViewPanelImage.Width = pageViewPanelImage.Source.Width; - pageViewPanelImage.Height = pageViewPanelImage.Source.Height; + pagePanel.ResetZoom(); + pagePanel.Source = image; - // reset view zoom factor - pageViewPanelImage.LayoutTransform = new ScaleTransform(); + _viewRenderFactor = factor; - pageViewPanel.InvalidateMeasure(); + pagePanel.SetScrollPosition(pos); - GC.Collect(); + Dispatcher.Delay(500, t => GC.Collect()); } private void UpdatePageViewWhenSelectionChanged(object sender, SelectionChangedEventArgs e) { - if (!PdfLoaded) + if (!_pdfLoaded) return; if (CurrentPage == -1) @@ -198,21 +168,6 @@ namespace QuickLook.Plugin.PDFViewer ReRenderCurrentPage(); } - private void ZoomToFit() - { - if (!PdfLoaded) - return; - - var size = PdfHandle.GetPageSize(CurrentPage, 1d); - - var factor = Math.Min(pageViewPanel.ActualWidth / size.Width, pageViewPanel.ActualHeight / size.Height); - - ZoomFactor = factor; - MinZoomFactor = factor; - - ReRenderCurrentPage(); - } - public static Size GetDesiredControlSizeByFirstPage(string path) { var tempHandle = new PdfFile(path); @@ -228,102 +183,17 @@ namespace QuickLook.Plugin.PDFViewer public void LoadPdf(string path) { PageIds.Clear(); - _whellMonitor?.Dispose(); PdfHandleForThumbnails = new PdfFile(path); PdfHandle = new PdfFile(path); - PdfLoaded = true; + _pdfLoaded = true; // fill thumbnails list Enumerable.Range(0, PdfHandle.TotalPages).ForEach(PageIds.Add); - OnPropertyChanged(nameof(PageIds)); + OnPropertyChanged("PageIds"); CurrentPage = 0; - - // calculate zoom factor for first page - ZoomToFit(); - - // register events - listThumbnails.SelectionChanged += UpdatePageViewWhenSelectionChanged; - //pageViewPanel.SizeChanged += ReRenderCurrentPageWhenSizeChanged; - - pageViewPanel.PreviewMouseWheel += NavigatePage; - StartMouseWhellDelayedZoomMonitor(pageViewPanel); - - pageViewPanel.MouseLeftButtonDown += DragScrollStart; - pageViewPanel.MouseMove += DragScrolling; - } - - private void DragScrolling(object sender, MouseEventArgs e) - { - if (!_dragInitPos.HasValue) - return; - - if (e.LeftButton == MouseButtonState.Released) - { - e.MouseDevice.Capture(null); - - _dragInitPos = null; - return; - } - - e.Handled = true; - - var delta = _dragInitPos.Value - e.GetPosition(pageViewPanel); - - pageViewPanel.ScrollToHorizontalOffset(delta.X); - pageViewPanel.ScrollToVerticalOffset(delta.Y); - } - - private void DragScrollStart(object sender, MouseButtonEventArgs e) - { - e.MouseDevice.Capture(pageViewPanel); - - _dragInitPos = e.GetPosition(pageViewPanel); - var temp = _dragInitPos.Value; // Point is a type value - temp.Offset(pageViewPanel.HorizontalOffset, pageViewPanel.VerticalOffset); - _dragInitPos = temp; - } - - private void StartMouseWhellDelayedZoomMonitor(UIElement ui) - { - if (_whellMonitor == null) - _whellMonitor = new PreviewMouseWheelMonitor(ui, 100); - - var newZoom = 1d; - var scrolling = false; - - _whellMonitor.PreviewMouseWheelStarted += (sender, e) => - { - if ((Keyboard.Modifiers & ModifierKeys.Control) == 0) - return; - - newZoom = ZoomFactor; - scrolling = true; - }; - _whellMonitor.PreviewMouseWheel += (sender, e) => - { - if ((Keyboard.Modifiers & ModifierKeys.Control) == 0) - return; - - e.Handled = true; - - newZoom = newZoom + (double) e.Delta / 120 * 0.1; - - newZoom = Math.Max(newZoom, MinZoomFactor); - newZoom = Math.Min(newZoom, 3); - - ReRenderCurrentPageLowQuality(newZoom / ZoomFactor, false); - }; - _whellMonitor.PreviewMouseWheelStopped += (sender, e) => - { - if (!scrolling) - return; - - ZoomFactor = newZoom; - ReRenderCurrentPage(); - scrolling = false; - }; + pagePanel.DoZoomToFit(true); } protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) diff --git a/QuickLook.Plugin/QuickLook.Plugin.PDFViewer/QuickLook.Plugin.PdfViewer.csproj b/QuickLook.Plugin/QuickLook.Plugin.PDFViewer/QuickLook.Plugin.PdfViewer.csproj index 7e0f8e7..624806b 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.PDFViewer/QuickLook.Plugin.PdfViewer.csproj +++ b/QuickLook.Plugin/QuickLook.Plugin.PDFViewer/QuickLook.Plugin.PdfViewer.csproj @@ -73,7 +73,6 @@ - @@ -84,6 +83,11 @@ QuickLook False + + {fe5a5111-9607-4721-a7be-422754002ed8} + QuickLook.Plugin.ImageViewer + False +