Move variables to the right column (#859)

* move variable editor

* support high contrast and tab navigation

* Remove obsolete resources

* take feedback into account

* Fix focus when virtualization recycle a EquationTextBox

* formatting
This commit is contained in:
Rudy Huyn
2019-12-12 14:52:36 -08:00
committed by Pepe Rivera
parent 2a0637e51c
commit da38b5a015
9 changed files with 423 additions and 335 deletions

View File

@@ -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<ListViewItem ^>(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<EquationTextBox ^>(equationInput);
auto equationTextBox = dynamic_cast<EquationTextBox ^>(container);
if (equationTextBox != nullptr)
{
equationTextBox->FocusTextBox();
}
else
{
auto equationInput = VisualTree::FindDescendantByName(container, "EquationInputButton");
if (equationInput == nullptr)
{
return;
}
equationTextBox = dynamic_cast<EquationTextBox ^>(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<EquationViewModel ^>(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<EquationTextBox ^>(sender);
auto colorChooser = static_cast<EquationStylePanelControl ^>(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<EquationTextBox ^>(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<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->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;
}