mirror of
https://github.com/Microsoft/calculator.git
synced 2025-08-20 21:33:10 -07:00
set snapshot
This commit is contained in:
parent
54d891a1ee
commit
2535c75501
4 changed files with 85 additions and 26 deletions
|
@ -37,7 +37,11 @@ namespace
|
||||||
int Command;
|
int Command;
|
||||||
};
|
};
|
||||||
|
|
||||||
CalculatorApp::ViewModel::ICalcManagerIExprCommand ^ CreateExprCommand(const IExpressionCommand* exprCmd) {
|
} // namespace
|
||||||
|
|
||||||
|
namespace CalculatorApp::ViewModel
|
||||||
|
{
|
||||||
|
ICalcManagerIExprCommand ^ CreateExprCommand(const IExpressionCommand* exprCmd) {
|
||||||
switch (exprCmd->GetCommandType())
|
switch (exprCmd->GetCommandType())
|
||||||
{
|
{
|
||||||
case CalculationManager::CommandType::UnaryCommand:
|
case CalculationManager::CommandType::UnaryCommand:
|
||||||
|
@ -81,10 +85,7 @@ namespace
|
||||||
throw std::logic_error{ "unhandled command type." };
|
throw std::logic_error{ "unhandled command type." };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // namespace
|
|
||||||
|
|
||||||
namespace CalculatorApp::ViewModel
|
|
||||||
{
|
|
||||||
CalcManagerHistoryToken::CalcManagerHistoryToken(Platform::String ^ opCodeName, int cmdIndex)
|
CalcManagerHistoryToken::CalcManagerHistoryToken(Platform::String ^ opCodeName, int cmdIndex)
|
||||||
{
|
{
|
||||||
assert(opCodeName != nullptr && "opCodeName is mandatory.");
|
assert(opCodeName != nullptr && "opCodeName is mandatory.");
|
||||||
|
@ -95,14 +96,16 @@ namespace CalculatorApp::ViewModel
|
||||||
CalcManagerHistoryItem::CalcManagerHistoryItem(const CalculationManager::HISTORYITEM& item)
|
CalcManagerHistoryItem::CalcManagerHistoryItem(const CalculationManager::HISTORYITEM& item)
|
||||||
{
|
{
|
||||||
Tokens = ref new Platform::Collections::Vector<CalcManagerHistoryToken ^>();
|
Tokens = ref new Platform::Collections::Vector<CalcManagerHistoryToken ^>();
|
||||||
Commands = ref new Platform::Collections::Vector<ICalcManagerIExprCommand ^>();
|
assert(item.historyItemVector.spTokens != nullptr && "spTokens shall not be null.");
|
||||||
if (item.historyItemVector.spTokens != nullptr)
|
|
||||||
{
|
|
||||||
for (auto& [opCode, cmdIdx] : *item.historyItemVector.spTokens)
|
for (auto& [opCode, cmdIdx] : *item.historyItemVector.spTokens)
|
||||||
{
|
{
|
||||||
Tokens->Append(ref new CalcManagerHistoryToken(ref new Platform::String(opCode.c_str()), cmdIdx));
|
Tokens->Append(ref new CalcManagerHistoryToken(ref new Platform::String(opCode.c_str()), cmdIdx));
|
||||||
// Commands->Append();
|
|
||||||
}
|
}
|
||||||
|
Commands = ref new Platform::Collections::Vector<ICalcManagerIExprCommand ^>();
|
||||||
|
assert(item.historyItemVector.spCommands != nullptr && "spCommands shall not be null.");
|
||||||
|
for (auto& cmd : *item.historyItemVector.spCommands)
|
||||||
|
{
|
||||||
|
Commands->Append(CreateExprCommand(cmd.get()));
|
||||||
}
|
}
|
||||||
Expression = ref new Platform::String(item.historyItemVector.expression.c_str());
|
Expression = ref new Platform::String(item.historyItemVector.expression.c_str());
|
||||||
Result = ref new Platform::String(item.historyItemVector.result.c_str());
|
Result = ref new Platform::String(item.historyItemVector.result.c_str());
|
||||||
|
@ -113,6 +116,7 @@ namespace CalculatorApp::ViewModel
|
||||||
auto& items = calcMgr.GetHistoryItems();
|
auto& items = calcMgr.GetHistoryItems();
|
||||||
if (!items.empty())
|
if (!items.empty())
|
||||||
{
|
{
|
||||||
|
HistoryItems = ref new Platform::Collections::Vector<CalcManagerHistoryItem ^>();
|
||||||
for (auto& item : items)
|
for (auto& item : items)
|
||||||
{
|
{
|
||||||
HistoryItems->Append(ref new CalcManagerHistoryItem(*item));
|
HistoryItems->Append(ref new CalcManagerHistoryItem(*item));
|
||||||
|
@ -127,12 +131,25 @@ namespace CalculatorApp::ViewModel
|
||||||
IsError = isError;
|
IsError = isError;
|
||||||
}
|
}
|
||||||
|
|
||||||
ExpressionDisplaySnapshot::ExpressionDisplaySnapshot(const std::vector<CalcHistoryToken>& tokens)
|
ExpressionDisplaySnapshot::ExpressionDisplaySnapshot(
|
||||||
|
const std::vector<CalcHistoryToken>& tokens,
|
||||||
|
const std::vector<std::shared_ptr<IExpressionCommand>>& commands)
|
||||||
{
|
{
|
||||||
Tokens = ref new Platform::Collections::Vector<CalcManagerHistoryToken ^>();
|
Tokens = ref new Platform::Collections::Vector<CalcManagerHistoryToken ^>();
|
||||||
for (auto& [opCode, cmdIdx] : tokens)
|
for (auto& [opCode, cmdIdx] : tokens)
|
||||||
{
|
{
|
||||||
Tokens->Append(ref new CalcManagerHistoryToken(ref new Platform::String(opCode.c_str()), cmdIdx));
|
Tokens->Append(ref new CalcManagerHistoryToken(ref new Platform::String(opCode.c_str()), cmdIdx));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Commands = ref new Platform::Collections::Vector<ICalcManagerIExprCommand ^>();
|
||||||
|
for (auto& cmd : commands)
|
||||||
|
{
|
||||||
|
Commands->Append(CreateExprCommand(cmd.get()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<std::shared_ptr<CalculationManager::HISTORYITEM>> ToUnderlying(Windows::Foundation::Collections::IVector<CalcManagerHistoryItem ^> ^ items)
|
||||||
|
{
|
||||||
|
return {}; // TODO
|
||||||
|
}
|
||||||
|
} // namespace CalculatorApp::ViewModel
|
||||||
|
|
|
@ -2,6 +2,9 @@
|
||||||
// Licensed under the MIT License.
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include <vector>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include "CalcManager/CalculatorManager.h"
|
#include "CalcManager/CalculatorManager.h"
|
||||||
|
|
||||||
namespace CalculatorApp::ViewModel
|
namespace CalculatorApp::ViewModel
|
||||||
|
@ -56,11 +59,11 @@ public
|
||||||
ref struct ExpressionDisplaySnapshot sealed
|
ref struct ExpressionDisplaySnapshot sealed
|
||||||
{
|
{
|
||||||
property Windows::Foundation::Collections::IVector<CalcManagerHistoryToken ^> ^ Tokens;
|
property Windows::Foundation::Collections::IVector<CalcManagerHistoryToken ^> ^ Tokens;
|
||||||
// TODO: commands
|
property Windows::Foundation::Collections::IVector<ICalcManagerIExprCommand ^> ^ Commands;
|
||||||
|
|
||||||
internal :;
|
internal :;
|
||||||
using CalcHistoryToken = std::pair<std::wstring, int>;
|
using CalcHistoryToken = std::pair<std::wstring, int>;
|
||||||
explicit ExpressionDisplaySnapshot(const std::vector<CalcHistoryToken>& tokens);
|
explicit ExpressionDisplaySnapshot(const std::vector<CalcHistoryToken>& tokens, const std::vector<std::shared_ptr<IExpressionCommand>>& commands);
|
||||||
};
|
};
|
||||||
|
|
||||||
public
|
public
|
||||||
|
@ -69,6 +72,10 @@ public
|
||||||
property CalcManagerSnapshot ^ CalcManager; // mandatory
|
property CalcManagerSnapshot ^ CalcManager; // mandatory
|
||||||
property PrimaryDisplaySnapshot ^ PrimaryDisplay; // mandatory
|
property PrimaryDisplaySnapshot ^ PrimaryDisplay; // mandatory
|
||||||
property ExpressionDisplaySnapshot ^ ExpressionDisplay; // optional
|
property ExpressionDisplaySnapshot ^ ExpressionDisplay; // optional
|
||||||
property Windows::Foundation::Collections::IVector<ICalcManagerIExprCommand ^> ^ Commands; // mandatory
|
property Windows::Foundation::Collections::IVector<ICalcManagerIExprCommand ^> ^ DisplayCommands; // mandatory
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ICalcManagerIExprCommand ^ CreateExprCommand(const IExpressionCommand* exprCmd);
|
||||||
|
std::vector<std::shared_ptr<CalculationManager::HISTORYITEM>> ToUnderlying(Windows::Foundation::Collections::IVector<CalcManagerHistoryItem ^> ^ items);
|
||||||
|
|
||||||
} // namespace CalculatorApp::ViewModel
|
} // namespace CalculatorApp::ViewModel
|
||||||
|
|
|
@ -115,7 +115,7 @@ namespace CalculatorResourceKeys
|
||||||
StringReference DisplayCopied(L"Display_Copied");
|
StringReference DisplayCopied(L"Display_Copied");
|
||||||
}
|
}
|
||||||
|
|
||||||
StandardCalculatorViewModel::StandardCalculatorViewModel()
|
StandardCalculatorViewModel::StandardCalculatorViewModel(StandardCalculatorSnapshot ^ snapshot)
|
||||||
: m_DisplayValue(L"0")
|
: m_DisplayValue(L"0")
|
||||||
, m_DecimalDisplayValue(L"0")
|
, m_DecimalDisplayValue(L"0")
|
||||||
, m_HexDisplayValue(L"0")
|
, m_HexDisplayValue(L"0")
|
||||||
|
@ -183,6 +183,33 @@ StandardCalculatorViewModel::StandardCalculatorViewModel()
|
||||||
IsNegateEnabled = true;
|
IsNegateEnabled = true;
|
||||||
IsDecimalEnabled = true;
|
IsDecimalEnabled = true;
|
||||||
AreProgrammerRadixOperatorsVisible = false;
|
AreProgrammerRadixOperatorsVisible = false;
|
||||||
|
|
||||||
|
if (snapshot != nullptr)
|
||||||
|
{
|
||||||
|
if (snapshot->CalcManager->HistoryItems != nullptr)
|
||||||
|
{
|
||||||
|
m_standardCalculatorManager.SetHistoryItems(ToUnderlying(snapshot->CalcManager->HistoryItems));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<int> commands;
|
||||||
|
if (snapshot->ExpressionDisplay != nullptr && snapshot->ExpressionDisplay->Tokens->GetAt(snapshot->ExpressionDisplay->Tokens->Size))
|
||||||
|
{
|
||||||
|
// commands = GetCommandsFromExpressionCommands(Snapshot->ExpressionDisplay->Commands);
|
||||||
|
}
|
||||||
|
if (commands.empty() && snapshot->DisplayCommands->Size > 0)
|
||||||
|
{
|
||||||
|
// commands = GetCommandsFromExpressionCommands(snapshot->DisplayCommands);
|
||||||
|
}
|
||||||
|
for (auto cmd : commands)
|
||||||
|
{
|
||||||
|
m_standardCalculatorManager.SendCommand(static_cast<Command>(cmd));
|
||||||
|
}
|
||||||
|
if (snapshot->ExpressionDisplay != nullptr)
|
||||||
|
{
|
||||||
|
// SetExpressionDisplay();
|
||||||
|
}
|
||||||
|
// SetPrimaryDisplay();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String ^ StandardCalculatorViewModel::LocalizeDisplayValue(_In_ wstring const& displayValue)
|
String ^ StandardCalculatorViewModel::LocalizeDisplayValue(_In_ wstring const& displayValue)
|
||||||
|
@ -1792,9 +1819,15 @@ StandardCalculatorSnapshot ^ StandardCalculatorViewModel::GetSnapshot() const
|
||||||
auto result = ref new StandardCalculatorSnapshot();
|
auto result = ref new StandardCalculatorSnapshot();
|
||||||
result->CalcManager = ref new CalcManagerSnapshot(m_standardCalculatorManager);
|
result->CalcManager = ref new CalcManagerSnapshot(m_standardCalculatorManager);
|
||||||
result->PrimaryDisplay = ref new PrimaryDisplaySnapshot(m_DisplayValue, m_IsInError);
|
result->PrimaryDisplay = ref new PrimaryDisplaySnapshot(m_DisplayValue, m_IsInError);
|
||||||
result->ExpressionDisplay = ref new ExpressionDisplaySnapshot(*m_tokens);
|
result->ExpressionDisplay = ref new ExpressionDisplaySnapshot(*m_tokens, *m_commands);
|
||||||
|
result->DisplayCommands = ref new Platform::Collections::Vector<ICalcManagerIExprCommand ^>();
|
||||||
|
for (auto cmd : m_standardCalculatorManager.GetDisplayCommandsSnapshot())
|
||||||
|
{
|
||||||
|
result->DisplayCommands->Append(CreateExprCommand(cmd.get()));
|
||||||
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// StandardCalculatorSnapshot StandardCalculatorViewModel::GetStandardCalculatorSnapshot() const
|
// StandardCalculatorSnapshot StandardCalculatorViewModel::GetStandardCalculatorSnapshot() const
|
||||||
//{
|
//{
|
||||||
// StandardCalculatorSnapshot snapshot;
|
// StandardCalculatorSnapshot snapshot;
|
||||||
|
|
|
@ -65,7 +65,6 @@ namespace CalculatorApp
|
||||||
[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
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
StandardCalculatorViewModel();
|
|
||||||
void UpdateOperand(int pos, Platform::String ^ text);
|
void UpdateOperand(int pos, Platform::String ^ text);
|
||||||
|
|
||||||
OBSERVABLE_OBJECT_CALLBACK(OnPropertyChanged);
|
OBSERVABLE_OBJECT_CALLBACK(OnPropertyChanged);
|
||||||
|
@ -269,10 +268,12 @@ namespace CalculatorApp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
property StandardCalculatorSnapshot ^ Snapshot { StandardCalculatorSnapshot ^ get() { return GetSnapshot(); } }
|
property StandardCalculatorSnapshot
|
||||||
|
^ Snapshot { StandardCalculatorSnapshot ^ get() { return GetSnapshot(); } }
|
||||||
|
|
||||||
// Used by unit tests
|
// Used by unit tests
|
||||||
void ResetCalcManager(bool clearMemory);
|
void
|
||||||
|
ResetCalcManager(bool clearMemory);
|
||||||
void SendCommandToCalcManager(int command);
|
void SendCommandToCalcManager(int command);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -325,7 +326,8 @@ namespace CalculatorApp
|
||||||
return m_CurrentAngleType;
|
return m_CurrentAngleType;
|
||||||
}
|
}
|
||||||
|
|
||||||
// void SetStandardCalculatorSnapshot(const StandardCalculatorSnapshot& state);
|
internal :;
|
||||||
|
explicit StandardCalculatorViewModel(StandardCalculatorSnapshot ^ snapshot = nullptr);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
StandardCalculatorSnapshot ^ GetSnapshot() const;
|
StandardCalculatorSnapshot ^ GetSnapshot() const;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue