diff options
Diffstat (limited to 'examples/script/calculator/calculator.js')
-rw-r--r-- | examples/script/calculator/calculator.js | 264 |
1 files changed, 264 insertions, 0 deletions
diff --git a/examples/script/calculator/calculator.js b/examples/script/calculator/calculator.js new file mode 100644 index 0000000..62c2cba --- /dev/null +++ b/examples/script/calculator/calculator.js @@ -0,0 +1,264 @@ +//! [0] +function Calculator(ui) +{ + this.ui = ui; + + this.pendingAdditiveOperator = ""; + this.pendingMultiplicativeOperator = ""; + this.sumInMemory = 0; + this.sumSoFar = 0; + this.factorSoFar = 0; + this.waitingForOperand = true; + + with (ui) { + display.text = "0"; + + zeroButton.clicked.connect(this, this.digitClicked); + oneButton.clicked.connect(this, "digitClicked"); + twoButton.clicked.connect(this, "digitClicked"); + threeButton.clicked.connect(this, "digitClicked"); + fourButton.clicked.connect(this, "digitClicked"); + fiveButton.clicked.connect(this, "digitClicked"); + sixButton.clicked.connect(this, "digitClicked"); + sevenButton.clicked.connect(this, "digitClicked"); + eightButton.clicked.connect(this, "digitClicked"); + nineButton.clicked.connect(this, "digitClicked"); + + pointButton.clicked.connect(this, "pointClicked"); + changeSignButton.clicked.connect(this, "changeSignClicked"); + + backspaceButton.clicked.connect(this, "backspaceClicked"); + clearButton.clicked.connect(this, "clear"); + clearAllButton.clicked.connect(this, "clearAll"); + + clearMemoryButton.clicked.connect(this, "clearMemory"); + readMemoryButton.clicked.connect(this, "readMemory"); + setMemoryButton.clicked.connect(this, "setMemory"); + addToMemoryButton.clicked.connect(this, "addToMemory"); + + divisionButton.clicked.connect(this, "multiplicativeOperatorClicked"); + timesButton.clicked.connect(this, "multiplicativeOperatorClicked"); + minusButton.clicked.connect(this, "additiveOperatorClicked"); + plusButton.clicked.connect(this, "additiveOperatorClicked"); + + squareRootButton.clicked.connect(this, "unaryOperatorClicked"); + powerButton.clicked.connect(this, "unaryOperatorClicked"); + reciprocalButton.clicked.connect(this, "unaryOperatorClicked"); + equalButton.clicked.connect(this, "equalClicked"); + } +} +//! [0] + +Calculator.prototype.abortOperation = function() +{ + this.clearAll(); + this.ui.display.text = "####"; +} + +Calculator.prototype.calculate = function(rightOperand, pendingOperator) +{ + if (pendingOperator == "+") { + this.sumSoFar += rightOperand; + } else if (pendingOperator == "-") { + this.sumSoFar -= rightOperand; + } else if (pendingOperator == "*") { + this.factorSoFar *= rightOperand; + } else if (pendingOperator == "/") { + if (rightOperand == 0) + return false; + this.factorSoFar /= rightOperand; + } + return true; +} + +//! [1] +Calculator.prototype.digitClicked = function() +{ + var digitValue = __qt_sender__.text - 0; + if ((digitValue == 0) && (this.ui.display.text == "0")) + return; + if (this.waitingForOperand) { + this.ui.display.clear(); + this.waitingForOperand = false; + } + this.ui.display.text += digitValue; +} +//! [1] + +Calculator.prototype.unaryOperatorClicked = function() +{ + var operand = this.ui.display.text - 0; + var result = 0; + if (__qt_sender__.text == "Sqrt") { + if (operand < 0) { + this.abortOperation(); + return; + } + result = Math.sqrt(operand); + } else if (__qt_sender__.text == "x^2") { + result = Math.pow(operand, 2); + } else if (__qt_sender__.text == "1/x") { + if (operand == 0.0) { + this.abortOperation(); + return; + } + result = 1 / operand; + } + this.ui.display.text = result + ""; + this.waitingForOperand = true; +} + +Calculator.prototype.additiveOperatorClicked = function() +{ + var operand = this.ui.display.text - 0; + + if (this.pendingMultiplicativeOperator.length != 0) { + if (!this.calculate(operand, this.pendingMultiplicativeOperator)) { + this.abortOperation(); + return; + } + this.ui.display.text = this.factorSoFar + ""; + operand = this.factorSoFar; + this.factorSoFar = 0; + this.pendingMultiplicativeOperator = ""; + } + + if (this.pendingAdditiveOperator.length != 0) { + if (!this.calculate(operand, this.pendingAdditiveOperator)) { + this.abortOperation(); + return; + } + this.ui.display.text = this.sumSoFar + ""; + } else { + this.sumSoFar = operand; + } + + this.pendingAdditiveOperator = __qt_sender__.text; + this.waitingForOperand = true; +} + +Calculator.prototype.multiplicativeOperatorClicked = function() +{ + var operand = this.ui.display.text - 0; + + if (this.pendingMultiplicativeOperator.length != 0) { + if (!this.calculate(operand, this.pendingMultiplicativeOperator)) { + this.abortOperation(); + return; + } + this.ui.display.text = this.factorSoFar + ""; + } else { + this.factorSoFar = operand; + } + + this.pendingMultiplicativeOperator = __qt_sender__.text; + this.waitingForOperand = true; +} + +Calculator.prototype.equalClicked = function() +{ + var operand = this.ui.display.text - 0; + + if (this.pendingMultiplicativeOperator.length != 0) { + if (!this.calculate(operand, this.pendingMultiplicativeOperator)) { + this.abortOperation(); + return; + } + operand = this.factorSoFar; + this.factorSoFar = 0.0; + this.pendingMultiplicativeOperator = ""; + } + if (this.pendingAdditiveOperator.length != 0) { + if (!this.calculate(operand, this.pendingAdditiveOperator)) { + this.abortOperation(); + return; + } + this.pendingAdditiveOperator = ""; + } else { + this.sumSoFar = operand; + } + + this.ui.display.text = this.sumSoFar + ""; + this.sumSoFar = 0.0; + this.waitingForOperand = true; +} + +Calculator.prototype.pointClicked = function() +{ + if (this.waitingForOperand) + this.ui.display.text = "0"; + if (this.ui.display.text.indexOf(".") == -1) + this.ui.display.text += "."; + this.waitingForOperand = false; +} + +//! [2] +Calculator.prototype.changeSignClicked = function() +{ + var text = this.ui.display.text; + var value = text - 0; + + if (value > 0) { + text = "-" + text; + } else if (value < 0) { + text = text.slice(1); + } + this.ui.display.text = text; +} +//! [2] + +Calculator.prototype.backspaceClicked = function() +{ + if (this.waitingForOperand) + return; + + var text = this.ui.display.text; + text = text.slice(0, -1); + if (text.length == 0) { + text = "0"; + this.waitingForOperand = true; + } + this.ui.display.text = text; +} + +Calculator.prototype.clear = function() +{ + if (this.waitingForOperand) + return; + + this.ui.display.text = "0"; + this.waitingForOperand = true; +} + +Calculator.prototype.clearAll = function() +{ + this.sumSoFar = 0.0; + this.factorSoFar = 0.0; + this.pendingAdditiveOperator = ""; + this.pendingMultiplicativeOperator = ""; + this.ui.display.text = "0"; + this.waitingForOperand = true; +} + +Calculator.prototype.clearMemory = function() +{ + this.sumInMemory = 0.0; +} + +Calculator.prototype.readMemory = function() +{ + this.ui.display.text = this.sumInMemory + ""; + this.waitingForOperand = true; +} + +Calculator.prototype.setMemory = function() +{ + this.equalClicked(); + this.sumInMemory = this.ui.display.text - 0; +} + +Calculator.prototype.addToMemory = function() +{ + this.equalClicked(); + this.sumInMemory += this.ui.display.text - 0; +} |