in src/CalcViewModel/StandardCalculatorViewModel.cpp [896:1018]
ButtonInfo StandardCalculatorViewModel::MapCharacterToButtonId(char16 ch)
{
ButtonInfo result;
result.buttonId = NumbersAndOperatorsEnum::None;
result.canSendNegate = false;
switch (ch)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
result.buttonId = NumbersAndOperatorsEnum::Zero + static_cast<NumbersAndOperatorsEnum>(ch - L'0');
result.canSendNegate = true;
break;
case '*':
result.buttonId = NumbersAndOperatorsEnum::Multiply;
break;
case '+':
result.buttonId = NumbersAndOperatorsEnum::Add;
break;
case '-':
result.buttonId = NumbersAndOperatorsEnum::Subtract;
break;
case '/':
result.buttonId = NumbersAndOperatorsEnum::Divide;
break;
case '^':
if (IsScientific)
{
result.buttonId = NumbersAndOperatorsEnum::XPowerY;
}
break;
case '%':
if (IsScientific || IsProgrammer)
{
result.buttonId = NumbersAndOperatorsEnum::Mod;
}
break;
case '=':
result.buttonId = NumbersAndOperatorsEnum::Equals;
break;
case '(':
result.buttonId = NumbersAndOperatorsEnum::OpenParenthesis;
break;
case ')':
result.buttonId = NumbersAndOperatorsEnum::CloseParenthesis;
break;
case 'a':
case 'A':
result.buttonId = NumbersAndOperatorsEnum::A;
break;
case 'b':
case 'B':
result.buttonId = NumbersAndOperatorsEnum::B;
break;
case 'c':
case 'C':
result.buttonId = NumbersAndOperatorsEnum::C;
break;
case 'd':
case 'D':
result.buttonId = NumbersAndOperatorsEnum::D;
break;
case 'e':
case 'E':
// Only allow scientific notation in scientific mode
if (IsProgrammer)
{
result.buttonId = NumbersAndOperatorsEnum::E;
}
else
{
result.buttonId = NumbersAndOperatorsEnum::Exp;
}
break;
case 'f':
case 'F':
result.buttonId = NumbersAndOperatorsEnum::F;
break;
default:
// For the decimalSeparator, we need to respect the user setting.
if (ch == m_decimalSeparator)
{
result.buttonId = NumbersAndOperatorsEnum::Decimal;
}
break;
}
if (result.buttonId == NumbersAndOperatorsEnum::None)
{
if (LocalizationSettings::GetInstance()->IsLocalizedDigit(ch))
{
result.buttonId =
NumbersAndOperatorsEnum::Zero + static_cast<NumbersAndOperatorsEnum>(ch - LocalizationSettings::GetInstance()->GetDigitSymbolFromEnUsDigit('0'));
result.canSendNegate = true;
}
}
// Negate cannot be sent for leading zeroes
if (NumbersAndOperatorsEnum::Zero == result.buttonId)
{
result.canSendNegate = false;
}
return result;
}