Prevent the graph to pan/zoom in some cases (#897)
* prevent the graph to change ranges when hide/show an equation or change the trig unit * make sure to not zoom/pan when we hide the last visible equation
This commit is contained in:
parent
8357f5d5c5
commit
7aaeee934c
@ -71,21 +71,6 @@ void GraphingSettingsViewModel::InitRanges()
|
||||
m_dontUpdateDisplayRange = false;
|
||||
}
|
||||
|
||||
void GraphingSettingsViewModel::RefreshPosition()
|
||||
{
|
||||
if (HasError())
|
||||
{
|
||||
InitRanges();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_Graph != nullptr)
|
||||
{
|
||||
m_Graph->SetDisplayRanges(m_XMinValue, m_XMaxValue, m_YMinValue, m_YMaxValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GraphingSettingsViewModel::UpdateDisplayRange(bool XValuesModified)
|
||||
{
|
||||
if (m_Graph == nullptr || m_dontUpdateDisplayRange || HasError())
|
||||
|
@ -229,7 +229,6 @@ namespace CalculatorApp::ViewModel
|
||||
RaisePropertyChanged(L"TrigModeRadians");
|
||||
RaisePropertyChanged(L"TrigModeDegrees");
|
||||
RaisePropertyChanged(L"TrigModeGradians");
|
||||
RefreshPosition();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -248,7 +247,6 @@ namespace CalculatorApp::ViewModel
|
||||
RaisePropertyChanged(L"TrigModeDegrees");
|
||||
RaisePropertyChanged(L"TrigModeRadians");
|
||||
RaisePropertyChanged(L"TrigModeGradians");
|
||||
RefreshPosition();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -267,14 +265,12 @@ namespace CalculatorApp::ViewModel
|
||||
RaisePropertyChanged(L"TrigModeGradians");
|
||||
RaisePropertyChanged(L"TrigModeDegrees");
|
||||
RaisePropertyChanged(L"TrigModeRadians");
|
||||
RefreshPosition();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
void UpdateDisplayRange(bool XValuesModified);
|
||||
void RefreshPosition();
|
||||
|
||||
public:
|
||||
void SetGrapher(GraphControl::Grapher ^ grapher);
|
||||
|
@ -160,7 +160,7 @@ void GraphingCalculator::OnEquationsVectorChanged(IObservableVector<EquationView
|
||||
GraphingControl->Equations->Append(equationViewModel->GraphEquation);
|
||||
}
|
||||
|
||||
GraphingControl->PlotGraph();
|
||||
GraphingControl->PlotGraph(false);
|
||||
}
|
||||
|
||||
void GraphingCalculator::OnTracePointChanged(Point newPoint)
|
||||
|
@ -121,7 +121,7 @@ namespace GraphControl
|
||||
m_renderMain->BackgroundColor = GraphBackground;
|
||||
}
|
||||
|
||||
TryUpdateGraph();
|
||||
TryUpdateGraph(false);
|
||||
}
|
||||
|
||||
void Grapher::OnEquationsPropertyChanged(EquationCollection ^ oldValue, EquationCollection ^ newValue)
|
||||
@ -157,7 +157,7 @@ namespace GraphControl
|
||||
ref new EquationChangedEventHandler(this, &Grapher::OnEquationLineEnabledChanged);
|
||||
}
|
||||
|
||||
PlotGraph();
|
||||
PlotGraph(false);
|
||||
}
|
||||
|
||||
void Grapher::OnEquationChanged(Equation ^ equation)
|
||||
@ -169,7 +169,7 @@ namespace GraphControl
|
||||
equation->HasGraphError = false;
|
||||
equation->IsValidated = false;
|
||||
|
||||
TryPlotGraph(shouldRetry);
|
||||
TryPlotGraph(false, shouldRetry);
|
||||
}
|
||||
|
||||
void Grapher::OnEquationStyleChanged(Equation ^)
|
||||
@ -193,7 +193,7 @@ namespace GraphControl
|
||||
return;
|
||||
}
|
||||
|
||||
PlotGraph();
|
||||
PlotGraph(true);
|
||||
}
|
||||
|
||||
KeyGraphFeaturesInfo ^ Grapher::AnalyzeEquation(Equation ^ equation)
|
||||
@ -223,14 +223,14 @@ namespace GraphControl
|
||||
return KeyGraphFeaturesInfo::Create(CalculatorApp::AnalysisErrorType::AnalysisCouldNotBePerformed);
|
||||
}
|
||||
|
||||
void Grapher::PlotGraph()
|
||||
void Grapher::PlotGraph(bool keepCurrentView)
|
||||
{
|
||||
TryPlotGraph(false);
|
||||
TryPlotGraph(keepCurrentView, false);
|
||||
}
|
||||
|
||||
void Grapher::TryPlotGraph(bool shouldRetry)
|
||||
void Grapher::TryPlotGraph(bool keepCurrentView, bool shouldRetry)
|
||||
{
|
||||
if (TryUpdateGraph())
|
||||
if (TryUpdateGraph(keepCurrentView))
|
||||
{
|
||||
SetEquationsAsValid();
|
||||
}
|
||||
@ -241,12 +241,12 @@ namespace GraphControl
|
||||
// If we failed to plot the graph, try again after the bad equations are flagged.
|
||||
if (shouldRetry)
|
||||
{
|
||||
TryUpdateGraph();
|
||||
TryUpdateGraph(keepCurrentView);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool Grapher::TryUpdateGraph()
|
||||
bool Grapher::TryUpdateGraph(bool keepCurrentView)
|
||||
{
|
||||
optional<vector<shared_ptr<IEquation>>> initResult = nullopt;
|
||||
bool successful = false;
|
||||
@ -289,7 +289,7 @@ namespace GraphControl
|
||||
|
||||
if (graphExpression = m_solver->ParseInput(request))
|
||||
{
|
||||
initResult = m_graph->TryInitialize(graphExpression.get());
|
||||
initResult = TryInitializeGraph(keepCurrentView, graphExpression.get());
|
||||
|
||||
if (initResult != nullopt)
|
||||
{
|
||||
@ -318,8 +318,7 @@ namespace GraphControl
|
||||
// Do not re-initialize the graph to empty if there are still valid equations graphed
|
||||
if (!shouldKeepPreviousGraph)
|
||||
{
|
||||
initResult = m_graph->TryInitialize();
|
||||
|
||||
initResult = TryInitializeGraph(keepCurrentView, graphExpression.get());
|
||||
if (initResult != nullopt)
|
||||
{
|
||||
UpdateGraphOptions(m_graph->GetOptions(), validEqs);
|
||||
@ -373,7 +372,7 @@ namespace GraphControl
|
||||
|
||||
shared_ptr<IGraph> Grapher::GetGraph(Equation ^ equation)
|
||||
{
|
||||
std::shared_ptr<Graphing::IGraph> graph = m_solver->CreateGrapher();
|
||||
shared_ptr<Graphing::IGraph> graph = m_solver->CreateGrapher();
|
||||
|
||||
wstringstream ss{};
|
||||
ss << s_getGraphOpeningTags;
|
||||
@ -487,7 +486,7 @@ namespace GraphControl
|
||||
void Grapher::OnForceProportionalAxesPropertyChanged(bool /*oldValue*/, bool newValue)
|
||||
{
|
||||
m_calculatedForceProportional = newValue;
|
||||
TryUpdateGraph();
|
||||
TryUpdateGraph(false);
|
||||
}
|
||||
|
||||
void Grapher::OnPointerEntered(PointerRoutedEventArgs ^ e)
|
||||
@ -646,14 +645,14 @@ namespace GraphControl
|
||||
{
|
||||
if (auto renderer = m_graph->GetRenderer())
|
||||
{
|
||||
std::shared_ptr<Graphing::IBitmap> BitmapOut;
|
||||
shared_ptr<Graphing::IBitmap> BitmapOut;
|
||||
bool hasSomeMissingDataOut = false;
|
||||
HRESULT hr = E_FAIL;
|
||||
hr = renderer->GetBitmap(BitmapOut, hasSomeMissingDataOut);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
// Get the raw date
|
||||
std::vector<BYTE> byteVector = BitmapOut->GetData();
|
||||
vector<BYTE> byteVector = BitmapOut->GetData();
|
||||
auto arr = ref new Array<BYTE>(&byteVector[0], (unsigned int)byteVector.size());
|
||||
|
||||
// create a memory stream wrapper
|
||||
@ -889,3 +888,19 @@ void Grapher::OnGraphBackgroundPropertyChanged(Windows::UI::Color /*oldValue*/,
|
||||
m_graph->GetOptions().SetBoxColor(color);
|
||||
}
|
||||
}
|
||||
|
||||
optional<vector<shared_ptr<Graphing::IEquation>>> Grapher::TryInitializeGraph(bool keepCurrentView, const IExpression* graphingExp)
|
||||
{
|
||||
if (keepCurrentView)
|
||||
{
|
||||
double xMin, xMax, yMin, yMax;
|
||||
m_graph->GetRenderer()->GetDisplayRanges(xMin, xMax, yMin, yMax);
|
||||
auto initResult = m_graph->TryInitialize(graphingExp);
|
||||
m_graph->GetRenderer()->SetDisplayRanges(xMin, xMax, yMin, yMax);
|
||||
return initResult;
|
||||
}
|
||||
else
|
||||
{
|
||||
return m_graph->TryInitialize(graphingExp);
|
||||
}
|
||||
}
|
||||
|
@ -104,7 +104,13 @@ public
|
||||
event Windows::Foundation::EventHandler<Windows::Foundation::Collections::IMap<Platform::String ^, double> ^> ^ VariablesUpdated;
|
||||
void SetVariable(Platform::String ^ variableName, double newValue);
|
||||
Platform::String ^ ConvertToLinear(Platform::String ^ mmlString);
|
||||
void PlotGraph();
|
||||
|
||||
/// <summary>
|
||||
/// Draw the graph. Call this method if you add or modify an equation.
|
||||
/// </summary>
|
||||
/// <param name="keepCurrentView">Force the graph control to not pan or zoom to adapt the view.</param>
|
||||
void PlotGraph(bool keepCurrentView);
|
||||
|
||||
GraphControl::KeyGraphFeaturesInfo ^ AnalyzeEquation(GraphControl::Equation ^ equation);
|
||||
|
||||
// We can't use the EvalTrigUnitMode enum directly in as the property type because it comes from another module which doesn't expose
|
||||
@ -116,7 +122,7 @@ public
|
||||
if (value != (int)m_solver->EvalOptions().GetTrigUnitMode())
|
||||
{
|
||||
m_solver->EvalOptions().SetTrigUnitMode((Graphing::EvalTrigUnitMode)value);
|
||||
PlotGraph();
|
||||
PlotGraph(true);
|
||||
}
|
||||
}
|
||||
|
||||
@ -265,8 +271,8 @@ public
|
||||
void OnEquationChanged(Equation ^ equation);
|
||||
void OnEquationStyleChanged(Equation ^ equation);
|
||||
void OnEquationLineEnabledChanged(Equation ^ equation);
|
||||
bool TryUpdateGraph();
|
||||
void TryPlotGraph(bool shouldRetry);
|
||||
bool TryUpdateGraph(bool keepCurrentView);
|
||||
void TryPlotGraph(bool keepCurrentView, bool shouldRetry);
|
||||
void UpdateGraphOptions(Graphing::IGraphingOptions& options, const std::vector<Equation ^>& validEqs);
|
||||
std::vector<Equation ^> GetGraphableEquations();
|
||||
void SetGraphArgs();
|
||||
@ -284,7 +290,7 @@ public
|
||||
|
||||
void SetEquationsAsValid();
|
||||
void SetEquationErrors();
|
||||
|
||||
std::optional<std::vector<std::shared_ptr<Graphing::IEquation>>> TryInitializeGraph(bool keepCurrentView, _In_ const Graphing::IExpression* graphingExp = nullptr);
|
||||
private:
|
||||
DX::RenderMain ^ m_renderMain = nullptr;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user