take feedback into account and modify OverflowTextblock::OnApplyTemplate to make this control customizable by other developers

This commit is contained in:
Rudy Huyn 2019-04-16 18:09:04 -07:00
commit b83657e66f
4 changed files with 62 additions and 39 deletions

View file

@ -67,6 +67,7 @@ StandardCalculatorViewModel::StandardCalculatorViewModel() :
m_BinaryDisplayValue(L"0"), m_BinaryDisplayValue(L"0"),
m_OctalDisplayValue(L"0"), m_OctalDisplayValue(L"0"),
m_standardCalculatorManager(&m_calculatorDisplay, &m_resourceProvider), m_standardCalculatorManager(&m_calculatorDisplay, &m_resourceProvider),
m_ExpressionTokens(ref new Vector<DisplayExpressionToken^>()),
m_MemorizedNumbers(ref new Vector<MemoryItemViewModel^>()), m_MemorizedNumbers(ref new Vector<MemoryItemViewModel^>()),
m_IsMemoryEmpty(true), m_IsMemoryEmpty(true),
m_IsFToEChecked(false), m_IsFToEChecked(false),
@ -129,7 +130,6 @@ StandardCalculatorViewModel::StandardCalculatorViewModel() :
AreHistoryShortcutsEnabled = true; AreHistoryShortcutsEnabled = true;
AreProgrammerRadixOperatorsEnabled = false; AreProgrammerRadixOperatorsEnabled = false;
m_ExpressionTokens = ref new Vector<DisplayExpressionToken^>();
m_tokenPosition = -1; m_tokenPosition = -1;
m_isLastOperationHistoryLoad = false; m_isLastOperationHistoryLoad = false;
} }
@ -1431,29 +1431,29 @@ void StandardCalculatorViewModel::SaveEditedCommand(_In_ unsigned int tokenPosit
switch (nOpCode) switch (nOpCode)
{ {
case static_cast<int>(Command::CommandASIN) : case static_cast<int>(Command::CommandASIN) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSIN), true, angleType); updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSIN), true, angleType);
break; break;
case static_cast<int>(Command::CommandACOS) : case static_cast<int>(Command::CommandACOS) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOS), true, angleType); updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOS), true, angleType);
break; break;
case static_cast<int>(Command::CommandATAN) : case static_cast<int>(Command::CommandATAN) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTAN), true, angleType); updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTAN), true, angleType);
break; break;
case static_cast<int>(Command::CommandASINH) : case static_cast<int>(Command::CommandASINH) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSINH), true, angleType); updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandSINH), true, angleType);
break; break;
case static_cast<int>(Command::CommandACOSH) : case static_cast<int>(Command::CommandACOSH) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOSH), true, angleType); updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandCOSH), true, angleType);
break; break;
case static_cast<int>(Command::CommandATANH) : case static_cast<int>(Command::CommandATANH) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTANH), true, angleType); updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandTANH), true, angleType);
break; break;
case static_cast<int>(Command::CommandPOWE) : case static_cast<int>(Command::CommandPOWE) :
updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandLN), true, angleType); updatedToken = CCalcEngine::OpCodeToUnaryString(static_cast<int>(Command::CommandLN), true, angleType);
break; break;
default: default:
updatedToken = CCalcEngine::OpCodeToUnaryString(nOpCode, false, angleType); updatedToken = CCalcEngine::OpCodeToUnaryString(nOpCode, false, angleType);
} }
if ((token.first.length() > 0) && (token.first[token.first.length() - 1] == L'(')) if ((token.first.length() > 0) && (token.first[token.first.length() - 1] == L'('))
{ {

View file

@ -30,21 +30,39 @@ DEPENDENCY_PROPERTY_INITIALIZATION(OverflowTextBlock, TokensUpdated);
void OverflowTextBlock::OnApplyTemplate() void OverflowTextBlock::OnApplyTemplate()
{ {
assert(((m_scrollLeft == nullptr) && (m_scrollRight == nullptr)) || ((m_scrollLeft != nullptr) && (m_scrollRight != nullptr))); UnregisterEventHandlers();
m_expressionContainer = safe_cast<ScrollViewer^>(GetTemplateChild("expressionContainer")); auto uiElement = GetTemplateChild("expressionContainer");
m_expressionContainer->ChangeView(m_expressionContainer->ExtentWidth - m_expressionContainer->ViewportWidth, nullptr, nullptr); if (uiElement != nullptr)
m_expressionContainer->ViewChanged += ref new Windows::Foundation::EventHandler<Windows::UI::Xaml::Controls::ScrollViewerViewChangedEventArgs ^>(this, &CalculatorApp::Controls::OverflowTextBlock::OnViewChanged); {
m_scrollLeft = safe_cast<Button^>(GetTemplateChild("scrollLeft")); m_expressionContainer = safe_cast<ScrollViewer^>(uiElement);
m_scrollRight = safe_cast<Button^>(GetTemplateChild("scrollRight")); m_expressionContainer->ChangeView(m_expressionContainer->ExtentWidth - m_expressionContainer->ViewportWidth, nullptr, nullptr);
m_containerViewChangedToken = m_expressionContainer->ViewChanged += ref new EventHandler<ScrollViewerViewChangedEventArgs ^>(this, &OverflowTextBlock::OnViewChanged);
}
m_scrollLeftClickEventToken = m_scrollLeft->Click += ref new RoutedEventHandler(this, &OverflowTextBlock::OnScrollClick); uiElement = GetTemplateChild("scrollLeft");
m_scrollRightClickEventToken = m_scrollRight->Click += ref new RoutedEventHandler(this, &OverflowTextBlock::OnScrollClick); if (uiElement != nullptr)
{
m_scrollLeft = safe_cast<Button^>(uiElement);
m_scrollLeftClickEventToken = m_scrollLeft->Click += ref new RoutedEventHandler(this, &OverflowTextBlock::OnScrollClick);
}
uiElement = GetTemplateChild("scrollRight");
if (uiElement != nullptr)
{
m_scrollRight = safe_cast<Button^>(GetTemplateChild("scrollRight"));
m_scrollRightClickEventToken = m_scrollRight->Click += ref new RoutedEventHandler(this, &OverflowTextBlock::OnScrollClick);
}
m_scrollingLeft = false; m_scrollingLeft = false;
m_scrollingRight = false; m_scrollingRight = false;
m_itemsControl = safe_cast<ItemsControl^>(GetTemplateChild("TokenList")); uiElement = GetTemplateChild("TokenList");
if (uiElement != nullptr)
{
m_itemsControl = safe_cast<ItemsControl^>(uiElement);
}
UpdateAllState(); UpdateAllState();
} }
@ -189,10 +207,14 @@ void OverflowTextBlock::UnregisterEventHandlers()
{ {
m_scrollRight->Click -= m_scrollRightClickEventToken; m_scrollRight->Click -= m_scrollRightClickEventToken;
} }
if (m_expressionContainer != nullptr)
{
m_expressionContainer->ViewChanged -= m_containerViewChangedToken;
}
} }
void OverflowTextBlock::OnViewChanged(_In_opt_ Object^ /*sender*/, _In_opt_ ScrollViewerViewChangedEventArgs^ /*args*/)
void CalculatorApp::Controls::OverflowTextBlock::OnViewChanged(Platform::Object ^sender, Windows::UI::Xaml::Controls::ScrollViewerViewChangedEventArgs ^args)
{ {
UpdateScrollButtons(); UpdateScrollButtons();
} }

View file

@ -34,6 +34,7 @@ namespace CalculatorApp
void OnPointerExited(_In_ Platform::Object^ sender, _In_ Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e); 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 ShowHideScrollButtons(Windows::UI::Xaml::Visibility vLeft, Windows::UI::Xaml::Visibility vRight);
void OnTokensUpdatedPropertyChanged(bool oldValue, bool newValue); void OnTokensUpdatedPropertyChanged(bool oldValue, bool newValue);
void OnViewChanged(_In_opt_ Platform::Object ^sender, _In_opt_ Windows::UI::Xaml::Controls::ScrollViewerViewChangedEventArgs ^args);
void UpdateVisualState(); void UpdateVisualState();
void UpdateExpressionState(); void UpdateExpressionState();
@ -52,7 +53,7 @@ namespace CalculatorApp
Windows::Foundation::EventRegistrationToken m_scrollLeftClickEventToken; Windows::Foundation::EventRegistrationToken m_scrollLeftClickEventToken;
Windows::Foundation::EventRegistrationToken m_scrollRightClickEventToken; Windows::Foundation::EventRegistrationToken m_scrollRightClickEventToken;
void OnViewChanged(Platform::Object ^sender, Windows::UI::Xaml::Controls::ScrollViewerViewChangedEventArgs ^args); Windows::Foundation::EventRegistrationToken m_containerViewChangedToken;
}; };
} }
} }

View file

@ -18,20 +18,20 @@
<TextBlock Margin="2,0,0,0" <TextBlock Margin="2,0,0,0"
Foreground="{ThemeResource SystemControlPageTextBaseMediumBrush}" Foreground="{ThemeResource SystemControlPageTextBaseMediumBrush}"
IsTextScaleFactorEnabled="False" IsTextScaleFactorEnabled="False"
Text="{x:Bind Token}"/> Text="{x:Bind Token, Mode=OneWay}"/>
</DataTemplate> </DataTemplate>
<DataTemplate x:Key="Operator" x:DataType="common:DisplayExpressionToken"> <DataTemplate x:Key="Operator" x:DataType="common:DisplayExpressionToken">
<TextBlock Margin="2,0,0,0" <TextBlock Margin="2,0,0,0"
Foreground="{ThemeResource SystemControlPageTextBaseMediumBrush}" Foreground="{ThemeResource SystemControlPageTextBaseMediumBrush}"
IsTextScaleFactorEnabled="False" IsTextScaleFactorEnabled="False"
Text="{x:Bind Token}"/> Text="{x:Bind Token, Mode=OneWay}"/>
</DataTemplate> </DataTemplate>
<DataTemplate x:Key="Separator" x:DataType="common:DisplayExpressionToken"> <DataTemplate x:Key="Separator" x:DataType="common:DisplayExpressionToken">
<TextBlock x:Name="MainText" <TextBlock x:Name="MainText"
IsTextScaleFactorEnabled="False" IsTextScaleFactorEnabled="False"
Text="{x:Bind Token}"/> Text="{x:Bind Token, Mode=OneWay}"/>
</DataTemplate> </DataTemplate>
<!-- TextBox Styles --> <!-- TextBox Styles -->