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:
		@@ -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,8 +289,8 @@ namespace GraphControl
 | 
			
		||||
 | 
			
		||||
            if (graphExpression = m_solver->ParseInput(request))
 | 
			
		||||
            {
 | 
			
		||||
                initResult = m_graph->TryInitialize(graphExpression.get());
 | 
			
		||||
 | 
			
		||||
                initResult = TryInitializeGraph(keepCurrentView, graphExpression.get());
 | 
			
		||||
                
 | 
			
		||||
                if (initResult != nullopt)
 | 
			
		||||
                {
 | 
			
		||||
                    UpdateGraphOptions(m_graph->GetOptions(), validEqs);
 | 
			
		||||
@@ -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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user