Merge master into feature/GraphingCalculator branch (#660)
This commit is contained in:
@@ -35,8 +35,10 @@ namespace
|
||||
StringReference IsStandardPropertyName(L"IsStandard");
|
||||
StringReference IsScientificPropertyName(L"IsScientific");
|
||||
StringReference IsProgrammerPropertyName(L"IsProgrammer");
|
||||
StringReference IsAlwaysOnTopPropertyName(L"IsAlwaysOnTop");
|
||||
StringReference DisplayValuePropertyName(L"DisplayValue");
|
||||
StringReference CalculationResultAutomationNamePropertyName(L"CalculationResultAutomationName");
|
||||
StringReference IsBitFlipCheckedPropertyName(L"IsBitFlipChecked");
|
||||
}
|
||||
|
||||
namespace CalculatorResourceKeys
|
||||
@@ -65,6 +67,7 @@ StandardCalculatorViewModel::StandardCalculatorViewModel()
|
||||
, m_HexDisplayValue(L"0")
|
||||
, m_BinaryDisplayValue(L"0")
|
||||
, m_OctalDisplayValue(L"0")
|
||||
, m_BinaryDigits(ref new Vector<bool>(64, false))
|
||||
, m_standardCalculatorManager(&m_calculatorDisplay, &m_resourceProvider)
|
||||
, m_ExpressionTokens(ref new Vector<DisplayExpressionToken ^>())
|
||||
, m_MemorizedNumbers(ref new Vector<MemoryItemViewModel ^>())
|
||||
@@ -72,10 +75,7 @@ StandardCalculatorViewModel::StandardCalculatorViewModel()
|
||||
, m_IsFToEChecked(false)
|
||||
, m_isShiftChecked(false)
|
||||
, m_IsShiftProgrammerChecked(false)
|
||||
, m_IsQwordEnabled(true)
|
||||
, m_IsDwordEnabled(true)
|
||||
, m_IsWordEnabled(true)
|
||||
, m_IsByteEnabled(true)
|
||||
, m_valueBitLength(BitLength::BitLengthQWord)
|
||||
, m_isBitFlipChecked(false)
|
||||
, m_isBinaryBitFlippingEnabled(false)
|
||||
, m_CurrentRadixType(RADIX_TYPE::DEC_RADIX)
|
||||
@@ -201,7 +201,12 @@ void StandardCalculatorViewModel::SetPrimaryDisplay(_In_ wstring const& displayS
|
||||
// not match what the narrator is saying
|
||||
m_CalculationResultAutomationName = CalculateNarratorDisplayValue(displayStringValue, localizedDisplayStringValue, isError);
|
||||
|
||||
DisplayValue = localizedDisplayStringValue;
|
||||
AreAlwaysOnTopResultsUpdated = false;
|
||||
if (DisplayValue != localizedDisplayStringValue)
|
||||
{
|
||||
DisplayValue = localizedDisplayStringValue;
|
||||
AreAlwaysOnTopResultsUpdated = true;
|
||||
}
|
||||
|
||||
IsInError = isError;
|
||||
|
||||
@@ -414,7 +419,7 @@ void StandardCalculatorViewModel::SetMemorizedNumbers(const vector<wstring>& new
|
||||
memorySlot->Value = Utils::LRO + ref new String(stringValue.c_str()) + Utils::PDF;
|
||||
|
||||
MemorizedNumbers->InsertAt(0, memorySlot);
|
||||
IsMemoryEmpty = false;
|
||||
IsMemoryEmpty = IsAlwaysOnTop;
|
||||
|
||||
// Update the slot position for the rest of the slots
|
||||
for (unsigned int i = 1; i < MemorizedNumbers->Size; i++)
|
||||
@@ -599,8 +604,6 @@ void StandardCalculatorViewModel::OnButtonPressed(Object ^ parameter)
|
||||
NumbersAndOperatorsEnum numOpEnum = CalculatorButtonPressedEventArgs::GetOperationFromCommandParameter(parameter);
|
||||
Command cmdenum = ConvertToOperatorsEnum(numOpEnum);
|
||||
|
||||
TraceLogger::GetInstance().UpdateFunctionUsage((int)numOpEnum);
|
||||
|
||||
if (IsInError)
|
||||
{
|
||||
m_standardCalculatorManager.SendCommand(Command::CommandCLEAR);
|
||||
@@ -668,31 +671,12 @@ void StandardCalculatorViewModel::OnButtonPressed(Object ^ parameter)
|
||||
m_isLastOperationHistoryLoad = false;
|
||||
}
|
||||
|
||||
TraceLogger::GetInstance().UpdateButtonUsage(numOpEnum, GetCalculatorMode());
|
||||
m_standardCalculatorManager.SendCommand(cmdenum);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int StandardCalculatorViewModel::GetBitLengthType()
|
||||
{
|
||||
if (IsQwordEnabled)
|
||||
{
|
||||
return QwordType;
|
||||
}
|
||||
else if (IsDwordEnabled)
|
||||
{
|
||||
return DwordType;
|
||||
}
|
||||
else if (IsWordEnabled)
|
||||
{
|
||||
return WordType;
|
||||
}
|
||||
else
|
||||
{
|
||||
return ByteType;
|
||||
}
|
||||
}
|
||||
|
||||
int StandardCalculatorViewModel::GetNumberBase()
|
||||
{
|
||||
if (CurrentRadixType == HEX_RADIX)
|
||||
@@ -723,9 +707,10 @@ void StandardCalculatorViewModel::OnCopyCommand(Object ^ parameter)
|
||||
|
||||
void StandardCalculatorViewModel::OnPasteCommand(Object ^ parameter)
|
||||
{
|
||||
auto that(this);
|
||||
ViewMode mode;
|
||||
int NumberBase = -1;
|
||||
int bitLengthType = -1;
|
||||
BitLength bitLengthType = BitLength::BitLengthUnknown;
|
||||
if (IsScientific)
|
||||
{
|
||||
mode = ViewMode::Scientific;
|
||||
@@ -734,7 +719,7 @@ void StandardCalculatorViewModel::OnPasteCommand(Object ^ parameter)
|
||||
{
|
||||
mode = ViewMode::Programmer;
|
||||
NumberBase = GetNumberBase();
|
||||
bitLengthType = GetBitLengthType();
|
||||
bitLengthType = m_valueBitLength;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -748,7 +733,7 @@ void StandardCalculatorViewModel::OnPasteCommand(Object ^ parameter)
|
||||
|
||||
// Ensure that the paste happens on the UI thread
|
||||
CopyPasteManager::GetStringToPaste(mode, NavCategory::GetGroupType(mode), NumberBase, bitLengthType)
|
||||
.then([this, mode](String ^ pastedString) { OnPaste(pastedString, mode); }, concurrency::task_continuation_context::use_current());
|
||||
.then([that, mode](String ^ pastedString) { that->OnPaste(pastedString); }, concurrency::task_continuation_context::use_current());
|
||||
}
|
||||
|
||||
CalculationManager::Command StandardCalculatorViewModel::ConvertToOperatorsEnum(NumbersAndOperatorsEnum operation)
|
||||
@@ -756,7 +741,7 @@ CalculationManager::Command StandardCalculatorViewModel::ConvertToOperatorsEnum(
|
||||
return safe_cast<Command>(operation);
|
||||
}
|
||||
|
||||
void StandardCalculatorViewModel::OnPaste(String ^ pastedString, ViewMode mode)
|
||||
void StandardCalculatorViewModel::OnPaste(String ^ pastedString)
|
||||
{
|
||||
// If pastedString is invalid("NoOp") then display pasteError else process the string
|
||||
if (pastedString == StringReference(CopyPasteManager::PasteErrorString))
|
||||
@@ -765,7 +750,7 @@ void StandardCalculatorViewModel::OnPaste(String ^ pastedString, ViewMode mode)
|
||||
return;
|
||||
}
|
||||
|
||||
TraceLogger::GetInstance().LogValidInputPasted(mode);
|
||||
TraceLogger::GetInstance().LogInputPasted(GetCalculatorMode());
|
||||
bool isFirstLegalChar = true;
|
||||
m_standardCalculatorManager.SendCommand(Command::CommandCENTR);
|
||||
bool sendNegate = false;
|
||||
@@ -884,7 +869,7 @@ void StandardCalculatorViewModel::OnPaste(String ^ pastedString, ViewMode mode)
|
||||
// Handle exponent and exponent sign (...e+... or ...e-... or ...e...)
|
||||
if (mappedNumOp == NumbersAndOperatorsEnum::Exp)
|
||||
{
|
||||
//Check the following item
|
||||
// Check the following item
|
||||
switch (MapCharacterToButtonId(*(it + 1), canSendNegate))
|
||||
{
|
||||
case NumbersAndOperatorsEnum::Subtract:
|
||||
@@ -896,7 +881,7 @@ void StandardCalculatorViewModel::OnPaste(String ^ pastedString, ViewMode mode)
|
||||
break;
|
||||
case NumbersAndOperatorsEnum::Add:
|
||||
{
|
||||
//Nothing to do, skip to the next item
|
||||
// Nothing to do, skip to the next item
|
||||
++it;
|
||||
}
|
||||
break;
|
||||
@@ -911,8 +896,7 @@ void StandardCalculatorViewModel::OnClearMemoryCommand(Object ^ parameter)
|
||||
{
|
||||
m_standardCalculatorManager.MemorizedNumberClearAll();
|
||||
|
||||
int windowId = Utils::GetWindowId();
|
||||
TraceLogger::GetInstance().LogMemoryClearAll(windowId);
|
||||
TraceLogger::GetInstance().UpdateButtonUsage(NumbersAndOperatorsEnum::MemoryClear, GetCalculatorMode());
|
||||
|
||||
String ^ announcement = LocalizationStringUtil::GetLocalizedNarratorAnnouncement(CalculatorResourceKeys::MemoryCleared, m_localizedMemoryCleared);
|
||||
Announcement = CalculatorAnnouncement::GetMemoryClearedAnnouncement(announcement);
|
||||
@@ -1046,8 +1030,7 @@ void StandardCalculatorViewModel::OnMemoryButtonPressed()
|
||||
{
|
||||
m_standardCalculatorManager.MemorizeNumber();
|
||||
|
||||
int windowId = Utils::GetWindowId();
|
||||
TraceLogger::GetInstance().InsertIntoMemoryMap(windowId, IsStandard, IsScientific, IsProgrammer);
|
||||
TraceLogger::GetInstance().UpdateButtonUsage(NumbersAndOperatorsEnum::Memory, GetCalculatorMode());
|
||||
|
||||
String ^ announcement = LocalizationStringUtil::GetLocalizedNarratorAnnouncement(
|
||||
CalculatorResourceKeys::MemorySave, m_localizedMemorySavedAutomationFormat, m_DisplayValue->Data());
|
||||
@@ -1079,49 +1062,31 @@ void StandardCalculatorViewModel::OnMemoryItemPressed(Object ^ memoryItemPositio
|
||||
auto boxedPosition = safe_cast<Box<int> ^>(memoryItemPosition);
|
||||
m_standardCalculatorManager.MemorizedNumberLoad(boxedPosition->Value);
|
||||
HideMemoryClicked();
|
||||
int windowId = Utils::GetWindowId();
|
||||
TraceLogger::GetInstance().LogMemoryUsed(windowId, boxedPosition->Value, IsStandard, IsScientific, IsProgrammer, MemorizedNumbers->Size);
|
||||
|
||||
auto mode = IsStandard ? ViewMode::Standard : IsScientific ? ViewMode::Scientific : ViewMode::Programmer;
|
||||
TraceLogger::GetInstance().LogMemoryItemLoad(mode, MemorizedNumbers->Size, boxedPosition->Value);
|
||||
}
|
||||
}
|
||||
|
||||
void StandardCalculatorViewModel::OnMemoryAdd(Object ^ memoryItemPosition)
|
||||
{
|
||||
// M+ will add display to memorylist if memory list is empty.
|
||||
int windowId = Utils::GetWindowId();
|
||||
|
||||
if (MemorizedNumbers)
|
||||
{
|
||||
auto boxedPosition = safe_cast<Box<int> ^>(memoryItemPosition);
|
||||
if (MemorizedNumbers->Size > 0)
|
||||
{
|
||||
TraceLogger::GetInstance().LogMemoryUsed(windowId, boxedPosition->Value, IsStandard, IsScientific, IsProgrammer, MemorizedNumbers->Size);
|
||||
TraceLogger::GetInstance().UpdateMemoryMap(windowId, boxedPosition->Value, IsStandard, IsScientific, IsProgrammer);
|
||||
}
|
||||
else
|
||||
{
|
||||
TraceLogger::GetInstance().InsertIntoMemoryMap(windowId, IsStandard, IsScientific, IsProgrammer);
|
||||
}
|
||||
TraceLogger::GetInstance().UpdateButtonUsage(NumbersAndOperatorsEnum::MemoryAdd, GetCalculatorMode());
|
||||
m_standardCalculatorManager.MemorizedNumberAdd(boxedPosition->Value);
|
||||
}
|
||||
}
|
||||
|
||||
void StandardCalculatorViewModel::OnMemorySubtract(Object ^ memoryItemPosition)
|
||||
{
|
||||
int windowId = Utils::GetWindowId();
|
||||
|
||||
// M- will add negative of displayed number to memorylist if memory list is empty.
|
||||
if (MemorizedNumbers)
|
||||
{
|
||||
auto boxedPosition = safe_cast<Box<int> ^>(memoryItemPosition);
|
||||
if (MemorizedNumbers->Size > 0)
|
||||
{
|
||||
TraceLogger::GetInstance().LogMemoryUsed(windowId, boxedPosition->Value, IsStandard, IsScientific, IsProgrammer, MemorizedNumbers->Size);
|
||||
TraceLogger::GetInstance().UpdateMemoryMap(windowId, boxedPosition->Value, IsStandard, IsScientific, IsProgrammer);
|
||||
}
|
||||
else
|
||||
{
|
||||
TraceLogger::GetInstance().InsertIntoMemoryMap(windowId, IsStandard, IsScientific, IsProgrammer);
|
||||
}
|
||||
TraceLogger::GetInstance().UpdateButtonUsage(NumbersAndOperatorsEnum::MemorySubtract, GetCalculatorMode());
|
||||
m_standardCalculatorManager.MemorizedNumberSubtract(boxedPosition->Value);
|
||||
}
|
||||
}
|
||||
@@ -1130,7 +1095,6 @@ void StandardCalculatorViewModel::OnMemoryClear(_In_ Object ^ memoryItemPosition
|
||||
{
|
||||
if (MemorizedNumbers && MemorizedNumbers->Size > 0)
|
||||
{
|
||||
int windowId = Utils::GetWindowId();
|
||||
auto boxedPosition = safe_cast<Box<int> ^>(memoryItemPosition);
|
||||
|
||||
if (boxedPosition->Value >= 0)
|
||||
@@ -1148,9 +1112,7 @@ void StandardCalculatorViewModel::OnMemoryClear(_In_ Object ^ memoryItemPosition
|
||||
{
|
||||
IsMemoryEmpty = true;
|
||||
}
|
||||
|
||||
TraceLogger::GetInstance().LogMemoryUsed(windowId, boxedPosition->Value, IsStandard, IsScientific, IsProgrammer, MemorizedNumbers->Size);
|
||||
TraceLogger::GetInstance().DeleteFromMemoryMap(windowId, boxedPosition->Value);
|
||||
TraceLogger::GetInstance().UpdateButtonUsage(NumbersAndOperatorsEnum::MemoryClear, GetCalculatorMode());
|
||||
|
||||
wstring localizedIndex = to_wstring(boxedPosition->Value + 1);
|
||||
LocalizationSettings::GetInstance().LocalizeDisplayValue(&localizedIndex);
|
||||
@@ -1191,6 +1153,11 @@ void StandardCalculatorViewModel::OnPropertyChanged(String ^ propertyname)
|
||||
RaisePropertyChanged(CalculationResultAutomationNamePropertyName);
|
||||
Announcement = GetDisplayUpdatedNarratorAnnouncement();
|
||||
}
|
||||
else if (propertyname == IsBitFlipCheckedPropertyName)
|
||||
{
|
||||
TraceLogger::GetInstance().UpdateButtonUsage(
|
||||
IsBitFlipChecked ? NumbersAndOperatorsEnum::BitflipButton : NumbersAndOperatorsEnum::FullKeypadButton, ViewMode::Programmer);
|
||||
}
|
||||
}
|
||||
|
||||
void StandardCalculatorViewModel::SetCalculatorType(ViewMode targetState)
|
||||
@@ -1223,7 +1190,7 @@ void StandardCalculatorViewModel::SetCalculatorType(ViewMode targetState)
|
||||
}
|
||||
}
|
||||
|
||||
String^ StandardCalculatorViewModel::GetRawDisplayValue()
|
||||
String ^ StandardCalculatorViewModel::GetRawDisplayValue()
|
||||
{
|
||||
if (IsInError)
|
||||
{
|
||||
@@ -1654,6 +1621,7 @@ wstring StandardCalculatorViewModel::AddPadding(wstring binaryString)
|
||||
|
||||
void StandardCalculatorViewModel::UpdateProgrammerPanelDisplay()
|
||||
{
|
||||
constexpr int32_t precision = 64;
|
||||
wstring hexDisplayString;
|
||||
wstring decimalDisplayString;
|
||||
wstring octalDisplayString;
|
||||
@@ -1661,8 +1629,7 @@ void StandardCalculatorViewModel::UpdateProgrammerPanelDisplay()
|
||||
if (!IsInError)
|
||||
{
|
||||
// we want the precision to be set to maximum value so that the autoconversions result as desired
|
||||
int32_t precision = 64;
|
||||
if (m_standardCalculatorManager.GetResultForRadix(16, precision) == L"")
|
||||
if ((hexDisplayString = m_standardCalculatorManager.GetResultForRadix(16, precision, true)) == L"")
|
||||
{
|
||||
hexDisplayString = DisplayValue->Data();
|
||||
decimalDisplayString = DisplayValue->Data();
|
||||
@@ -1671,10 +1638,9 @@ void StandardCalculatorViewModel::UpdateProgrammerPanelDisplay()
|
||||
}
|
||||
else
|
||||
{
|
||||
hexDisplayString = m_standardCalculatorManager.GetResultForRadix(16, precision);
|
||||
decimalDisplayString = m_standardCalculatorManager.GetResultForRadix(10, precision);
|
||||
octalDisplayString = m_standardCalculatorManager.GetResultForRadix(8, precision);
|
||||
binaryDisplayString = m_standardCalculatorManager.GetResultForRadix(2, precision);
|
||||
decimalDisplayString = m_standardCalculatorManager.GetResultForRadix(10, precision, true);
|
||||
octalDisplayString = m_standardCalculatorManager.GetResultForRadix(8, precision, true);
|
||||
binaryDisplayString = m_standardCalculatorManager.GetResultForRadix(2, precision, true);
|
||||
}
|
||||
}
|
||||
const auto& localizer = LocalizationSettings::GetInstance();
|
||||
@@ -1693,6 +1659,17 @@ void StandardCalculatorViewModel::UpdateProgrammerPanelDisplay()
|
||||
DecDisplayValue_AutomationName = GetLocalizedStringFormat(m_localizedDecimalAutomationFormat, DecimalDisplayValue);
|
||||
OctDisplayValue_AutomationName = GetLocalizedStringFormat(m_localizedOctalAutomationFormat, GetNarratorStringReadRawNumbers(OctalDisplayValue));
|
||||
BinDisplayValue_AutomationName = GetLocalizedStringFormat(m_localizedBinaryAutomationFormat, GetNarratorStringReadRawNumbers(BinaryDisplayValue));
|
||||
|
||||
auto binaryValueArray = ref new Vector<bool>(64, false);
|
||||
auto binaryValue = m_standardCalculatorManager.GetResultForRadix(2, precision, false);
|
||||
int i = 0;
|
||||
|
||||
// To get bit 0, grab from opposite end of string.
|
||||
for (std::wstring::reverse_iterator it = binaryValue.rbegin(); it != binaryValue.rend(); ++it)
|
||||
{
|
||||
binaryValueArray->SetAt(i++, *it == L'1');
|
||||
}
|
||||
BinaryDigits = binaryValueArray;
|
||||
}
|
||||
|
||||
void StandardCalculatorViewModel::SwitchAngleType(NumbersAndOperatorsEnum num)
|
||||
@@ -1884,3 +1861,44 @@ NarratorAnnouncement ^ StandardCalculatorViewModel::GetDisplayUpdatedNarratorAnn
|
||||
|
||||
return CalculatorAnnouncement::GetDisplayUpdatedAnnouncement(announcement);
|
||||
}
|
||||
|
||||
ViewMode StandardCalculatorViewModel::GetCalculatorMode()
|
||||
{
|
||||
if (IsStandard)
|
||||
{
|
||||
return ViewMode::Standard;
|
||||
}
|
||||
else if (IsScientific)
|
||||
{
|
||||
return ViewMode::Scientific;
|
||||
}
|
||||
return ViewMode::Programmer;
|
||||
}
|
||||
|
||||
void StandardCalculatorViewModel::ValueBitLength::set(CalculatorApp::Common::BitLength value)
|
||||
{
|
||||
if (m_valueBitLength != value)
|
||||
{
|
||||
m_valueBitLength = value;
|
||||
RaisePropertyChanged(L"ValueBitLength");
|
||||
|
||||
switch (value)
|
||||
{
|
||||
case BitLength::BitLengthQWord:
|
||||
ButtonPressed->Execute(NumbersAndOperatorsEnum::Qword);
|
||||
break;
|
||||
case BitLength::BitLengthDWord:
|
||||
ButtonPressed->Execute(NumbersAndOperatorsEnum::Dword);
|
||||
break;
|
||||
case BitLength::BitLengthWord:
|
||||
ButtonPressed->Execute(NumbersAndOperatorsEnum::Word);
|
||||
break;
|
||||
case BitLength::BitLengthByte:
|
||||
ButtonPressed->Execute(NumbersAndOperatorsEnum::Byte);
|
||||
break;
|
||||
}
|
||||
|
||||
// update memory list according to bit length
|
||||
SetMemorizedNumbersString();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user