diff --git a/.github/actions/spell-check/expect.txt b/.github/actions/spell-check/expect.txt index c802457500..325b984c1c 100644 --- a/.github/actions/spell-check/expect.txt +++ b/.github/actions/spell-check/expect.txt @@ -4,12 +4,10 @@ abgr ABlocked ABOUTBOX Abug -accctrl Acceleratorkeys ACCEPTFILES ACCESSDENIED ACCESSTOKEN -aclapi AClient AColumn acrt @@ -54,12 +52,9 @@ APIENTRY APIIs Apm APPBARDATA -appdata APPEXECLINK -Appium APPLICATIONFRAMEHOST appmanifest -appmodel APPNAME appref appsettings @@ -83,11 +78,7 @@ ASSOCSTR ASYNCWINDOWPLACEMENT ASYNCWINDOWPOS atl -atlbase -atlcom atleast -atlfile -atlstr ATRIOX aumid Authenticode @@ -135,7 +126,6 @@ bmi bms BNumber BODGY -bootstrapper BOOTSTRAPPERINSTALLFOLDER bostrot BOTTOMALIGN @@ -163,7 +153,6 @@ CALG callbackptr calpwstr Cangjie -caniuse CANRENAME CAPTUREBLT CAPTURECHANGED @@ -178,11 +167,9 @@ CDeclaration CDEF CElems CENTERALIGN -ceq certlm certmgr cfp -cguid CHANGECBCHAIN changecursor CHILDACTIVATE @@ -207,19 +194,16 @@ CLSCTX Clusion cmder CMDNOTFOUNDMODULEINTERFACE -Cmds CMIC CMINVOKECOMMANDINFO CMINVOKECOMMANDINFOEX CMock CMONITORS cmph -cne CNF coclass codereview Codespaces -codicon COINIT colorconv colorformat @@ -231,18 +215,12 @@ comdef comdlg comexp cominterop -commandline -commctrl -commdlg compmgmt COMPOSITIONFULL -comutil CONFIGW CONFLICTINGMODIFIERKEY CONFLICTINGMODIFIERSHORTCUT CONOUT -consts -contentdialog contentfiles CONTEXTHELP CONTEXTMENUHANDLER @@ -257,7 +235,6 @@ countof cph cplusplus CPower -cppwinrt createdump CREATEPROCESS CREATESCHEDULEDTASK @@ -267,8 +244,6 @@ CRECT CRH critsec Crossdevice -CRSEL -crx CSearch CSettings cso @@ -306,11 +281,8 @@ DBLEPSILON DCapture DCBA DCOM -dcommon -dcomp DComposition DCR -DCs ddd DDEIf DDevice @@ -345,7 +317,6 @@ DESIGNINFO DESKTOPABSOLUTEEDITING DESKTOPABSOLUTEPARSING desktopshorcutinstalled -desktopwindowxamlsource devblogs devdocs devenum @@ -353,7 +324,6 @@ devmgmt DEVMODE DEVMODEW DEVMON -devpkey DEVSOURCE DGR DIALOGEX @@ -423,8 +393,6 @@ DWORDLONG dworigin dwrite dxgi -dxgidebug -dxgiformat easeofaccess ecount EData @@ -434,15 +402,12 @@ EDITSHORTCUTS EDITTEXT EFile ekus -emmintrin -Emoji ENABLEDELAYEDEXPANSION ENABLEDPOPUP ENABLETAB ENABLETEMPLATE encodedlaunch encryptor -endpointvolume ENDSESSION ENSUREVISIBLE ENTERSIZEMOVE @@ -466,7 +431,6 @@ eula eurochange eventlog eventvwr -evntrace evt EWXFORCE EWXFORCEIFHUNG @@ -478,7 +442,6 @@ examplehandler examplepowertoy EXAND EXCLUDEFROMCAPTURE -exdisp executionpolicy exename EXITSIZEMOVE @@ -541,7 +504,6 @@ frm Froml FROMTOUCH fsmgmt -Functiondiscoverykeys FZE gacutil Gaeilge @@ -576,10 +538,10 @@ gpo GPOCA gpp gpu +gradians GSM gtm guiddata -guiddef GUITHREADINFO GValue gwl @@ -626,7 +588,6 @@ Hif HIMAGELIST himl hinst -hinstance HIWORD HKCC HKCOMB @@ -659,7 +620,6 @@ hrgn hsb HSCROLL hsi -hstring HTCLIENT hthumbnail HTOUCHINPUT @@ -737,14 +697,12 @@ installscopeperuser INSTALLSTARTMENUSHORTCUT INSTALLSTATE Inste -Intelli Interlop INTRESOURCE INVALIDARG invalidoperatioexception ipcmanager IPREVIEW -ipreviewhandlervisualssetfont irprops isbi ISearch @@ -769,7 +727,6 @@ jpe jpnime Jsons jsonval -junja jxr keybd KEYBDDATA @@ -787,7 +744,6 @@ keyvault KILLFOCUS killrunner kmph -Knownfolders KSPROPERTY Kybd lastcodeanalysissucceeded @@ -818,7 +774,6 @@ LIVEZOOM lld LLKH llkhf -lmcons LMEM LMENU lnks @@ -861,7 +816,6 @@ lprc LPSAFEARRAY lpstr lpsz -lpt LPTHREAD LPTOP lptpm @@ -920,18 +874,13 @@ MERGECOPY MERGEPAINT Metadatas metafile -mfapi mfc -mfidl -mfobjects mfplat -mftransform Mgmt mic midl mii mindaro -Minimatch Minimizable MINIMIZEBOX MINIMIZEEND @@ -946,10 +895,8 @@ mlcfg mmc mmcexe MMdd -mmdeviceapi mmi mmsys -mmsystem mockapi MODALFRAME MODESPRUNED @@ -976,7 +923,6 @@ mscorlib msctls msdata MSDL -msedge MSGFLT msiexec MSIFASTINSTALL @@ -1030,7 +976,6 @@ netframework netsetup netsh newcolor -newdev NEWDIALOGSTYLE NEWFILE newitem @@ -1057,7 +1002,6 @@ NOCOPYBITS NOCOPYSECURITYATTRIBS NOCRLF nodeca -nodoc NODRAWCAPTION NODRAWICON NOINHERITLAYOUT @@ -1095,7 +1039,6 @@ NOTIFICATIONSDLL NOTIFYICONDATA NOTIFYICONDATAW NOTIMPL -notlike NOTOPMOST NOTRACK NOTSRCCOPY @@ -1108,15 +1051,12 @@ NResize nsunt NTAPI ntdll -ntfs NTSTATUS NTSYSAPI NULLCURSOR nullonfailure numberbox nwc -Objbase -objidl ocr Ocrsettings odbccp @@ -1148,7 +1088,6 @@ osvi OUTOFCONTEXT outpin Outptr -outputtype outsettings OVERLAPPEDWINDOW overlaywindow @@ -1167,7 +1106,6 @@ PARENTRELATIVEPARSING parray PARTIALCONFIRMATIONDIALOGTITLE PATCOPY -pathcch PATHMUSTEXIST PATINVERT PATPAINT @@ -1255,7 +1193,6 @@ pptal ppv prc Prefixer -Preinstalled prependpath prevhost previewer @@ -1272,7 +1209,6 @@ prm proactively PROCESSENTRY PROCESSKEY -processthreadsapi PROCESSTRACE procmon PRODEXT @@ -1282,7 +1218,6 @@ programdata projectname PROPBAG PROPERTYKEY -propkey PROPVARIANT propvarutil PRTL @@ -1346,7 +1281,6 @@ rectp RECTSOURCE recyclebin Redist -redistributable reencode reencoded REFCLSID @@ -1375,10 +1309,8 @@ remoteip Removelnk renamable RENAMEONCOLLISION -Renamer reparented reparenting -reparse reportfileaccesses requery requerying @@ -1390,7 +1322,6 @@ RESIZETOFIT resmimetype RESOURCEID RESTORETOMAXIMIZED -restrictederrorinfo resultlist RETURNONLYFSDIRS RGBQUAD @@ -1405,7 +1336,6 @@ riid ringbuffer RKey RNumber -roadmap rop ROUNDSMALL rpcrt @@ -1418,14 +1348,12 @@ rstringalpha rstringdigit RTB RTLREADING -ruleset runas rundll rungameid RUNLEVEL runtimeclass runtimepack -runtimes ruuid rvm rwin @@ -1486,21 +1414,17 @@ SHCNE SHCNF SHCONTF Shcore -shellapi SHELLDETAILS SHELLDLL shellex SHELLEXECUTEINFO SHELLEXECUTEINFOW -shellscalingapi SHFILEINFO SHFILEOPSTRUCT SHGDN SHGDNF SHGFI shinfo -shldisp -shlobj shlwapi shmem SHNAMEMAPPING @@ -1628,7 +1552,6 @@ SVGIn SVGIO svgz SVSI -SWC SWFO SWP SWRESTORE @@ -1652,8 +1575,6 @@ SYSMENU SYSTEMAPPS SYSTEMMODAL SYSTEMTIME -tailwindcss -tapp TApplication TApplied targ @@ -1694,7 +1615,6 @@ THH THICKFRAME THISCOMPONENT THotkey -thumbcache TILEDWINDOW TILLSON timedate @@ -1708,17 +1628,14 @@ tkconverters TLayout tlb tlbimp -tlhelp TMPVAR TNP Toolhelp toolkitconverters -Toolset toolwindow TOPDOWNDIB TOUCHEVENTF TOUCHINPUT -touchpad TRACEHANDLE tracelogging tracerpt @@ -1731,7 +1648,6 @@ triaging trl trx tsa -Tsd TServer tstoi TStr @@ -1761,15 +1677,11 @@ UNCPRIORITY UNDNAME unhiding UNICODETEXT -uninstantiated -uniquifier Uniquifies unitconverter unittests -Unknwn UNLEN UNORM -unregistering unremapped unvirtualized unwide @@ -1783,11 +1695,9 @@ updown UPGRADINGPRODUCTCODE Uptool urld -urlmon Usb USEDEFAULT USEFILEATTRIBUTES -USERDATA USESHOWWINDOW USESTDHANDLES USRDLL @@ -1814,7 +1724,6 @@ vdupq VERBSONLY VERBW VERIFYCONTEXT -verrsrc VERSIONINFO VERTRES VERTSIZE @@ -1862,7 +1771,6 @@ WANTPALM wbem WBounds Wca -wcautil WCE wcex WClass @@ -1884,10 +1792,7 @@ wifi wil winapi winappsdk -wincodec -Wincodecsdk wincolor -windef windir WINDOWCREATED WINDOWEDGE @@ -1896,18 +1801,12 @@ WINDOWNAME WINDOWPLACEMENT WINDOWPOSCHANGED WINDOWPOSCHANGING -windowsapp WINDOWSBUILDNUMBER windowssearch windowssettings WINDOWSTYLES WINDOWSTYLESICON -windowsx -winerror WINEVENT -winevt -winexe -winforms winget wingetcreate Winhook @@ -1918,9 +1817,7 @@ WINNT winres winrt winsdk -winsdkver winsta -winternl WINTHRESHOLD WINVER winxamlmanager @@ -1966,14 +1863,12 @@ wrl wscui wsf wsh -wsl wstr wsz WTA WTNCA wtoi WTS -wtsapi WTSAT Wubi WVC diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/ExtendedCalculatorParserTests.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/ExtendedCalculatorParserTests.cs index b13072021b..594773c36b 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/ExtendedCalculatorParserTests.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/ExtendedCalculatorParserTests.cs @@ -279,5 +279,67 @@ namespace Microsoft.PowerToys.Run.Plugin.Calculator.UnitTests Assert.IsNotNull(result); Assert.AreEqual(expectedResult, result.Result); } + + [DataTestMethod] + [DataRow("sin(90)", "sin((pi / 180) * (90))")] + [DataRow("arcsin(0.5)", "(180 / pi) * (arcsin(0.5))")] + [DataRow("sin(sin(30))", "sin((pi / 180) * (sin((pi / 180) * (30))))")] + [DataRow("cos(tan(45))", "cos((pi / 180) * (tan((pi / 180) * (45))))")] + [DataRow("arctan(sin(30))", "(180 / pi) * (arctan(sin((pi / 180) * (30))))")] + [DataRow("sin(cos(tan(30)))", "sin((pi / 180) * (cos((pi / 180) * (tan((pi / 180) * (30))))))")] + [DataRow("sin(arcsin(0.5))", "sin((pi / 180) * ((180 / pi) * (arcsin(0.5))))")] + [DataRow("sin(30) + cos(60)", "sin((pi / 180) * (30)) + cos((pi / 180) * (60))")] + [DataRow("sin(30 + 15)", "sin((pi / 180) * (30 + 15))")] + [DataRow("sin(45) * cos(45) - tan(30)", "sin((pi / 180) * (45)) * cos((pi / 180) * (45)) - tan((pi / 180) * (30))")] + [DataRow("arcsin(arccos(0.5))", "(180 / pi) * (arcsin((180 / pi) * (arccos(0.5))))")] + [DataRow("sin(sin(sin(30)))", "sin((pi / 180) * (sin((pi / 180) * (sin((pi / 180) * (30))))))")] + [DataRow("log(10)", "log(10)")] + [DataRow("sin(30) + pi", "sin((pi / 180) * (30)) + pi")] + [DataRow("sin(-30)", "sin((pi / 180) * (-30))")] + [DataRow("sin((30))", "sin((pi / 180) * ((30)))")] + [DataRow("arcsin(1) * 2", "(180 / pi) * (arcsin(1)) * 2")] + [DataRow("cos(1/2)", "cos((pi / 180) * (1/2))")] + [DataRow("sin ( 90 )", "sin ((pi / 180) * ( 90 ))")] + [DataRow("cos(arcsin(sin(45)))", "cos((pi / 180) * ((180 / pi) * (arcsin(sin((pi / 180) * (45))))))")] + public void UpdateTrigFunctions_Degrees(string input, string expectedResult) + { + // Call UpdateTrigFunctions in degrees mode + string result = CalculateHelper.UpdateTrigFunctions(input, CalculateEngine.TrigMode.Degrees); + + // Assert + Assert.IsNotNull(result); + Assert.AreEqual(expectedResult, result); + } + + [DataTestMethod] + [DataRow("sin(90)", "sin((pi / 200) * (90))")] + [DataRow("arcsin(0.5)", "(200 / pi) * (arcsin(0.5))")] + [DataRow("sin(sin(30))", "sin((pi / 200) * (sin((pi / 200) * (30))))")] + [DataRow("cos(tan(45))", "cos((pi / 200) * (tan((pi / 200) * (45))))")] + [DataRow("arctan(sin(30))", "(200 / pi) * (arctan(sin((pi / 200) * (30))))")] + [DataRow("sin(cos(tan(30)))", "sin((pi / 200) * (cos((pi / 200) * (tan((pi / 200) * (30))))))")] + [DataRow("sin(arcsin(0.5))", "sin((pi / 200) * ((200 / pi) * (arcsin(0.5))))")] + [DataRow("sin(30) + cos(60)", "sin((pi / 200) * (30)) + cos((pi / 200) * (60))")] + [DataRow("sin(30 + 15)", "sin((pi / 200) * (30 + 15))")] + [DataRow("sin(45) * cos(45) - tan(30)", "sin((pi / 200) * (45)) * cos((pi / 200) * (45)) - tan((pi / 200) * (30))")] + [DataRow("arcsin(arccos(0.5))", "(200 / pi) * (arcsin((200 / pi) * (arccos(0.5))))")] + [DataRow("sin(sin(sin(30)))", "sin((pi / 200) * (sin((pi / 200) * (sin((pi / 200) * (30))))))")] + [DataRow("log(10)", "log(10)")] + [DataRow("sin(30) + pi", "sin((pi / 200) * (30)) + pi")] + [DataRow("sin(-30)", "sin((pi / 200) * (-30))")] + [DataRow("sin((30))", "sin((pi / 200) * ((30)))")] + [DataRow("arcsin(1) * 2", "(200 / pi) * (arcsin(1)) * 2")] + [DataRow("cos(1/2)", "cos((pi / 200) * (1/2))")] + [DataRow("sin ( 90 )", "sin ((pi / 200) * ( 90 ))")] + [DataRow("cos(arcsin(sin(45)))", "cos((pi / 200) * ((200 / pi) * (arcsin(sin((pi / 200) * (45))))))")] + public void UpdateTrigFunctions_Gradians(string input, string expectedResult) + { + // Call UpdateTrigFunctions in gradians mode + string result = CalculateHelper.UpdateTrigFunctions(input, CalculateEngine.TrigMode.Gradians); + + // Assert + Assert.IsNotNull(result); + Assert.AreEqual(expectedResult, result); + } } } diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/CalculateEngine.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/CalculateEngine.cs index 815a52d8b0..9248e3ca89 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/CalculateEngine.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/CalculateEngine.cs @@ -23,6 +23,13 @@ namespace Microsoft.PowerToys.Run.Plugin.Calculator public const int RoundingDigits = 10; + public enum TrigMode + { + Radians, + Degrees, + Gradians, + } + /// /// Interpret /// @@ -52,6 +59,9 @@ namespace Microsoft.PowerToys.Run.Plugin.Calculator input = CalculateHelper.FixHumanMultiplicationExpressions(input); + // Modify trig functions depending on angle unit setting + input = CalculateHelper.UpdateTrigFunctions(input, Main.GetTrigMode()); + var result = _magesEngine.Interpret(input); // This could happen for some incorrect queries, like pi(2) diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/CalculateHelper.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/CalculateHelper.cs index 436591e3b3..95705a34ca 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/CalculateHelper.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/CalculateHelper.cs @@ -25,6 +25,11 @@ namespace Microsoft.PowerToys.Run.Plugin.Calculator @")+$", RegexOptions.Compiled); + private const string DegToRad = "(pi / 180) * "; + private const string GradToRad = "(pi / 200) * "; + private const string RadToDeg = "(180 / pi) * "; + private const string RadToGrad = "(200 / pi) * "; + public static bool InputValid(string input) { if (string.IsNullOrWhiteSpace(input)) @@ -204,5 +209,86 @@ namespace Microsoft.PowerToys.Run.Plugin.Calculator return output; } + + // Gets the index of the closing bracket of a function + private static int FindClosingBracketIndex(string input, int start) + { + int bracketCount = 0; // Set count to zero + for (int i = start; i < input.Length; i++) + { + if (input[i] == '(') + { + bracketCount++; + } + else if (input[i] == ')') + { + bracketCount--; + if (bracketCount == 0) + { + return i; + } + } + } + + return -1; // Unmatched brackets + } + + private static string ModifyTrigFunction(string input, string function, string modification) + { + // Get the RegEx pattern to match, depending on whether the function is inverse or normal + string pattern = function.StartsWith("arc", StringComparison.Ordinal) ? string.Empty : @"(? Resources.wox_plugin_calculator_plugin_name; @@ -67,6 +69,20 @@ namespace Microsoft.PowerToys.Run.Plugin.Calculator DisplayDescription = Resources.wox_plugin_calculator_replace_input_description, Value = true, }, + new PluginAdditionalOption + { + Key = TrigMode, + DisplayLabel = Resources.wox_plugin_calculator_trig_unit_mode, + DisplayDescription = Resources.wox_plugin_calculator_trig_unit_mode_description, + PluginOptionType = PluginAdditionalOption.AdditionalOptionType.Combobox, + ComboBoxValue = (int)CalculateEngine.TrigMode.Radians, + ComboBoxItems = + [ + new KeyValuePair(Resources.wox_plugin_calculator_trig_unit_radians, "0"), + new KeyValuePair(Resources.wox_plugin_calculator_trig_unit_degrees, "1"), + new KeyValuePair(Resources.wox_plugin_calculator_trig_unit_gradians, "2"), + ], + }, }; public List Query(Query query) @@ -183,6 +199,7 @@ namespace Microsoft.PowerToys.Run.Plugin.Calculator var inputUseEnglishFormat = false; var outputUseEnglishFormat = false; var replaceInput = true; + var trigMode = CalculateEngine.TrigMode.Radians; if (settings != null && settings.AdditionalOptions != null) { @@ -194,11 +211,20 @@ namespace Microsoft.PowerToys.Run.Plugin.Calculator var optionReplaceInput = settings.AdditionalOptions.FirstOrDefault(x => x.Key == ReplaceInput); replaceInput = optionReplaceInput?.Value ?? replaceInput; + + var optionTrigMode = settings.AdditionalOptions.FirstOrDefault(x => x.Key == TrigMode); + trigMode = (CalculateEngine.TrigMode)int.Parse(optionTrigMode.ComboBoxValue.ToString(CultureInfo.InvariantCulture), CultureInfo.InvariantCulture); } _inputUseEnglishFormat = inputUseEnglishFormat; _outputUseEnglishFormat = outputUseEnglishFormat; _replaceInput = replaceInput; + _trigMode = trigMode; + } + + public static CalculateEngine.TrigMode GetTrigMode() + { + return _trigMode; } public void Dispose() diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/Properties/Resources.Designer.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/Properties/Resources.Designer.cs index b48a3f417e..861993dbdd 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/Properties/Resources.Designer.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/Properties/Resources.Designer.cs @@ -203,5 +203,50 @@ namespace Microsoft.PowerToys.Run.Plugin.Calculator.Properties { return ResourceManager.GetString("wox_plugin_calculator_replace_input_description", resourceCulture); } } + + /// + /// Looks up a localized string similar to Degrees. + /// + public static string wox_plugin_calculator_trig_unit_degrees { + get { + return ResourceManager.GetString("wox_plugin_calculator_trig_unit_degrees", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Gradians. + /// + public static string wox_plugin_calculator_trig_unit_gradians { + get { + return ResourceManager.GetString("wox_plugin_calculator_trig_unit_gradians", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Trigonometry Unit. + /// + public static string wox_plugin_calculator_trig_unit_mode { + get { + return ResourceManager.GetString("wox_plugin_calculator_trig_unit_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Specifies the angle unit to use for trigonometry operations.. + /// + public static string wox_plugin_calculator_trig_unit_mode_description { + get { + return ResourceManager.GetString("wox_plugin_calculator_trig_unit_mode_description", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Radians. + /// + public static string wox_plugin_calculator_trig_unit_radians { + get { + return ResourceManager.GetString("wox_plugin_calculator_trig_unit_radians", resourceCulture); + } + } } } diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/Properties/Resources.resx b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/Properties/Resources.resx index 727603ab04..3c56eedf4b 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/Properties/Resources.resx +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/Properties/Resources.resx @@ -167,4 +167,24 @@ When using direct activation, appending '=' to the expression will replace the input with the calculated result (e.g. '=5*3-2=' will change the query to '=13'). + + Trigonometry Unit + Title text for trig unit mode. + + + Specifies the angle unit to use for trigonometry operations + Description text for trig mode setting. + + + Radians + Text for angle unit. + + + Degrees + Text to use for angle unit. + + + Gradians + Text for angle unit. + \ No newline at end of file