From b83657e66fda914e6fd825e777ac2ad0c6f9b7a2 Mon Sep 17 00:00:00 2001 From: Rudy Huyn Date: Tue, 16 Apr 2019 18:09:04 -0700 Subject: [PATCH] take feedback into account and modify OverflowTextblock::OnApplyTemplate to make this control customizable by other developers --- .../StandardCalculatorViewModel.cpp | 48 +++++++++---------- src/Calculator/Controls/OverflowTextBlock.cpp | 44 ++++++++++++----- src/Calculator/Controls/OverflowTextBlock.h | 3 +- src/Calculator/Views/Calculator.xaml | 6 +-- 4 files changed, 62 insertions(+), 39 deletions(-) diff --git a/src/CalcViewModel/StandardCalculatorViewModel.cpp b/src/CalcViewModel/StandardCalculatorViewModel.cpp index 48ed3a9b..7f0295d8 100644 --- a/src/CalcViewModel/StandardCalculatorViewModel.cpp +++ b/src/CalcViewModel/StandardCalculatorViewModel.cpp @@ -67,6 +67,7 @@ StandardCalculatorViewModel::StandardCalculatorViewModel() : m_BinaryDisplayValue(L"0"), m_OctalDisplayValue(L"0"), m_standardCalculatorManager(&m_calculatorDisplay, &m_resourceProvider), + m_ExpressionTokens(ref new Vector()), m_MemorizedNumbers(ref new Vector()), m_IsMemoryEmpty(true), m_IsFToEChecked(false), @@ -129,7 +130,6 @@ StandardCalculatorViewModel::StandardCalculatorViewModel() : AreHistoryShortcutsEnabled = true; AreProgrammerRadixOperatorsEnabled = false; - m_ExpressionTokens = ref new Vector(); m_tokenPosition = -1; m_isLastOperationHistoryLoad = false; } @@ -1431,29 +1431,29 @@ void StandardCalculatorViewModel::SaveEditedCommand(_In_ unsigned int tokenPosit switch (nOpCode) { - case static_cast(Command::CommandASIN) : - updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast(Command::CommandSIN), true, angleType); - break; - case static_cast(Command::CommandACOS) : - updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast(Command::CommandCOS), true, angleType); - break; - case static_cast(Command::CommandATAN) : - updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast(Command::CommandTAN), true, angleType); - break; - case static_cast(Command::CommandASINH) : - updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast(Command::CommandSINH), true, angleType); - break; - case static_cast(Command::CommandACOSH) : - updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast(Command::CommandCOSH), true, angleType); - break; - case static_cast(Command::CommandATANH) : - updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast(Command::CommandTANH), true, angleType); - break; - case static_cast(Command::CommandPOWE) : - updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast(Command::CommandLN), true, angleType); - break; - default: - updatedToken = CCalcEngine::OpCodeToUnaryString(nOpCode, false, angleType); + case static_cast(Command::CommandASIN) : + updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast(Command::CommandSIN), true, angleType); + break; + case static_cast(Command::CommandACOS) : + updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast(Command::CommandCOS), true, angleType); + break; + case static_cast(Command::CommandATAN) : + updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast(Command::CommandTAN), true, angleType); + break; + case static_cast(Command::CommandASINH) : + updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast(Command::CommandSINH), true, angleType); + break; + case static_cast(Command::CommandACOSH) : + updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast(Command::CommandCOSH), true, angleType); + break; + case static_cast(Command::CommandATANH) : + updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast(Command::CommandTANH), true, angleType); + break; + case static_cast(Command::CommandPOWE) : + updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast(Command::CommandLN), true, angleType); + break; + default: + updatedToken = CCalcEngine::OpCodeToUnaryString(nOpCode, false, angleType); } if ((token.first.length() > 0) && (token.first[token.first.length() - 1] == L'(')) { diff --git a/src/Calculator/Controls/OverflowTextBlock.cpp b/src/Calculator/Controls/OverflowTextBlock.cpp index 26ee70f0..c946d79b 100644 --- a/src/Calculator/Controls/OverflowTextBlock.cpp +++ b/src/Calculator/Controls/OverflowTextBlock.cpp @@ -30,21 +30,39 @@ DEPENDENCY_PROPERTY_INITIALIZATION(OverflowTextBlock, TokensUpdated); void OverflowTextBlock::OnApplyTemplate() { - assert(((m_scrollLeft == nullptr) && (m_scrollRight == nullptr)) || ((m_scrollLeft != nullptr) && (m_scrollRight != nullptr))); + UnregisterEventHandlers(); - m_expressionContainer = safe_cast(GetTemplateChild("expressionContainer")); - m_expressionContainer->ChangeView(m_expressionContainer->ExtentWidth - m_expressionContainer->ViewportWidth, nullptr, nullptr); - m_expressionContainer->ViewChanged += ref new Windows::Foundation::EventHandler(this, &CalculatorApp::Controls::OverflowTextBlock::OnViewChanged); - m_scrollLeft = safe_cast(GetTemplateChild("scrollLeft")); - m_scrollRight = safe_cast(GetTemplateChild("scrollRight")); + auto uiElement = GetTemplateChild("expressionContainer"); + if (uiElement != nullptr) + { + m_expressionContainer = safe_cast(uiElement); + m_expressionContainer->ChangeView(m_expressionContainer->ExtentWidth - m_expressionContainer->ViewportWidth, nullptr, nullptr); + m_containerViewChangedToken = m_expressionContainer->ViewChanged += ref new EventHandler(this, &OverflowTextBlock::OnViewChanged); + } - m_scrollLeftClickEventToken = m_scrollLeft->Click += ref new RoutedEventHandler(this, &OverflowTextBlock::OnScrollClick); - m_scrollRightClickEventToken = m_scrollRight->Click += ref new RoutedEventHandler(this, &OverflowTextBlock::OnScrollClick); + uiElement = GetTemplateChild("scrollLeft"); + if (uiElement != nullptr) + { + m_scrollLeft = safe_cast(uiElement); + m_scrollLeftClickEventToken = m_scrollLeft->Click += ref new RoutedEventHandler(this, &OverflowTextBlock::OnScrollClick); + } + + uiElement = GetTemplateChild("scrollRight"); + if (uiElement != nullptr) + { + m_scrollRight = safe_cast(GetTemplateChild("scrollRight")); + m_scrollRightClickEventToken = m_scrollRight->Click += ref new RoutedEventHandler(this, &OverflowTextBlock::OnScrollClick); + } m_scrollingLeft = false; m_scrollingRight = false; - m_itemsControl = safe_cast(GetTemplateChild("TokenList")); + uiElement = GetTemplateChild("TokenList"); + if (uiElement != nullptr) + { + m_itemsControl = safe_cast(uiElement); + } + UpdateAllState(); } @@ -189,10 +207,14 @@ void OverflowTextBlock::UnregisterEventHandlers() { m_scrollRight->Click -= m_scrollRightClickEventToken; } + + if (m_expressionContainer != nullptr) + { + m_expressionContainer->ViewChanged -= m_containerViewChangedToken; + } } - -void CalculatorApp::Controls::OverflowTextBlock::OnViewChanged(Platform::Object ^sender, Windows::UI::Xaml::Controls::ScrollViewerViewChangedEventArgs ^args) +void OverflowTextBlock::OnViewChanged(_In_opt_ Object^ /*sender*/, _In_opt_ ScrollViewerViewChangedEventArgs^ /*args*/) { UpdateScrollButtons(); } diff --git a/src/Calculator/Controls/OverflowTextBlock.h b/src/Calculator/Controls/OverflowTextBlock.h index d155475a..d4102091 100644 --- a/src/Calculator/Controls/OverflowTextBlock.h +++ b/src/Calculator/Controls/OverflowTextBlock.h @@ -34,6 +34,7 @@ namespace CalculatorApp void OnPointerExited(_In_ Platform::Object^ sender, _In_ Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e); void ShowHideScrollButtons(Windows::UI::Xaml::Visibility vLeft, Windows::UI::Xaml::Visibility vRight); void OnTokensUpdatedPropertyChanged(bool oldValue, bool newValue); + void OnViewChanged(_In_opt_ Platform::Object ^sender, _In_opt_ Windows::UI::Xaml::Controls::ScrollViewerViewChangedEventArgs ^args); void UpdateVisualState(); void UpdateExpressionState(); @@ -52,7 +53,7 @@ namespace CalculatorApp Windows::Foundation::EventRegistrationToken m_scrollLeftClickEventToken; Windows::Foundation::EventRegistrationToken m_scrollRightClickEventToken; - void OnViewChanged(Platform::Object ^sender, Windows::UI::Xaml::Controls::ScrollViewerViewChangedEventArgs ^args); + Windows::Foundation::EventRegistrationToken m_containerViewChangedToken; }; } } diff --git a/src/Calculator/Views/Calculator.xaml b/src/Calculator/Views/Calculator.xaml index 65916c3b..29b44558 100644 --- a/src/Calculator/Views/Calculator.xaml +++ b/src/Calculator/Views/Calculator.xaml @@ -18,20 +18,20 @@ + Text="{x:Bind Token, Mode=OneWay}"/> + Text="{x:Bind Token, Mode=OneWay}"/> + Text="{x:Bind Token, Mode=OneWay}"/>