From 2b0521eb590fdf67740b312fade3f3029e79254c Mon Sep 17 00:00:00 2001 From: "Tian L." <60599517+tian-lt@users.noreply.github.com> Date: Mon, 18 Nov 2024 18:34:12 +0800 Subject: [PATCH] Resolve an existing defect when restoring from snapshots (#2249) * fix bug * fix a comment --- .../StandardCalculatorViewModel.cpp | 65 +++++++++++++------ 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/src/CalcViewModel/StandardCalculatorViewModel.cpp b/src/CalcViewModel/StandardCalculatorViewModel.cpp index ef440992..d4be2d64 100644 --- a/src/CalcViewModel/StandardCalculatorViewModel.cpp +++ b/src/CalcViewModel/StandardCalculatorViewModel.cpp @@ -1813,30 +1813,53 @@ void CalculatorApp::ViewModel::StandardCalculatorViewModel::Snapshot::set(Calcul m_standardCalculatorManager.SetHistoryItems(ToUnderlying(snapshot->CalcManager->HistoryItems)); } - std::vector commands; - if (snapshot->ExpressionDisplay != nullptr && snapshot->ExpressionDisplay->Tokens->GetAt(snapshot->ExpressionDisplay->Tokens->Size - 1)->OpCodeName == L"=") - { - commands = GetCommandsFromExpressionCommands(ToUnderlying(snapshot->ExpressionDisplay->Commands)); - } - if (commands.empty() && snapshot->DisplayCommands->Size > 0) - { - commands = GetCommandsFromExpressionCommands(ToUnderlying(snapshot->DisplayCommands)); - } - for (auto cmd : commands) - { - m_standardCalculatorManager.SendCommand(static_cast(cmd)); - } if (snapshot->ExpressionDisplay != nullptr) { - using RawTokenCollection = std::vector>; - RawTokenCollection rawTokens; - for (CalculatorApp::ViewModel::Snapshot::CalcManagerToken ^ token : snapshot->ExpressionDisplay->Tokens) + if (snapshot->DisplayCommands->Size == 0) { - rawTokens.push_back(std::pair{ token->OpCodeName->Data(), token->CommandIndex }); + // use case: the current expression was evaluated before. load from history. + assert(!snapshot->PrimaryDisplay->IsError); + using RawTokenCollection = std::vector>; + RawTokenCollection rawTokens; + for (CalculatorApp::ViewModel::Snapshot::CalcManagerToken ^ token : snapshot->ExpressionDisplay->Tokens) + { + rawTokens.push_back(std::pair{ token->OpCodeName->Data(), token->CommandIndex }); + } + auto tokens = std::make_shared(rawTokens); + auto commands = std::make_shared>>(ToUnderlying(snapshot->ExpressionDisplay->Commands)); + SetHistoryExpressionDisplay(tokens, commands); + SetExpressionDisplay(tokens, commands); + SetPrimaryDisplay(snapshot->PrimaryDisplay->DisplayValue, false); + } + else + { + // use case: the current expression was not evaluated before, or it was an error. + auto displayCommands = GetCommandsFromExpressionCommands(ToUnderlying(snapshot->DisplayCommands)); + for (auto cmd : displayCommands) + { + m_standardCalculatorManager.SendCommand(static_cast(cmd)); + } + if (snapshot->PrimaryDisplay->IsError) + { + SetPrimaryDisplay(snapshot->PrimaryDisplay->DisplayValue, true); + } + } + } + else + { + if (snapshot->PrimaryDisplay->IsError) + { + // use case: user copy-pasted an invalid expression to Calculator and caused an error. + SetPrimaryDisplay(snapshot->PrimaryDisplay->DisplayValue, true); + } + else + { + // use case: there was no expression but user was inputing some numbers (including negative numbers). + auto commands = GetCommandsFromExpressionCommands(ToUnderlying(snapshot->DisplayCommands)); + for (auto cmd : commands) + { + m_standardCalculatorManager.SendCommand(static_cast(cmd)); + } } - SetExpressionDisplay( - std::make_shared(rawTokens), - std::make_shared>>(ToUnderlying(snapshot->ExpressionDisplay->Commands))); } - SetPrimaryDisplay(snapshot->PrimaryDisplay->DisplayValue, snapshot->PrimaryDisplay->IsError); }