mirror of https://github.com/qt/qtdoc.git
153 lines
4.8 KiB
JavaScript
153 lines
4.8 KiB
JavaScript
// Copyright (C) 2023 The Qt Company Ltd.
|
||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||
|
||
.pragma library
|
||
|
||
let curVal = 0
|
||
let previousOperator = ""
|
||
let lastOp = ""
|
||
let digits = ""
|
||
|
||
function isOperationDisabled(op, display) {
|
||
if (digits !== "" && lastOp !== "=" && (op === "π" || op === "e"))
|
||
return true
|
||
if (digits === "" && !((op >= "0" && op <= "9") || op === "π" || op === "e" || op === "AC"))
|
||
return true
|
||
if (op === "bs" && (display.isOperandEmpty() || !((lastOp >= "0" && lastOp <= "9")
|
||
|| lastOp === "π" || lastOp === "e" || lastOp === ".")))
|
||
return true
|
||
if (op === '=' && previousOperator.length != 1)
|
||
return true
|
||
if (op === "." && digits.search(/\./) != -1)
|
||
return true
|
||
if (op === "√" && digits.search(/-/) != -1)
|
||
return true
|
||
if (op === "AC" && display.isDisplayEmpty())
|
||
return true
|
||
|
||
return false
|
||
}
|
||
|
||
function digitPressed(op, display) {
|
||
if (isOperationDisabled(op, display))
|
||
return
|
||
if (lastOp === "π" || lastOp === "e")
|
||
return
|
||
// handle mathematical constants
|
||
if (op === "π") {
|
||
lastOp = op
|
||
digits = Math.PI.toPrecision(display.maxDigits - 1).toString()
|
||
display.appendDigit(digits)
|
||
return
|
||
}
|
||
if (op === "e") {
|
||
lastOp = op
|
||
digits = Math.E.toPrecision(display.maxDigits - 1).toString()
|
||
display.appendDigit(digits)
|
||
return
|
||
}
|
||
|
||
// append a digit to another digit or decimal point
|
||
if (lastOp.toString().length === 1 && ((lastOp >= "0" && lastOp <= "9") || lastOp === ".") ) {
|
||
if (digits.length >= display.maxDigits)
|
||
return
|
||
digits = digits + op.toString()
|
||
display.appendDigit(op.toString())
|
||
// else just write a single digit to display
|
||
} else {
|
||
digits = op.toString()
|
||
display.appendDigit(digits)
|
||
}
|
||
lastOp = op
|
||
}
|
||
|
||
function operatorPressed(op, display) {
|
||
if (isOperationDisabled(op, display))
|
||
return
|
||
|
||
if (op === "±") {
|
||
digits = Number(digits.valueOf() * -1).toString()
|
||
display.setDigit(display.displayNumber(Number(digits)))
|
||
return
|
||
}
|
||
|
||
if (op === "bs") {
|
||
digits = digits.slice(0, -1)
|
||
if (digits === "-")
|
||
digits = ""
|
||
display.backspace()
|
||
return
|
||
}
|
||
|
||
lastOp = op
|
||
|
||
if (previousOperator === "+") {
|
||
digits = (Number(curVal) + Number(digits.valueOf())).toString()
|
||
} else if (previousOperator === "−") {
|
||
digits = (Number(curVal) - Number(digits.valueOf())).toString()
|
||
} else if (previousOperator === "×") {
|
||
digits = (Number(curVal) * Number(digits.valueOf())).toString()
|
||
} else if (previousOperator === "÷") {
|
||
digits = (Number(curVal) / Number(digits.valueOf())).toString()
|
||
}
|
||
|
||
|
||
if (op === "+" || op === "−" || op === "×" || op === "÷") {
|
||
previousOperator = op
|
||
curVal = digits.valueOf()
|
||
digits = ""
|
||
display.displayOperator(previousOperator)
|
||
return
|
||
}
|
||
|
||
curVal = 0
|
||
previousOperator = ""
|
||
|
||
if (op === "=") {
|
||
display.newLine("=", Number(digits))
|
||
}
|
||
|
||
if (op === "√") {
|
||
digits = (Math.sqrt(digits.valueOf())).toString()
|
||
display.newLine("√", Number(digits))
|
||
} else if (op === "⅟x") {
|
||
digits = (1 / digits.valueOf()).toString()
|
||
display.newLine("⅟x", Number(digits))
|
||
} else if (op === "x²") {
|
||
digits = (digits.valueOf() * digits.valueOf()).toString()
|
||
display.newLine("x²", Number(digits))
|
||
} else if (op === "x³") {
|
||
digits = (digits.valueOf() * digits.valueOf() * digits.valueOf()).toString()
|
||
display.newLine("x³", Number(digits))
|
||
} else if (op === "|x|") {
|
||
digits = (Math.abs(digits.valueOf())).toString()
|
||
display.newLine("|x|", Number(digits))
|
||
} else if (op === "⌊x⌋") {
|
||
digits = (Math.floor(digits.valueOf())).toString()
|
||
display.newLine("⌊x⌋", Number(digits))
|
||
} else if (op === "sin") {
|
||
digits = Number(Math.sin(digits.valueOf())).toString()
|
||
display.newLine("sin", Number(digits))
|
||
} else if (op === "cos") {
|
||
digits = Number(Math.cos(digits.valueOf())).toString()
|
||
display.newLine("cos", Number(digits))
|
||
} else if (op === "tan") {
|
||
digits = Number(Math.tan(digits.valueOf())).toString()
|
||
display.newLine("tan", Number(digits))
|
||
} else if (op === "log") {
|
||
digits = Number(Math.log10(digits.valueOf())).toString()
|
||
display.newLine("log", Number(digits))
|
||
} else if (op === "ln") {
|
||
digits = Number(Math.log(digits.valueOf())).toString()
|
||
display.newLine("ln", Number(digits))
|
||
}
|
||
|
||
if (op === "AC") {
|
||
display.allClear()
|
||
curVal = 0
|
||
lastOp = ""
|
||
digits = ""
|
||
previousOperator = ""
|
||
}
|
||
}
|