diff --git a/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml b/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml index 458c212..aeff790 100644 --- a/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml +++ b/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml @@ -2,7 +2,6 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:contract7Present="http://schemas.microsoft.com/winfx/2006/xaml/presentation?IsApiContractPresent(Windows.Foundation.UniversalApiContract,7)" - xmlns:controls="using:CalculatorApp.Controls" xmlns:converters="using:CalculatorApp.Converters" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:graphControl="using:GraphControl" @@ -15,64 +14,36 @@ - - + + + + + + @@ -384,33 +321,63 @@ - - - - - - + + + + + + + + + 4,4,0,0 + 0,0,4,4 + 4,0,0,4 + 0,4,4,0 + + + 4,4,0,0 + 0,0,4,4 + 4,0,0,4 + 0,4,4,0 + + + 0 + 0 + 0 + 0 + + + + + + + + + - + + - + + + + + + - - + + + - - - - + Command="{x:Bind ZoomInButtonPressed, Mode=OneTime}"> + - - - - + Command="{x:Bind ZoomOutButtonPressed, Mode=OneTime}"> + - - - - - - - - - + + + + + + + diff --git a/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.cpp b/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.cpp index bd1ce90..761ee8e 100644 --- a/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.cpp +++ b/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.cpp @@ -51,20 +51,12 @@ constexpr auto sc_ViewModelPropertyName = L"ViewModel"; DEPENDENCY_PROPERTY_INITIALIZATION(GraphingCalculator, IsSmallState); -GraphingCalculator::GraphingCalculator() - : ActiveTracingOn(false) +GraphingCalculator::GraphingCalculator() { Equation::RegisterDependencyProperties(); Grapher::RegisterDependencyProperties(); InitializeComponent(); - auto toolTip = ref new ToolTip(); - auto resProvider = AppResourceProvider::GetInstance(); - auto tracingMessage = ActiveTracingOn ? resProvider->GetResourceString(L"disableTracingButtonToolTip") : resProvider->GetResourceString(L"enableTracingButtonToolTip"); - toolTip->Content = tracingMessage; - ToolTipService::SetToolTip(ActiveTracing, toolTip); - AutomationProperties::SetName(ActiveTracing, tracingMessage); - DataTransferManager ^ dataTransferManager = DataTransferManager::GetForCurrentView(); // Register the current control as a share source. @@ -383,23 +375,39 @@ void GraphingCalculator::OnZoomResetCommand(Object ^ /* parameter */) GraphingControl->ResetGrid(); } -void GraphingCalculator::OnActiveTracingClick(Object ^ sender, RoutedEventArgs ^ e) +String ^ GraphingCalculator::GetTracingLegend(Platform::IBox ^ isTracing) { - // The focus change to this button will have turned off the tracing if it was on - ActiveTracingOn = !ActiveTracingOn; - GraphingControl->ActiveTracing = ActiveTracingOn; - - auto toolTip = ref new ToolTip(); auto resProvider = AppResourceProvider::GetInstance(); - auto tracingMessage = ActiveTracingOn ? resProvider->GetResourceString(L"disableTracingButtonToolTip") : resProvider->GetResourceString(L"enableTracingButtonToolTip"); - toolTip->Content = tracingMessage; - ToolTipService::SetToolTip(ActiveTracing, toolTip); - AutomationProperties::SetName(ActiveTracing, tracingMessage); + return isTracing != nullptr && isTracing->Value ? resProvider->GetResourceString(L"disableTracingButtonToolTip") + : resProvider->GetResourceString(L"enableTracingButtonToolTip"); } void GraphingCalculator::GraphingControl_LostFocus(Object ^ sender, RoutedEventArgs ^ e) { // If the graph is losing focus while we are in active tracing we need to turn it off so we don't try to eat keys in other controls. + if (GraphingControl->ActiveTracing) + { + if (ActiveTracing->Equals(FocusManager::GetFocusedElement()) && ActiveTracing->IsPressed) + { + m_ActiveTracingPointerCaptureLost = ActiveTracing->PointerCaptureLost += + ref new Windows::UI::Xaml::Input::PointerEventHandler(this, &CalculatorApp::GraphingCalculator::ActiveTracing_PointerCaptureLost); + } + else + { + GraphingControl->ActiveTracing = false; + OnShowTracePopupChanged(false); + } + } +} + +void CalculatorApp::GraphingCalculator::ActiveTracing_PointerCaptureLost(Platform::Object ^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs ^ e) +{ + if (m_ActiveTracingPointerCaptureLost.Value != 0) + { + ActiveTracing->PointerCaptureLost -= m_ActiveTracingPointerCaptureLost; + m_ActiveTracingPointerCaptureLost.Value = 0; + } + if (GraphingControl->ActiveTracing) { GraphingControl->ActiveTracing = false; @@ -487,11 +495,46 @@ void GraphingCalculator::PositionGraphPopup() } } -void GraphingCalculator::TraceValuePopup_SizeChanged(Platform::Object ^ sender, Windows::UI::Xaml::SizeChangedEventArgs ^ e) +void GraphingCalculator::TraceValuePopup_SizeChanged(Object ^ sender, SizeChangedEventArgs ^ e) { PositionGraphPopup(); } + ::Visibility GraphingCalculator::ManageEditVariablesButtonVisibility(unsigned int numberOfVariables) { return numberOfVariables == 0 ? ::Visibility::Collapsed : ::Visibility::Visible; } + +void CalculatorApp::GraphingCalculator::ActiveTracing_Checked(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e) +{ + m_activeTracingKeyUpToken = Window::Current->CoreWindow->KeyUp += + ref new Windows::Foundation::TypedEventHandler( + this, &CalculatorApp::GraphingCalculator::ActiveTracing_KeyUp); + + KeyboardShortcutManager::IgnoreEscape(false); +} + +void CalculatorApp::GraphingCalculator::ActiveTracing_Unchecked(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e) +{ + if (m_ActiveTracingPointerCaptureLost.Value != 0) + { + ActiveTracing->PointerCaptureLost -= m_ActiveTracingPointerCaptureLost; + m_ActiveTracingPointerCaptureLost.Value = 0; + } + + if (m_activeTracingKeyUpToken.Value != 0) + { + Window::Current->CoreWindow->KeyUp -= m_activeTracingKeyUpToken; + m_activeTracingKeyUpToken.Value = 0; + } + KeyboardShortcutManager::HonorEscape(); +} + +void CalculatorApp::GraphingCalculator::ActiveTracing_KeyUp(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::KeyEventArgs ^ args) +{ + if (args->VirtualKey == VirtualKey::Escape) + { + GraphingControl->ActiveTracing = false; + args->Handled = true; + } +} diff --git a/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.h b/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.h index 2e2cf70..39993f6 100644 --- a/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.h +++ b/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.h @@ -36,6 +36,7 @@ public ref class GraphingCalculator sealed : public Windows::UI::Xaml::Data::INo static Windows::UI::Xaml::Visibility ShouldDisplayPanel(bool isSmallState, bool isEquationModeActivated, bool isGraphPanel); static Platform::String ^ GetInfoForSwitchModeToggleButton(bool isChecked); static Windows::UI::Xaml::Visibility ManageEditVariablesButtonVisibility(unsigned int numberOfVariables); + static Platform::String ^ GetTracingLegend(Platform::IBox ^ isTracing); private: void GraphingCalculator_DataContextChanged(Windows::UI::Xaml::FrameworkElement ^ sender, Windows::UI::Xaml::DataContextChangedEventArgs ^ args); @@ -54,31 +55,35 @@ public ref class GraphingCalculator sealed : public Windows::UI::Xaml::Data::INo double validateDouble(Platform::String ^ value, double defaultValue); - CalculatorApp::ViewModel::GraphingCalculatorViewModel ^ m_viewModel; - void OnShareClick(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e); void OnShowTracePopupChanged(bool newValue); void OnTracePointChanged(Windows::Foundation::Point newPoint); private: - Windows::Foundation::EventRegistrationToken m_dataRequestedToken; - Windows::Foundation::EventRegistrationToken m_vectorChangedToken; - Windows::Foundation::EventRegistrationToken m_variableUpdatedToken; void OnDataRequested( Windows::ApplicationModel::DataTransfer::DataTransferManager ^ sender, Windows::ApplicationModel::DataTransfer::DataRequestedEventArgs ^ e); void TextBoxGotFocus(Windows::UI::Xaml::Controls::TextBox ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e); - void OnActiveTracingClick(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e); void GraphingControl_LostFocus(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e); void GraphingControl_LosingFocus(Windows::UI::Xaml::UIElement ^ sender, Windows::UI::Xaml::Input::LosingFocusEventArgs ^ args); void GraphingControl_VariablesUpdated(Platform::Object ^ sender, Object ^ args); void OnEquationKeyGraphFeaturesRequested(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e); void OnKeyGraphFeaturesClosed(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e); - bool ActiveTracingOn; void SwitchModeToggleButton_Checked(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e); void TraceValuePopup_SizeChanged(Platform::Object ^ sender, Windows::UI::Xaml::SizeChangedEventArgs ^ e); void PositionGraphPopup(); + void ActiveTracing_Checked(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e); + void ActiveTracing_Unchecked(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e); + void ActiveTracing_KeyUp(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::KeyEventArgs ^ args); + void ActiveTracing_PointerCaptureLost(Platform::Object ^ sender, Windows::UI::Xaml::Input::PointerRoutedEventArgs ^ e); + private: + Windows::Foundation::EventRegistrationToken m_dataRequestedToken; + Windows::Foundation::EventRegistrationToken m_vectorChangedToken; + Windows::Foundation::EventRegistrationToken m_variableUpdatedToken; + Windows::Foundation::EventRegistrationToken m_activeTracingKeyUpToken; + Windows::Foundation::EventRegistrationToken m_ActiveTracingPointerCaptureLost; + CalculatorApp::ViewModel::GraphingCalculatorViewModel ^ m_viewModel; }; } diff --git a/src/GraphControl/Control/Grapher.h b/src/GraphControl/Control/Grapher.h index a96f2dd..ebe43eb 100644 --- a/src/GraphControl/Control/Grapher.h +++ b/src/GraphControl/Control/Grapher.h @@ -18,11 +18,12 @@ public public delegate void TracingValueChangedEventHandler(Windows::Foundation::Point value); - [Windows::UI::Xaml::Markup::ContentPropertyAttribute(Name = L"Equations")] public ref class Grapher sealed : public Windows::UI::Xaml::Controls::Control + [Windows::UI::Xaml::Markup::ContentPropertyAttribute(Name = L"Equations")] public ref class Grapher sealed : public Windows::UI::Xaml::Controls::Control, public Windows::UI::Xaml::Data::INotifyPropertyChanged { public: event TracingValueChangedEventHandler ^ TracingValueChangedEvent; event TracingChangedEventHandler ^ TracingChangedEvent; + virtual event Windows::UI::Xaml::Data::PropertyChangedEventHandler ^ PropertyChanged; public: Grapher(); @@ -93,17 +94,22 @@ public #pragma endregion // Pass active tracing turned on or off down to the renderer + property bool ActiveTracing { bool get() { - return m_renderMain->ActiveTracing; + return m_renderMain != nullptr && m_renderMain->ActiveTracing; } void set(bool value) { - m_renderMain->ActiveTracing = value; - UpdateTracingChanged(); + if (m_renderMain != nullptr && m_renderMain->ActiveTracing != value) + { + m_renderMain->ActiveTracing = value; + UpdateTracingChanged(); + PropertyChanged(this, ref new Windows::UI::Xaml::Data::PropertyChangedEventArgs(L"ActiveTracing")); + } } }