mirror of
https://github.com/Microsoft/calculator.git
synced 2025-07-16 02:02:51 -07:00
Modify the declaration of some properties of StandardCalculatorViewModel to make them read-only and use macros (#799)
This commit is contained in:
parent
1380c7ed83
commit
86307f206f
3 changed files with 91 additions and 173 deletions
|
@ -78,7 +78,7 @@ StandardCalculatorViewModel::StandardCalculatorViewModel()
|
||||||
, m_IsShiftProgrammerChecked(false)
|
, m_IsShiftProgrammerChecked(false)
|
||||||
, m_valueBitLength(BitLength::BitLengthQWord)
|
, m_valueBitLength(BitLength::BitLengthQWord)
|
||||||
, m_isBitFlipChecked(false)
|
, m_isBitFlipChecked(false)
|
||||||
, m_isBinaryBitFlippingEnabled(false)
|
, m_IsBinaryBitFlippingEnabled(false)
|
||||||
, m_CurrentRadixType(NumberBase::DecBase)
|
, m_CurrentRadixType(NumberBase::DecBase)
|
||||||
, m_CurrentAngleType(NumbersAndOperatorsEnum::Degree)
|
, m_CurrentAngleType(NumbersAndOperatorsEnum::Degree)
|
||||||
, m_Announcement(nullptr)
|
, m_Announcement(nullptr)
|
||||||
|
@ -93,6 +93,8 @@ StandardCalculatorViewModel::StandardCalculatorViewModel()
|
||||||
, m_localizedMemoryCleared(nullptr)
|
, m_localizedMemoryCleared(nullptr)
|
||||||
, m_localizedOpenParenthesisCountChangedAutomationFormat(nullptr)
|
, m_localizedOpenParenthesisCountChangedAutomationFormat(nullptr)
|
||||||
, m_localizedNoRightParenthesisAddedFormat(nullptr)
|
, m_localizedNoRightParenthesisAddedFormat(nullptr)
|
||||||
|
, m_TokenPosition(-1)
|
||||||
|
, m_isLastOperationHistoryLoad(false)
|
||||||
{
|
{
|
||||||
WeakReference calculatorViewModel(this);
|
WeakReference calculatorViewModel(this);
|
||||||
auto appResourceProvider = AppResourceProvider::GetInstance();
|
auto appResourceProvider = AppResourceProvider::GetInstance();
|
||||||
|
@ -130,9 +132,6 @@ StandardCalculatorViewModel::StandardCalculatorViewModel()
|
||||||
IsDecimalEnabled = true;
|
IsDecimalEnabled = true;
|
||||||
AreHistoryShortcutsEnabled = true;
|
AreHistoryShortcutsEnabled = true;
|
||||||
AreProgrammerRadixOperatorsEnabled = false;
|
AreProgrammerRadixOperatorsEnabled = false;
|
||||||
|
|
||||||
m_tokenPosition = -1;
|
|
||||||
m_isLastOperationHistoryLoad = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String ^ StandardCalculatorViewModel::LocalizeDisplayValue(_In_ wstring const& displayValue, _In_ bool isError)
|
String ^ StandardCalculatorViewModel::LocalizeDisplayValue(_In_ wstring const& displayValue, _In_ bool isError)
|
||||||
|
@ -455,7 +454,7 @@ void StandardCalculatorViewModel::FtoEButtonToggled()
|
||||||
|
|
||||||
void StandardCalculatorViewModel::HandleUpdatedOperandData(Command cmdenum)
|
void StandardCalculatorViewModel::HandleUpdatedOperandData(Command cmdenum)
|
||||||
{
|
{
|
||||||
DisplayExpressionToken ^ displayExpressionToken = ExpressionTokens->GetAt(m_tokenPosition);
|
DisplayExpressionToken ^ displayExpressionToken = ExpressionTokens->GetAt(m_TokenPosition);
|
||||||
if (displayExpressionToken == nullptr)
|
if (displayExpressionToken == nullptr)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@ -583,7 +582,7 @@ void StandardCalculatorViewModel::HandleUpdatedOperandData(Command cmdenum)
|
||||||
}
|
}
|
||||||
|
|
||||||
String ^ updatedData = ref new String(temp);
|
String ^ updatedData = ref new String(temp);
|
||||||
UpdateOperand(m_tokenPosition, updatedData);
|
UpdateOperand(m_TokenPosition, updatedData);
|
||||||
displayExpressionToken->Token = updatedData;
|
displayExpressionToken->Token = updatedData;
|
||||||
IsOperandUpdatedUsingViewModel = true;
|
IsOperandUpdatedUsingViewModel = true;
|
||||||
displayExpressionToken->CommandIndex = commandIndex;
|
displayExpressionToken->CommandIndex = commandIndex;
|
||||||
|
@ -622,7 +621,7 @@ void StandardCalculatorViewModel::OnButtonPressed(Object ^ parameter)
|
||||||
&& numOpEnum != NumbersAndOperatorsEnum::IsProgrammerMode && numOpEnum != NumbersAndOperatorsEnum::FToE
|
&& numOpEnum != NumbersAndOperatorsEnum::IsProgrammerMode && numOpEnum != NumbersAndOperatorsEnum::FToE
|
||||||
&& (numOpEnum != NumbersAndOperatorsEnum::Degree) && (numOpEnum != NumbersAndOperatorsEnum::Radians) && (numOpEnum != NumbersAndOperatorsEnum::Grads))
|
&& (numOpEnum != NumbersAndOperatorsEnum::Degree) && (numOpEnum != NumbersAndOperatorsEnum::Radians) && (numOpEnum != NumbersAndOperatorsEnum::Grads))
|
||||||
{
|
{
|
||||||
if (!m_keyPressed)
|
if (!m_KeyPressed)
|
||||||
{
|
{
|
||||||
SaveEditedCommand(m_selectedExpressionToken->TokenPosition, cmdenum);
|
SaveEditedCommand(m_selectedExpressionToken->TokenPosition, cmdenum);
|
||||||
}
|
}
|
||||||
|
@ -765,9 +764,10 @@ void StandardCalculatorViewModel::OnPaste(String ^ pastedString)
|
||||||
while (it != pastedString->End())
|
while (it != pastedString->End())
|
||||||
{
|
{
|
||||||
bool sendCommand = true;
|
bool sendCommand = true;
|
||||||
bool canSendNegate = false;
|
auto buttonInfo = MapCharacterToButtonId(*it);
|
||||||
|
|
||||||
NumbersAndOperatorsEnum mappedNumOp = MapCharacterToButtonId(*it, canSendNegate);
|
NumbersAndOperatorsEnum mappedNumOp = buttonInfo.buttonId;
|
||||||
|
bool canSendNegate = buttonInfo.canSendNegate;
|
||||||
|
|
||||||
if (mappedNumOp == NumbersAndOperatorsEnum::None)
|
if (mappedNumOp == NumbersAndOperatorsEnum::None)
|
||||||
{
|
{
|
||||||
|
@ -869,7 +869,7 @@ void StandardCalculatorViewModel::OnPaste(String ^ pastedString)
|
||||||
if (mappedNumOp == NumbersAndOperatorsEnum::Exp)
|
if (mappedNumOp == NumbersAndOperatorsEnum::Exp)
|
||||||
{
|
{
|
||||||
// Check the following item
|
// Check the following item
|
||||||
switch (MapCharacterToButtonId(*(it + 1), canSendNegate))
|
switch (MapCharacterToButtonId(*(it + 1)).buttonId)
|
||||||
{
|
{
|
||||||
case NumbersAndOperatorsEnum::Subtract:
|
case NumbersAndOperatorsEnum::Subtract:
|
||||||
{
|
{
|
||||||
|
@ -919,10 +919,11 @@ void StandardCalculatorViewModel::SetViewPinnedState(bool pinned)
|
||||||
IsCurrentViewPinned = pinned;
|
IsCurrentViewPinned = pinned;
|
||||||
}
|
}
|
||||||
|
|
||||||
NumbersAndOperatorsEnum StandardCalculatorViewModel::MapCharacterToButtonId(const wchar_t ch, bool& canSendNegate)
|
ButtonInfo StandardCalculatorViewModel::MapCharacterToButtonId(char16 ch)
|
||||||
{
|
{
|
||||||
NumbersAndOperatorsEnum mappedValue = NumbersAndOperatorsEnum::None;
|
ButtonInfo result;
|
||||||
canSendNegate = false;
|
result.buttonId = NumbersAndOperatorsEnum::None;
|
||||||
|
result.canSendNegate = false;
|
||||||
|
|
||||||
switch (ch)
|
switch (ch)
|
||||||
{
|
{
|
||||||
|
@ -936,112 +937,111 @@ NumbersAndOperatorsEnum StandardCalculatorViewModel::MapCharacterToButtonId(cons
|
||||||
case '7':
|
case '7':
|
||||||
case '8':
|
case '8':
|
||||||
case '9':
|
case '9':
|
||||||
mappedValue = NumbersAndOperatorsEnum::Zero + static_cast<NumbersAndOperatorsEnum>(ch - L'0');
|
result.buttonId = NumbersAndOperatorsEnum::Zero + static_cast<NumbersAndOperatorsEnum>(ch - L'0');
|
||||||
canSendNegate = true;
|
result.canSendNegate = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '*':
|
case '*':
|
||||||
mappedValue = NumbersAndOperatorsEnum::Multiply;
|
result.buttonId = NumbersAndOperatorsEnum::Multiply;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '+':
|
case '+':
|
||||||
mappedValue = NumbersAndOperatorsEnum::Add;
|
result.buttonId = NumbersAndOperatorsEnum::Add;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '-':
|
case '-':
|
||||||
mappedValue = NumbersAndOperatorsEnum::Subtract;
|
result.buttonId = NumbersAndOperatorsEnum::Subtract;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '/':
|
case '/':
|
||||||
mappedValue = NumbersAndOperatorsEnum::Divide;
|
result.buttonId = NumbersAndOperatorsEnum::Divide;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '^':
|
case '^':
|
||||||
if (IsScientific)
|
if (IsScientific)
|
||||||
{
|
{
|
||||||
mappedValue = NumbersAndOperatorsEnum::XPowerY;
|
result.buttonId = NumbersAndOperatorsEnum::XPowerY;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '%':
|
case '%':
|
||||||
if (IsScientific || IsProgrammer)
|
if (IsScientific || IsProgrammer)
|
||||||
{
|
{
|
||||||
mappedValue = NumbersAndOperatorsEnum::Mod;
|
result.buttonId = NumbersAndOperatorsEnum::Mod;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '=':
|
case '=':
|
||||||
mappedValue = NumbersAndOperatorsEnum::Equals;
|
result.buttonId = NumbersAndOperatorsEnum::Equals;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '(':
|
case '(':
|
||||||
mappedValue = NumbersAndOperatorsEnum::OpenParenthesis;
|
result.buttonId = NumbersAndOperatorsEnum::OpenParenthesis;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ')':
|
case ')':
|
||||||
mappedValue = NumbersAndOperatorsEnum::CloseParenthesis;
|
result.buttonId = NumbersAndOperatorsEnum::CloseParenthesis;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'a':
|
case 'a':
|
||||||
case 'A':
|
case 'A':
|
||||||
mappedValue = NumbersAndOperatorsEnum::A;
|
result.buttonId = NumbersAndOperatorsEnum::A;
|
||||||
break;
|
break;
|
||||||
case 'b':
|
case 'b':
|
||||||
case 'B':
|
case 'B':
|
||||||
mappedValue = NumbersAndOperatorsEnum::B;
|
result.buttonId = NumbersAndOperatorsEnum::B;
|
||||||
break;
|
break;
|
||||||
case 'c':
|
case 'c':
|
||||||
case 'C':
|
case 'C':
|
||||||
mappedValue = NumbersAndOperatorsEnum::C;
|
result.buttonId = NumbersAndOperatorsEnum::C;
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
case 'D':
|
case 'D':
|
||||||
mappedValue = NumbersAndOperatorsEnum::D;
|
result.buttonId = NumbersAndOperatorsEnum::D;
|
||||||
break;
|
break;
|
||||||
case 'e':
|
case 'e':
|
||||||
case 'E':
|
case 'E':
|
||||||
// Only allow scientific notation in scientific mode
|
// Only allow scientific notation in scientific mode
|
||||||
if (IsProgrammer)
|
if (IsProgrammer)
|
||||||
{
|
{
|
||||||
mappedValue = NumbersAndOperatorsEnum::E;
|
result.buttonId = NumbersAndOperatorsEnum::E;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mappedValue = NumbersAndOperatorsEnum::Exp;
|
result.buttonId = NumbersAndOperatorsEnum::Exp;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
case 'F':
|
case 'F':
|
||||||
mappedValue = NumbersAndOperatorsEnum::F;
|
result.buttonId = NumbersAndOperatorsEnum::F;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// For the decimalSeparator, we need to respect the user setting.
|
// For the decimalSeparator, we need to respect the user setting.
|
||||||
if (ch == m_decimalSeparator)
|
if (ch == m_decimalSeparator)
|
||||||
{
|
{
|
||||||
mappedValue = NumbersAndOperatorsEnum::Decimal;
|
result.buttonId = NumbersAndOperatorsEnum::Decimal;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mappedValue == NumbersAndOperatorsEnum::None)
|
if (result.buttonId == NumbersAndOperatorsEnum::None)
|
||||||
{
|
{
|
||||||
if (LocalizationSettings::GetInstance().IsLocalizedDigit(ch))
|
if (LocalizationSettings::GetInstance().IsLocalizedDigit(ch))
|
||||||
{
|
{
|
||||||
mappedValue =
|
result.buttonId = NumbersAndOperatorsEnum::Zero
|
||||||
NumbersAndOperatorsEnum::Zero + static_cast<NumbersAndOperatorsEnum>(ch - LocalizationSettings::GetInstance().GetDigitSymbolFromEnUsDigit('0'));
|
+ static_cast<NumbersAndOperatorsEnum>(ch - LocalizationSettings::GetInstance().GetDigitSymbolFromEnUsDigit('0'));
|
||||||
canSendNegate = true;
|
result.canSendNegate = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Negate cannot be sent for leading zeroes
|
// Negate cannot be sent for leading zeroes
|
||||||
if (NumbersAndOperatorsEnum::Zero == mappedValue)
|
if (NumbersAndOperatorsEnum::Zero == result.buttonId)
|
||||||
{
|
{
|
||||||
canSendNegate = false;
|
result.canSendNegate = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return mappedValue;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StandardCalculatorViewModel::OnInputChanged()
|
void StandardCalculatorViewModel::OnInputChanged()
|
||||||
{
|
{
|
||||||
IsInputEmpty = m_standardCalculatorManager.IsInputEmpty();
|
IsInputEmpty = m_standardCalculatorManager.IsInputEmpty();
|
||||||
|
|
|
@ -20,7 +20,6 @@ namespace CalculatorFunctionalTests
|
||||||
namespace CalculatorUnitTests
|
namespace CalculatorUnitTests
|
||||||
{
|
{
|
||||||
class MultiWindowUnitTests;
|
class MultiWindowUnitTests;
|
||||||
class TimerTests;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace CalculatorApp
|
namespace CalculatorApp
|
||||||
|
@ -31,8 +30,13 @@ namespace CalculatorApp
|
||||||
namespace ViewModel
|
namespace ViewModel
|
||||||
{
|
{
|
||||||
#define ASCII_0 48
|
#define ASCII_0 48
|
||||||
public
|
public delegate void HideMemoryClickedHandler();
|
||||||
delegate void HideMemoryClickedHandler();
|
|
||||||
|
public value struct ButtonInfo
|
||||||
|
{
|
||||||
|
NumbersAndOperatorsEnum buttonId;
|
||||||
|
bool canSendNegate;
|
||||||
|
};
|
||||||
|
|
||||||
[Windows::UI::Xaml::Data::Bindable] public ref class StandardCalculatorViewModel sealed : public Windows::UI::Xaml::Data::INotifyPropertyChanged
|
[Windows::UI::Xaml::Data::Bindable] public ref class StandardCalculatorViewModel sealed : public Windows::UI::Xaml::Data::INotifyPropertyChanged
|
||||||
{
|
{
|
||||||
|
@ -43,40 +47,47 @@ namespace CalculatorApp
|
||||||
|
|
||||||
OBSERVABLE_OBJECT_CALLBACK(OnPropertyChanged);
|
OBSERVABLE_OBJECT_CALLBACK(OnPropertyChanged);
|
||||||
OBSERVABLE_PROPERTY_RW(Platform::String ^, DisplayValue);
|
OBSERVABLE_PROPERTY_RW(Platform::String ^, DisplayValue);
|
||||||
OBSERVABLE_PROPERTY_RW(HistoryViewModel ^, HistoryVM);
|
OBSERVABLE_PROPERTY_R(HistoryViewModel ^, HistoryVM);
|
||||||
OBSERVABLE_NAMED_PROPERTY_RW(bool, IsInError);
|
OBSERVABLE_PROPERTY_RW(bool, IsAlwaysOnTop);
|
||||||
OBSERVABLE_PROPERTY_RW(bool, IsOperatorCommand);
|
OBSERVABLE_PROPERTY_R(bool, IsBinaryBitFlippingEnabled);
|
||||||
OBSERVABLE_PROPERTY_RW(Platform::String ^, DisplayStringExpression);
|
PROPERTY_R(bool, IsOperandUpdatedUsingViewModel);
|
||||||
|
PROPERTY_R(int, TokenPosition);
|
||||||
|
PROPERTY_R(bool, IsOperandTextCompletelySelected);
|
||||||
|
PROPERTY_R(bool, KeyPressed);
|
||||||
|
PROPERTY_R(Platform::String ^, SelectedExpressionLastData);
|
||||||
|
OBSERVABLE_NAMED_PROPERTY_R(bool, IsInError);
|
||||||
|
OBSERVABLE_PROPERTY_R(bool, IsOperatorCommand);
|
||||||
|
OBSERVABLE_PROPERTY_R(Platform::String ^, DisplayStringExpression);
|
||||||
OBSERVABLE_PROPERTY_R(Windows::Foundation::Collections::IObservableVector<Common::DisplayExpressionToken ^> ^, ExpressionTokens);
|
OBSERVABLE_PROPERTY_R(Windows::Foundation::Collections::IObservableVector<Common::DisplayExpressionToken ^> ^, ExpressionTokens);
|
||||||
OBSERVABLE_PROPERTY_RW(Platform::String ^, DecimalDisplayValue);
|
OBSERVABLE_PROPERTY_R(Platform::String ^, DecimalDisplayValue);
|
||||||
OBSERVABLE_PROPERTY_RW(Platform::String ^, HexDisplayValue);
|
OBSERVABLE_PROPERTY_R(Platform::String ^, HexDisplayValue);
|
||||||
OBSERVABLE_PROPERTY_RW(Platform::String ^, OctalDisplayValue);
|
OBSERVABLE_PROPERTY_R(Platform::String ^, OctalDisplayValue);
|
||||||
OBSERVABLE_NAMED_PROPERTY_RW(Platform::String ^, BinaryDisplayValue);
|
OBSERVABLE_NAMED_PROPERTY_R(Platform::String ^, BinaryDisplayValue);
|
||||||
OBSERVABLE_NAMED_PROPERTY_R(Windows::Foundation::Collections::IVector<bool> ^, BinaryDigits);
|
OBSERVABLE_NAMED_PROPERTY_R(Windows::Foundation::Collections::IVector<bool> ^, BinaryDigits);
|
||||||
OBSERVABLE_PROPERTY_RW(Platform::String ^, HexDisplayValue_AutomationName);
|
OBSERVABLE_PROPERTY_R(Platform::String ^, HexDisplayValue_AutomationName);
|
||||||
OBSERVABLE_PROPERTY_RW(Platform::String ^, DecDisplayValue_AutomationName);
|
OBSERVABLE_PROPERTY_R(Platform::String ^, DecDisplayValue_AutomationName);
|
||||||
OBSERVABLE_PROPERTY_RW(Platform::String ^, OctDisplayValue_AutomationName);
|
OBSERVABLE_PROPERTY_R(Platform::String ^, OctDisplayValue_AutomationName);
|
||||||
OBSERVABLE_PROPERTY_RW(Platform::String ^, BinDisplayValue_AutomationName);
|
OBSERVABLE_PROPERTY_R(Platform::String ^, BinDisplayValue_AutomationName);
|
||||||
OBSERVABLE_PROPERTY_RW(bool, IsBinaryOperatorEnabled);
|
OBSERVABLE_PROPERTY_R(bool, IsBinaryOperatorEnabled);
|
||||||
OBSERVABLE_PROPERTY_RW(bool, IsUnaryOperatorEnabled);
|
OBSERVABLE_PROPERTY_R(bool, IsUnaryOperatorEnabled);
|
||||||
OBSERVABLE_PROPERTY_RW(bool, IsNegateEnabled);
|
OBSERVABLE_PROPERTY_R(bool, IsNegateEnabled);
|
||||||
OBSERVABLE_PROPERTY_RW(bool, IsDecimalEnabled);
|
OBSERVABLE_PROPERTY_RW(bool, IsDecimalEnabled);
|
||||||
OBSERVABLE_PROPERTY_RW(bool, IsCurrentViewPinned);
|
OBSERVABLE_PROPERTY_R(bool, IsCurrentViewPinned);
|
||||||
OBSERVABLE_PROPERTY_RW(Windows::Foundation::Collections::IVector<MemoryItemViewModel ^> ^, MemorizedNumbers);
|
OBSERVABLE_PROPERTY_R(Windows::Foundation::Collections::IVector<MemoryItemViewModel ^> ^, MemorizedNumbers);
|
||||||
OBSERVABLE_NAMED_PROPERTY_RW(bool, IsMemoryEmpty);
|
OBSERVABLE_NAMED_PROPERTY_RW(bool, IsMemoryEmpty);
|
||||||
OBSERVABLE_PROPERTY_RW(bool, IsFToEChecked);
|
OBSERVABLE_PROPERTY_R(bool, IsFToEChecked);
|
||||||
OBSERVABLE_PROPERTY_R(bool, IsFToEEnabled);
|
OBSERVABLE_PROPERTY_R(bool, IsFToEEnabled);
|
||||||
OBSERVABLE_PROPERTY_RW(bool, AreHEXButtonsEnabled);
|
OBSERVABLE_PROPERTY_R(bool, AreHEXButtonsEnabled);
|
||||||
OBSERVABLE_PROPERTY_RW(Platform::String ^, CalculationResultAutomationName);
|
OBSERVABLE_PROPERTY_R(Platform::String ^, CalculationResultAutomationName);
|
||||||
OBSERVABLE_PROPERTY_RW(Platform::String ^, CalculationExpressionAutomationName);
|
OBSERVABLE_PROPERTY_R(Platform::String ^, CalculationExpressionAutomationName);
|
||||||
OBSERVABLE_PROPERTY_RW(bool, IsShiftProgrammerChecked);
|
OBSERVABLE_PROPERTY_R(bool, IsShiftProgrammerChecked);
|
||||||
OBSERVABLE_PROPERTY_RW(CalculatorApp::Common::NumberBase, CurrentRadixType);
|
OBSERVABLE_PROPERTY_R(CalculatorApp::Common::NumberBase, CurrentRadixType);
|
||||||
OBSERVABLE_PROPERTY_RW(bool, AreTokensUpdated);
|
OBSERVABLE_PROPERTY_R(bool, AreTokensUpdated);
|
||||||
OBSERVABLE_PROPERTY_RW(bool, AreAlwaysOnTopResultsUpdated);
|
OBSERVABLE_PROPERTY_R(bool, AreAlwaysOnTopResultsUpdated);
|
||||||
OBSERVABLE_PROPERTY_RW(bool, AreHistoryShortcutsEnabled);
|
OBSERVABLE_PROPERTY_RW(bool, AreHistoryShortcutsEnabled);
|
||||||
OBSERVABLE_PROPERTY_RW(bool, AreProgrammerRadixOperatorsEnabled);
|
OBSERVABLE_PROPERTY_R(bool, AreProgrammerRadixOperatorsEnabled);
|
||||||
OBSERVABLE_PROPERTY_RW(bool, IsInputEmpty);
|
OBSERVABLE_PROPERTY_R(bool, IsInputEmpty);
|
||||||
OBSERVABLE_PROPERTY_RW(CalculatorApp::Common::Automation::NarratorAnnouncement ^, Announcement);
|
OBSERVABLE_PROPERTY_R(CalculatorApp::Common::Automation::NarratorAnnouncement ^, Announcement);
|
||||||
OBSERVABLE_PROPERTY_R(unsigned int, OpenParenthesisCount);
|
OBSERVABLE_PROPERTY_R(unsigned int, OpenParenthesisCount);
|
||||||
|
|
||||||
COMMAND_FOR_METHOD(CopyCommand, StandardCalculatorViewModel::OnCopyCommand);
|
COMMAND_FOR_METHOD(CopyCommand, StandardCalculatorViewModel::OnCopyCommand);
|
||||||
|
@ -109,22 +120,6 @@ namespace CalculatorApp
|
||||||
static property Platform::String
|
static property Platform::String
|
||||||
^ IsBitFlipCheckedPropertyName { Platform::String ^ get() { return Platform::StringReference(L"IsBitFlipChecked"); } }
|
^ IsBitFlipCheckedPropertyName { Platform::String ^ get() { return Platform::StringReference(L"IsBitFlipChecked"); } }
|
||||||
|
|
||||||
property bool IsBinaryBitFlippingEnabled
|
|
||||||
{
|
|
||||||
bool get()
|
|
||||||
{
|
|
||||||
return m_isBinaryBitFlippingEnabled;
|
|
||||||
}
|
|
||||||
void set(bool value)
|
|
||||||
{
|
|
||||||
if (m_isBinaryBitFlippingEnabled != value)
|
|
||||||
{
|
|
||||||
m_isBinaryBitFlippingEnabled = value;
|
|
||||||
RaisePropertyChanged(L"IsBinaryBitFlippingEnabled");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
property CalculatorApp::Common::BitLength ValueBitLength
|
property CalculatorApp::Common::BitLength ValueBitLength
|
||||||
{
|
{
|
||||||
CalculatorApp::Common::BitLength get()
|
CalculatorApp::Common::BitLength get()
|
||||||
|
@ -205,22 +200,6 @@ namespace CalculatorApp
|
||||||
static property Platform::String
|
static property Platform::String
|
||||||
^ IsProgrammerPropertyName { Platform::String ^ get() { return Platform::StringReference(L"IsProgrammer"); } }
|
^ IsProgrammerPropertyName { Platform::String ^ get() { return Platform::StringReference(L"IsProgrammer"); } }
|
||||||
|
|
||||||
property bool IsAlwaysOnTop
|
|
||||||
{
|
|
||||||
bool get()
|
|
||||||
{
|
|
||||||
return m_isAlwaysOnTop;
|
|
||||||
}
|
|
||||||
void set(bool value)
|
|
||||||
{
|
|
||||||
if (m_isAlwaysOnTop != value)
|
|
||||||
{
|
|
||||||
m_isAlwaysOnTop = value;
|
|
||||||
RaisePropertyChanged(L"IsAlwaysOnTop");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
property bool IsEditingEnabled
|
property bool IsEditingEnabled
|
||||||
{
|
{
|
||||||
bool get()
|
bool get()
|
||||||
|
@ -271,65 +250,12 @@ namespace CalculatorApp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
property int TokenPosition
|
internal :
|
||||||
{
|
void OnPaste(Platform::String ^ pastedString);
|
||||||
int get()
|
|
||||||
{
|
|
||||||
return m_tokenPosition;
|
|
||||||
}
|
|
||||||
void set(int value)
|
|
||||||
{
|
|
||||||
m_tokenPosition = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
property Platform::String^ SelectedExpressionLastData
|
|
||||||
{
|
|
||||||
Platform::String^ get() { return m_selectedExpressionLastData; }
|
|
||||||
void set(Platform::String^ value) { m_selectedExpressionLastData = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
property bool KeyPressed
|
|
||||||
{
|
|
||||||
bool get()
|
|
||||||
{
|
|
||||||
return m_keyPressed;
|
|
||||||
}
|
|
||||||
void set(bool value)
|
|
||||||
{
|
|
||||||
m_keyPressed = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
property bool IsOperandUpdatedUsingViewModel
|
|
||||||
{
|
|
||||||
bool get()
|
|
||||||
{
|
|
||||||
return m_operandUpdated;
|
|
||||||
}
|
|
||||||
void set(bool value)
|
|
||||||
{
|
|
||||||
m_operandUpdated = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
property bool IsOperandTextCompletelySelected
|
|
||||||
{
|
|
||||||
bool get()
|
|
||||||
{
|
|
||||||
return m_completeTextSelection;
|
|
||||||
}
|
|
||||||
void set(bool value)
|
|
||||||
{
|
|
||||||
m_completeTextSelection = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal : void OnPaste(Platform::String ^ pastedString);
|
|
||||||
void OnCopyCommand(Platform::Object ^ parameter);
|
void OnCopyCommand(Platform::Object ^ parameter);
|
||||||
void OnPasteCommand(Platform::Object ^ parameter);
|
void OnPasteCommand(Platform::Object ^ parameter);
|
||||||
|
|
||||||
NumbersAndOperatorsEnum MapCharacterToButtonId(const wchar_t ch, bool& canSendNegate);
|
ButtonInfo MapCharacterToButtonId(char16 ch);
|
||||||
|
|
||||||
// Memory feature related methods. They are internal because they need to called from the MainPage code-behind
|
// Memory feature related methods. They are internal because they need to called from the MainPage code-behind
|
||||||
void OnMemoryButtonPressed();
|
void OnMemoryButtonPressed();
|
||||||
|
@ -413,14 +339,9 @@ namespace CalculatorApp
|
||||||
bool m_isStandard;
|
bool m_isStandard;
|
||||||
bool m_isScientific;
|
bool m_isScientific;
|
||||||
bool m_isProgrammer;
|
bool m_isProgrammer;
|
||||||
bool m_isAlwaysOnTop;
|
|
||||||
bool m_isBinaryBitFlippingEnabled;
|
|
||||||
bool m_isBitFlipChecked;
|
bool m_isBitFlipChecked;
|
||||||
bool m_isRtlLanguage;
|
bool m_isRtlLanguage;
|
||||||
int m_tokenPosition;
|
|
||||||
bool m_keyPressed;
|
|
||||||
bool m_operandUpdated;
|
bool m_operandUpdated;
|
||||||
bool m_completeTextSelection;
|
|
||||||
bool m_isLastOperationHistoryLoad;
|
bool m_isLastOperationHistoryLoad;
|
||||||
CalculatorApp::Common::BitLength m_valueBitLength;
|
CalculatorApp::Common::BitLength m_valueBitLength;
|
||||||
Platform::String ^ m_selectedExpressionLastData;
|
Platform::String ^ m_selectedExpressionLastData;
|
||||||
|
@ -463,7 +384,6 @@ namespace CalculatorApp
|
||||||
friend class CalculatorDisplay;
|
friend class CalculatorDisplay;
|
||||||
friend class CalculatorFunctionalTests::HistoryTests;
|
friend class CalculatorFunctionalTests::HistoryTests;
|
||||||
friend class CalculatorUnitTests::MultiWindowUnitTests;
|
friend class CalculatorUnitTests::MultiWindowUnitTests;
|
||||||
friend class CalculatorUnitTests::TimerTests;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -373,27 +373,25 @@ namespace CalculatorUnitTests
|
||||||
/// Low-level test of character mapping
|
/// Low-level test of character mapping
|
||||||
TEST_METHOD(VerifyCorrectCharacterMapping)
|
TEST_METHOD(VerifyCorrectCharacterMapping)
|
||||||
{
|
{
|
||||||
bool canSendNegate = false;
|
|
||||||
|
|
||||||
// Valid numbers
|
// Valid numbers
|
||||||
NumbersAndOperatorsEnum n = m_viewModel->MapCharacterToButtonId(L'0', canSendNegate);
|
NumbersAndOperatorsEnum n = m_viewModel->MapCharacterToButtonId(L'0').buttonId;
|
||||||
ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::Zero);
|
ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::Zero);
|
||||||
|
|
||||||
n = m_viewModel->MapCharacterToButtonId(L'1', canSendNegate);
|
n = m_viewModel->MapCharacterToButtonId(L'1').buttonId;
|
||||||
ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::One);
|
ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::One);
|
||||||
|
|
||||||
// Valid operators
|
// Valid operators
|
||||||
n = m_viewModel->MapCharacterToButtonId(L'+', canSendNegate);
|
n = m_viewModel->MapCharacterToButtonId(L'+').buttonId;
|
||||||
ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::Add);
|
ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::Add);
|
||||||
|
|
||||||
n = m_viewModel->MapCharacterToButtonId(L'=', canSendNegate);
|
n = m_viewModel->MapCharacterToButtonId(L'=').buttonId;
|
||||||
ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::Equals);
|
ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::Equals);
|
||||||
|
|
||||||
n = m_viewModel->MapCharacterToButtonId(L'a', canSendNegate);
|
n = m_viewModel->MapCharacterToButtonId(L'a').buttonId;
|
||||||
ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::A);
|
ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::A);
|
||||||
|
|
||||||
// Invalid character
|
// Invalid character
|
||||||
n = m_viewModel->MapCharacterToButtonId(L'$', canSendNegate);
|
n = m_viewModel->MapCharacterToButtonId(L'$').buttonId;
|
||||||
ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::None);
|
ValidateNumbersAndOperatorsAreEqual(n, NumbersAndOperatorsEnum::None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue