diff --git a/src/Calculator/App.xaml b/src/Calculator/App.xaml index 0398438..c550cfe 100644 --- a/src/Calculator/App.xaml +++ b/src/Calculator/App.xaml @@ -1816,8 +1816,8 @@ Grid.RowSpan="1" Grid.Column="0" Grid.ColumnSpan="4" - MinWidth="{ThemeResource TextControlThemeMinWidth}" - MinHeight="{ThemeResource TextControlThemeMinHeight}" + MinWidth="32" + MinHeight="16" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" @@ -1899,7 +1899,6 @@ - @@ -2212,16 +2211,6 @@ - - diff --git a/src/Calculator/Controls/EquationTextBox.cpp b/src/Calculator/Controls/EquationTextBox.cpp index 2663c76..57f5a13 100644 --- a/src/Calculator/Controls/EquationTextBox.cpp +++ b/src/Calculator/Controls/EquationTextBox.cpp @@ -176,7 +176,6 @@ void EquationTextBox::OnLostFocus(RoutedEventArgs ^ e) return; } - EquationSubmitted(this, m_sourceSubmission); if (m_functionButton && m_richEditBox->MathText != L"") { m_functionButton->IsEnabled = true; @@ -218,6 +217,8 @@ void EquationTextBox::OnRichEditBoxLostFocus(Object ^ sender, RoutedEventArgs ^ UpdateCommonVisualState(); UpdateButtonsVisualState(); + + EquationSubmitted(this, m_sourceSubmission); } void EquationTextBox::OnDeleteButtonClicked(Object ^ sender, RoutedEventArgs ^ e) diff --git a/src/Calculator/Resources/en-US/Resources.resw b/src/Calculator/Resources/en-US/Resources.resw index 8e6414d..9955cc3 100644 --- a/src/Calculator/Resources/en-US/Resources.resw +++ b/src/Calculator/Resources/en-US/Resources.resw @@ -4182,14 +4182,6 @@ Start tracing This is the tooltip/automation name for the graphing calculator start tracing button - - Variables - This is the tooltip for the Calculator variables button. - - - Variables - This is the automation name for the Calculator variables button. - Configure slider This is the tooltip text for the slider options button in Graphing Calculator diff --git a/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml b/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml index f98a095..7c729a9 100644 --- a/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml +++ b/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml @@ -2,67 +2,278 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="using:CalculatorApp.Controls" + xmlns:converters="using:CalculatorApp.Converters" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="using:CalculatorApp" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:mux="using:Microsoft.UI.Xaml.Controls" xmlns:vm="using:CalculatorApp.ViewModel" d:DesignHeight="300" d:DesignWidth="400" mc:Ignorable="d"> + + + - - + + + + - - - - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - diff --git a/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml.cpp b/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml.cpp index 6b960c0..d39b466 100644 --- a/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml.cpp +++ b/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml.cpp @@ -74,8 +74,8 @@ void EquationInputArea::AddNewEquation() eq->LineColor = AvailableColors->GetAt(m_lastLineColorIndex); eq->IsLineEnabled = true; eq->FunctionLabelIndex = ++m_lastFunctionLabelIndex; - Equations->Append(eq); m_equationToFocus = eq; + Equations->Append(eq); } void EquationInputArea::InputTextBox_GotFocus(Object ^ sender, RoutedEventArgs ^ e) @@ -113,41 +113,52 @@ void EquationInputArea::InputTextBox_Submitted(Object ^ sender, EquationSubmissi if (source == EquationSubmissionSource::ENTER_KEY || eq->Expression != nullptr && eq->Expression->Length() > 0) { unsigned int index = 0; - if (Equations->IndexOf(eq, &index) && index == Equations->Size - 1) + if (Equations->IndexOf(eq, &index)) { - // If it's the last equation of the list - AddNewEquation(); - } - else - { - auto nextEquation = Equations->GetAt(index + 1); - FocusEquationTextBox(nextEquation); + if (index == Equations->Size - 1) + { + // If it's the last equation of the list + AddNewEquation(); + } + else + { + auto nextEquation = Equations->GetAt(index + 1); + FocusEquationTextBox(nextEquation); + } } } } void EquationInputArea::FocusEquationTextBox(EquationViewModel ^ equation) { - auto nextContainer = EquationInputList->ContainerFromItem(equation); - if (nextContainer == nullptr) + unsigned int index; + if (!Equations->IndexOf(equation, &index) || index < 0) { return; } - auto listviewItem = dynamic_cast(nextContainer); - if (listviewItem == nullptr) + auto container = EquationInputList->TryGetElement(index); + if (container == nullptr) { return; } - auto equationInput = VisualTree::FindDescendantByName(nextContainer, "EquationInputButton"); - if (equationInput == nullptr) - { - return; - } - auto equationTextBox = dynamic_cast(equationInput); + auto equationTextBox = dynamic_cast(container); if (equationTextBox != nullptr) { equationTextBox->FocusTextBox(); } + else + { + auto equationInput = VisualTree::FindDescendantByName(container, "EquationInputButton"); + if (equationInput == nullptr) + { + return; + } + equationTextBox = dynamic_cast(equationInput); + if (equationTextBox != nullptr) + { + equationTextBox->FocusTextBox(); + } + } } void EquationInputArea::EquationTextBox_RemoveButtonClicked(Object ^ sender, RoutedEventArgs ^ e) @@ -182,7 +193,6 @@ void EquationInputArea::EquationTextBox_KeyGraphFeaturesButtonClicked(Object ^ s auto eq = static_cast(tb->DataContext); EquationVM = eq; - KeyGraphFeaturesRequested(EquationVM, ref new RoutedEventArgs()); } @@ -193,17 +203,59 @@ void EquationInputArea::EquationTextBox_EquationButtonClicked(Object ^ sender, R eq->IsLineEnabled = !eq->IsLineEnabled; } -void EquationInputArea::EquationTextBoxLoaded(Object ^ sender, RoutedEventArgs ^ e) +void EquationInputArea::InputTextBox_Loaded(Object ^ sender, RoutedEventArgs ^ e) { auto tb = static_cast(sender); auto colorChooser = static_cast(tb->ColorChooserFlyout->Content); colorChooser->AvailableColors = AvailableColors; - if (tb->DataContext == m_equationToFocus) + if (m_equationToFocus!=nullptr && tb->DataContext == m_equationToFocus) { m_equationToFocus = nullptr; tb->FocusTextBox(); + + unsigned int index; + if (Equations->IndexOf(m_equationToFocus, &index)) + { + auto container = EquationInputList->TryGetElement(index); + if (container != nullptr) + { + container->StartBringIntoView(); + } + } + } +} + +void EquationInputArea::InputTextBox_DataContextChanged( + Windows::UI::Xaml::FrameworkElement ^ sender, + Windows::UI::Xaml::DataContextChangedEventArgs ^ args) +{ + auto tb = static_cast(sender); + if (!tb->IsLoaded) + { + return; + } + + FocusEquationIfNecessary(tb); +} + +void EquationInputArea::FocusEquationIfNecessary(CalculatorApp::Controls::EquationTextBox ^ textBox) +{ + if (m_equationToFocus != nullptr && textBox->DataContext == m_equationToFocus) + { + m_equationToFocus = nullptr; + textBox->FocusTextBox(); + + unsigned int index; + if (Equations->IndexOf(m_equationToFocus, &index)) + { + auto container = EquationInputList->TryGetElement(index); + if (container != nullptr) + { + container->StartBringIntoView(); + } + } } } @@ -258,3 +310,60 @@ void EquationInputArea::ReloadAvailableColors(bool isHighContrast) equationViewModel->LineColor = AvailableColors->GetAt(m_lastLineColorIndex); } } + +void EquationInputArea::TextBoxGotFocus(TextBox ^ sender, RoutedEventArgs ^ e) +{ + sender->SelectAll(); +} + +void EquationInputArea::SubmitTextbox(TextBox ^ sender) +{ + auto variableViewModel = static_cast(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->Max = validateDouble(sender->Text, variableViewModel->Max); + } + else if (sender->Name == "StepTextBox") + { + variableViewModel->Step = validateDouble(sender->Text, variableViewModel->Step); + } +} + +void EquationInputArea::TextBoxLosingFocus(TextBox ^ sender, LosingFocusEventArgs ^) +{ + SubmitTextbox(sender); +} + +void EquationInputArea::TextBoxKeyDown(TextBox ^ sender, KeyRoutedEventArgs ^ e) +{ + if (e->Key == ::VirtualKey::Enter) + { + SubmitTextbox(sender); + } +} + +double EquationInputArea::validateDouble(String ^ value, double defaultValue) +{ + try + { + return stod(value->Data()); + } + catch (...) + { + return defaultValue; + } +} + +::Visibility EquationInputArea::ManageEditVariablesButtonVisibility(unsigned int numberOfVariables) +{ + return numberOfVariables == 0 ? ::Visibility::Collapsed : ::Visibility::Visible; +} diff --git a/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml.h b/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml.h index 17a5f58..50e4863 100644 --- a/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml.h +++ b/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml.h @@ -6,6 +6,7 @@ #include "Views/GraphingCalculator/EquationInputArea.g.h" #include "CalcViewModel/Common/Utils.h" #include "CalcViewModel/GraphingCalculator/EquationViewModel.h" +#include "CalcViewModel/GraphingCalculator/GraphingCalculatorViewModel.h" #include "EquationStylePanelControl.xaml.h" #include "CalcViewModel/Common/KeyboardShortcutManager.h" #include "Controls/EquationTextBox.h" @@ -20,29 +21,41 @@ namespace CalculatorApp EquationInputArea(); OBSERVABLE_OBJECT_CALLBACK(OnPropertyChanged); - OBSERVABLE_PROPERTY_RW(Windows::Foundation::Collections::IObservableVector< ViewModel::EquationViewModel^ >^, Equations); + OBSERVABLE_PROPERTY_RW(Windows::Foundation::Collections::IObservableVector ^, Equations); + OBSERVABLE_PROPERTY_RW(Windows::Foundation::Collections::IObservableVector ^, Variables); OBSERVABLE_PROPERTY_RW_ALWAYS_NOTIFY(ViewModel::EquationViewModel ^, EquationVM); OBSERVABLE_PROPERTY_RW(Windows::Foundation::Collections::IObservableVector ^, AvailableColors); event Windows::UI::Xaml::RoutedEventHandler ^ KeyGraphFeaturesRequested; + public: + static Windows::UI::Xaml::Visibility ManageEditVariablesButtonVisibility(unsigned int numberOfVariables); + private: void OnPropertyChanged(Platform::String^ propertyName); void OnEquationsPropertyChanged(); void AddNewEquation(); - void InputTextBox_GotFocus(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e); - void InputTextBox_LostFocus(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e); + void InputTextBox_GotFocus(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs^ e); + void InputTextBox_LostFocus(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs^ e); void InputTextBox_Submitted(Platform::Object ^ sender, CalculatorApp::Controls::EquationSubmissionSource e); void OnHighContrastChanged(Windows::UI::ViewManagement::AccessibilitySettings ^ sender, Platform::Object ^ args); void ReloadAvailableColors(bool isHighContrast); void FocusEquationTextBox(ViewModel::EquationViewModel ^ equation); - void EquationTextBox_RemoveButtonClicked(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e); + void EquationTextBox_RemoveButtonClicked(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs^ e); void EquationTextBox_KeyGraphFeaturesButtonClicked(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e); void EquationTextBox_EquationButtonClicked(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e); - void EquationTextBoxLoaded(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e); + void InputTextBox_Loaded(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e); + void InputTextBox_DataContextChanged(Windows::UI::Xaml::FrameworkElement ^ sender, Windows::UI::Xaml::DataContextChangedEventArgs ^ args); + void FocusEquationIfNecessary(_In_ CalculatorApp::Controls::EquationTextBox ^ textBox); + + double validateDouble(Platform::String ^ value, double defaultValue); + void TextBoxGotFocus(Windows::UI::Xaml::Controls::TextBox ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e); + 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); private: Windows::UI::ViewManagement::AccessibilitySettings ^ m_accessibilitySettings; diff --git a/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml b/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml index e41b8c6..dd2aaae 100644 --- a/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml +++ b/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml @@ -14,7 +14,6 @@ - - @@ -278,7 +276,9 @@ - + @@ -368,180 +368,8 @@ VerticalAlignment="Top" Style="{ThemeResource GraphControlCommandPanel}" RequestedTheme="Light"> - - - - - + - + @@ -661,6 +489,7 @@ Margin="0,4,0,0" Equations="{x:Bind ViewModel.Equations}" KeyGraphFeaturesRequested="OnEquationKeyGraphFeaturesRequested" + Variables="{x:Bind ViewModel.Variables}" Visibility="{x:Bind IsKeyGraphFeaturesVisible, Converter={StaticResource BooleanToVisibilityNegationConverter}, Mode=OneWay}"/> SetVariable(args.variableName, args.newValue); } -void GraphingCalculator::SubmitTextbox(TextBox ^ sender) -{ - auto variableViewModel = static_cast(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->Max = validateDouble(sender->Text, variableViewModel->Max); - } - else if (sender->Name == "StepTextBox") - { - variableViewModel->Step = validateDouble(sender->Text, variableViewModel->Step); - } -} - -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(); -} - void GraphingCalculator::OnZoomInCommand(Object ^ /* parameter */) { GraphingControl->ZoomFromCenter(zoomInScale); diff --git a/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.h b/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.h index 39993f6..cdf5564 100644 --- a/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.h +++ b/src/Calculator/Views/GraphingCalculator/GraphingCalculator.xaml.h @@ -45,10 +45,6 @@ public ref class GraphingCalculator sealed : public Windows::UI::Xaml::Data::INo Windows::Foundation::Collections::IObservableVector ^ sender, Windows::Foundation::Collections::IVectorChangedEventArgs ^ event); - 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); - void OnZoomInCommand(Object ^ parameter); void OnZoomOutCommand(Object ^ parameter); void OnZoomResetCommand(Object ^ parameter);