ButtonInfo StandardCalculatorViewModel::MapCharacterToButtonId()

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;
}