Add variable editing (#581)
This commit is contained in:
		@@ -10,6 +10,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Utility macros to make Models easier to write
 | 
					// Utility macros to make Models easier to write
 | 
				
			||||||
// generates a member variable called m_<n>
 | 
					// generates a member variable called m_<n>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define PROPERTY_R(t, n)                                                                                                                                       \
 | 
					#define PROPERTY_R(t, n)                                                                                                                                       \
 | 
				
			||||||
    property t n                                                                                                                                               \
 | 
					    property t n                                                                                                                                               \
 | 
				
			||||||
    {                                                                                                                                                          \
 | 
					    {                                                                                                                                                          \
 | 
				
			||||||
@@ -72,6 +73,25 @@ private:
 | 
				
			|||||||
                                                                                                                                                               \
 | 
					                                                                                                                                                               \
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define OBSERVABLE_PROPERTY_RW_ALWAYS_NOTIFY(t, n)                                                                                                             \
 | 
				
			||||||
 | 
					    property t n                                                                                                                                               \
 | 
				
			||||||
 | 
					    {                                                                                                                                                          \
 | 
				
			||||||
 | 
					        t get()                                                                                                                                                \
 | 
				
			||||||
 | 
					        {                                                                                                                                                      \
 | 
				
			||||||
 | 
					            return m_##n;                                                                                                                                      \
 | 
				
			||||||
 | 
					        }                                                                                                                                                      \
 | 
				
			||||||
 | 
					        void set(t value)                                                                                                                                      \
 | 
				
			||||||
 | 
					        {                                                                                                                                                      \
 | 
				
			||||||
 | 
					            m_##n = value;                                                                                                                                     \
 | 
				
			||||||
 | 
					            RaisePropertyChanged(L#n);                                                                                                                         \
 | 
				
			||||||
 | 
					        }                                                                                                                                                      \
 | 
				
			||||||
 | 
					    }                                                                                                                                                          \
 | 
				
			||||||
 | 
					                                                                                                                                                               \
 | 
				
			||||||
 | 
					private:                                                                                                                                                       \
 | 
				
			||||||
 | 
					    t m_##n;                                                                                                                                                   \
 | 
				
			||||||
 | 
					                                                                                                                                                               \
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define OBSERVABLE_PROPERTY_RW(t, n)                                                                                                                           \
 | 
					#define OBSERVABLE_PROPERTY_RW(t, n)                                                                                                                           \
 | 
				
			||||||
    property t n                                                                                                                                               \
 | 
					    property t n                                                                                                                                               \
 | 
				
			||||||
    {                                                                                                                                                          \
 | 
					    {                                                                                                                                                          \
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,17 +2,37 @@
 | 
				
			|||||||
#include "GraphingCalculatorViewModel.h"
 | 
					#include "GraphingCalculatorViewModel.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace CalculatorApp::ViewModel;
 | 
					using namespace CalculatorApp::ViewModel;
 | 
				
			||||||
 | 
					using namespace Platform;
 | 
				
			||||||
using namespace Platform::Collections;
 | 
					using namespace Platform::Collections;
 | 
				
			||||||
 | 
					using namespace Windows::Foundation;
 | 
				
			||||||
 | 
					using namespace Windows::Foundation::Collections;
 | 
				
			||||||
 | 
					using namespace Windows::UI::Xaml::Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace CalculatorApp::ViewModel
 | 
					namespace CalculatorApp::ViewModel
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GraphingCalculatorViewModel::GraphingCalculatorViewModel()
 | 
					    GraphingCalculatorViewModel::GraphingCalculatorViewModel()
 | 
				
			||||||
        : m_IsDecimalEnabled{ true }
 | 
					        : m_IsDecimalEnabled{ true }
 | 
				
			||||||
        , m_Equations{ ref new Vector< EquationViewModel^ >() }
 | 
					        , m_Equations{ ref new Vector< EquationViewModel^ >() }
 | 
				
			||||||
 | 
					        , m_Variables{ ref new Vector< VariableViewModel^ >() }
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void GraphingCalculatorViewModel::OnButtonPressed(Object^ parameter)
 | 
					    void GraphingCalculatorViewModel::OnButtonPressed(Object^ parameter)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void GraphingCalculatorViewModel::UpdateVariables(IMap<String^, double>^ variables)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        Variables->Clear();
 | 
				
			||||||
 | 
					        for (auto var : variables)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            auto variable = ref new VariableViewModel(var->Key, var->Value);
 | 
				
			||||||
 | 
					            variable->VariableUpdated += ref new EventHandler<VariableChangedEventArgs>([this, variable](Object^ sender, VariableChangedEventArgs e)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    VariableUpdated(variable, VariableChangedEventArgs{ e.variableName, e.newValue });
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					            Variables->Append(variable);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,62 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace CalculatorApp::ViewModel
 | 
					namespace CalculatorApp::ViewModel
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    public value struct VariableChangedEventArgs sealed
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        Platform::String^ variableName;
 | 
				
			||||||
 | 
					        double newValue;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    [Windows::UI::Xaml::Data::Bindable]
 | 
				
			||||||
 | 
					    public ref class VariableViewModel sealed : public Windows::UI::Xaml::Data::INotifyPropertyChanged
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					    public:
 | 
				
			||||||
 | 
					        VariableViewModel(Platform::String^ name, double value) :
 | 
				
			||||||
 | 
					            m_Name(name),
 | 
				
			||||||
 | 
					            m_Value(value),
 | 
				
			||||||
 | 
					            m_SliderSettingsVisible(false),
 | 
				
			||||||
 | 
					            m_Min(0.0),
 | 
				
			||||||
 | 
					            m_Step(0.1),
 | 
				
			||||||
 | 
					            m_Max(2.0)
 | 
				
			||||||
 | 
					        { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        OBSERVABLE_OBJECT_CALLBACK(OnPropertyChanged);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        OBSERVABLE_PROPERTY_R(Platform::String^, Name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // TODO: Consider removing this work around and manually set the textbox text.
 | 
				
			||||||
 | 
					        OBSERVABLE_PROPERTY_RW_ALWAYS_NOTIFY(double, Value);
 | 
				
			||||||
 | 
					        OBSERVABLE_PROPERTY_RW_ALWAYS_NOTIFY(double, Min);
 | 
				
			||||||
 | 
					        OBSERVABLE_PROPERTY_RW_ALWAYS_NOTIFY(double, Step);
 | 
				
			||||||
 | 
					        OBSERVABLE_PROPERTY_RW_ALWAYS_NOTIFY(double, Max);
 | 
				
			||||||
 | 
					        OBSERVABLE_PROPERTY_RW(bool, SliderSettingsVisible);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        event Windows::Foundation::EventHandler<VariableChangedEventArgs>^ VariableUpdated;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        void SetValue(double value)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (value < Min)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                value = Min;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else if (value > Max)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                value = Max;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Value = value;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private:
 | 
				
			||||||
 | 
					        void OnPropertyChanged(Platform::String^ propertyName)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (propertyName == "Value")
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                VariableUpdated(this, VariableChangedEventArgs{ Name, Value });
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [Windows::UI::Xaml::Data::Bindable]
 | 
					    [Windows::UI::Xaml::Data::Bindable]
 | 
				
			||||||
    public ref class GraphingCalculatorViewModel sealed : public Windows::UI::Xaml::Data::INotifyPropertyChanged
 | 
					    public ref class GraphingCalculatorViewModel sealed : public Windows::UI::Xaml::Data::INotifyPropertyChanged
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -14,9 +70,13 @@ namespace CalculatorApp::ViewModel
 | 
				
			|||||||
        OBSERVABLE_OBJECT();
 | 
					        OBSERVABLE_OBJECT();
 | 
				
			||||||
        OBSERVABLE_PROPERTY_R(bool, IsDecimalEnabled);
 | 
					        OBSERVABLE_PROPERTY_R(bool, IsDecimalEnabled);
 | 
				
			||||||
        OBSERVABLE_PROPERTY_R(Windows::Foundation::Collections::IObservableVector< EquationViewModel^ >^, Equations);
 | 
					        OBSERVABLE_PROPERTY_R(Windows::Foundation::Collections::IObservableVector< EquationViewModel^ >^, Equations);
 | 
				
			||||||
 | 
					        OBSERVABLE_PROPERTY_R(Windows::Foundation::Collections::IObservableVector< VariableViewModel^ >^, Variables);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        COMMAND_FOR_METHOD(ButtonPressed, GraphingCalculatorViewModel::OnButtonPressed);
 | 
					        COMMAND_FOR_METHOD(ButtonPressed, GraphingCalculatorViewModel::OnButtonPressed);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        event Windows::Foundation::EventHandler<VariableChangedEventArgs>^ VariableUpdated;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        void UpdateVariables(Windows::Foundation::Collections::IMap<Platform::String^, double>^ variables);
 | 
				
			||||||
    private:
 | 
					    private:
 | 
				
			||||||
        void OnButtonPressed(Platform::Object^ parameter);
 | 
					        void OnButtonPressed(Platform::Object^ parameter);
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1725,6 +1725,16 @@
 | 
				
			|||||||
                    </Setter.Value>
 | 
					                    </Setter.Value>
 | 
				
			||||||
                </Setter>
 | 
					                </Setter>
 | 
				
			||||||
            </Style>
 | 
					            </Style>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <Style x:Key="VariableTextBoxStyle" TargetType="TextBox">
 | 
				
			||||||
 | 
					                <Setter Property="Margin" Value="12,4,4,4"/>
 | 
				
			||||||
 | 
					                <Setter Property="Background" Value="Transparent"/>
 | 
				
			||||||
 | 
					                <Setter Property="BorderThickness" Value="0,0,0,1"/>
 | 
				
			||||||
 | 
					                <Setter Property="FontSize" Value="14"/>
 | 
				
			||||||
 | 
					                <Setter Property="AcceptsReturn" Value="False"/>
 | 
				
			||||||
 | 
					                <Setter Property="InputScope" Value="Number"/>
 | 
				
			||||||
 | 
					                <Setter Property="TextWrapping" Value="NoWrap"/>
 | 
				
			||||||
 | 
					            </Style>
 | 
				
			||||||
        </ResourceDictionary>
 | 
					        </ResourceDictionary>
 | 
				
			||||||
    </Application.Resources>
 | 
					    </Application.Resources>
 | 
				
			||||||
</Application>
 | 
					</Application>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3439,4 +3439,20 @@
 | 
				
			|||||||
    <value>Add Equation</value>
 | 
					    <value>Add Equation</value>
 | 
				
			||||||
    <comment>Placeholder text for the equation input button</comment>
 | 
					    <comment>Placeholder text for the equation input button</comment>
 | 
				
			||||||
  </data>
 | 
					  </data>
 | 
				
			||||||
 | 
					  <data name="VaiablesHeader.Text" xml:space="preserve">
 | 
				
			||||||
 | 
					    <value>Variables</value>
 | 
				
			||||||
 | 
					    <comment>Header text for variables area</comment>
 | 
				
			||||||
 | 
					  </data>
 | 
				
			||||||
 | 
					  <data name="StepTextBlock.Text" xml:space="preserve">
 | 
				
			||||||
 | 
					    <value>Step</value>
 | 
				
			||||||
 | 
					    <comment>Label text for the step text box</comment>
 | 
				
			||||||
 | 
					  </data>
 | 
				
			||||||
 | 
					  <data name="MinTextBlock.Text" xml:space="preserve">
 | 
				
			||||||
 | 
					    <value>Min</value>
 | 
				
			||||||
 | 
					    <comment>Label text for the min text box</comment>
 | 
				
			||||||
 | 
					  </data>
 | 
				
			||||||
 | 
					  <data name="MaxTextBlock.Text" xml:space="preserve">
 | 
				
			||||||
 | 
					    <value>Max</value>
 | 
				
			||||||
 | 
					    <comment>Label text for the max text box</comment>
 | 
				
			||||||
 | 
					  </data>
 | 
				
			||||||
</root>
 | 
					</root>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,7 @@
 | 
				
			|||||||
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 | 
					             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 | 
				
			||||||
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 | 
					             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 | 
				
			||||||
             xmlns:controls="using:CalculatorApp.Controls"
 | 
					             xmlns:controls="using:CalculatorApp.Controls"
 | 
				
			||||||
 | 
					             xmlns:converters="using:CalculatorApp.Converters"
 | 
				
			||||||
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 | 
					             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 | 
				
			||||||
             xmlns:graphControl="using:GraphControl"
 | 
					             xmlns:graphControl="using:GraphControl"
 | 
				
			||||||
             xmlns:local="using:CalculatorApp"
 | 
					             xmlns:local="using:CalculatorApp"
 | 
				
			||||||
@@ -10,6 +11,11 @@
 | 
				
			|||||||
             DataContextChanged="GraphingCalculator_DataContextChanged"
 | 
					             DataContextChanged="GraphingCalculator_DataContextChanged"
 | 
				
			||||||
             mc:Ignorable="d">
 | 
					             mc:Ignorable="d">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <UserControl.Resources>
 | 
				
			||||||
 | 
					        <converters:BooleanToVisibilityConverter x:Name="BooleanToVisibilityConverter"/>
 | 
				
			||||||
 | 
					        <converters:BooleanToVisibilityNegationConverter x:Name="BooleanToVisibilityNegationConverter"/>
 | 
				
			||||||
 | 
					    </UserControl.Resources>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <Grid x:Name="RootGrid">
 | 
					    <Grid x:Name="RootGrid">
 | 
				
			||||||
        <Grid.RowDefinitions>
 | 
					        <Grid.RowDefinitions>
 | 
				
			||||||
            <RowDefinition x:Name="RowHamburger" Height="{StaticResource HamburgerHeightGridLength}"/>
 | 
					            <RowDefinition x:Name="RowHamburger" Height="{StaticResource HamburgerHeightGridLength}"/>
 | 
				
			||||||
@@ -25,11 +31,12 @@
 | 
				
			|||||||
              Grid.Row="1"
 | 
					              Grid.Row="1"
 | 
				
			||||||
              Grid.Column="0">
 | 
					              Grid.Column="0">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            <graphControl:Grapher Grid.Row="0"
 | 
					            <graphControl:Grapher Name="GraphingControl"
 | 
				
			||||||
                                  Margin="4,7,4,4"
 | 
					                                  Margin="4,7,4,4"
 | 
				
			||||||
                                  EquationsSource="{x:Bind ViewModel.Equations, Mode=OneWay}"
 | 
					                                  EquationsSource="{x:Bind ViewModel.Equations, Mode=OneWay}"
 | 
				
			||||||
                                  ForceProportionalAxes="True"
 | 
					                                  ForceProportionalAxes="True"
 | 
				
			||||||
                                  UseSystemFocusVisuals="True">
 | 
					                                  UseSystemFocusVisuals="True"
 | 
				
			||||||
 | 
					                                  VariablesUpdated="GraphVariablesUpdated">
 | 
				
			||||||
                <graphControl:Grapher.Background>
 | 
					                <graphControl:Grapher.Background>
 | 
				
			||||||
                    <SolidColorBrush Color="White"/>
 | 
					                    <SolidColorBrush Color="White"/>
 | 
				
			||||||
                </graphControl:Grapher.Background>
 | 
					                </graphControl:Grapher.Background>
 | 
				
			||||||
@@ -39,6 +46,175 @@
 | 
				
			|||||||
                    </DataTemplate>
 | 
					                    </DataTemplate>
 | 
				
			||||||
                </graphControl:Grapher.EquationTemplate>
 | 
					                </graphControl:Grapher.EquationTemplate>
 | 
				
			||||||
            </graphControl:Grapher>
 | 
					            </graphControl:Grapher>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <!-- Temporary button until the final UI is created -->
 | 
				
			||||||
 | 
					            <Button Margin="12,0,0,12"
 | 
				
			||||||
 | 
					                    VerticalAlignment="Bottom"
 | 
				
			||||||
 | 
					                    FontFamily="{StaticResource SymbolThemeFontFamily}"
 | 
				
			||||||
 | 
					                    FontSize="18"
 | 
				
			||||||
 | 
					                    Content=""
 | 
				
			||||||
 | 
					                    RequestedTheme="Light">
 | 
				
			||||||
 | 
					                <Button.Flyout>
 | 
				
			||||||
 | 
					                    <Flyout Placement="TopEdgeAlignedRight">
 | 
				
			||||||
 | 
					                        <Flyout.FlyoutPresenterStyle>
 | 
				
			||||||
 | 
					                            <Style TargetType="FlyoutPresenter">
 | 
				
			||||||
 | 
					                                <Setter Property="RequestedTheme" Value="Default"/>
 | 
				
			||||||
 | 
					                                <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Disabled"/>
 | 
				
			||||||
 | 
					                                <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
 | 
				
			||||||
 | 
					                                <Setter Property="Margin" Value="12,0,0,0"/>
 | 
				
			||||||
 | 
					                            </Style>
 | 
				
			||||||
 | 
					                        </Flyout.FlyoutPresenterStyle>
 | 
				
			||||||
 | 
					                        <ListView x:Name="VariableListView"
 | 
				
			||||||
 | 
					                                  MinWidth="300"
 | 
				
			||||||
 | 
					                                  ItemsSource="{x:Bind ViewModel.Variables}"
 | 
				
			||||||
 | 
					                                  SelectionMode="None">
 | 
				
			||||||
 | 
					                            <ListView.Resources>
 | 
				
			||||||
 | 
					                                <ResourceDictionary>
 | 
				
			||||||
 | 
					                                    <ResourceDictionary.ThemeDictionaries>
 | 
				
			||||||
 | 
					                                        <ResourceDictionary x:Key="Default">
 | 
				
			||||||
 | 
					                                            <SolidColorBrush x:Key="TextControlBackgroundFocused" Color="Transparent"/>
 | 
				
			||||||
 | 
					                                            <SolidColorBrush x:Key="TextControlBackgroundPointerOver" Color="Transparent"/>
 | 
				
			||||||
 | 
					                                            <SolidColorBrush x:Key="TextControlForegroundFocused" Color="White"/>
 | 
				
			||||||
 | 
					                                            <x:Double x:Key="TextControlThemeMinWidth">32</x:Double>
 | 
				
			||||||
 | 
					                                            <x:Double x:Key="TextControlThemeMinHeight">16</x:Double>
 | 
				
			||||||
 | 
					                                        </ResourceDictionary>
 | 
				
			||||||
 | 
					                                        <ResourceDictionary x:Key="Light">
 | 
				
			||||||
 | 
					                                            <SolidColorBrush x:Key="TextControlBackgroundFocused" Color="Transparent"/>
 | 
				
			||||||
 | 
					                                            <SolidColorBrush x:Key="TextControlBackgroundPointerOver" Color="Transparent"/>
 | 
				
			||||||
 | 
					                                            <SolidColorBrush x:Key="TextControlForegroundFocused" Color="Black"/>
 | 
				
			||||||
 | 
					                                            <x:Double x:Key="TextControlThemeMinWidth">32</x:Double>
 | 
				
			||||||
 | 
					                                            <x:Double x:Key="TextControlThemeMinHeight">16</x:Double>
 | 
				
			||||||
 | 
					                                        </ResourceDictionary>
 | 
				
			||||||
 | 
					                                        <ResourceDictionary x:Key="HighContrast">
 | 
				
			||||||
 | 
					                                            <SolidColorBrush x:Key="TextControlBackgroundFocused" Color="{ThemeResource SystemColorButtonFaceColor}"/>
 | 
				
			||||||
 | 
					                                            <SolidColorBrush x:Key="TextControlBackgroundPointerOver" Color="{StaticResource SystemColorButtonFaceColor}"/>
 | 
				
			||||||
 | 
					                                            <SolidColorBrush x:Key="TextControlForegroundFocused" Color="{ThemeResource SystemColorButtonTextColor}"/>
 | 
				
			||||||
 | 
					                                            <x:Double x:Key="TextControlThemeMinWidth">32</x:Double>
 | 
				
			||||||
 | 
					                                            <x:Double x:Key="TextControlThemeMinHeight">16</x:Double>
 | 
				
			||||||
 | 
					                                        </ResourceDictionary>
 | 
				
			||||||
 | 
					                                    </ResourceDictionary.ThemeDictionaries>
 | 
				
			||||||
 | 
					                                </ResourceDictionary>
 | 
				
			||||||
 | 
					                            </ListView.Resources>
 | 
				
			||||||
 | 
					                            <ListView.Header>
 | 
				
			||||||
 | 
					                                <TextBlock x:Uid="VaiablesHeader" Margin="0,0,0,12"/>
 | 
				
			||||||
 | 
					                            </ListView.Header>
 | 
				
			||||||
 | 
					                            <ListView.ItemContainerStyle>
 | 
				
			||||||
 | 
					                                <Style TargetType="ListViewItem">
 | 
				
			||||||
 | 
					                                    <Setter Property="IsTabStop" Value="False"/>
 | 
				
			||||||
 | 
					                                    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
 | 
				
			||||||
 | 
					                                    <Setter Property="Margin" Value="0,0,0,12"/>
 | 
				
			||||||
 | 
					                                </Style>
 | 
				
			||||||
 | 
					                            </ListView.ItemContainerStyle>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            <ListView.ItemTemplate>
 | 
				
			||||||
 | 
					                                <DataTemplate x:DataType="vm:VariableViewModel">
 | 
				
			||||||
 | 
					                                    <StackPanel>
 | 
				
			||||||
 | 
					                                        <Grid HorizontalAlignment="Stretch">
 | 
				
			||||||
 | 
					                                            <Grid.ColumnDefinitions>
 | 
				
			||||||
 | 
					                                                <ColumnDefinition Width="Auto"/>
 | 
				
			||||||
 | 
					                                                <ColumnDefinition Width="*"/>
 | 
				
			||||||
 | 
					                                                <ColumnDefinition Width="Auto"/>
 | 
				
			||||||
 | 
					                                            </Grid.ColumnDefinitions>
 | 
				
			||||||
 | 
					                                            <TextBlock Padding="0,0,0,8"
 | 
				
			||||||
 | 
					                                                       VerticalAlignment="Bottom"
 | 
				
			||||||
 | 
					                                                       Text="{x:Bind Name}"/>
 | 
				
			||||||
 | 
					                                            <TextBox x:Name="ValueTextBox"
 | 
				
			||||||
 | 
					                                                     Grid.Column="1"
 | 
				
			||||||
 | 
					                                                     HorizontalAlignment="Left"
 | 
				
			||||||
 | 
					                                                     Style="{StaticResource VariableTextBoxStyle}"
 | 
				
			||||||
 | 
					                                                     GotFocus="TextBoxGotFocus"
 | 
				
			||||||
 | 
					                                                     KeyDown="TextBoxKeyDown"
 | 
				
			||||||
 | 
					                                                     LosingFocus="TextBoxLosingFocus"
 | 
				
			||||||
 | 
					                                                     Text="{x:Bind Value, Mode=OneWay}"/>
 | 
				
			||||||
 | 
					                                            <ToggleButton Grid.Column="2"
 | 
				
			||||||
 | 
					                                                          HorizontalAlignment="Right"
 | 
				
			||||||
 | 
					                                                          Background="Transparent"
 | 
				
			||||||
 | 
					                                                          FontFamily="{StaticResource SymbolThemeFontFamily}"
 | 
				
			||||||
 | 
					                                                          Content=""
 | 
				
			||||||
 | 
					                                                          IsChecked="{x:Bind SliderSettingsVisible, Mode=TwoWay}">
 | 
				
			||||||
 | 
					                                                <ToggleButton.Resources>
 | 
				
			||||||
 | 
					                                                    <SolidColorBrush x:Key="ToggleButtonBackgroundPressed" Color="Transparent"/>
 | 
				
			||||||
 | 
					                                                    <SolidColorBrush x:Key="ToggleButtonBackgroundChecked" Color="Transparent"/>
 | 
				
			||||||
 | 
					                                                    <SolidColorBrush x:Key="ToggleButtonBackgroundCheckedPointerOver" Color="Transparent"/>
 | 
				
			||||||
 | 
					                                                    <SolidColorBrush x:Key="ToggleButtonBorderBrushCheckedPointerOver" Color="Transparent"/>
 | 
				
			||||||
 | 
					                                                    <SolidColorBrush x:Key="ToggleButtonBackgroundPointerOver" Color="Transparent"/>
 | 
				
			||||||
 | 
					                                                    <SolidColorBrush x:Key="ToggleButtonBorderBrushPointerOver" Color="Transparent"/>
 | 
				
			||||||
 | 
					                                                    <SolidColorBrush x:Key="ToggleButtonBackgroundCheckedPressed" Color="Transparent"/>
 | 
				
			||||||
 | 
					                                                    <SolidColorBrush x:Key="ToggleButtonForegroundPointerOver" Color="{ThemeResource SystemAccentColor}"/>
 | 
				
			||||||
 | 
					                                                    <SolidColorBrush x:Key="ToggleButtonForegroundPressed" Color="{ThemeResource SystemAccentColor}"/>
 | 
				
			||||||
 | 
					                                                    <SolidColorBrush x:Key="ToggleButtonForegroundChecked" Color="{ThemeResource SystemAccentColor}"/>
 | 
				
			||||||
 | 
					                                                    <SolidColorBrush x:Key="ToggleButtonForegroundCheckedPressed" Color="{ThemeResource SystemAccentColor}"/>
 | 
				
			||||||
 | 
					                                                    <SolidColorBrush x:Key="ToggleButtonForegroundCheckedPointerOver" Color="{ThemeResource SystemAccentColor}"/>
 | 
				
			||||||
 | 
					                                                    <x:Double x:Key="TextControlThemeMinWidth">32</x:Double>
 | 
				
			||||||
 | 
					                                                </ToggleButton.Resources>
 | 
				
			||||||
 | 
					                                            </ToggleButton>
 | 
				
			||||||
 | 
					                                        </Grid>
 | 
				
			||||||
 | 
					                                        <Slider MinHeight="38"
 | 
				
			||||||
 | 
					                                                Maximum="{x:Bind Max, Mode=TwoWay}"
 | 
				
			||||||
 | 
					                                                Minimum="{x:Bind Min, Mode=TwoWay}"
 | 
				
			||||||
 | 
					                                                StepFrequency="{x:Bind Step, Mode=TwoWay}"
 | 
				
			||||||
 | 
					                                                Visibility="{x:Bind SliderSettingsVisible, Converter={StaticResource BooleanToVisibilityNegationConverter}, Mode=OneWay}"
 | 
				
			||||||
 | 
					                                                Value="{x:Bind Value, Mode=TwoWay}"/>
 | 
				
			||||||
 | 
					                                        <Grid Grid.Row="1"
 | 
				
			||||||
 | 
					                                              MinHeight="38"
 | 
				
			||||||
 | 
					                                              HorizontalAlignment="Stretch"
 | 
				
			||||||
 | 
					                                              Visibility="{x:Bind SliderSettingsVisible, Converter={StaticResource BooleanToVisibilityConverter}, Mode=OneWay}">
 | 
				
			||||||
 | 
					                                            <Grid.ColumnDefinitions>
 | 
				
			||||||
 | 
					                                                <ColumnDefinition Width="Auto"/>
 | 
				
			||||||
 | 
					                                                <ColumnDefinition Width="*"/>
 | 
				
			||||||
 | 
					                                                <ColumnDefinition Width="Auto"/>
 | 
				
			||||||
 | 
					                                            </Grid.ColumnDefinitions>
 | 
				
			||||||
 | 
					                                            <StackPanel Orientation="Horizontal">
 | 
				
			||||||
 | 
					                                                <TextBlock x:Uid="MinTextBlock"
 | 
				
			||||||
 | 
					                                                           Padding="0,0,0,8"
 | 
				
			||||||
 | 
					                                                           VerticalAlignment="Bottom"
 | 
				
			||||||
 | 
					                                                           FontWeight="SemiBold"/>
 | 
				
			||||||
 | 
					                                                <TextBox x:Name="MinTextBox"
 | 
				
			||||||
 | 
					                                                         MaxWidth="96"
 | 
				
			||||||
 | 
					                                                         Style="{StaticResource VariableTextBoxStyle}"
 | 
				
			||||||
 | 
					                                                         GotFocus="TextBoxGotFocus"
 | 
				
			||||||
 | 
					                                                         KeyDown="TextBoxKeyDown"
 | 
				
			||||||
 | 
					                                                         LosingFocus="TextBoxLosingFocus"
 | 
				
			||||||
 | 
					                                                         Text="{x:Bind Min, Mode=OneWay}"/>
 | 
				
			||||||
 | 
					                                            </StackPanel>
 | 
				
			||||||
 | 
					                                            <StackPanel Grid.Column="1"
 | 
				
			||||||
 | 
					                                                        HorizontalAlignment="Center"
 | 
				
			||||||
 | 
					                                                        Orientation="Horizontal">
 | 
				
			||||||
 | 
					                                                <TextBlock x:Uid="StepTextBlock"
 | 
				
			||||||
 | 
					                                                           Padding="0,0,0,8"
 | 
				
			||||||
 | 
					                                                           HorizontalAlignment="Center"
 | 
				
			||||||
 | 
					                                                           VerticalAlignment="Bottom"
 | 
				
			||||||
 | 
					                                                           FontWeight="SemiBold"/>
 | 
				
			||||||
 | 
					                                                <TextBox x:Name="StepTextBox"
 | 
				
			||||||
 | 
					                                                         MaxWidth="96"
 | 
				
			||||||
 | 
					                                                         HorizontalAlignment="Center"
 | 
				
			||||||
 | 
					                                                         Style="{StaticResource VariableTextBoxStyle}"
 | 
				
			||||||
 | 
					                                                         GotFocus="TextBoxGotFocus"
 | 
				
			||||||
 | 
					                                                         KeyDown="TextBoxKeyDown"
 | 
				
			||||||
 | 
					                                                         LosingFocus="TextBoxLosingFocus"
 | 
				
			||||||
 | 
					                                                         Text="{x:Bind Step, Mode=OneWay}"/>
 | 
				
			||||||
 | 
					                                            </StackPanel>
 | 
				
			||||||
 | 
					                                            <StackPanel Grid.Column="2" Orientation="Horizontal">
 | 
				
			||||||
 | 
					                                                <TextBlock x:Uid="MaxTextBlock"
 | 
				
			||||||
 | 
					                                                           Padding="0,0,0,8"
 | 
				
			||||||
 | 
					                                                           VerticalAlignment="Bottom"
 | 
				
			||||||
 | 
					                                                           FontWeight="SemiBold"/>
 | 
				
			||||||
 | 
					                                                <TextBox x:Name="MaxTextBox"
 | 
				
			||||||
 | 
					                                                         MaxWidth="96"
 | 
				
			||||||
 | 
					                                                         Style="{StaticResource VariableTextBoxStyle}"
 | 
				
			||||||
 | 
					                                                         GotFocus="TextBoxGotFocus"
 | 
				
			||||||
 | 
					                                                         KeyDown="TextBoxKeyDown"
 | 
				
			||||||
 | 
					                                                         LosingFocus="TextBoxLosingFocus"
 | 
				
			||||||
 | 
					                                                         Text="{x:Bind Max, Mode=OneWay}"/>
 | 
				
			||||||
 | 
					                                            </StackPanel>
 | 
				
			||||||
 | 
					                                        </Grid>
 | 
				
			||||||
 | 
					                                    </StackPanel>
 | 
				
			||||||
 | 
					                                </DataTemplate>
 | 
				
			||||||
 | 
					                            </ListView.ItemTemplate>
 | 
				
			||||||
 | 
					                        </ListView>
 | 
				
			||||||
 | 
					                    </Flyout>
 | 
				
			||||||
 | 
					                </Button.Flyout>
 | 
				
			||||||
 | 
					            </Button>
 | 
				
			||||||
        </Grid>
 | 
					        </Grid>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <!-- Right portion of the screen -->
 | 
					        <!-- Right portion of the screen -->
 | 
				
			||||||
@@ -50,12 +226,13 @@
 | 
				
			|||||||
            <Grid.RowDefinitions>
 | 
					            <Grid.RowDefinitions>
 | 
				
			||||||
                <RowDefinition Height="5*"/>
 | 
					                <RowDefinition Height="5*"/>
 | 
				
			||||||
                <RowDefinition Height="3*"/>
 | 
					                <RowDefinition Height="3*"/>
 | 
				
			||||||
 | 
					                <RowDefinition Height="3*"/>
 | 
				
			||||||
            </Grid.RowDefinitions>
 | 
					            </Grid.RowDefinitions>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            <local:EquationInputArea Grid.Row="0" Equations="{x:Bind ViewModel.Equations}"/>
 | 
					            <local:EquationInputArea Grid.Row="0" Equations="{x:Bind ViewModel.Equations}"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            <Grid x:Name="ButtonContainerGrid"
 | 
					            <Grid x:Name="ButtonContainerGrid"
 | 
				
			||||||
                  Grid.Row="1"
 | 
					                  Grid.Row="2"
 | 
				
			||||||
                  Margin="3,0,3,3"
 | 
					                  Margin="3,0,3,3"
 | 
				
			||||||
                  UseLayoutRounding="False">
 | 
					                  UseLayoutRounding="False">
 | 
				
			||||||
                <Grid.RowDefinitions>
 | 
					                <Grid.RowDefinitions>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,13 +11,16 @@ using namespace CalculatorApp::ViewModel;
 | 
				
			|||||||
using namespace concurrency;
 | 
					using namespace concurrency;
 | 
				
			||||||
using namespace GraphControl;
 | 
					using namespace GraphControl;
 | 
				
			||||||
using namespace Platform;
 | 
					using namespace Platform;
 | 
				
			||||||
 | 
					using namespace std;
 | 
				
			||||||
using namespace std::chrono;
 | 
					using namespace std::chrono;
 | 
				
			||||||
using namespace Utils;
 | 
					using namespace Utils;
 | 
				
			||||||
 | 
					using namespace Windows::Foundation;
 | 
				
			||||||
using namespace Windows::Foundation::Collections;
 | 
					using namespace Windows::Foundation::Collections;
 | 
				
			||||||
using namespace Windows::Storage::Streams;
 | 
					using namespace Windows::Storage::Streams;
 | 
				
			||||||
using namespace Windows::System;
 | 
					using namespace Windows::System;
 | 
				
			||||||
using namespace Windows::UI::Xaml;
 | 
					using namespace Windows::UI::Xaml;
 | 
				
			||||||
using namespace Windows::UI::Xaml::Data;
 | 
					using namespace Windows::UI::Xaml::Data;
 | 
				
			||||||
 | 
					using namespace Windows::UI::Xaml::Controls;
 | 
				
			||||||
using namespace Windows::UI::Xaml::Input;
 | 
					using namespace Windows::UI::Xaml::Input;
 | 
				
			||||||
using namespace Windows::UI::Xaml::Media;
 | 
					using namespace Windows::UI::Xaml::Media;
 | 
				
			||||||
using namespace Windows::UI::Xaml::Media::Imaging;
 | 
					using namespace Windows::UI::Xaml::Media::Imaging;
 | 
				
			||||||
@@ -34,6 +37,8 @@ GraphingCalculator::GraphingCalculator()
 | 
				
			|||||||
void GraphingCalculator::GraphingCalculator_DataContextChanged(FrameworkElement^ sender, DataContextChangedEventArgs^ args)
 | 
					void GraphingCalculator::GraphingCalculator_DataContextChanged(FrameworkElement^ sender, DataContextChangedEventArgs^ args)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ViewModel = dynamic_cast<GraphingCalculatorViewModel^>(args->NewValue);
 | 
					    ViewModel = dynamic_cast<GraphingCalculatorViewModel^>(args->NewValue);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ViewModel->VariableUpdated += ref new EventHandler<VariableChangedEventArgs>(this, &CalculatorApp::GraphingCalculator::OnVariableChanged);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GraphingCalculatorViewModel^ GraphingCalculator::ViewModel::get()
 | 
					GraphingCalculatorViewModel^ GraphingCalculator::ViewModel::get()
 | 
				
			||||||
@@ -49,3 +54,67 @@ void GraphingCalculator::ViewModel::set(GraphingCalculatorViewModel^ vm)
 | 
				
			|||||||
        RaisePropertyChanged(StringReference(sc_ViewModelPropertyName));
 | 
					        RaisePropertyChanged(StringReference(sc_ViewModelPropertyName));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void GraphingCalculator::GraphVariablesUpdated(Object^, Object^)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    m_viewModel->UpdateVariables(GraphingControl->Variables);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void GraphingCalculator::OnVariableChanged(Platform::Object^ sender, VariableChangedEventArgs args)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GraphingControl->SetVariable(args.variableName, args.newValue);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void GraphingCalculator::SubmitTextbox(TextBox^ sender)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    auto variableViewModel = static_cast<VariableViewModel^>(sender->DataContext);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (sender->Name == "ValueTextBox")
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        variableViewModel->SetValue(validateDouble(sender->Text, variableViewModel->Value));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if (sender->Name == "MinTextBox")
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        variableViewModel->Min = validateDouble(sender->Text, variableViewModel->Min);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if (sender->Name == "MaxTextBox")
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        variableViewModel->Step = validateDouble(sender->Text, variableViewModel->Step);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if (sender->Name == "StepTextBox")
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        variableViewModel->Max = validateDouble(sender->Text, variableViewModel->Max);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void GraphingCalculator::TextBoxLosingFocus(TextBox^ sender, LosingFocusEventArgs^)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SubmitTextbox(sender);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void GraphingCalculator::TextBoxKeyDown(TextBox^ sender, KeyRoutedEventArgs^ e)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (e->Key == ::VirtualKey::Enter)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        SubmitTextbox(sender);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					double GraphingCalculator::validateDouble(String^ value, double defaultValue)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    try
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return stod(value->Data());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    catch (...)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return defaultValue;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void GraphingCalculator::TextBoxGotFocus(TextBox^ sender, RoutedEventArgs^ e)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    sender->SelectAll();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "Views\GraphingCalculator\GraphingCalculator.g.h"
 | 
					#include "Views\GraphingCalculator\GraphingCalculator.g.h"
 | 
				
			||||||
#include "CalcViewModel/GraphingCalculator/GraphingCalculatorViewModel.h"
 | 
					#include "CalcViewModel\GraphingCalculator\GraphingCalculatorViewModel.h"
 | 
				
			||||||
#include "Views\NumberPad.xaml.h"
 | 
					#include "Views\NumberPad.xaml.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace CalculatorApp
 | 
					namespace CalculatorApp
 | 
				
			||||||
@@ -22,7 +22,17 @@ namespace CalculatorApp
 | 
				
			|||||||
    private:
 | 
					    private:
 | 
				
			||||||
        void GraphingCalculator_DataContextChanged(Windows::UI::Xaml::FrameworkElement^ sender, Windows::UI::Xaml::DataContextChangedEventArgs^ args);
 | 
					        void GraphingCalculator_DataContextChanged(Windows::UI::Xaml::FrameworkElement^ sender, Windows::UI::Xaml::DataContextChangedEventArgs^ args);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private:
 | 
					        void GraphVariablesUpdated(Platform::Object^ sender, Object^ args);
 | 
				
			||||||
 | 
					        void OnVariableChanged(Platform::Object^ sender, CalculatorApp::ViewModel::VariableChangedEventArgs args);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        void TextBoxLosingFocus(Windows::UI::Xaml::Controls::TextBox^ textbox, Windows::UI::Xaml::Input::LosingFocusEventArgs^ args);
 | 
				
			||||||
 | 
					        void TextBoxKeyDown(Windows::UI::Xaml::Controls::TextBox^ textbox, Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e);
 | 
				
			||||||
 | 
					        void SubmitTextbox(Windows::UI::Xaml::Controls::TextBox^ textbox);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        double validateDouble(Platform::String^ value, double defaultValue);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        CalculatorApp::ViewModel::GraphingCalculatorViewModel^ m_viewModel;
 | 
					        CalculatorApp::ViewModel::GraphingCalculatorViewModel^ m_viewModel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        void TextBoxGotFocus(Windows::UI::Xaml::Controls::TextBox^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,8 +26,12 @@ namespace
 | 
				
			|||||||
    constexpr auto s_propertyName_EquationTemplate = L"EquationTemplate";
 | 
					    constexpr auto s_propertyName_EquationTemplate = L"EquationTemplate";
 | 
				
			||||||
    constexpr auto s_propertyName_Equations = L"Equations";
 | 
					    constexpr auto s_propertyName_Equations = L"Equations";
 | 
				
			||||||
    constexpr auto s_propertyName_EquationsSource = L"EquationsSource";
 | 
					    constexpr auto s_propertyName_EquationsSource = L"EquationsSource";
 | 
				
			||||||
 | 
					    constexpr auto s_propertyName_Variables = L"Variables";
 | 
				
			||||||
    constexpr auto s_propertyName_ForceProportionalAxes = L"ForceProportionalAxes";
 | 
					    constexpr auto s_propertyName_ForceProportionalAxes = L"ForceProportionalAxes";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    constexpr auto s_X = L"x";
 | 
				
			||||||
 | 
					    constexpr auto s_Y = L"y";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Helper function for converting a pointer position to a position that the graphing engine will understand.
 | 
					    // Helper function for converting a pointer position to a position that the graphing engine will understand.
 | 
				
			||||||
    // posX/posY are the pointer position elements and width,height are the dimensions of the graph surface.
 | 
					    // posX/posY are the pointer position elements and width,height are the dimensions of the graph surface.
 | 
				
			||||||
    // The graphing engine interprets x,y position between the range [-1, 1].
 | 
					    // The graphing engine interprets x,y position between the range [-1, 1].
 | 
				
			||||||
@@ -43,6 +47,7 @@ namespace GraphControl
 | 
				
			|||||||
    DependencyProperty^ Grapher::s_equationTemplateProperty;
 | 
					    DependencyProperty^ Grapher::s_equationTemplateProperty;
 | 
				
			||||||
    DependencyProperty^ Grapher::s_equationsProperty;
 | 
					    DependencyProperty^ Grapher::s_equationsProperty;
 | 
				
			||||||
    DependencyProperty^ Grapher::s_equationsSourceProperty;
 | 
					    DependencyProperty^ Grapher::s_equationsSourceProperty;
 | 
				
			||||||
 | 
					    DependencyProperty^ Grapher::s_variablesProperty;
 | 
				
			||||||
    DependencyProperty^ Grapher::s_forceProportionalAxesTemplateProperty;
 | 
					    DependencyProperty^ Grapher::s_forceProportionalAxesTemplateProperty;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    Grapher::Grapher()
 | 
					    Grapher::Grapher()
 | 
				
			||||||
@@ -54,6 +59,7 @@ namespace GraphControl
 | 
				
			|||||||
        DefaultStyleKey = StringReference(s_defaultStyleKey);
 | 
					        DefaultStyleKey = StringReference(s_defaultStyleKey);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this->SetValue(EquationsProperty, ref new EquationCollection());
 | 
					        this->SetValue(EquationsProperty, ref new EquationCollection());
 | 
				
			||||||
 | 
					        this->SetValue(VariablesProperty, ref new Map<String^, double>());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this->Loaded += ref new RoutedEventHandler(this, &Grapher::OnLoaded);
 | 
					        this->Loaded += ref new RoutedEventHandler(this, &Grapher::OnLoaded);
 | 
				
			||||||
        this->Unloaded += ref new RoutedEventHandler(this, &Grapher::OnUnloaded);
 | 
					        this->Unloaded += ref new RoutedEventHandler(this, &Grapher::OnUnloaded);
 | 
				
			||||||
@@ -145,6 +151,17 @@ namespace GraphControl
 | 
				
			|||||||
                    ref new PropertyChangedCallback(&Grapher::OnCustomDependencyPropertyChanged)));
 | 
					                    ref new PropertyChangedCallback(&Grapher::OnCustomDependencyPropertyChanged)));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!s_variablesProperty)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            s_variablesProperty = DependencyProperty::Register(
 | 
				
			||||||
 | 
					                StringReference(s_propertyName_Variables),
 | 
				
			||||||
 | 
					                IObservableMap<String^, double>::typeid,
 | 
				
			||||||
 | 
					                Grapher::typeid,
 | 
				
			||||||
 | 
					                ref new PropertyMetadata(
 | 
				
			||||||
 | 
					                    nullptr,
 | 
				
			||||||
 | 
					                    ref new PropertyChangedCallback(&Grapher::OnCustomDependencyPropertyChanged)));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!s_forceProportionalAxesTemplateProperty)
 | 
					        if (!s_forceProportionalAxesTemplateProperty)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            s_forceProportionalAxesTemplateProperty = DependencyProperty::Register(
 | 
					            s_forceProportionalAxesTemplateProperty = DependencyProperty::Register(
 | 
				
			||||||
@@ -350,8 +367,11 @@ namespace GraphControl
 | 
				
			|||||||
                    if (m_graph->TryInitialize(graphExpression.get()))
 | 
					                    if (m_graph->TryInitialize(graphExpression.get()))
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        UpdateGraphOptions(m_graph->GetOptions(), validEqs);
 | 
					                        UpdateGraphOptions(m_graph->GetOptions(), validEqs);
 | 
				
			||||||
 | 
					                        SetGraphArgs();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        m_renderMain->Graph = m_graph;
 | 
					                        m_renderMain->Graph = m_graph;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        UpdateVariables();
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -360,13 +380,80 @@ namespace GraphControl
 | 
				
			|||||||
                if (m_graph->TryInitialize())
 | 
					                if (m_graph->TryInitialize())
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    UpdateGraphOptions(m_graph->GetOptions(), validEqs);
 | 
					                    UpdateGraphOptions(m_graph->GetOptions(), validEqs);
 | 
				
			||||||
 | 
					                    SetGraphArgs();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    m_renderMain->Graph = m_graph;
 | 
					                    m_renderMain->Graph = m_graph;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    UpdateVariables();
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void Grapher::SetGraphArgs()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (m_graph)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            for (auto variable : Variables)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                m_graph->SetArgValue(variable->Key->Data(), variable->Value);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void Grapher::UpdateVariables()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        auto updatedVariables = ref new Map<String^, double>();
 | 
				
			||||||
 | 
					        if (m_graph)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            auto graphVariables = m_graph->GetVariables();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for (auto graphVar : graphVariables)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (graphVar->GetVariableName() != s_X && graphVar->GetVariableName() != s_Y)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    auto key = ref new String(graphVar->GetVariableName().data());
 | 
				
			||||||
 | 
					                    double value = 1.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (Variables->HasKey(key))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        value = Variables->Lookup(key);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    updatedVariables->Insert(key, value);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Variables = updatedVariables;
 | 
				
			||||||
 | 
					        VariablesUpdated(this, Variables);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void Grapher::SetVariable(Platform::String^ variableName, double newValue)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (Variables->HasKey(variableName))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (Variables->Lookup(variableName) == newValue)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Variables->Remove(variableName);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Variables->Insert(variableName, newValue);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (m_graph)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            m_graph->SetArgValue(variableName->Data(), newValue);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (m_renderMain)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                m_renderMain->RunRenderPass();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void Grapher::UpdateGraphOptions(IGraphingOptions& options, const vector<Equation^>& validEqs)
 | 
					    void Grapher::UpdateGraphOptions(IGraphingOptions& options, const vector<Equation^>& validEqs)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        options.SetForceProportional(ForceProportionalAxes);
 | 
					        options.SetForceProportional(ForceProportionalAxes);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@
 | 
				
			|||||||
#include "Equation.h"
 | 
					#include "Equation.h"
 | 
				
			||||||
#include "EquationCollection.h"
 | 
					#include "EquationCollection.h"
 | 
				
			||||||
#include "IMathSolver.h"
 | 
					#include "IMathSolver.h"
 | 
				
			||||||
 | 
					#include "Common.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace GraphControl
 | 
					namespace GraphControl
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -78,6 +79,29 @@ namespace GraphControl
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        #pragma endregion
 | 
					        #pragma endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #pragma region Windows::Foundation::Collections::IObservableMap<Platform::String^, double>^ Variables DependencyProperty
 | 
				
			||||||
 | 
					        static property Windows::UI::Xaml::DependencyProperty^ VariablesProperty
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Windows::UI::Xaml::DependencyProperty^ get()
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return s_variablesProperty;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        property Windows::Foundation::Collections::IObservableMap<Platform::String^, double>^ Variables
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Windows::Foundation::Collections::IObservableMap<Platform::String^, double>^ get()
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return static_cast<Windows::Foundation::Collections::IObservableMap<Platform::String^, double>^>(GetValue(s_variablesProperty));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            void set(Windows::Foundation::Collections::IObservableMap<Platform::String^, double>^ value)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                SetValue(s_variablesProperty, value);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        #pragma endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #pragma region Windows::UI::Xaml::DataTemplate^ ForceProportionalAxes DependencyProperty
 | 
					        #pragma region Windows::UI::Xaml::DataTemplate^ ForceProportionalAxes DependencyProperty
 | 
				
			||||||
        static property Windows::UI::Xaml::DependencyProperty^ ForceProportionalAxesTemplateProperty
 | 
					        static property Windows::UI::Xaml::DependencyProperty^ ForceProportionalAxesTemplateProperty
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -100,6 +124,10 @@ namespace GraphControl
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        #pragma endregion
 | 
					        #pragma endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        event Windows::Foundation::EventHandler<Windows::Foundation::Collections::IMap<Platform::String^, double>^>^ VariablesUpdated;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        void SetVariable(Platform::String^ variableName, double newValue);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    protected:
 | 
					    protected:
 | 
				
			||||||
        #pragma region Control Overrides
 | 
					        #pragma region Control Overrides
 | 
				
			||||||
        void OnApplyTemplate() override;
 | 
					        void OnApplyTemplate() override;
 | 
				
			||||||
@@ -127,12 +155,14 @@ namespace GraphControl
 | 
				
			|||||||
        void OnDataSourceChanged(GraphControl::InspectingDataSource^ sender, GraphControl::DataSourceChangedEventArgs args);
 | 
					        void OnDataSourceChanged(GraphControl::InspectingDataSource^ sender, GraphControl::DataSourceChangedEventArgs args);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        void OnEquationsChanged(Windows::UI::Xaml::DependencyPropertyChangedEventArgs^ args);
 | 
					        void OnEquationsChanged(Windows::UI::Xaml::DependencyPropertyChangedEventArgs^ args);
 | 
				
			||||||
        void OnEquationsVectorChanged(Windows::Foundation::Collections::IObservableVector<GraphControl::Equation ^> ^sender, Windows::Foundation::Collections::IVectorChangedEventArgs ^event);
 | 
					        void OnEquationsVectorChanged(Windows::Foundation::Collections::IObservableVector<GraphControl::Equation ^> ^sender, Windows::Foundation::Collections::IVectorChangedEventArgs^ event);
 | 
				
			||||||
        void OnEquationChanged();
 | 
					        void OnEquationChanged();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        void UpdateGraph();
 | 
					        void UpdateGraph();
 | 
				
			||||||
        void UpdateGraphOptions(Graphing::IGraphingOptions& options, const std::vector<Equation^>& validEqs);
 | 
					        void UpdateGraphOptions(Graphing::IGraphingOptions& options, const std::vector<Equation^>& validEqs);
 | 
				
			||||||
        std::vector<Equation^> GetValidEquations();
 | 
					        std::vector<Equation^> GetValidEquations();
 | 
				
			||||||
 | 
					        void SetGraphArgs();
 | 
				
			||||||
 | 
					        void UpdateVariables();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        void OnForceProportionalAxesChanged(Windows::UI::Xaml::DependencyPropertyChangedEventArgs^ args);
 | 
					        void OnForceProportionalAxesChanged(Windows::UI::Xaml::DependencyPropertyChangedEventArgs^ args);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -154,6 +184,7 @@ namespace GraphControl
 | 
				
			|||||||
        Windows::Foundation::EventRegistrationToken m_tokenDataSourceChanged;
 | 
					        Windows::Foundation::EventRegistrationToken m_tokenDataSourceChanged;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        static Windows::UI::Xaml::DependencyProperty^ s_equationsProperty;
 | 
					        static Windows::UI::Xaml::DependencyProperty^ s_equationsProperty;
 | 
				
			||||||
 | 
					        static Windows::UI::Xaml::DependencyProperty^ s_variablesProperty;
 | 
				
			||||||
        Windows::Foundation::EventRegistrationToken m_tokenEquationsChanged;
 | 
					        Windows::Foundation::EventRegistrationToken m_tokenEquationsChanged;
 | 
				
			||||||
        Windows::Foundation::EventRegistrationToken m_tokenEquationChanged;
 | 
					        Windows::Foundation::EventRegistrationToken m_tokenEquationChanged;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <memory>
 | 
					#include <memory>
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef GRAPHINGAPI
 | 
					#ifndef GRAPHINGAPI
 | 
				
			||||||
#ifdef GRAPHING_ENGINE_IMPL
 | 
					#ifdef GRAPHING_ENGINE_IMPL
 | 
				
			||||||
@@ -38,6 +39,14 @@ namespace Graphing
 | 
				
			|||||||
        virtual bool IsEmptySet() const = 0;
 | 
					        virtual bool IsEmptySet() const = 0;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct IVariable
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        virtual ~IVariable() = default;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        virtual int GetVariableID() const = 0;
 | 
				
			||||||
 | 
					        virtual const std::wstring& GetVariableName() = 0;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    struct IExpressible
 | 
					    struct IExpressible
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        virtual ~IExpressible() = default;
 | 
					        virtual ~IExpressible() = default;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,6 +16,10 @@ namespace Graphing
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        virtual IGraphingOptions& GetOptions() = 0;
 | 
					        virtual IGraphingOptions& GetOptions() = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        virtual std::vector<std::shared_ptr<IVariable>> GetVariables() = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        virtual void SetArgValue(std::wstring variableName, double value) = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        virtual std::shared_ptr< Renderer::IGraphRenderer > GetRenderer() const = 0;
 | 
					        virtual std::shared_ptr< Renderer::IGraphRenderer > GetRenderer() const = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        virtual bool TryResetSelection() = 0;
 | 
					        virtual bool TryResetSelection() = 0;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user