diff --git a/src/CalcViewModel/Common/Automation/NarratorAnnouncement.cpp b/src/CalcViewModel/Common/Automation/NarratorAnnouncement.cpp index 15fca2c..90e6fee 100644 --- a/src/CalcViewModel/Common/Automation/NarratorAnnouncement.cpp +++ b/src/CalcViewModel/Common/Automation/NarratorAnnouncement.cpp @@ -24,6 +24,7 @@ namespace CalculatorApp::Common::Automation StringReference OpenParenthesisCountChanged(L"OpenParenthesisCountChanged"); StringReference NoParenthesisAdded(L"NoParenthesisAdded"); StringReference GraphModeChanged(L"GraphModeChanged"); + StringReference GraphViewChanged(L"GraphViewChanged"); } } @@ -150,3 +151,12 @@ NarratorAnnouncement ^ CalculatorAnnouncement::GetGraphModeChangedAnnouncement(P AutomationNotificationKind::ActionCompleted, AutomationNotificationProcessing::ImportantMostRecent); } + +NarratorAnnouncement ^ CalculatorAnnouncement::GetGraphViewChangedAnnouncement(Platform::String ^ announcement) +{ + return ref new NarratorAnnouncement( + announcement, + CalculatorActivityIds::GraphViewChanged, + AutomationNotificationKind::ActionCompleted, + AutomationNotificationProcessing::MostRecent); +} diff --git a/src/CalcViewModel/Common/Automation/NarratorAnnouncement.h b/src/CalcViewModel/Common/Automation/NarratorAnnouncement.h index 81c3856..a1ba97e 100644 --- a/src/CalcViewModel/Common/Automation/NarratorAnnouncement.h +++ b/src/CalcViewModel/Common/Automation/NarratorAnnouncement.h @@ -68,6 +68,7 @@ public static NarratorAnnouncement ^ GetNoRightParenthesisAddedAnnouncement(Platform::String ^ announcement); static NarratorAnnouncement ^ GetGraphModeChangedAnnouncement(Platform::String ^ announcement); + static NarratorAnnouncement ^ GetGraphViewChangedAnnouncement(Platform::String ^ announcement); }; } diff --git a/src/CalcViewModel/Common/LocalizationStringUtil.h b/src/CalcViewModel/Common/LocalizationStringUtil.h index 0e3d9df..73da6d0 100644 --- a/src/CalcViewModel/Common/LocalizationStringUtil.h +++ b/src/CalcViewModel/Common/LocalizationStringUtil.h @@ -81,6 +81,18 @@ namespace CalculatorApp { return LocalizationStringUtilInternal::GetLocalizedString(pMessage, param1->Data(), param2->Data(), param3->Data(), param4->Data()); } + + static Platform::String + ^ GetLocalizedString( + Platform::String ^ pMessage, + Platform::String ^ param1, + Platform::String ^ param2, + Platform::String ^ param3, + Platform::String ^ param4, + Platform::String ^ param5) + { + return LocalizationStringUtilInternal::GetLocalizedString(pMessage, param1->Data(), param2->Data(), param3->Data(), param4->Data(), param5->Data()); + } }; } } diff --git a/src/Calculator/Resources/en-US/Resources.resw b/src/Calculator/Resources/en-US/Resources.resw index abeb7b7..edb1da9 100644 --- a/src/Calculator/Resources/en-US/Resources.resw +++ b/src/Calculator/Resources/en-US/Resources.resw @@ -4174,6 +4174,10 @@ Start tracing This is the tooltip/automation name for the graphing calculator start tracing button + + Graph viewing window, x-axis bounded by %1 and %2, y-axis bounded by %3 and %4, displaying %5 equations + {Locked="%1","%2", "%3", "%4", "%5"}. + Configure slider This is the tooltip text for the slider options button in Graphing Calculator diff --git a/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml b/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml index 612324d..432b6bc 100644 --- a/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml +++ b/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml @@ -471,7 +471,10 @@ VariableUpdated += ref new EventHandler(this, &CalculatorApp::GraphingCalculator::OnVariableChanged); + + UpdateGraphAutomationName(); } void GraphingCalculator::OnEquationsVectorChanged(IObservableVector ^ sender, IVectorChangedEventArgs ^ event) @@ -620,6 +623,48 @@ void GraphingCalculator::SetDefaultFocus() } } +void GraphingCalculator::GraphingControl_GraphViewChangedEvent(Object ^ sender, RoutedEventArgs ^ e) +{ + UpdateGraphAutomationName(); + + auto announcement = CalculatorAnnouncement::GetGraphViewChangedAnnouncement(GraphControlAutomationName); + auto peer = FrameworkElementAutomationPeer::FromElement(GraphingControl); + if (peer != nullptr) + { + peer->RaiseNotificationEvent(announcement->Kind, announcement->Processing, announcement->Announcement, announcement->ActivityId); + } +} + +void GraphingCalculator::GraphingControl_GraphPlottedEvent(Object ^ sender, RoutedEventArgs ^ e) +{ + UpdateGraphAutomationName(); +} + +void GraphingCalculator::UpdateGraphAutomationName() +{ + int numEquations = 0; + double xAxisMin, xAxisMax, yAxisMin, yAxisMax; + + // Only count equations that are graphed + for (auto equation : ViewModel->Equations) + { + if (equation->GraphEquation->IsValidated) + { + numEquations++; + } + } + + GraphingControl->GetDisplayRanges(&xAxisMin, &xAxisMax, &yAxisMin, &yAxisMax); + + GraphControlAutomationName = LocalizationStringUtil::GetLocalizedString( + AppResourceProvider::GetInstance()->GetResourceString(L"graphAutomationName"), + xAxisMin.ToString(), + xAxisMax.ToString(), + yAxisMin.ToString(), + yAxisMax.ToString(), + numEquations.ToString()); +} + void GraphingCalculator::GraphMenuFlyoutItem_Click(Object ^ sender, RoutedEventArgs ^ e) { auto dataPackage = ref new DataPackage(); diff --git a/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.h b/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.h index 66b79ee..e1662cc 100644 --- a/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.h +++ b/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.h @@ -27,6 +27,7 @@ public ref class GraphingCalculator sealed : public Windows::UI::Xaml::Data::INo COMMAND_FOR_METHOD(ZoomResetButtonPressed, GraphingCalculator::OnZoomResetCommand); OBSERVABLE_PROPERTY_R(bool, IsKeyGraphFeaturesVisible); DEPENDENCY_PROPERTY(bool, IsSmallState); + DEPENDENCY_PROPERTY(Platform::String ^, GraphControlAutomationName); property CalculatorApp::ViewModel::GraphingCalculatorViewModel^ ViewModel { @@ -65,6 +66,8 @@ public ref class GraphingCalculator sealed : public Windows::UI::Xaml::Data::INo 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 GraphingControl_GraphViewChangedEvent(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e); + void GraphingControl_GraphPlottedEvent(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e); void OnEquationKeyGraphFeaturesRequested(Platform::Object ^ sender, CalculatorApp::ViewModel::EquationViewModel ^ e); void OnKeyGraphFeaturesClosed(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e); void TraceValuePopup_SizeChanged(Platform::Object ^ sender, Windows::UI::Xaml::SizeChangedEventArgs ^ e); @@ -78,6 +81,8 @@ public ref class GraphingCalculator sealed : public Windows::UI::Xaml::Data::INo void DisplayGraphSettings(); void AddTracePointerShadow(); + void UpdateGraphAutomationName(); + private: Windows::Foundation::EventRegistrationToken m_dataRequestedToken; Windows::Foundation::EventRegistrationToken m_vectorChangedToken; diff --git a/src/GraphControl/Control/Grapher.cpp b/src/GraphControl/Control/Grapher.cpp index 4ed9ed3..bb7c5a8 100644 --- a/src/GraphControl/Control/Grapher.cpp +++ b/src/GraphControl/Control/Grapher.cpp @@ -84,6 +84,7 @@ namespace GraphControl void Grapher::ZoomFromCenter(double scale) { ScaleRange(0, 0, scale); + GraphViewChangedEvent(this, ref new RoutedEventArgs()); } void Grapher::ScaleRange(double centerX, double centerY, double scale) @@ -95,6 +96,7 @@ namespace GraphControl if (SUCCEEDED(renderer->ScaleRange(centerX, centerY, scale))) { m_renderMain->RunRenderPass(); + GraphViewChangedEvent(this, ref new RoutedEventArgs()); } } } @@ -109,6 +111,7 @@ namespace GraphControl if (SUCCEEDED(renderer->ResetRange())) { m_renderMain->RunRenderPass(); + GraphViewChangedEvent(this, ref new RoutedEventArgs()); } } } @@ -249,6 +252,8 @@ namespace GraphControl co_await TryUpdateGraph(keepCurrentView); } } + + GraphPlottedEvent(this, ref new RoutedEventArgs()); } task Grapher::TryUpdateGraph(bool keepCurrentView) @@ -603,6 +608,7 @@ namespace GraphControl const auto [centerX, centerY] = PointerPositionToGraphPosition(pos.X, pos.Y, ActualWidth, ActualHeight); ScaleRange(centerX, centerY, scale); + GraphViewChangedEvent(this, ref new RoutedEventArgs()); e->Handled = true; } @@ -676,6 +682,7 @@ namespace GraphControl if (needsRenderPass) { m_renderMain->RunRenderPass(); + GraphViewChangedEvent(this, ref new RoutedEventArgs()); } } } diff --git a/src/GraphControl/Control/Grapher.h b/src/GraphControl/Control/Grapher.h index cddec89..e6cdedf 100644 --- a/src/GraphControl/Control/Grapher.h +++ b/src/GraphControl/Control/Grapher.h @@ -31,6 +31,8 @@ public event TracingValueChangedEventHandler ^ TracingValueChangedEvent; event PointerValueChangedEventHandler ^ PointerValueChangedEvent; event TracingChangedEventHandler ^ TracingChangedEvent; + event Windows::UI::Xaml::RoutedEventHandler ^ GraphViewChangedEvent; + event Windows::UI::Xaml::RoutedEventHandler ^ GraphPlottedEvent; virtual event Windows::UI::Xaml::Data::PropertyChangedEventHandler ^ PropertyChanged; public: