From c5bd06af9048bafc90342aa918d35b6a18772d03 Mon Sep 17 00:00:00 2001 From: Daniel Belcher Date: Mon, 1 Apr 2019 17:20:21 -0700 Subject: [PATCH] - Mouse wheel can be used to zoom in/out of the graph. --- src/GraphControl/Control/Grapher.cpp | 28 ++++++++++++++++++++++++++++ src/GraphControl/Control/Grapher.h | 5 +++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/GraphControl/Control/Grapher.cpp b/src/GraphControl/Control/Grapher.cpp index 86809619..aefbd1af 100644 --- a/src/GraphControl/Control/Grapher.cpp +++ b/src/GraphControl/Control/Grapher.cpp @@ -417,4 +417,32 @@ namespace GraphControl e->Handled = true; } } + + void Grapher::OnPointerWheelChanged(PointerRoutedEventArgs^ args) + { + PointerPoint^ currentPointer = args->GetCurrentPoint(/*relative to*/ this); + + double delta = currentPointer->Properties->MouseWheelDelta; + + // The maximum delta is 120 according to: + // https://docs.microsoft.com/en-us/uwp/api/windows.ui.input.pointerpointproperties.mousewheeldelta#Windows_UI_Input_PointerPointProperties_MouseWheelDelta + // Apply a dampening effect so that small mouse movements have a smoother zoom. + constexpr double scrollDamper = 0.15; + double scale = 1.0 + (abs(delta) / WHEEL_DELTA) * scrollDamper; + + // positive delta if wheel scrolled away from the user + if (delta >= 0) + { + scale = 1.0 / scale; + } + + // For scaling, the graphing engine interprets x,y position between the range [-1, 1]. + // Translate the pointer position to the [-1, 1] bounds. + double centerX = (currentPointer->Position.X - ActualWidth / 2) / (ActualWidth / 2); + double centerY = (ActualHeight / 2 - currentPointer->Position.Y) / (ActualHeight / 2); + + ScaleRange(centerX, centerY, scale); + + args->Handled = true; + } } diff --git a/src/GraphControl/Control/Grapher.h b/src/GraphControl/Control/Grapher.h index d6b57d1c..f33ac4fc 100644 --- a/src/GraphControl/Control/Grapher.h +++ b/src/GraphControl/Control/Grapher.h @@ -110,6 +110,7 @@ namespace GraphControl void OnPointerEntered(Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e) override; void OnPointerMoved(Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e) override; void OnPointerExited(Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e) override; + void OnPointerWheelChanged(Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e) override; #pragma endregion private: @@ -125,6 +126,7 @@ namespace GraphControl void OnDataSourceChanged(GraphControl::InspectingDataSource^ sender, GraphControl::DataSourceChangedEventArgs args); void OnEquationsChanged(Windows::UI::Xaml::DependencyPropertyChangedEventArgs^ args); + void OnEquationsVectorChanged(Windows::Foundation::Collections::IObservableVector ^sender, Windows::Foundation::Collections::IVectorChangedEventArgs ^event); void OnEquationChanged(); void UpdateGraph(); @@ -158,6 +160,5 @@ namespace GraphControl const std::unique_ptr m_solver; const std::shared_ptr m_graph; - void OnEquationsVectorChanged(Windows::Foundation::Collections::IObservableVector ^sender, Windows::Foundation::Collections::IVectorChangedEventArgs ^event); -}; + }; }