mirror of
https://github.com/Microsoft/calculator.git
synced 2025-08-22 06:13:14 -07:00
Merge branch 'main' into sharper2
This commit is contained in:
commit
562e45f17e
30 changed files with 144 additions and 203 deletions
|
@ -22,7 +22,7 @@ Calculator ships regularly with new features and bug fixes. You can get the late
|
||||||
|
|
||||||
## Getting started
|
## Getting started
|
||||||
Prerequisites:
|
Prerequisites:
|
||||||
- Your computer must be running Windows 10, version 1809 or newer. Windows 11 is recommended.
|
- Your computer must be running Windows 11, build 22000 or newer.
|
||||||
- Install the latest version of [Visual Studio](https://developer.microsoft.com/en-us/windows/downloads) (the free community edition is sufficient).
|
- Install the latest version of [Visual Studio](https://developer.microsoft.com/en-us/windows/downloads) (the free community edition is sufficient).
|
||||||
- Install the "Universal Windows Platform Development" workload.
|
- Install the "Universal Windows Platform Development" workload.
|
||||||
- Install the optional "C++ Universal Windows Platform tools" component.
|
- Install the optional "C++ Universal Windows Platform tools" component.
|
||||||
|
|
|
@ -22,10 +22,9 @@ namespace CalcEngine
|
||||||
Number::Number(PNUMBER p) noexcept
|
Number::Number(PNUMBER p) noexcept
|
||||||
: m_sign{ p->sign }
|
: m_sign{ p->sign }
|
||||||
, m_exp{ p->exp }
|
, m_exp{ p->exp }
|
||||||
, m_mantissa{}
|
|
||||||
{
|
{
|
||||||
m_mantissa.reserve(p->cdigit);
|
m_mantissa.reserve(p->cdigit);
|
||||||
copy(p->mant, p->mant + p->cdigit, back_inserter(m_mantissa));
|
copy_n(p->mant, p->cdigit, back_inserter(m_mantissa));
|
||||||
}
|
}
|
||||||
|
|
||||||
PNUMBER Number::ToPNUMBER() const
|
PNUMBER Number::ToPNUMBER() const
|
||||||
|
|
|
@ -101,7 +101,7 @@ CCalcEngine::CCalcEngine(
|
||||||
{
|
{
|
||||||
InitChopNumbers();
|
InitChopNumbers();
|
||||||
|
|
||||||
m_dwWordBitWidth = DwWordBitWidthFromeNumWidth(m_numwidth);
|
m_dwWordBitWidth = DwWordBitWidthFromNumWidth(m_numwidth);
|
||||||
|
|
||||||
m_maxTrigonometricNum = RationalMath::Pow(10, 100);
|
m_maxTrigonometricNum = RationalMath::Pow(10, 100);
|
||||||
|
|
||||||
|
|
|
@ -30,17 +30,31 @@ namespace
|
||||||
// 0 is returned. Higher the number, higher the precedence of the operator.
|
// 0 is returned. Higher the number, higher the precedence of the operator.
|
||||||
int NPrecedenceOfOp(int nopCode)
|
int NPrecedenceOfOp(int nopCode)
|
||||||
{
|
{
|
||||||
static uint16_t rgbPrec[] = { 0, 0, IDC_OR, 0, IDC_XOR, 0, IDC_AND, 1, IDC_NAND, 1, IDC_NOR, 1, IDC_ADD, 2, IDC_SUB, 2, IDC_RSHF, 3,
|
switch (nopCode)
|
||||||
IDC_LSHF, 3, IDC_RSHFL, 3, IDC_MOD, 3, IDC_DIV, 3, IDC_MUL, 3, IDC_PWR, 4, IDC_ROOT, 4, IDC_LOGBASEY, 4 };
|
|
||||||
|
|
||||||
for (unsigned int iPrec = 0; iPrec < size(rgbPrec); iPrec += 2)
|
|
||||||
{
|
{
|
||||||
if (nopCode == rgbPrec[iPrec])
|
default:
|
||||||
{
|
case IDC_OR:
|
||||||
return rgbPrec[iPrec + 1];
|
case IDC_XOR:
|
||||||
}
|
return 0;
|
||||||
|
case IDC_AND:
|
||||||
|
case IDC_NAND:
|
||||||
|
case IDC_NOR:
|
||||||
|
return 1;
|
||||||
|
case IDC_ADD:
|
||||||
|
case IDC_SUB:
|
||||||
|
return 2;
|
||||||
|
case IDC_LSHF:
|
||||||
|
case IDC_RSHF:
|
||||||
|
case IDC_RSHFL:
|
||||||
|
case IDC_MOD:
|
||||||
|
case IDC_DIV:
|
||||||
|
case IDC_MUL:
|
||||||
|
return 3;
|
||||||
|
case IDC_PWR:
|
||||||
|
case IDC_ROOT:
|
||||||
|
case IDC_LOGBASEY:
|
||||||
|
return 4;
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -518,7 +532,7 @@ void CCalcEngine::ProcessCommandWorker(OpCode wParam)
|
||||||
|
|
||||||
if (wParam == IDC_OPENP)
|
if (wParam == IDC_OPENP)
|
||||||
{
|
{
|
||||||
// if there's an omitted multiplication sign
|
// if there's an omitted multiplication sign
|
||||||
if (IsDigitOpCode(m_nLastCom) || IsUnaryOpCode(m_nLastCom) || m_nLastCom == IDC_PNT || m_nLastCom == IDC_CLOSEP)
|
if (IsDigitOpCode(m_nLastCom) || IsUnaryOpCode(m_nLastCom) || m_nLastCom == IDC_PNT || m_nLastCom == IDC_CLOSEP)
|
||||||
{
|
{
|
||||||
ProcessCommand(IDC_MUL);
|
ProcessCommand(IDC_MUL);
|
||||||
|
|
|
@ -39,7 +39,7 @@ void CCalcEngine::SetRadixTypeAndNumWidth(RadixType radixtype, NUM_WIDTH numwidt
|
||||||
if (numwidth >= NUM_WIDTH::QWORD_WIDTH && numwidth <= NUM_WIDTH::BYTE_WIDTH)
|
if (numwidth >= NUM_WIDTH::QWORD_WIDTH && numwidth <= NUM_WIDTH::BYTE_WIDTH)
|
||||||
{
|
{
|
||||||
m_numwidth = numwidth;
|
m_numwidth = numwidth;
|
||||||
m_dwWordBitWidth = DwWordBitWidthFromeNumWidth(numwidth);
|
m_dwWordBitWidth = DwWordBitWidthFromNumWidth(numwidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
// inform ratpak that a change in base or precision has occurred
|
// inform ratpak that a change in base or precision has occurred
|
||||||
|
@ -50,7 +50,7 @@ void CCalcEngine::SetRadixTypeAndNumWidth(RadixType radixtype, NUM_WIDTH numwidt
|
||||||
DisplayNum();
|
DisplayNum();
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t CCalcEngine::DwWordBitWidthFromeNumWidth(NUM_WIDTH numwidth)
|
int32_t CCalcEngine::DwWordBitWidthFromNumWidth(NUM_WIDTH numwidth)
|
||||||
{
|
{
|
||||||
switch (numwidth)
|
switch (numwidth)
|
||||||
{
|
{
|
||||||
|
@ -85,7 +85,7 @@ uint32_t CCalcEngine::NRadixFromRadixType(RadixType radixtype)
|
||||||
// Toggles a given bit into the number representation. returns true if it changed it actually.
|
// Toggles a given bit into the number representation. returns true if it changed it actually.
|
||||||
bool CCalcEngine::TryToggleBit(CalcEngine::Rational& rat, uint32_t wbitno)
|
bool CCalcEngine::TryToggleBit(CalcEngine::Rational& rat, uint32_t wbitno)
|
||||||
{
|
{
|
||||||
uint32_t wmax = DwWordBitWidthFromeNumWidth(m_numwidth);
|
uint32_t wmax = DwWordBitWidthFromNumWidth(m_numwidth);
|
||||||
if (wbitno >= wmax)
|
if (wbitno >= wmax)
|
||||||
{
|
{
|
||||||
return false; // ignore error cant happen
|
return false; // ignore error cant happen
|
||||||
|
|
|
@ -179,7 +179,7 @@ private:
|
||||||
CalcEngine::Rational SciCalcFunctions(CalcEngine::Rational const& rat, uint32_t op);
|
CalcEngine::Rational SciCalcFunctions(CalcEngine::Rational const& rat, uint32_t op);
|
||||||
CalcEngine::Rational DoOperation(int operation, CalcEngine::Rational const& lhs, CalcEngine::Rational const& rhs);
|
CalcEngine::Rational DoOperation(int operation, CalcEngine::Rational const& lhs, CalcEngine::Rational const& rhs);
|
||||||
void SetRadixTypeAndNumWidth(RadixType radixtype, NUM_WIDTH numwidth);
|
void SetRadixTypeAndNumWidth(RadixType radixtype, NUM_WIDTH numwidth);
|
||||||
int32_t DwWordBitWidthFromeNumWidth(NUM_WIDTH numwidth);
|
int32_t DwWordBitWidthFromNumWidth(NUM_WIDTH numwidth);
|
||||||
uint32_t NRadixFromRadixType(RadixType radixtype);
|
uint32_t NRadixFromRadixType(RadixType radixtype);
|
||||||
double GenerateRandomNumber();
|
double GenerateRandomNumber();
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
// CalcErr.h
|
// CalcErr.h
|
||||||
//
|
//
|
||||||
// Defines the error codes thrown by ratpak and caught by Calculator
|
// Defines the error codes thrown by ratpak and caught by Calculator
|
||||||
|
@ -36,7 +38,7 @@
|
||||||
// This format is based loosely on an OLE HRESULT and is compatible with the
|
// This format is based loosely on an OLE HRESULT and is compatible with the
|
||||||
// SUCCEEDED and FAILED macros as well as the HRESULT_CODE macro
|
// SUCCEEDED and FAILED macros as well as the HRESULT_CODE macro
|
||||||
|
|
||||||
typedef int32_t ResultCode;
|
using ResultCode = int32_t;
|
||||||
|
|
||||||
// CALC_E_DIVIDEBYZERO
|
// CALC_E_DIVIDEBYZERO
|
||||||
//
|
//
|
||||||
|
|
|
@ -156,13 +156,12 @@ namespace UnitConversionManager
|
||||||
std::wstring targetCurrencyCode;
|
std::wstring targetCurrencyCode;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::tuple<std::vector<UnitConversionManager::Unit>, UnitConversionManager::Unit, UnitConversionManager::Unit> CategorySelectionInitializer;
|
using CategorySelectionInitializer = std::tuple<std::vector<UnitConversionManager::Unit>, UnitConversionManager::Unit, UnitConversionManager::Unit>;
|
||||||
typedef std::unordered_map<
|
using UnitToUnitToConversionDataMap = std::unordered_map<
|
||||||
UnitConversionManager::Unit,
|
UnitConversionManager::Unit,
|
||||||
std::unordered_map<UnitConversionManager::Unit, UnitConversionManager::ConversionData, UnitConversionManager::UnitHash>,
|
std::unordered_map<UnitConversionManager::Unit, UnitConversionManager::ConversionData, UnitConversionManager::UnitHash>,
|
||||||
UnitConversionManager::UnitHash>
|
UnitConversionManager::UnitHash>;
|
||||||
UnitToUnitToConversionDataMap;
|
using CategoryToUnitVectorMap = std::unordered_map<int, std::vector<UnitConversionManager::Unit>>;
|
||||||
typedef std::unordered_map<int, std::vector<UnitConversionManager::Unit>> CategoryToUnitVectorMap;
|
|
||||||
|
|
||||||
class IViewModelCurrencyCallback
|
class IViewModelCurrencyCallback
|
||||||
{
|
{
|
||||||
|
|
|
@ -16,7 +16,7 @@ namespace CalculatorApp::ViewModelNative
|
||||||
{
|
{
|
||||||
std::wstring returnString = L"";
|
std::wstring returnString = L"";
|
||||||
const UINT32 length = 1024;
|
const UINT32 length = 1024;
|
||||||
std::unique_ptr<wchar_t[]> spBuffer = std::unique_ptr<wchar_t[]>(new wchar_t[length]);
|
std::unique_ptr<wchar_t[]> spBuffer = std::make_unique<wchar_t[]>(length);
|
||||||
va_list args = NULL;
|
va_list args = NULL;
|
||||||
va_start(args, pMessage);
|
va_start(args, pMessage);
|
||||||
DWORD fmtReturnVal = FormatMessage(FORMAT_MESSAGE_FROM_STRING, pMessage->Data(), 0, 0, spBuffer.get(), length, &args);
|
DWORD fmtReturnVal = FormatMessage(FORMAT_MESSAGE_FROM_STRING, pMessage->Data(), 0, 0, spBuffer.get(), length, &args);
|
||||||
|
|
|
@ -42,14 +42,3 @@
|
||||||
#include "winrt/Windows.UI.Xaml.h"
|
#include "winrt/Windows.UI.Xaml.h"
|
||||||
#include "winrt/Windows.Foundation.Metadata.h"
|
#include "winrt/Windows.Foundation.Metadata.h"
|
||||||
#include "winrt/Windows.Management.Policies.h"
|
#include "winrt/Windows.Management.Policies.h"
|
||||||
|
|
||||||
// The following namespaces exist as a convenience to resolve
|
|
||||||
// ambiguity for Windows types in the Windows::UI::Xaml::Automation::Peers
|
|
||||||
// namespace that only exist on RS3.
|
|
||||||
// Once the app switches to min version RS3, the namespaces can be removed.
|
|
||||||
// TODO - MSFT 12735088
|
|
||||||
namespace StandardPeers = Windows::UI::Xaml::Automation::Peers;
|
|
||||||
namespace CalculatorApp::ViewModelNative::Common::Automation
|
|
||||||
{
|
|
||||||
}
|
|
||||||
namespace CustomPeers = CalculatorApp::ViewModelNative::Common::Automation;
|
|
||||||
|
|
|
@ -792,9 +792,9 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
|
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
|
||||||
<Version>6.2.10</Version>
|
<Version>6.2.14</Version>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Microsoft.UI.Xaml" Version="2.8.0" />
|
<PackageReference Include="Microsoft.UI.Xaml" Version="2.8.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\CalculatorApp.ViewModel\CalculatorApp.ViewModel.csproj">
|
<ProjectReference Include="..\CalculatorApp.ViewModel\CalculatorApp.ViewModel.csproj">
|
||||||
|
|
|
@ -44,10 +44,10 @@ namespace CalculatorApp
|
||||||
// restore the selection to the way we wanted it to begin with
|
// restore the selection to the way we wanted it to begin with
|
||||||
if (CurrentPosition >= 0 && CurrentPosition < m_source.Count)
|
if (CurrentPosition >= 0 && CurrentPosition < m_source.Count)
|
||||||
{
|
{
|
||||||
Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, new Windows.UI.Core.DispatchedHandler(() =>
|
Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
|
||||||
{
|
{
|
||||||
CurrentChanged?.Invoke(this, null);
|
CurrentChanged?.Invoke(this, null);
|
||||||
})).AsTask().Wait();
|
}).AsTask().Wait();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,11 +33,11 @@ namespace CalculatorApp
|
||||||
|
|
||||||
// Using a DependencyProperty as the backing store for MinFontSize. This enables animation, styling, binding, etc...
|
// Using a DependencyProperty as the backing store for MinFontSize. This enables animation, styling, binding, etc...
|
||||||
public static readonly DependencyProperty MinFontSizeProperty =
|
public static readonly DependencyProperty MinFontSizeProperty =
|
||||||
DependencyProperty.Register(nameof(MinFontSize), typeof(double), typeof(CalculationResult), new PropertyMetadata(0.0, new PropertyChangedCallback((sender, args) =>
|
DependencyProperty.Register(nameof(MinFontSize), typeof(double), typeof(CalculationResult), new PropertyMetadata(0.0, (sender, args) =>
|
||||||
{
|
{
|
||||||
var self = (CalculationResult)sender;
|
var self = (CalculationResult)sender;
|
||||||
self.OnMinFontSizePropertyChanged((double)args.OldValue, (double)args.NewValue);
|
self.OnMinFontSizePropertyChanged((double)args.OldValue, (double)args.NewValue);
|
||||||
})));
|
}));
|
||||||
|
|
||||||
public double MaxFontSize
|
public double MaxFontSize
|
||||||
{
|
{
|
||||||
|
@ -47,11 +47,11 @@ namespace CalculatorApp
|
||||||
|
|
||||||
// Using a DependencyProperty as the backing store for MaxFontSize. This enables animation, styling, binding, etc...
|
// Using a DependencyProperty as the backing store for MaxFontSize. This enables animation, styling, binding, etc...
|
||||||
public static readonly DependencyProperty MaxFontSizeProperty =
|
public static readonly DependencyProperty MaxFontSizeProperty =
|
||||||
DependencyProperty.Register(nameof(MaxFontSize), typeof(double), typeof(CalculationResult), new PropertyMetadata(30.0, new PropertyChangedCallback((sender, args) =>
|
DependencyProperty.Register(nameof(MaxFontSize), typeof(double), typeof(CalculationResult), new PropertyMetadata(30.0, (sender, args) =>
|
||||||
{
|
{
|
||||||
var self = (CalculationResult)sender;
|
var self = (CalculationResult)sender;
|
||||||
self.OnMaxFontSizePropertyChanged((double)args.OldValue, (double)args.NewValue);
|
self.OnMaxFontSizePropertyChanged((double)args.OldValue, (double)args.NewValue);
|
||||||
})));
|
}));
|
||||||
|
|
||||||
public Thickness DisplayMargin
|
public Thickness DisplayMargin
|
||||||
{
|
{
|
||||||
|
@ -71,11 +71,11 @@ namespace CalculatorApp
|
||||||
|
|
||||||
// Using a DependencyProperty as the backing store for IsActive. This enables animation, styling, binding, etc...
|
// Using a DependencyProperty as the backing store for IsActive. This enables animation, styling, binding, etc...
|
||||||
public static readonly DependencyProperty IsActiveProperty =
|
public static readonly DependencyProperty IsActiveProperty =
|
||||||
DependencyProperty.Register(nameof(IsActive), typeof(bool), typeof(CalculationResult), new PropertyMetadata(default(bool), new PropertyChangedCallback((sender, args) =>
|
DependencyProperty.Register(nameof(IsActive), typeof(bool), typeof(CalculationResult), new PropertyMetadata(default(bool), (sender, args) =>
|
||||||
{
|
{
|
||||||
var self = (CalculationResult)sender;
|
var self = (CalculationResult)sender;
|
||||||
self.OnIsActivePropertyChanged((bool)args.OldValue, (bool)args.NewValue);
|
self.OnIsActivePropertyChanged((bool)args.OldValue, (bool)args.NewValue);
|
||||||
})));
|
}));
|
||||||
|
|
||||||
public string DisplayValue
|
public string DisplayValue
|
||||||
{
|
{
|
||||||
|
@ -85,11 +85,11 @@ namespace CalculatorApp
|
||||||
|
|
||||||
// Using a DependencyProperty as the backing store for DisplayValue. This enables animation, styling, binding, etc...
|
// Using a DependencyProperty as the backing store for DisplayValue. This enables animation, styling, binding, etc...
|
||||||
public static readonly DependencyProperty DisplayValueProperty =
|
public static readonly DependencyProperty DisplayValueProperty =
|
||||||
DependencyProperty.Register(nameof(DisplayValue), typeof(string), typeof(CalculationResult), new PropertyMetadata(string.Empty, new PropertyChangedCallback((sender, args) =>
|
DependencyProperty.Register(nameof(DisplayValue), typeof(string), typeof(CalculationResult), new PropertyMetadata(string.Empty, (sender, args) =>
|
||||||
{
|
{
|
||||||
var self = (CalculationResult)sender;
|
var self = (CalculationResult)sender;
|
||||||
self.OnDisplayValuePropertyChanged((string)args.OldValue, (string)args.NewValue);
|
self.OnDisplayValuePropertyChanged((string)args.OldValue, (string)args.NewValue);
|
||||||
})));
|
}));
|
||||||
|
|
||||||
public bool IsInError
|
public bool IsInError
|
||||||
{
|
{
|
||||||
|
@ -99,11 +99,11 @@ namespace CalculatorApp
|
||||||
|
|
||||||
// Using a DependencyProperty as the backing store for IsInError. This enables animation, styling, binding, etc...
|
// Using a DependencyProperty as the backing store for IsInError. This enables animation, styling, binding, etc...
|
||||||
public static readonly DependencyProperty IsInErrorProperty =
|
public static readonly DependencyProperty IsInErrorProperty =
|
||||||
DependencyProperty.Register(nameof(IsInError), typeof(bool), typeof(CalculationResult), new PropertyMetadata(default(bool), new PropertyChangedCallback((sender, args) =>
|
DependencyProperty.Register(nameof(IsInError), typeof(bool), typeof(CalculationResult), new PropertyMetadata(default(bool), (sender, args) =>
|
||||||
{
|
{
|
||||||
var self = (CalculationResult)sender;
|
var self = (CalculationResult)sender;
|
||||||
self.OnIsInErrorPropertyChanged((bool)args.OldValue, (bool)args.NewValue);
|
self.OnIsInErrorPropertyChanged((bool)args.OldValue, (bool)args.NewValue);
|
||||||
})));
|
}));
|
||||||
|
|
||||||
public bool IsOperatorCommand
|
public bool IsOperatorCommand
|
||||||
{
|
{
|
||||||
|
@ -151,7 +151,7 @@ namespace CalculatorApp
|
||||||
|
|
||||||
if (widthDiff > WIDTHCUTOFF)
|
if (widthDiff > WIDTHCUTOFF)
|
||||||
{
|
{
|
||||||
fontSizeChange = Math.Min((double)Math.Max((double)Math.Floor(WIDTHTOFONTSCALAR * widthDiff) - WIDTHTOFONTOFFSET, INCREMENTOFFSET), MAXFONTINCREMENT);
|
fontSizeChange = Math.Min(Math.Max(Math.Floor(WIDTHTOFONTSCALAR * widthDiff) - WIDTHTOFONTOFFSET, INCREMENTOFFSET), MAXFONTINCREMENT);
|
||||||
}
|
}
|
||||||
if (m_textBlock.ActualWidth < containerSize && Math.Abs(m_textBlock.FontSize - MaxFontSize) > FONTTOLERANCE && !m_haveCalculatedMax)
|
if (m_textBlock.ActualWidth < containerSize && Math.Abs(m_textBlock.FontSize - MaxFontSize) > FONTTOLERANCE && !m_haveCalculatedMax)
|
||||||
{
|
{
|
||||||
|
|
|
@ -33,11 +33,11 @@ namespace CalculatorApp
|
||||||
|
|
||||||
// Using a DependencyProperty as the backing store for ButtonId. This enables animation, styling, binding, etc...
|
// Using a DependencyProperty as the backing store for ButtonId. This enables animation, styling, binding, etc...
|
||||||
public static readonly DependencyProperty ButtonIdProperty =
|
public static readonly DependencyProperty ButtonIdProperty =
|
||||||
DependencyProperty.Register(nameof(ButtonId), typeof(NumbersAndOperatorsEnum), typeof(CalculatorButton), new PropertyMetadata(default(NumbersAndOperatorsEnum), new PropertyChangedCallback((sender, args) =>
|
DependencyProperty.Register(nameof(ButtonId), typeof(NumbersAndOperatorsEnum), typeof(CalculatorButton), new PropertyMetadata(default(NumbersAndOperatorsEnum), (sender, args) =>
|
||||||
{
|
{
|
||||||
var self = (CalculatorButton)sender;
|
var self = (CalculatorButton)sender;
|
||||||
self.OnButtonIdPropertyChanged((NumbersAndOperatorsEnum)args.OldValue, (NumbersAndOperatorsEnum)args.NewValue);
|
self.OnButtonIdPropertyChanged((NumbersAndOperatorsEnum)args.OldValue, (NumbersAndOperatorsEnum)args.NewValue);
|
||||||
})));
|
}));
|
||||||
|
|
||||||
public string AuditoryFeedback
|
public string AuditoryFeedback
|
||||||
{
|
{
|
||||||
|
@ -47,11 +47,11 @@ namespace CalculatorApp
|
||||||
|
|
||||||
// Using a DependencyProperty as the backing store for AuditoryFeedback. This enables animation, styling, binding, etc...
|
// Using a DependencyProperty as the backing store for AuditoryFeedback. This enables animation, styling, binding, etc...
|
||||||
public static readonly DependencyProperty AuditoryFeedbackProperty =
|
public static readonly DependencyProperty AuditoryFeedbackProperty =
|
||||||
DependencyProperty.Register(nameof(AuditoryFeedback), typeof(string), typeof(CalculatorButton), new PropertyMetadata(string.Empty, new PropertyChangedCallback((sender, args) =>
|
DependencyProperty.Register(nameof(AuditoryFeedback), typeof(string), typeof(CalculatorButton), new PropertyMetadata(string.Empty, (sender, args) =>
|
||||||
{
|
{
|
||||||
var self = (CalculatorButton)sender;
|
var self = (CalculatorButton)sender;
|
||||||
self.OnAuditoryFeedbackPropertyChanged((string)args.OldValue, (string)args.NewValue);
|
self.OnAuditoryFeedbackPropertyChanged((string)args.OldValue, (string)args.NewValue);
|
||||||
})));
|
}));
|
||||||
|
|
||||||
public Windows.UI.Xaml.Media.Brush HoverBackground
|
public Windows.UI.Xaml.Media.Brush HoverBackground
|
||||||
{
|
{
|
||||||
|
|
|
@ -37,11 +37,11 @@ namespace CalculatorApp
|
||||||
|
|
||||||
// Using a DependencyProperty as the backing store for TokensUpdated. This enables animation, styling, binding, etc...
|
// Using a DependencyProperty as the backing store for TokensUpdated. This enables animation, styling, binding, etc...
|
||||||
public static readonly DependencyProperty TokensUpdatedProperty =
|
public static readonly DependencyProperty TokensUpdatedProperty =
|
||||||
DependencyProperty.Register(nameof(TokensUpdated), typeof(bool), typeof(OverflowTextBlock), new PropertyMetadata(default(bool), new PropertyChangedCallback((sender, args) =>
|
DependencyProperty.Register(nameof(TokensUpdated), typeof(bool), typeof(OverflowTextBlock), new PropertyMetadata(default(bool), (sender, args) =>
|
||||||
{
|
{
|
||||||
var self = (OverflowTextBlock)sender;
|
var self = (OverflowTextBlock)sender;
|
||||||
self.OnTokensUpdatedPropertyChanged((bool)args.OldValue, (bool)args.NewValue);
|
self.OnTokensUpdatedPropertyChanged((bool)args.OldValue, (bool)args.NewValue);
|
||||||
})));
|
}));
|
||||||
|
|
||||||
public OverflowButtonPlacement ScrollButtonsPlacement
|
public OverflowButtonPlacement ScrollButtonsPlacement
|
||||||
{
|
{
|
||||||
|
@ -51,11 +51,11 @@ namespace CalculatorApp
|
||||||
|
|
||||||
// Using a DependencyProperty as the backing store for ScrollButtonsPlacement. This enables animation, styling, binding, etc...
|
// Using a DependencyProperty as the backing store for ScrollButtonsPlacement. This enables animation, styling, binding, etc...
|
||||||
public static readonly DependencyProperty ScrollButtonsPlacementProperty =
|
public static readonly DependencyProperty ScrollButtonsPlacementProperty =
|
||||||
DependencyProperty.Register(nameof(ScrollButtonsPlacement), typeof(OverflowButtonPlacement), typeof(OverflowTextBlock), new PropertyMetadata(default(OverflowButtonPlacement), new PropertyChangedCallback((sender, args) =>
|
DependencyProperty.Register(nameof(ScrollButtonsPlacement), typeof(OverflowButtonPlacement), typeof(OverflowTextBlock), new PropertyMetadata(default(OverflowButtonPlacement), (sender, args) =>
|
||||||
{
|
{
|
||||||
var self = (OverflowTextBlock)sender;
|
var self = (OverflowTextBlock)sender;
|
||||||
self.OnScrollButtonsPlacementPropertyChanged((OverflowButtonPlacement)args.OldValue, (OverflowButtonPlacement)args.NewValue);
|
self.OnScrollButtonsPlacementPropertyChanged((OverflowButtonPlacement)args.OldValue, (OverflowButtonPlacement)args.NewValue);
|
||||||
})));
|
}));
|
||||||
|
|
||||||
public bool IsActive
|
public bool IsActive
|
||||||
{
|
{
|
||||||
|
|
|
@ -234,7 +234,7 @@ namespace CalculatorApp
|
||||||
// Delay load things later when we get a chance.
|
// Delay load things later when we get a chance.
|
||||||
WeakReference weakThis = new WeakReference(this);
|
WeakReference weakThis = new WeakReference(this);
|
||||||
_ = this.Dispatcher.RunAsync(
|
_ = this.Dispatcher.RunAsync(
|
||||||
CoreDispatcherPriority.Normal, new DispatchedHandler(() =>
|
CoreDispatcherPriority.Normal, () =>
|
||||||
{
|
{
|
||||||
if (TraceLogger.GetInstance().IsWindowIdInLog(ApplicationView.GetApplicationViewIdForWindow(CoreWindow.GetForCurrentThread())))
|
if (TraceLogger.GetInstance().IsWindowIdInLog(ApplicationView.GetApplicationViewIdForWindow(CoreWindow.GetForCurrentThread())))
|
||||||
{
|
{
|
||||||
|
@ -243,7 +243,7 @@ namespace CalculatorApp
|
||||||
refThis.GetMemory();
|
refThis.GetMemory();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}));
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LoadResourceStrings()
|
private void LoadResourceStrings()
|
||||||
|
@ -533,7 +533,7 @@ namespace CalculatorApp
|
||||||
|
|
||||||
// Since we need different font sizes for different numeric system,
|
// Since we need different font sizes for different numeric system,
|
||||||
// we use a table of optimal font sizes for each numeric system.
|
// we use a table of optimal font sizes for each numeric system.
|
||||||
private static readonly FontTable[] fontTables = new FontTable[] {
|
private static readonly FontTable[] fontTables = {
|
||||||
new FontTable { numericSystem = "Arab", fullFont = 104, fullFontMin = 29.333, portraitMin = 23, snapFont = 40,
|
new FontTable { numericSystem = "Arab", fullFont = 104, fullFontMin = 29.333, portraitMin = 23, snapFont = 40,
|
||||||
fullNumPadFont = 56, snapScientificNumPadFont = 40, portraitScientificNumPadFont = 56 },
|
fullNumPadFont = 56, snapScientificNumPadFont = 40, portraitScientificNumPadFont = 56 },
|
||||||
new FontTable { numericSystem = "ArabExt", fullFont = 104, fullFontMin = 29.333, portraitMin = 23, snapFont = 40,
|
new FontTable { numericSystem = "ArabExt", fullFont = 104, fullFontMin = 29.333, portraitMin = 23, snapFont = 40,
|
||||||
|
|
|
@ -124,11 +124,11 @@ namespace CalculatorApp
|
||||||
{
|
{
|
||||||
InverseHyperbolicTrigFunctions.Visibility = Visibility.Visible;
|
InverseHyperbolicTrigFunctions.Visibility = Visibility.Visible;
|
||||||
}
|
}
|
||||||
else if (isShiftChecked && !isHypeChecked)
|
else if (isShiftChecked)
|
||||||
{
|
{
|
||||||
InverseTrigFunctions.Visibility = Visibility.Visible;
|
InverseTrigFunctions.Visibility = Visibility.Visible;
|
||||||
}
|
}
|
||||||
else if (!isShiftChecked && isHypeChecked)
|
else if (isHypeChecked)
|
||||||
{
|
{
|
||||||
HyperbolicTrigFunctions.Visibility = Visibility.Visible;
|
HyperbolicTrigFunctions.Visibility = Visibility.Visible;
|
||||||
}
|
}
|
||||||
|
|
|
@ -258,8 +258,7 @@ namespace CalculatorApp
|
||||||
}
|
}
|
||||||
|
|
||||||
if (submission.Source == EquationSubmissionSource.ENTER_KEY
|
if (submission.Source == EquationSubmissionSource.ENTER_KEY
|
||||||
|| (submission.Source == EquationSubmissionSource.FOCUS_LOST && submission.HasTextChanged && eq.Expression != null
|
|| (submission.Source == EquationSubmissionSource.FOCUS_LOST && submission.HasTextChanged && !string.IsNullOrEmpty(eq.Expression)))
|
||||||
&& eq.Expression.Length > 0))
|
|
||||||
{
|
{
|
||||||
if (submission.Source == EquationSubmissionSource.ENTER_KEY)
|
if (submission.Source == EquationSubmissionSource.ENTER_KEY)
|
||||||
{
|
{
|
||||||
|
@ -355,13 +354,13 @@ namespace CalculatorApp
|
||||||
{
|
{
|
||||||
|
|
||||||
WeakReference weakThis = new WeakReference(this);
|
WeakReference weakThis = new WeakReference(this);
|
||||||
_ = this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(() =>
|
_ = this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
|
||||||
{
|
{
|
||||||
if (weakThis.Target is EquationInputArea refThis && refThis.m_isHighContrast == refThis.m_accessibilitySettings.HighContrast)
|
if (weakThis.Target is EquationInputArea refThis && refThis.m_isHighContrast == refThis.m_accessibilitySettings.HighContrast)
|
||||||
{
|
{
|
||||||
refThis.ReloadAvailableColors(false, false);
|
refThis.ReloadAvailableColors(false, false);
|
||||||
}
|
}
|
||||||
}));
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void EquationTextBox_RemoveButtonClicked(object sender, RoutedEventArgs e)
|
private void EquationTextBox_RemoveButtonClicked(object sender, RoutedEventArgs e)
|
||||||
|
@ -436,10 +435,7 @@ namespace CalculatorApp
|
||||||
if (index >= 0)
|
if (index >= 0)
|
||||||
{
|
{
|
||||||
var container = (UIElement)EquationInputList.ContainerFromIndex(index);
|
var container = (UIElement)EquationInputList.ContainerFromIndex(index);
|
||||||
if (container != null)
|
container?.StartBringIntoView();
|
||||||
{
|
|
||||||
container.StartBringIntoView();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -466,10 +462,7 @@ namespace CalculatorApp
|
||||||
if (index >= 0)
|
if (index >= 0)
|
||||||
{
|
{
|
||||||
var container = (UIElement)EquationInputList.ContainerFromIndex(index);
|
var container = (UIElement)EquationInputList.ContainerFromIndex(index);
|
||||||
if (container != null)
|
container?.StartBringIntoView();
|
||||||
{
|
|
||||||
container.StartBringIntoView();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -594,11 +587,11 @@ namespace CalculatorApp
|
||||||
{
|
{
|
||||||
TimeSpan timeSpan = new TimeSpan(10000000); // 1 tick = 100 nanoseconds, and 10000000 ticks = 1 second.
|
TimeSpan timeSpan = new TimeSpan(10000000); // 1 tick = 100 nanoseconds, and 10000000 ticks = 1 second.
|
||||||
DispatcherTimerDelayer delayer = new DispatcherTimerDelayer(timeSpan);
|
DispatcherTimerDelayer delayer = new DispatcherTimerDelayer(timeSpan);
|
||||||
delayer.Action += new EventHandler<object>((object s, object arg) =>
|
delayer.Action += (s, arg) =>
|
||||||
{
|
{
|
||||||
CalculatorApp.ViewModelNative.Common.TraceLogger.GetInstance().LogVariableChanged("Slider", name);
|
CalculatorApp.ViewModelNative.Common.TraceLogger.GetInstance().LogVariableChanged("Slider", name);
|
||||||
variableSliders.Remove(name);
|
variableSliders.Remove(name);
|
||||||
});
|
};
|
||||||
delayer.Start();
|
delayer.Start();
|
||||||
variableSliders.Add(name, delayer);
|
variableSliders.Add(name, delayer);
|
||||||
}
|
}
|
||||||
|
@ -612,12 +605,8 @@ namespace CalculatorApp
|
||||||
private EquationViewModel GetViewModelFromEquationTextBox(object sender)
|
private EquationViewModel GetViewModelFromEquationTextBox(object sender)
|
||||||
{
|
{
|
||||||
var tb = (EquationTextBox)sender;
|
var tb = (EquationTextBox)sender;
|
||||||
if (tb == null)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var eq = (EquationViewModel)tb.DataContext;
|
var eq = (EquationViewModel)tb?.DataContext;
|
||||||
|
|
||||||
return eq;
|
return eq;
|
||||||
}
|
}
|
||||||
|
|
|
@ -752,13 +752,13 @@ namespace CalculatorApp
|
||||||
private void OnColorValuesChanged(UISettings sender, object args)
|
private void OnColorValuesChanged(UISettings sender, object args)
|
||||||
{
|
{
|
||||||
WeakReference weakThis = new WeakReference(this);
|
WeakReference weakThis = new WeakReference(this);
|
||||||
_ = this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(() =>
|
_ = this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
|
||||||
{
|
{
|
||||||
if (weakThis.Target is GraphingCalculator refThis && IsMatchAppTheme)
|
if (weakThis.Target is GraphingCalculator refThis && IsMatchAppTheme)
|
||||||
{
|
{
|
||||||
refThis.UpdateGraphTheme();
|
refThis.UpdateGraphTheme();
|
||||||
}
|
}
|
||||||
}));
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateGraphTheme()
|
private void UpdateGraphTheme()
|
||||||
|
@ -788,13 +788,13 @@ namespace CalculatorApp
|
||||||
|
|
||||||
IsMatchAppTheme = isMatchAppTheme;
|
IsMatchAppTheme = isMatchAppTheme;
|
||||||
WeakReference weakThis = new WeakReference(this);
|
WeakReference weakThis = new WeakReference(this);
|
||||||
_ = this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(() =>
|
_ = this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
|
||||||
{
|
{
|
||||||
if (weakThis.Target is GraphingCalculator refThis)
|
if (weakThis.Target is GraphingCalculator refThis)
|
||||||
{
|
{
|
||||||
refThis.UpdateGraphTheme();
|
refThis.UpdateGraphTheme();
|
||||||
}
|
}
|
||||||
}));
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private const double zoomInScale = 1 / 1.0625;
|
private const double zoomInScale = 1 / 1.0625;
|
||||||
|
|
|
@ -187,7 +187,7 @@ namespace CalculatorApp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static readonly Dictionary<NumbersAndOperatorsEnum, Tuple<string, int, int>> buttonOutput = new Dictionary<NumbersAndOperatorsEnum, Tuple<string, int, int>>()
|
private static readonly Dictionary<NumbersAndOperatorsEnum, Tuple<string, int, int>> buttonOutput = new Dictionary<NumbersAndOperatorsEnum, Tuple<string, int, int>>
|
||||||
{
|
{
|
||||||
{ NumbersAndOperatorsEnum.Sin, Tuple.Create("sin()", 4, 0) },
|
{ NumbersAndOperatorsEnum.Sin, Tuple.Create("sin()", 4, 0) },
|
||||||
{ NumbersAndOperatorsEnum.Cos, Tuple.Create("cos()", 4, 0) },
|
{ NumbersAndOperatorsEnum.Cos, Tuple.Create("cos()", 4, 0) },
|
||||||
|
|
|
@ -92,7 +92,7 @@ namespace CalculatorApp
|
||||||
{
|
{
|
||||||
if (Frame.RequestedThemeProperty == dp)
|
if (Frame.RequestedThemeProperty == dp)
|
||||||
{
|
{
|
||||||
_ = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(() => { SetTitleBarControlColors(); }));
|
_ = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, SetTitleBarControlColors);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,8 +120,8 @@ namespace CalculatorApp
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
double leftAddition = 0;
|
double leftAddition;
|
||||||
double rightAddition = 0;
|
double rightAddition;
|
||||||
|
|
||||||
if (FlowDirection == FlowDirection.LeftToRight)
|
if (FlowDirection == FlowDirection.LeftToRight)
|
||||||
{
|
{
|
||||||
|
@ -140,18 +140,14 @@ namespace CalculatorApp
|
||||||
|
|
||||||
private void ColorValuesChanged(Windows.UI.ViewManagement.UISettings sender, object e)
|
private void ColorValuesChanged(Windows.UI.ViewManagement.UISettings sender, object e)
|
||||||
{
|
{
|
||||||
_ = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(() => { SetTitleBarControlColors(); }));
|
_ = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, SetTitleBarControlColors);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetTitleBarControlColors()
|
private void SetTitleBarControlColors()
|
||||||
{
|
{
|
||||||
var applicationView = ApplicationView.GetForCurrentView();
|
var applicationView = ApplicationView.GetForCurrentView();
|
||||||
if (applicationView == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var applicationTitleBar = applicationView.TitleBar;
|
var applicationTitleBar = applicationView?.TitleBar;
|
||||||
if (applicationTitleBar == null)
|
if (applicationTitleBar == null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@ -184,11 +180,11 @@ namespace CalculatorApp
|
||||||
|
|
||||||
private void OnHighContrastChanged(Windows.UI.ViewManagement.AccessibilitySettings sender, object args)
|
private void OnHighContrastChanged(Windows.UI.ViewManagement.AccessibilitySettings sender, object args)
|
||||||
{
|
{
|
||||||
_ = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(() =>
|
_ = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
|
||||||
{
|
{
|
||||||
SetTitleBarControlColors();
|
SetTitleBarControlColors();
|
||||||
SetTitleBarVisibility(false);
|
SetTitleBarVisibility(false);
|
||||||
}));
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnWindowActivated(object sender, WindowActivatedEventArgs e)
|
private void OnWindowActivated(object sender, WindowActivatedEventArgs e)
|
||||||
|
@ -281,12 +277,12 @@ namespace CalculatorApp
|
||||||
public static readonly DependencyProperty BackButtonSpaceReservedProperty =
|
public static readonly DependencyProperty BackButtonSpaceReservedProperty =
|
||||||
DependencyProperty.Register(
|
DependencyProperty.Register(
|
||||||
nameof(BackButtonSpaceReserved), typeof(bool), typeof(TitleBar),
|
nameof(BackButtonSpaceReserved), typeof(bool), typeof(TitleBar),
|
||||||
new PropertyMetadata(false, new PropertyChangedCallback((sender, args) =>
|
new PropertyMetadata(false, (sender, args) =>
|
||||||
{
|
{
|
||||||
var self = sender as TitleBar;
|
var self = sender as TitleBar;
|
||||||
VisualStateManager.GoToState(
|
VisualStateManager.GoToState(
|
||||||
self, (bool)args.NewValue ? self.BackButtonVisible.Name : self.BackButtonCollapsed.Name, true);
|
self, (bool)args.NewValue ? self.BackButtonVisible.Name : self.BackButtonCollapsed.Name, true);
|
||||||
})));
|
}));
|
||||||
|
|
||||||
private readonly Windows.ApplicationModel.Core.CoreApplicationViewTitleBar m_coreTitleBar;
|
private readonly Windows.ApplicationModel.Core.CoreApplicationViewTitleBar m_coreTitleBar;
|
||||||
private readonly Windows.UI.ViewManagement.UISettings m_uiSettings;
|
private readonly Windows.UI.ViewManagement.UISettings m_uiSettings;
|
||||||
|
|
|
@ -86,7 +86,7 @@ namespace CalculatorApp
|
||||||
|
|
||||||
public void SetDefaultFocus()
|
public void SetDefaultFocus()
|
||||||
{
|
{
|
||||||
Control[] focusPrecedence = new Control[] { Value1, CurrencyRefreshBlockControl, OfflineBlock, ClearEntryButtonPos0 };
|
Control[] focusPrecedence = { Value1, CurrencyRefreshBlockControl, OfflineBlock, ClearEntryButtonPos0 };
|
||||||
|
|
||||||
foreach (Control control in focusPrecedence)
|
foreach (Control control in focusPrecedence)
|
||||||
{
|
{
|
||||||
|
@ -368,10 +368,7 @@ namespace CalculatorApp
|
||||||
|
|
||||||
private void HideProgressRing()
|
private void HideProgressRing()
|
||||||
{
|
{
|
||||||
if (m_delayTimer != null)
|
m_delayTimer?.Stop();
|
||||||
{
|
|
||||||
m_delayTimer.Stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
CurrencyLoadingProgressRing.IsActive = false;
|
CurrencyLoadingProgressRing.IsActive = false;
|
||||||
}
|
}
|
||||||
|
@ -391,8 +388,8 @@ namespace CalculatorApp
|
||||||
private static readonly Lazy<UISettings> uiSettings = new Lazy<UISettings>(true);
|
private static readonly Lazy<UISettings> uiSettings = new Lazy<UISettings>(true);
|
||||||
private readonly Windows.UI.Xaml.Controls.MenuFlyout m_resultsFlyout = default;
|
private readonly Windows.UI.Xaml.Controls.MenuFlyout m_resultsFlyout = default;
|
||||||
|
|
||||||
private readonly string m_chargesMayApplyText = string.Empty;
|
private readonly string m_chargesMayApplyText;
|
||||||
private readonly string m_failedToRefreshText = string.Empty;
|
private readonly string m_failedToRefreshText;
|
||||||
|
|
||||||
private bool m_meteredConnectionOverride;
|
private bool m_meteredConnectionOverride;
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,7 @@ namespace CalculatorApp
|
||||||
public Task HandleViewRelease()
|
public Task HandleViewRelease()
|
||||||
{
|
{
|
||||||
TaskCompletionSource<object> tsource = new TaskCompletionSource<object>();
|
TaskCompletionSource<object> tsource = new TaskCompletionSource<object>();
|
||||||
_ = m_coreDispatcher.RunAsync(CoreDispatcherPriority.Low, new DispatchedHandler(() =>
|
_ = m_coreDispatcher.RunAsync(CoreDispatcherPriority.Low, () =>
|
||||||
{
|
{
|
||||||
KeyboardShortcutManager.OnWindowClosed(this.m_viewId);
|
KeyboardShortcutManager.OnWindowClosed(this.m_viewId);
|
||||||
Window.Current.Content = null;
|
Window.Current.Content = null;
|
||||||
|
@ -70,7 +70,7 @@ namespace CalculatorApp
|
||||||
tsource.SetResult(new object());
|
tsource.SetResult(new object());
|
||||||
this.m_coreDispatcher.StopProcessEvents();
|
this.m_coreDispatcher.StopProcessEvents();
|
||||||
Window.Current.Close();
|
Window.Current.Close();
|
||||||
}));
|
});
|
||||||
|
|
||||||
return tsource.Task;
|
return tsource.Task;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Appium.WebDriver" Version="4.3.1" />
|
<PackageReference Include="Appium.WebDriver" Version="4.3.2" />
|
||||||
<PackageReference Include="MSTest.TestFramework" Version="2.2.8" />
|
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
|
@ -41,63 +41,27 @@ namespace CalculatorUITestFramework
|
||||||
/// <param name="mode">The mode to be changed to</param>
|
/// <param name="mode">The mode to be changed to</param>
|
||||||
public void ChangeCalculatorMode(CalculatorMode mode)
|
public void ChangeCalculatorMode(CalculatorMode mode)
|
||||||
{
|
{
|
||||||
string modeAccessibilityId;
|
string modeAccessibilityId = mode switch
|
||||||
switch (mode)
|
|
||||||
{
|
{
|
||||||
case CalculatorMode.StandardCalculator:
|
CalculatorMode.StandardCalculator => "Standard",
|
||||||
modeAccessibilityId = "Standard";
|
CalculatorMode.ScientificCalculator => "Scientific",
|
||||||
break;
|
CalculatorMode.ProgrammerCalculator => "Programmer",
|
||||||
case CalculatorMode.ScientificCalculator:
|
CalculatorMode.DateCalculator => "Date",
|
||||||
modeAccessibilityId = "Scientific";
|
CalculatorMode.Currency => "Currency",
|
||||||
break;
|
CalculatorMode.Volume => "Volume",
|
||||||
case CalculatorMode.ProgrammerCalculator:
|
CalculatorMode.Length => "Length",
|
||||||
modeAccessibilityId = "Programmer";
|
CalculatorMode.Weight => "Weight",
|
||||||
break;
|
CalculatorMode.Temperature => "Temperature",
|
||||||
case CalculatorMode.DateCalculator:
|
CalculatorMode.Energy => "Energy",
|
||||||
modeAccessibilityId = "Date";
|
CalculatorMode.Area => "Area",
|
||||||
break;
|
CalculatorMode.Speed => "Speed",
|
||||||
case CalculatorMode.Currency:
|
CalculatorMode.Time => "Time",
|
||||||
modeAccessibilityId = "Currency";
|
CalculatorMode.Power => "Power",
|
||||||
break;
|
CalculatorMode.Data => "Data",
|
||||||
case CalculatorMode.Volume:
|
CalculatorMode.Pressure => "Pressure",
|
||||||
modeAccessibilityId = "Volume";
|
CalculatorMode.Angle => "Angle",
|
||||||
break;
|
_ => throw (new ArgumentException("The mode is not valid"))
|
||||||
case CalculatorMode.Length:
|
};
|
||||||
modeAccessibilityId = "Length";
|
|
||||||
break;
|
|
||||||
case CalculatorMode.Weight:
|
|
||||||
modeAccessibilityId = "Weight";
|
|
||||||
break;
|
|
||||||
case CalculatorMode.Temperature:
|
|
||||||
modeAccessibilityId = "Temperature";
|
|
||||||
break;
|
|
||||||
case CalculatorMode.Energy:
|
|
||||||
modeAccessibilityId = "Energy";
|
|
||||||
break;
|
|
||||||
case CalculatorMode.Area:
|
|
||||||
modeAccessibilityId = "Area";
|
|
||||||
break;
|
|
||||||
case CalculatorMode.Speed:
|
|
||||||
modeAccessibilityId = "Speed";
|
|
||||||
break;
|
|
||||||
case CalculatorMode.Time:
|
|
||||||
modeAccessibilityId = "Time";
|
|
||||||
break;
|
|
||||||
case CalculatorMode.Power:
|
|
||||||
modeAccessibilityId = "Power";
|
|
||||||
break;
|
|
||||||
case CalculatorMode.Data:
|
|
||||||
modeAccessibilityId = "Data";
|
|
||||||
break;
|
|
||||||
case CalculatorMode.Pressure:
|
|
||||||
modeAccessibilityId = "Pressure";
|
|
||||||
break;
|
|
||||||
case CalculatorMode.Angle:
|
|
||||||
modeAccessibilityId = "Angle";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw (new ArgumentException("The mode is not valid"));
|
|
||||||
}
|
|
||||||
|
|
||||||
this.NavigationMenuButton.Click();
|
this.NavigationMenuButton.Click();
|
||||||
this.NavigationMenuPane.WaitForDisplayed();
|
this.NavigationMenuPane.WaitForDisplayed();
|
||||||
|
|
|
@ -109,21 +109,13 @@ namespace CalculatorUITestFramework
|
||||||
public void SetAngleOperator(AngleOperatorState value)
|
public void SetAngleOperator(AngleOperatorState value)
|
||||||
{
|
{
|
||||||
//set the desired string value for the button
|
//set the desired string value for the button
|
||||||
string desiredId;
|
string desiredId = value switch
|
||||||
switch (value)
|
|
||||||
{
|
{
|
||||||
case AngleOperatorState.Degrees:
|
AngleOperatorState.Degrees => "degButton",
|
||||||
desiredId = "degButton";
|
AngleOperatorState.Gradians => "gradButton",
|
||||||
break;
|
AngleOperatorState.Radians => "radButton",
|
||||||
case AngleOperatorState.Gradians:
|
_ => throw new NotImplementedException()
|
||||||
desiredId = "gradButton";
|
};
|
||||||
break;
|
|
||||||
case AngleOperatorState.Radians:
|
|
||||||
desiredId = "radButton";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
while (this.DegRadGradButton.GetAttribute("AutomationId") != desiredId)
|
while (this.DegRadGradButton.GetAttribute("AutomationId") != desiredId)
|
||||||
{
|
{
|
||||||
this.DegRadGradButton.Click();
|
this.DegRadGradButton.Click();
|
||||||
|
|
|
@ -20,6 +20,7 @@ using System.IO;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace CalculatorUITestFramework
|
namespace CalculatorUITestFramework
|
||||||
{
|
{
|
||||||
|
@ -146,20 +147,23 @@ namespace CalculatorUITestFramework
|
||||||
{
|
{
|
||||||
Uri status;
|
Uri status;
|
||||||
Uri service = this.ServiceUrl;
|
Uri service = this.ServiceUrl;
|
||||||
HttpClient httpClient = new HttpClient();
|
using (HttpClient httpClient = new HttpClient())
|
||||||
httpClient.Timeout = this.InitializationTimeout;
|
{
|
||||||
|
httpClient.Timeout = this.InitializationTimeout;
|
||||||
|
|
||||||
if (service.IsLoopback)
|
if (service.IsLoopback)
|
||||||
{
|
{
|
||||||
status = new Uri("http://localhost:" + Convert.ToString(this.Port) + "/status");
|
status = new Uri("http://localhost:" + Convert.ToString(this.Port) + "/status");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
status = new Uri(service + "/status");
|
||||||
|
}
|
||||||
|
|
||||||
|
var httpResponse = Task.Run(() => httpClient.GetAsync(status)).ConfigureAwait(false).GetAwaiter().GetResult();
|
||||||
|
|
||||||
|
return httpResponse.IsSuccessStatusCode;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
status = new Uri(service + "/status");
|
|
||||||
}
|
|
||||||
|
|
||||||
var httpResponse = httpClient.GetAsync(status);
|
|
||||||
return httpResponse.Result.IsSuccessStatusCode;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,10 +45,6 @@ namespace CalculatorUITestFramework
|
||||||
|
|
||||||
public WindowsDriverServiceBuilder WithStartUpTimeOut(TimeSpan startUpTimeout)
|
public WindowsDriverServiceBuilder WithStartUpTimeOut(TimeSpan startUpTimeout)
|
||||||
{
|
{
|
||||||
if (startUpTimeout == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("A startup timeout should not be NULL");
|
|
||||||
}
|
|
||||||
this.StartUpTimeout = startUpTimeout;
|
this.StartUpTimeout = startUpTimeout;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,10 +4,10 @@
|
||||||
<IsPackable>false</IsPackable>
|
<IsPackable>false</IsPackable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.0.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
|
||||||
<PackageReference Include="MSTest.TestAdapter" Version="2.2.8" />
|
<PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
|
||||||
<PackageReference Include="MSTest.TestFramework" Version="2.2.8" />
|
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
|
||||||
<PackageReference Include="Appium.WebDriver" Version="4.3.1" />
|
<PackageReference Include="Appium.WebDriver" Version="4.3.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\CalculatorUITestFramework\CalculatorUITestFramework.csproj" />
|
<ProjectReference Include="..\CalculatorUITestFramework\CalculatorUITestFramework.csproj" />
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
namespace Graphing::Analyzer
|
namespace Graphing::Analyzer
|
||||||
{
|
{
|
||||||
typedef unsigned int NativeAnalysisType; // PerformAnalysisType
|
using NativeAnalysisType = unsigned int; // PerformAnalysisType
|
||||||
|
|
||||||
struct IGraphAnalyzer : public NonCopyable, public NonMoveable
|
struct IGraphAnalyzer : public NonCopyable, public NonMoveable
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue