source: trunk/examples/script/calculator/calculator.js@ 500

Last change on this file since 500 was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 7.3 KB
Line 
1//! [0]
2function Calculator(ui)
3{
4 this.ui = ui;
5
6 this.pendingAdditiveOperator = "";
7 this.pendingMultiplicativeOperator = "";
8 this.sumInMemory = 0;
9 this.sumSoFar = 0;
10 this.factorSoFar = 0;
11 this.waitingForOperand = true;
12
13 with (ui) {
14 display.text = "0";
15
16 zeroButton.clicked.connect(this, this.digitClicked);
17 oneButton.clicked.connect(this, "digitClicked");
18 twoButton.clicked.connect(this, "digitClicked");
19 threeButton.clicked.connect(this, "digitClicked");
20 fourButton.clicked.connect(this, "digitClicked");
21 fiveButton.clicked.connect(this, "digitClicked");
22 sixButton.clicked.connect(this, "digitClicked");
23 sevenButton.clicked.connect(this, "digitClicked");
24 eightButton.clicked.connect(this, "digitClicked");
25 nineButton.clicked.connect(this, "digitClicked");
26
27 pointButton.clicked.connect(this, "pointClicked");
28 changeSignButton.clicked.connect(this, "changeSignClicked");
29
30 backspaceButton.clicked.connect(this, "backspaceClicked");
31 clearButton.clicked.connect(this, "clear");
32 clearAllButton.clicked.connect(this, "clearAll");
33
34 clearMemoryButton.clicked.connect(this, "clearMemory");
35 readMemoryButton.clicked.connect(this, "readMemory");
36 setMemoryButton.clicked.connect(this, "setMemory");
37 addToMemoryButton.clicked.connect(this, "addToMemory");
38
39 divisionButton.clicked.connect(this, "multiplicativeOperatorClicked");
40 timesButton.clicked.connect(this, "multiplicativeOperatorClicked");
41 minusButton.clicked.connect(this, "additiveOperatorClicked");
42 plusButton.clicked.connect(this, "additiveOperatorClicked");
43
44 squareRootButton.clicked.connect(this, "unaryOperatorClicked");
45 powerButton.clicked.connect(this, "unaryOperatorClicked");
46 reciprocalButton.clicked.connect(this, "unaryOperatorClicked");
47 equalButton.clicked.connect(this, "equalClicked");
48 }
49}
50//! [0]
51
52Calculator.prototype.abortOperation = function()
53{
54 this.clearAll();
55 this.ui.display.text = "####";
56}
57
58Calculator.prototype.calculate = function(rightOperand, pendingOperator)
59{
60 if (pendingOperator == "+") {
61 this.sumSoFar += rightOperand;
62 } else if (pendingOperator == "-") {
63 this.sumSoFar -= rightOperand;
64 } else if (pendingOperator == "*") {
65 this.factorSoFar *= rightOperand;
66 } else if (pendingOperator == "/") {
67 if (rightOperand == 0)
68 return false;
69 this.factorSoFar /= rightOperand;
70 }
71 return true;
72}
73
74//! [1]
75Calculator.prototype.digitClicked = function()
76{
77 var digitValue = __qt_sender__.text - 0;
78 if ((digitValue == 0) && (this.ui.display.text == "0"))
79 return;
80 if (this.waitingForOperand) {
81 this.ui.display.clear();
82 this.waitingForOperand = false;
83 }
84 this.ui.display.text += digitValue;
85}
86//! [1]
87
88Calculator.prototype.unaryOperatorClicked = function()
89{
90 var operand = this.ui.display.text - 0;
91 var result = 0;
92 if (__qt_sender__.text == "Sqrt") {
93 if (operand < 0) {
94 this.abortOperation();
95 return;
96 }
97 result = Math.sqrt(operand);
98 } else if (__qt_sender__.text == "x^2") {
99 result = Math.pow(operand, 2);
100 } else if (__qt_sender__.text == "1/x") {
101 if (operand == 0.0) {
102 this.abortOperation();
103 return;
104 }
105 result = 1 / operand;
106 }
107 this.ui.display.text = result + "";
108 this.waitingForOperand = true;
109}
110
111Calculator.prototype.additiveOperatorClicked = function()
112{
113 var operand = this.ui.display.text - 0;
114
115 if (this.pendingMultiplicativeOperator.length != 0) {
116 if (!this.calculate(operand, this.pendingMultiplicativeOperator)) {
117 this.abortOperation();
118 return;
119 }
120 this.ui.display.text = this.factorSoFar + "";
121 operand = this.factorSoFar;
122 this.factorSoFar = 0;
123 this.pendingMultiplicativeOperator = "";
124 }
125
126 if (this.pendingAdditiveOperator.length != 0) {
127 if (!this.calculate(operand, this.pendingAdditiveOperator)) {
128 this.abortOperation();
129 return;
130 }
131 this.ui.display.text = this.sumSoFar + "";
132 } else {
133 this.sumSoFar = operand;
134 }
135
136 this.pendingAdditiveOperator = __qt_sender__.text;
137 this.waitingForOperand = true;
138}
139
140Calculator.prototype.multiplicativeOperatorClicked = function()
141{
142 var operand = this.ui.display.text - 0;
143
144 if (this.pendingMultiplicativeOperator.length != 0) {
145 if (!this.calculate(operand, this.pendingMultiplicativeOperator)) {
146 this.abortOperation();
147 return;
148 }
149 this.ui.display.text = this.factorSoFar + "";
150 } else {
151 this.factorSoFar = operand;
152 }
153
154 this.pendingMultiplicativeOperator = __qt_sender__.text;
155 this.waitingForOperand = true;
156}
157
158Calculator.prototype.equalClicked = function()
159{
160 var operand = this.ui.display.text - 0;
161
162 if (this.pendingMultiplicativeOperator.length != 0) {
163 if (!this.calculate(operand, this.pendingMultiplicativeOperator)) {
164 this.abortOperation();
165 return;
166 }
167 operand = this.factorSoFar;
168 this.factorSoFar = 0.0;
169 this.pendingMultiplicativeOperator = "";
170 }
171 if (this.pendingAdditiveOperator.length != 0) {
172 if (!this.calculate(operand, this.pendingAdditiveOperator)) {
173 this.abortOperation();
174 return;
175 }
176 this.pendingAdditiveOperator = "";
177 } else {
178 this.sumSoFar = operand;
179 }
180
181 this.ui.display.text = this.sumSoFar + "";
182 this.sumSoFar = 0.0;
183 this.waitingForOperand = true;
184}
185
186Calculator.prototype.pointClicked = function()
187{
188 if (this.waitingForOperand)
189 this.ui.display.text = "0";
190 if (this.ui.display.text.indexOf(".") == -1)
191 this.ui.display.text += ".";
192 this.waitingForOperand = false;
193}
194
195//! [2]
196Calculator.prototype.changeSignClicked = function()
197{
198 var text = this.ui.display.text;
199 var value = text - 0;
200
201 if (value > 0) {
202 text = "-" + text;
203 } else if (value < 0) {
204 text = text.slice(1);
205 }
206 this.ui.display.text = text;
207}
208//! [2]
209
210Calculator.prototype.backspaceClicked = function()
211{
212 if (this.waitingForOperand)
213 return;
214
215 var text = this.ui.display.text;
216 text = text.slice(0, -1);
217 if (text.length == 0) {
218 text = "0";
219 this.waitingForOperand = true;
220 }
221 this.ui.display.text = text;
222}
223
224Calculator.prototype.clear = function()
225{
226 if (this.waitingForOperand)
227 return;
228
229 this.ui.display.text = "0";
230 this.waitingForOperand = true;
231}
232
233Calculator.prototype.clearAll = function()
234{
235 this.sumSoFar = 0.0;
236 this.factorSoFar = 0.0;
237 this.pendingAdditiveOperator = "";
238 this.pendingMultiplicativeOperator = "";
239 this.ui.display.text = "0";
240 this.waitingForOperand = true;
241}
242
243Calculator.prototype.clearMemory = function()
244{
245 this.sumInMemory = 0.0;
246}
247
248Calculator.prototype.readMemory = function()
249{
250 this.ui.display.text = this.sumInMemory + "";
251 this.waitingForOperand = true;
252}
253
254Calculator.prototype.setMemory = function()
255{
256 this.equalClicked();
257 this.sumInMemory = this.ui.display.text - 0;
258}
259
260Calculator.prototype.addToMemory = function()
261{
262 this.equalClicked();
263 this.sumInMemory += this.ui.display.text - 0;
264}
Note: See TracBrowser for help on using the repository browser.