From 799cc4916be4ab04f4897c7f83b1da9c951d599c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Laban?= Date: Thu, 16 May 2019 16:39:17 -0400 Subject: [PATCH 1/6] Add support for SetExpressionDisplay --- src/CalcManager/CCalcManager.cpp | 166 ++++++++++-------- src/CalcManager/CCalcManager.h | 20 +-- .../CalcManager/CalculatorManager.Interop.cs | 10 +- .../CalcManager/CalculatorManager.cs | 2 +- .../CalcManager/ExpressionCommandInterface.cs | 12 +- .../ExpressionItemTemplateSelector.cs | 2 +- .../ViewModels/StandardCalculatorViewModel.cs | 2 +- src/Calculator.Shared/Views/Calculator.xaml | 2 +- 8 files changed, 111 insertions(+), 105 deletions(-) diff --git a/src/CalcManager/CCalcManager.cpp b/src/CalcManager/CCalcManager.cpp index 9f8393e2..eab5ad20 100644 --- a/src/CalcManager/CCalcManager.cpp +++ b/src/CalcManager/CCalcManager.cpp @@ -75,11 +75,20 @@ public: } virtual void SetExpressionDisplay( - std::shared_ptr>> const& /*tokens*/, - std::shared_ptr>> const& /*commands*/) override + std::shared_ptr>> const& tokens, + std::shared_ptr>> const& commands) override { printf("Native:SetExpressionDisplay()\n"); + auto item = std::make_shared(); + item->historyItemVector.expression = L""; + item->historyItemVector.result = L""; + item->historyItemVector.spCommands = commands; + item->historyItemVector.spTokens = tokens; + + auto pItem = MarshalHistoryItem(item); + + _params.SetExpressionDisplay(_params.CalculatorState, pItem); } virtual void SetParenthesisNumber(unsigned int count) override @@ -182,6 +191,83 @@ const wchar_t* ToWChar(std::wstring& str) return out; } +GetHistoryItemResult* MarshalHistoryItem(std::shared_ptr& historyItem) +{ + auto itemResult = new GetHistoryItemResult{}; + + itemResult->expression = ToWChar(historyItem->historyItemVector.expression); + itemResult->result = ToWChar(historyItem->historyItemVector.result); + + unsigned int tokenCount; + historyItem->historyItemVector.spTokens->GetSize(&tokenCount); + itemResult->TokenCount = tokenCount; + + // + // Marshal Tokens + // + auto tokenStrings = new const wchar_t* [tokenCount] {}; + auto tokenValues = new int32_t[tokenCount]{}; + + // DBGPRINT(L"TokenCount: %d (int32_t: %d)\n", tokenCount, sizeof(int32_t)); + + for (uint32_t j = 0; j < tokenCount; j++) + { + std::pair pair; + + if (SUCCEEDED(historyItem->historyItemVector.spTokens->GetAt(j, &pair))) + { + tokenStrings[j] = ToWChar(pair.first); + tokenValues[j] = (int32_t)pair.second; + // DBGPRINT(L"\tPair: %ws;%d\n", pair.first.data(), tokenValues[j]); + } + } + + itemResult->TokenStrings = tokenStrings; + itemResult->TokenValues = tokenValues; + + // + // Marshal Commands + // + unsigned int commandCount; + historyItem->historyItemVector.spCommands->GetSize(&commandCount); + itemResult->CommandCount = commandCount; + + auto commands = new void* [commandCount] {}; + + for (uint32_t commandId = 0; commandId < commandCount; commandId++) + { + std::shared_ptr command; + if (SUCCEEDED(historyItem->historyItemVector.spCommands->GetAt(commandId, &command))) + { + commands[commandId] = command.get(); + } + } + + itemResult->Commands = commands; + + return itemResult; +} + +void* MarshalHistoryItems(std::vector>& historyItems) +{ + auto result = new GetHistoryItemsResult{}; + + result->ItemsCount = (int32_t)historyItems.size(); + + auto resultsArray = new GetHistoryItemResult*[result->ItemsCount]; + result->HistoryItems = (void*)resultsArray; + + for (size_t i = 0; i < historyItems.size(); i++) + { + auto historyItem = historyItems[i]; + + resultsArray[i] = MarshalHistoryItem(historyItem); + } + + return result; +} + + void* CalculatorManager_Create(CalculatorManager_CreateParams* pParams) { auto calcDisplay = new CalcDisplay(*pParams); @@ -316,82 +402,6 @@ void CalculatorManager_SetInHistoryItemLoadMode(void* manager, bool isHistoryIte AsManager(manager)->SetInHistoryItemLoadMode(isHistoryItemLoadMode); } -GetHistoryItemResult* MarshalHistoryItem(std::shared_ptr& historyItem) -{ - auto itemResult = new GetHistoryItemResult{}; - - itemResult->expression = ToWChar(historyItem->historyItemVector.expression); - itemResult->result = ToWChar(historyItem->historyItemVector.result); - - unsigned int tokenCount; - historyItem->historyItemVector.spTokens->GetSize(&tokenCount); - itemResult->TokenCount = tokenCount; - - // - // Marshal Tokens - // - auto tokenStrings = new const wchar_t* [tokenCount] {}; - auto tokenValues = new int32_t[tokenCount]{}; - - // DBGPRINT(L"TokenCount: %d (int32_t: %d)\n", tokenCount, sizeof(int32_t)); - - for (uint32_t j = 0; j < tokenCount; j++) - { - std::pair pair; - - if (SUCCEEDED(historyItem->historyItemVector.spTokens->GetAt(j, &pair))) - { - tokenStrings[j] = ToWChar(pair.first); - tokenValues[j] = (int32_t)pair.second; - // DBGPRINT(L"\tPair: %ws;%d\n", pair.first.data(), tokenValues[j]); - } - } - - itemResult->TokenStrings = tokenStrings; - itemResult->TokenValues = tokenValues; - - // - // Marshal Commands - // - unsigned int commandCount; - historyItem->historyItemVector.spCommands->GetSize(&commandCount); - itemResult->CommandCount = commandCount; - - auto commands = new void*[commandCount]{}; - - for (uint32_t commandId = 0; commandId < commandCount; commandId++) - { - std::shared_ptr command; - if (SUCCEEDED(historyItem->historyItemVector.spCommands->GetAt(commandId, &command))) - { - commands[commandId] = command.get(); - } - } - - itemResult->Commands = commands; - - return itemResult; -} - -void* MarshalHistoryItems(std::vector>& historyItems) -{ - auto result = new GetHistoryItemsResult{}; - - result->ItemsCount = (int32_t)historyItems.size(); - - auto resultsArray = new GetHistoryItemResult*[result->ItemsCount]; - result->HistoryItems = (void*)resultsArray; - - for (size_t i = 0; i < historyItems.size(); i++) - { - auto historyItem = historyItems[i]; - - resultsArray[i] = MarshalHistoryItem(historyItem); - } - - return result; -} - void* CalculatorManager_GetHistoryItems(void* manager) { auto historyItems = AsManager(manager)->GetHistoryItems(); diff --git a/src/CalcManager/CCalcManager.h b/src/CalcManager/CCalcManager.h index 76cf983d..4eb4e663 100644 --- a/src/CalcManager/CCalcManager.h +++ b/src/CalcManager/CCalcManager.h @@ -6,23 +6,12 @@ #include "headers/Rational.h" #include "headers/ICalcDisplay.h" - -struct TokenPair { - char* Item1; - int Item2; -}; - -struct ExpressionDisplayData { - int TokenCount; - TokenPair* Tokens; - - int CommandCount; - void* Commands; -}; +struct GetHistoryItemResult; +struct GetHistoryItemsResult; typedef void (*SetPrimaryDisplayFunc)(void* state, const char* text, bool isError); typedef void (*SetIsInErrorFunc)(void* state, bool isInError); -typedef void (*SetExpressionDisplayFunc)(void* state, ExpressionDisplayData* data); +typedef void (*SetExpressionDisplayFunc)(void* state, GetHistoryItemResult* data); typedef void (*SetParenthesisNumberFunc)(void* state, unsigned int count); typedef void (*OnNoRightParenAddedFunc)(void* state); typedef void (*MaxDigitsReachedFunc)(void* state); @@ -57,6 +46,9 @@ struct CalculatorManager_CreateParams { #define DLL_EXPORT __declspec(dllexport) #endif +GetHistoryItemResult* MarshalHistoryItem(std::shared_ptr& historyItem); +void* MarshalHistoryItems(std::vector>& historyItems); + extern "C" { struct GetHistoryItemsResult diff --git a/src/Calculator.Shared/CalcManager/CalculatorManager.Interop.cs b/src/Calculator.Shared/CalcManager/CalculatorManager.Interop.cs index d66d1a09..11e382ab 100644 --- a/src/Calculator.Shared/CalcManager/CalculatorManager.Interop.cs +++ b/src/Calculator.Shared/CalcManager/CalculatorManager.Interop.cs @@ -106,7 +106,7 @@ namespace CalculationManager public delegate void MemoryItemChangedCallbackFunc(IntPtr state, int indexOfMemory); public delegate void OnHistoryItemAddedCallbackFunc(IntPtr state, int addedItemIndex); public delegate void OnNoRightParenAddedCallbackFunc(IntPtr state); - public delegate void SetExpressionDisplayCallbackFunc(IntPtr state); + public delegate void SetExpressionDisplayCallbackFunc(IntPtr state, IntPtr data); public delegate void SetMemorizedNumbersCallbackFunc(IntPtr state, int count, IntPtr newMemorizedNumbers); public static GetCEngineStringFunc _getCEngineStringCallback = GetCEngineStringCallback; @@ -154,10 +154,14 @@ namespace CalculationManager Debug.WriteLine($"CalculatorManager.OnNoRightParenAddedCallback"); } - public static void SetExpressionDisplayCallback(IntPtr state) + public static void SetExpressionDisplayCallback(IntPtr state, IntPtr historyItem) { var manager = GCHandle.FromIntPtr((IntPtr)state).Target as CalculatorDisplay; - // manager.SetExpressionDisplay(); + + var nativeResult = Marshal.PtrToStructure(historyItem); + var itemResult = CalculatorManager.UnmarshalHistoryItemResult(nativeResult); + + manager.SetExpressionDisplay(itemResult.historyItemVector.spTokens, itemResult.historyItemVector.spCommands); Debug.WriteLine($"CalculatorManager.SetExpressionDisplayCallback"); } diff --git a/src/Calculator.Shared/CalcManager/CalculatorManager.cs b/src/Calculator.Shared/CalcManager/CalculatorManager.cs index f76b1ad2..a3937fae 100644 --- a/src/Calculator.Shared/CalcManager/CalculatorManager.cs +++ b/src/Calculator.Shared/CalcManager/CalculatorManager.cs @@ -248,7 +248,7 @@ namespace CalculationManager return output; } - private static HISTORYITEM UnmarshalHistoryItemResult(GetHistoryItemResult historyResultItem) + internal static HISTORYITEM UnmarshalHistoryItemResult(GetHistoryItemResult historyResultItem) { var historyItem = new HISTORYITEM(); historyItem.historyItemVector.expression = historyResultItem.expression; diff --git a/src/Calculator.Shared/CalcManager/ExpressionCommandInterface.cs b/src/Calculator.Shared/CalcManager/ExpressionCommandInterface.cs index fd052726..6a9eaae9 100644 --- a/src/Calculator.Shared/CalcManager/ExpressionCommandInterface.cs +++ b/src/Calculator.Shared/CalcManager/ExpressionCommandInterface.cs @@ -67,8 +67,8 @@ namespace CalculationManager public CParentheses(IntPtr pExpressionCommand) => this.pExpressionCommand = pExpressionCommand; public int GetCommand() => throw new NotImplementedException(); - public CalculationManager.CommandType GetCommandType() => throw new NotImplementedException(); - public void Accept(ISerializeCommandVisitor commandVisitor) => throw new NotImplementedException(); + public CalculationManager.CommandType GetCommandType() => CommandType.Parentheses; + public void Accept(ISerializeCommandVisitor commandVisitor) => throw new NotImplementedException(); } public class CUnaryCommand : IUnaryCommand @@ -80,8 +80,8 @@ namespace CalculationManager public CUnaryCommand(int command) => throw new NotImplementedException(); public CUnaryCommand(int command1, int command2) => throw new NotImplementedException(); public CalculatorList GetCommands() => throw new NotImplementedException(); - public CalculationManager.CommandType GetCommandType() => throw new NotImplementedException(); - public void SetCommand(int command) => throw new NotImplementedException(); + public CalculationManager.CommandType GetCommandType() => CommandType.UnaryCommand; + public void SetCommand(int command) => throw new NotImplementedException(); public void SetCommands(int command1, int command2) => throw new NotImplementedException(); public void Accept(ISerializeCommandVisitor commandVisitor) => throw new NotImplementedException(); } @@ -95,7 +95,7 @@ namespace CalculationManager public CBinaryCommand(int command) => throw new NotImplementedException(); public void SetCommand(int command) => throw new NotImplementedException(); public int GetCommand() => throw new NotImplementedException(); - public CommandType GetCommandType() => throw new NotImplementedException(); + public CalculationManager.CommandType GetCommandType() => CommandType.BinaryCommand; public void Accept(ISerializeCommandVisitor commandVisitor) => throw new NotImplementedException(); } @@ -117,7 +117,7 @@ namespace CalculationManager public bool IsSciFmt() => throw new NotImplementedException(); public bool IsDecimalPresent() => throw new NotImplementedException(); public string GetToken(char decimalSymbol) => throw new NotImplementedException(); - public CalculationManager.CommandType GetCommandType() => throw new NotImplementedException(); + public CalculationManager.CommandType GetCommandType() => CommandType.OperandCommand; public void Accept(ISerializeCommandVisitor commandVisitor) => throw new NotImplementedException(); public string GetString(uint radix, int precision) => throw new NotImplementedException(); } diff --git a/src/Calculator.Shared/Converters/ExpressionItemTemplateSelector.cs b/src/Calculator.Shared/Converters/ExpressionItemTemplateSelector.cs index c1e56077..6e061742 100644 --- a/src/Calculator.Shared/Converters/ExpressionItemTemplateSelector.cs +++ b/src/Calculator.Shared/Converters/ExpressionItemTemplateSelector.cs @@ -11,7 +11,7 @@ namespace CalculatorApp [Windows.UI.Xaml.Data.Bindable] public sealed class ExpressionItemTemplateSelector : Windows.UI.Xaml.Controls.DataTemplateSelector { - Windows.UI.Xaml.DataTemplate SelectTemplateCore(object item, Windows.UI.Xaml.DependencyObject container) + protected override Windows.UI.Xaml.DataTemplate SelectTemplateCore(object item, Windows.UI.Xaml.DependencyObject container) { DisplayExpressionToken token = (DisplayExpressionToken)(item); if (token != null) diff --git a/src/Calculator.Shared/ViewModels/StandardCalculatorViewModel.cs b/src/Calculator.Shared/ViewModels/StandardCalculatorViewModel.cs index 92b64cc2..2e27efba 100644 --- a/src/Calculator.Shared/ViewModels/StandardCalculatorViewModel.cs +++ b/src/Calculator.Shared/ViewModels/StandardCalculatorViewModel.cs @@ -830,7 +830,7 @@ namespace CalculatorApp.ViewModel else { var expressionToken = new DisplayExpressionToken(currentTokenString, i, isEditable, type); - m_ExpressionTokens.Append(expressionToken); + m_ExpressionTokens.Add(expressionToken); } } } diff --git a/src/Calculator.Shared/Views/Calculator.xaml b/src/Calculator.Shared/Views/Calculator.xaml index 4e5f78a7..c86ca1a7 100644 --- a/src/Calculator.Shared/Views/Calculator.xaml +++ b/src/Calculator.Shared/Views/Calculator.xaml @@ -969,7 +969,7 @@ IsOperatorCommand="{x:Bind Model.IsOperatorCommand, Mode=OneWay}" TabIndex="1" /> Date: Fri, 17 May 2019 10:52:22 -0400 Subject: [PATCH 2/6] Remove debug information --- src/CalcManager/CCalcManager.cpp | 38 ++++++++++-------- src/CalcManager/CalcManager.wasm | Bin 960212 -> 960742 bytes .../CalcManager/CalculatorManager.Interop.cs | 28 ++++++++----- 3 files changed, 39 insertions(+), 27 deletions(-) diff --git a/src/CalcManager/CCalcManager.cpp b/src/CalcManager/CCalcManager.cpp index eab5ad20..efb1e834 100644 --- a/src/CalcManager/CCalcManager.cpp +++ b/src/CalcManager/CCalcManager.cpp @@ -10,7 +10,8 @@ #include #include -#if !defined(__EMSCRIPTEN__) +#if !DEBUG +#if defined(_WINDOWS_) #include #include @@ -25,23 +26,28 @@ VOID _DBGPRINT(LPCWSTR kwszFunction, INT iLineNumber, LPCWSTR kwszDebugFormatStr va_start(args, kwszDebugFormatString); - cbFormatString = _scwprintf(L"[%s:%d] ", kwszFunction, iLineNumber) * sizeof(WCHAR); - cbFormatString += _vscwprintf(kwszDebugFormatString, args) * sizeof(WCHAR) + 2; + cbFormatString = _scwDBGPRINT(L"[%s:%d] ", kwszFunction, iLineNumber) * sizeof(WCHAR); + cbFormatString += _vscwDBGPRINT(kwszDebugFormatString, args) * sizeof(WCHAR) + 2; /* Depending on the size of the format string, allocate space on the stack or the heap. */ wszDebugString = (PWCHAR)_malloca(cbFormatString); /* Populate the buffer with the contents of the format string. */ - StringCbPrintfW(wszDebugString, cbFormatString, L"[%s:%d] ", kwszFunction, iLineNumber); + StringCbDBGPRINTW(wszDebugString, cbFormatString, L"[%s:%d] ", kwszFunction, iLineNumber); StringCbLengthW(wszDebugString, cbFormatString, &st_Offset); - StringCbVPrintfW(&wszDebugString[st_Offset / sizeof(WCHAR)], cbFormatString - st_Offset, kwszDebugFormatString, args); + StringCbVDBGPRINTW(&wszDebugString[st_Offset / sizeof(WCHAR)], cbFormatString - st_Offset, kwszDebugFormatString, args); OutputDebugStringW(wszDebugString); _freea(wszDebugString); va_end(args); } +#elif defined(__EMSCRIPTEN__) +#define DBGPRINT(kwszDebugFormatString, ...) printf(kwszDebugFormatString, ##__VA_ARGS__); #endif +#else +#define DBGPRINT(kwszDebugFormatString, ...) +#endif // DEBUG using namespace CalculationManager; @@ -62,14 +68,14 @@ public: std::wstring_convert> convert; auto str = convert.to_bytes(pszText); - printf("Native:SetPrimaryDisplay(%ls, %d)\n", pszText.data(), isError); + DBGPRINT("Native:SetPrimaryDisplay(%ls, %d)\n", pszText.data(), isError); _params.SetPrimaryDisplay(_params.CalculatorState, str.data(), isError); } virtual void SetIsInError(bool isInError) override { - printf("Native:SetIsInError(%d)\n", isInError); + DBGPRINT("Native:SetIsInError(%d)\n", isInError); _params.SetIsInError(_params.CalculatorState, isInError); } @@ -78,7 +84,7 @@ public: std::shared_ptr>> const& tokens, std::shared_ptr>> const& commands) override { - printf("Native:SetExpressionDisplay()\n"); + DBGPRINT("Native:SetExpressionDisplay()\n"); auto item = std::make_shared(); item->historyItemVector.expression = L""; @@ -93,38 +99,38 @@ public: virtual void SetParenthesisNumber(unsigned int count) override { - printf("Native:SetParenthesisNumber(%d)\n", count); + DBGPRINT("Native:SetParenthesisNumber(%d)\n", count); _params.SetParenthesisNumber(_params.CalculatorState, count); } virtual void OnNoRightParenAdded() override { - printf("Native:OnNoRightParenAdded()\n"); + DBGPRINT("Native:OnNoRightParenAdded()\n"); _params.OnNoRightParenAdded(_params.CalculatorState); } virtual void MaxDigitsReached() override { - printf("Native:MaxDigitsReached()\n"); + DBGPRINT("Native:MaxDigitsReached()\n"); _params.MaxDigitsReached(_params.CalculatorState); } virtual void BinaryOperatorReceived() override { - printf("Native:BinaryOperatorReceived()\n"); + DBGPRINT("Native:BinaryOperatorReceived()\n"); _params.BinaryOperatorReceived(_params.CalculatorState); } virtual void OnHistoryItemAdded(unsigned int addedItemIndex) override { - printf("Native:OnHistoryItemAdded(%d)\n", addedItemIndex); + DBGPRINT("Native:OnHistoryItemAdded(%d)\n", addedItemIndex); _params.OnHistoryItemAdded(_params.CalculatorState, addedItemIndex); } virtual void SetMemorizedNumbers(const std::vector& memorizedNumbers) override { - printf("Native:SetMemorizedNumbers(%d)\n", (int)memorizedNumbers.size()); + DBGPRINT("Native:SetMemorizedNumbers(%d)\n", (int)memorizedNumbers.size()); auto numbers = new const wchar_t* [memorizedNumbers.size()] {}; @@ -148,7 +154,7 @@ public: virtual void MemoryItemChanged(unsigned int indexOfMemory) override { - printf("Native:MemoryItemChanged(%d)\n", indexOfMemory); + DBGPRINT("Native:MemoryItemChanged(%d)\n", indexOfMemory); _params.MemoryItemChanged(_params.CalculatorState, indexOfMemory); } @@ -169,7 +175,7 @@ public: { auto pResult = _params.GetCEngineString(_params.ResourceState, id.data()); auto str = std::wstring(pResult); - printf("Native:GetCEngineString(id=%ls, str.data()=%ls)\n", id.data(), str.data()); + DBGPRINT("Native:GetCEngineString(id=%ls, str.data()=%ls)\n", id.data(), str.data()); return str; } }; diff --git a/src/CalcManager/CalcManager.wasm b/src/CalcManager/CalcManager.wasm index 873bff551c0352184bf041ec6c6ee16024bf6861..7ba36e0683b13dc9da293d620ae0b5e7e81d0655 100644 GIT binary patch delta 19276 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 D&xjKX diff --git a/src/Calculator.Shared/CalcManager/CalculatorManager.Interop.cs b/src/Calculator.Shared/CalcManager/CalculatorManager.Interop.cs index 11e382ab..009198e3 100644 --- a/src/Calculator.Shared/CalcManager/CalculatorManager.Interop.cs +++ b/src/Calculator.Shared/CalcManager/CalculatorManager.Interop.cs @@ -127,7 +127,7 @@ namespace CalculationManager var manager = GCHandle.FromIntPtr((IntPtr)state).Target as CalculatorDisplay; manager.MaxDigitsReached(); - Debug.WriteLine($"CalculatorManager.MaxDigitsReachedCallback"); + DebugTrace($"CalculatorManager.MaxDigitsReachedCallback"); } public static void MemoryItemChangedCallback(IntPtr state, int indexOfMemory) @@ -135,7 +135,7 @@ namespace CalculationManager var manager = GCHandle.FromIntPtr((IntPtr)state).Target as CalculatorDisplay; manager.MemoryItemChanged(indexOfMemory); - Debug.WriteLine($"CalculatorManager.MemoryItemChangedCallback({indexOfMemory})"); + DebugTrace($"CalculatorManager.MemoryItemChangedCallback({indexOfMemory})"); } public static void OnHistoryItemAddedCallback(IntPtr state, int addedItemIndex) @@ -143,7 +143,7 @@ namespace CalculationManager var manager = GCHandle.FromIntPtr((IntPtr)state).Target as CalculatorDisplay; manager.OnHistoryItemAdded(addedItemIndex); - Debug.WriteLine($"CalculatorManager.OnHistoryItemAddedCallback({addedItemIndex})"); + DebugTrace($"CalculatorManager.OnHistoryItemAddedCallback({addedItemIndex})"); } public static void OnNoRightParenAddedCallback(IntPtr state) @@ -151,11 +151,13 @@ namespace CalculationManager var manager = GCHandle.FromIntPtr((IntPtr)state).Target as CalculatorDisplay; manager.OnNoRightParenAdded(); - Debug.WriteLine($"CalculatorManager.OnNoRightParenAddedCallback"); + DebugTrace($"CalculatorManager.OnNoRightParenAddedCallback"); } public static void SetExpressionDisplayCallback(IntPtr state, IntPtr historyItem) { + DebugTrace($"CalculatorManager.SetExpressionDisplayCallback({state}, {historyItem})"); + var manager = GCHandle.FromIntPtr((IntPtr)state).Target as CalculatorDisplay; var nativeResult = Marshal.PtrToStructure(historyItem); @@ -163,7 +165,6 @@ namespace CalculationManager manager.SetExpressionDisplay(itemResult.historyItemVector.spTokens, itemResult.historyItemVector.spCommands); - Debug.WriteLine($"CalculatorManager.SetExpressionDisplayCallback"); } public static void SetMemorizedNumbersCallback(IntPtr state, int count, IntPtr newMemorizedNumbers) @@ -179,7 +180,7 @@ namespace CalculationManager manager.SetMemorizedNumbers(numbers); - Debug.WriteLine($"CalculatorManager.SetMemorizedNumbersCallback({string.Join(";", numbers)})"); + DebugTrace($"CalculatorManager.SetMemorizedNumbersCallback({string.Join(";", numbers)})"); } public static void SetParenthesisNumberCallback(IntPtr state, int parenthesisCount) @@ -187,7 +188,7 @@ namespace CalculationManager var manager = GCHandle.FromIntPtr((IntPtr)state).Target as CalculatorDisplay; manager.SetParenthesisNumber(parenthesisCount); - Debug.WriteLine($"CalculatorManager.SetParenthesisNumberCallback({parenthesisCount})"); + DebugTrace($"CalculatorManager.SetParenthesisNumberCallback({parenthesisCount})"); } public static void BinaryOperatorReceivedCallback(IntPtr state) @@ -195,7 +196,7 @@ namespace CalculationManager var manager = GCHandle.FromIntPtr((IntPtr)state).Target as CalculatorDisplay; manager.BinaryOperatorReceived(); - Debug.WriteLine($"CalculatorManager.BinaryOperatorReceivedCallback"); + DebugTrace($"CalculatorManager.BinaryOperatorReceivedCallback"); } public static void SetPrimaryDisplayCallback(IntPtr state, [MarshalAs(UnmanagedType.LPWStr)] string displayStringValue, bool isError) @@ -203,7 +204,7 @@ namespace CalculationManager var manager = GCHandle.FromIntPtr((IntPtr)state).Target as CalculatorDisplay; manager.SetPrimaryDisplay(displayStringValue, isError); - Debug.WriteLine($"CalculatorManager.SetPrimaryDisplayCallback({displayStringValue}, {isError})"); + DebugTrace($"CalculatorManager.SetPrimaryDisplayCallback({displayStringValue}, {isError})"); } public static void SetIsInErrorCallback(IntPtr state, bool isError) @@ -211,7 +212,7 @@ namespace CalculationManager var manager = GCHandle.FromIntPtr((IntPtr)state).Target as CalculatorDisplay; manager.SetIsInError(isError); - Debug.WriteLine($"CalculatorManager.SetIsInErrorCallback({isError})"); + DebugTrace($"CalculatorManager.SetIsInErrorCallback({isError})"); } public static IntPtr GetCEngineStringCallback(IntPtr state, IntPtr pResourceId) @@ -227,7 +228,7 @@ namespace CalculationManager var pEngineString = Marshal.StringToHGlobalUni(resourceValue); #endif - Debug.WriteLine($"GetCEngineStringCallback({resourceId}, {resourceValue}"); + DebugTrace($"GetCEngineStringCallback({resourceId}, {resourceValue})"); return pEngineString; } @@ -240,6 +241,11 @@ namespace CalculationManager Marshal.WriteInt32(pRet2 + resourceValue.Length * 4, 0); return pRet2; } + + private static void DebugTrace(string message) + { + // Debug.WriteLine(message); + } } [StructLayout(LayoutKind.Sequential)] From 7556e845047898de9613a26fa3b75850b33bc0b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Laban?= Date: Fri, 17 May 2019 10:52:45 -0400 Subject: [PATCH 3/6] Restore ResultsMVisualStateTrigger --- src/Calculator.Shared/Views/Calculator.xaml | 2 +- src/Calculator.Shared/Views/Calculator.xaml.cs | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Calculator.Shared/Views/Calculator.xaml b/src/Calculator.Shared/Views/Calculator.xaml index c86ca1a7..287c0b6b 100644 --- a/src/Calculator.Shared/Views/Calculator.xaml +++ b/src/Calculator.Shared/Views/Calculator.xaml @@ -907,7 +907,7 @@ - + diff --git a/src/Calculator.Shared/Views/Calculator.xaml.cs b/src/Calculator.Shared/Views/Calculator.xaml.cs index 3d591e48..422c3775 100644 --- a/src/Calculator.Shared/Views/Calculator.xaml.cs +++ b/src/Calculator.Shared/Views/Calculator.xaml.cs @@ -228,21 +228,21 @@ namespace CalculatorApp state = "Programmer"; Model.IsDecimalEnabled = false; // UNO TODO - // ResultsMVisualStateTrigger.MinWindowHeight = 640; + ResultsMVisualStateTrigger.MinWindowHeight = 640; } else if (IsScientific) { state = "Scientific"; Model.IsDecimalEnabled = true; // UNO TODO - // ResultsMVisualStateTrigger.MinWindowHeight = 544; + ResultsMVisualStateTrigger.MinWindowHeight = 544; } else { state = "Standard"; Model.IsDecimalEnabled = true; // UNO TODO - // ResultsMVisualStateTrigger.MinWindowHeight = 1; + ResultsMVisualStateTrigger.MinWindowHeight = 1; } CloseHistoryFlyout(); @@ -376,7 +376,8 @@ namespace CalculatorApp } else { - AnimateWithoutResult.Begin(); + /* UNO TODO */ + AnimateWithoutResult?.Begin(); } } } From becbbf81b6fe34f9776166fe99cc940e30271263 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Laban?= Date: Fri, 17 May 2019 10:52:59 -0400 Subject: [PATCH 4/6] Fix GetAppViewState --- src/Calculator.Shared/App.xaml.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Calculator.Shared/App.xaml.cs b/src/Calculator.Shared/App.xaml.cs index dac57e65..bf38c091 100644 --- a/src/Calculator.Shared/App.xaml.cs +++ b/src/Calculator.Shared/App.xaml.cs @@ -106,8 +106,12 @@ namespace CalculatorApp public static string GetAppViewState() { String newViewState; - CoreWindow window = CoreWindow.GetForCurrentThread(); - if ((window.Bounds.Width >= 560) && (window.Bounds.Height >= 356)) +#if NETFX_CORE + CoreWindow window = CoreWindow.GetForCurrentThread(); +#else + var window = Windows.UI.Xaml.Window.Current; +#endif + if ((window.Bounds.Width >= 560) && (window.Bounds.Height >= 356)) { newViewState = ViewState.DockedView; } From 8559c576d6ecd8b8aae60f0cc0be948d452ed0e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Laban?= Date: Fri, 17 May 2019 10:53:10 -0400 Subject: [PATCH 5/6] Fix AspectRatioTrigger --- .../Views/StateTriggers/AspectRatioTrigger.cs | 222 ++++++++++-------- 1 file changed, 121 insertions(+), 101 deletions(-) diff --git a/src/Calculator.Shared/Views/StateTriggers/AspectRatioTrigger.cs b/src/Calculator.Shared/Views/StateTriggers/AspectRatioTrigger.cs index 48a92789..5e9d0904 100644 --- a/src/Calculator.Shared/Views/StateTriggers/AspectRatioTrigger.cs +++ b/src/Calculator.Shared/Views/StateTriggers/AspectRatioTrigger.cs @@ -14,126 +14,146 @@ using Windows.UI.Xaml; namespace CalculatorApp.Views.StateTriggers { - public enum Aspect - { - Height, - Width - } + public enum Aspect + { + Height, + Width + } - public sealed class AspectRatioTrigger : Windows.UI.Xaml.StateTriggerBase - { - /* The source for which this class will respond to size changed events. */ - public FrameworkElement Source - { - get { return (FrameworkElement)GetValue(SourceProperty); } - set { SetValue(SourceProperty, value); } - } + public sealed class AspectRatioTrigger : Windows.UI.Xaml.StateTriggerBase + { + /* The source for which this class will respond to size changed events. */ + public FrameworkElement Source + { + get { return (FrameworkElement)GetValue(SourceProperty); } + set { SetValue(SourceProperty, value); } + } - public static readonly DependencyProperty SourceProperty = - DependencyProperty.Register("Source", typeof(FrameworkElement), typeof(AspectRatioTrigger), new PropertyMetadata(null)); + public static readonly DependencyProperty SourceProperty = + DependencyProperty.Register( + name: nameof(Source), + propertyType: typeof(FrameworkElement), + ownerType: typeof(AspectRatioTrigger), + typeMetadata: new PropertyMetadata( + defaultValue: null, + propertyChangedCallback: (s, e) => (s as AspectRatioTrigger)?.OnSourcePropertyChanged(e.OldValue as FrameworkElement, e.NewValue as FrameworkElement)) + ); - /* Either Height or Width. The property will determine which aspect is used as the numerator when calculating + /* Either Height or Width. The property will determine which aspect is used as the numerator when calculating the aspect ratio. */ - public Aspect NumeratorAspect - { - get { return (Aspect)GetValue(NumeratorAspectProperty); } - set { SetValue(NumeratorAspectProperty, value); } - } + public Aspect NumeratorAspect + { + get { return (Aspect)GetValue(NumeratorAspectProperty); } + set { SetValue(NumeratorAspectProperty, value); } + } - // Using a DependencyProperty as the backing store for NumeratorAspect. This enables animation, styling, binding, etc... - public static readonly DependencyProperty NumeratorAspectProperty = - DependencyProperty.Register("NumeratorAspect", typeof(Aspect), typeof(AspectRatioTrigger), new PropertyMetadata(Aspect.Height)); + // Using a DependencyProperty as the backing store for NumeratorAspect. This enables animation, styling, binding, etc... + public static readonly DependencyProperty NumeratorAspectProperty = + DependencyProperty.Register( + name: "NumeratorAspect", + propertyType: typeof(Aspect), + ownerType: typeof(AspectRatioTrigger), + typeMetadata: new PropertyMetadata(Aspect.Height) + ); - /* The threshold that will cause the trigger to fire when the aspect ratio exceeds this value. */ - public double Threshold - { - get { return (double)GetValue(ThresholdProperty); } - set { SetValue(ThresholdProperty, value); } - } + /* The threshold that will cause the trigger to fire when the aspect ratio exceeds this value. */ + public double Threshold + { + get { return (double)GetValue(ThresholdProperty); } + set { SetValue(ThresholdProperty, value); } + } - // Using a DependencyProperty as the backing store for Threshold. This enables animation, styling, binding, etc... - public static readonly DependencyProperty ThresholdProperty = - DependencyProperty.Register("Threshold", typeof(double), typeof(AspectRatioTrigger), new PropertyMetadata(0.0)); + // Using a DependencyProperty as the backing store for Threshold. This enables animation, styling, binding, etc... + public static readonly DependencyProperty ThresholdProperty = + DependencyProperty.Register( + name: "Threshold", + propertyType: typeof(double), + ownerType: typeof(AspectRatioTrigger), + typeMetadata: new PropertyMetadata(0.0) + ); + + /* If true, the trigger will fire if the aspect ratio is greater than or equal to the threshold. */ + public bool ActiveIfEqual + { + get { return (bool)GetValue(ActiveIfEqualProperty); } + set { SetValue(ActiveIfEqualProperty, value); } + } + + // Using a DependencyProperty as the backing store for ActiveIfEqual. This enables animation, styling, binding, etc... + public static readonly DependencyProperty ActiveIfEqualProperty = + DependencyProperty.Register( + name: "ActiveIfEqual", + propertyType: typeof(bool), + ownerType: typeof(AspectRatioTrigger), + typeMetadata: new PropertyMetadata(false) + ); + AspectRatioTrigger() + { + SetActive(false); + } - /* If true, the trigger will fire if the aspect ratio is greater than or equal to the threshold. */ - public bool ActiveIfEqual - { - get { return (bool)GetValue(ActiveIfEqualProperty); } - set { SetValue(ActiveIfEqualProperty, value); } - } + void OnSourcePropertyChanged(FrameworkElement oldValue, FrameworkElement newValue) + { + UnregisterSizeChanged(oldValue); + RegisterSizeChanged(newValue); + } - // Using a DependencyProperty as the backing store for ActiveIfEqual. This enables animation, styling, binding, etc... - public static readonly DependencyProperty ActiveIfEqualProperty = - DependencyProperty.Register("ActiveIfEqual", typeof(bool), typeof(AspectRatioTrigger), new PropertyMetadata(false)); + void RegisterSizeChanged(FrameworkElement element) + { + if (element == null) + { + return; + } + if (element != Source) + { + UnregisterSizeChanged(Source); + } - AspectRatioTrigger() - { - SetActive(false); - } + element.SizeChanged += OnSizeChanged; + } - void OnSourcePropertyChanged(FrameworkElement oldValue, FrameworkElement newValue) - { - UnregisterSizeChanged(oldValue); - RegisterSizeChanged(newValue); - } + void UnregisterSizeChanged(FrameworkElement element) + { + if (element != null) + { + element.SizeChanged -= OnSizeChanged; + } + } - void RegisterSizeChanged(FrameworkElement element) - { - if (element == null) - { - return; - } + void OnSizeChanged(object sender, SizeChangedEventArgs e) + { + UpdateIsActive(e.NewSize); + } - if (element != Source) - { - UnregisterSizeChanged(Source); - } + void UpdateIsActive(Size sourceSize) + { + double numerator, denominator; + if (NumeratorAspect == Aspect.Height) + { + numerator = sourceSize.Height; + denominator = sourceSize.Width; + } + else + { + numerator = sourceSize.Width; + denominator = sourceSize.Height; + } - element.SizeChanged += OnSizeChanged; - } + bool isActive = false; + if (denominator > 0) + { + double ratio = numerator / denominator; + double threshold = Math.Abs(Threshold); - void UnregisterSizeChanged(FrameworkElement element) - { - if (element != null) - { - element.SizeChanged -= OnSizeChanged; - } - } + isActive = ((ratio > threshold) || (ActiveIfEqual && (ratio == threshold))); + } - void OnSizeChanged(object sender, SizeChangedEventArgs e) - { - UpdateIsActive(e.NewSize); - } + SetActive(isActive); + } - void UpdateIsActive(Size sourceSize) - { - double numerator, denominator; - if (NumeratorAspect == Aspect.Height) - { - numerator = sourceSize.Height; - denominator = sourceSize.Width; - } - else - { - numerator = sourceSize.Width; - denominator = sourceSize.Height; - } - - bool isActive = false; - if (denominator > 0) - { - double ratio = numerator / denominator; - double threshold = Math.Abs(Threshold); - - isActive = ((ratio > threshold) || (ActiveIfEqual && (ratio == threshold))); - } - - SetActive(isActive); - } - - } + } } From 22a74cec5666bd6e8f9a3c697316a92426a3889f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Laban?= Date: Fri, 17 May 2019 10:53:53 -0400 Subject: [PATCH 6/6] Adjust CalManager --- src/CalcManager/CCalcManager.cpp | 2 +- src/Calculator.Wasm/WasmScripts/AppManifest.js | 2 +- src/Calculator.Wasm/WasmScripts/CalcManager.js | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/CalcManager/CCalcManager.cpp b/src/CalcManager/CCalcManager.cpp index efb1e834..1663554c 100644 --- a/src/CalcManager/CCalcManager.cpp +++ b/src/CalcManager/CCalcManager.cpp @@ -10,7 +10,7 @@ #include #include -#if !DEBUG +#if DEBUG #if defined(_WINDOWS_) #include #include diff --git a/src/Calculator.Wasm/WasmScripts/AppManifest.js b/src/Calculator.Wasm/WasmScripts/AppManifest.js index bb8fff30..87d7f7ca 100644 --- a/src/Calculator.Wasm/WasmScripts/AppManifest.js +++ b/src/Calculator.Wasm/WasmScripts/AppManifest.js @@ -2,6 +2,6 @@ splashScreenImage: "Assets/SplashScreen.scale-200.png", splashScreenColor: "#00f", - displayName: "WindowsCalculator" + displayName: "Calculator" } diff --git a/src/Calculator.Wasm/WasmScripts/CalcManager.js b/src/Calculator.Wasm/WasmScripts/CalcManager.js index e3c5ac1e..fe4fdf17 100644 --- a/src/Calculator.Wasm/WasmScripts/CalcManager.js +++ b/src/Calculator.Wasm/WasmScripts/CalcManager.js @@ -22,8 +22,8 @@ var fMaxDigitsReachedCallback = Module.addFunction((state) => _maxDigitsReachedCallback(state), 'vii'); var fMemoryItemChangedCallback = Module.addFunction((state, indexOfMemory) => _memoryItemChangedCallback(state, indexOfMemory), 'vii'); var fOnHistoryItemAddedCallback = Module.addFunction((state, addedItemIndex) => _onHistoryItemAddedCallback(state, addedItemIndex), 'vii'); - var fOnNoRightParenAddedCallback = Module.addFunction((state) => _onNoRightParenAddedCallback (state), 'vi'); - var fSetExpressionDisplayCallback = Module.addFunction((state) => _setExpressionDisplayCallback (state), 'vi'); + var fOnNoRightParenAddedCallback = Module.addFunction((state) => _onNoRightParenAddedCallback(state), 'vi'); + var fSetExpressionDisplayCallback = Module.addFunction((state, historyItem) => _setExpressionDisplayCallback(state, historyItem), 'vii'); var fSetMemorizedNumbersCallback = Module.addFunction((state, size, numbers) => _setMemorizedNumbersCallback(state, size, numbers), 'viii'); var ret = `${fGetCEngineStringCallback};`