annotate examples/widgets/calculator/calculator_d1.d @ 216:06e7d3219464

ups....
author SokoL_SD
date Tue, 14 Jul 2009 15:28:22 +0000
parents
children 256ab6cb8e85
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
216
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
1 /****************************************************************************
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
2 **
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
4 ** Contact: Qt Software Information (qt-info@nokia.com)
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
5 **
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
6 ** This file is part of the example classes of the Qt Toolkit.
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
7 **
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
8 ** $QT_BEGIN_LICENSE:LGPL$
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
9 ** Commercial Usage
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
10 ** Licensees holding valid Qt Commercial licenses may use this file in
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
11 ** accordance with the Qt Commercial License Agreement provided with the
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
12 ** Software or, alternatively, in accordance with the terms contained in
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
13 ** a written agreement between you and Nokia.
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
14 **
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
15 ** GNU Lesser General Public License Usage
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
16 ** Alternatively, this file may be used under the terms of the GNU Lesser
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
17 ** General Public License version 2.1 as published by the Free Software
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
18 ** Foundation and appearing in the file LICENSE.LGPL included in the
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
19 ** packaging of this file. Please review the following information to
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
20 ** ensure the GNU Lesser General Public License version 2.1 requirements
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
21 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
22 **
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
23 ** In addition, as a special exception, Nokia gives you certain
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
24 ** additional rights. These rights are described in the Nokia Qt LGPL
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
25 ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
26 ** package.
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
27 **
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
28 ** GNU General Public License Usage
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
29 ** Alternatively, this file may be used under the terms of the GNU
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
30 ** General Public License version 3.0 as published by the Free Software
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
31 ** Foundation and appearing in the file LICENSE.GPL included in the
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
32 ** packaging of this file. Please review the following information to
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
33 ** ensure the GNU General Public License version 3.0 requirements will be
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
34 ** met: http://www.gnu.org/copyleft/gpl.html.
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
35 **
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
36 ** If you are unsure which license is appropriate for your use, please
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
37 ** contact the sales department at qt-sales@nokia.com.
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
38 ** $QT_END_LICENSE$
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
39 **
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
40 ****************************************************************************/
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
41
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
42 module calculator_d1;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
43
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
44 import button;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
45 import qt.gui.QDialog;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
46 import qt.gui.QGridLayout;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
47 import qt.gui.QLineEdit;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
48 import qt.gui.QFont;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
49
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
50 import tango.math.Math;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
51 import tango.math.Math : pow, sqrt;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
52 import Float = tango.text.convert.Float;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
53 import Integer = tango.text.convert.Integer;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
54 import tango.core.Array;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
55
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
56 class Calculator : public QDialog
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
57 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
58
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
59 public:
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
60
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
61 this(QWidget parent = null)
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
62 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
63 super(parent);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
64
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
65 sumInMemory = 0.0;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
66 sumSoFar = 0.0;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
67 factorSoFar = 0.0;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
68 waitingForOperand = true;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
69
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
70 display = new QLineEdit("0");
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
71 display.setReadOnly(true);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
72 display.setAlignment(Qt.AlignRight);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
73 display.setMaxLength(15);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
74
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
75 auto font = new QFont(display.font());
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
76 font.setPointSize(font.pointSize() + 8);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
77 display.setFont(font);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
78
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
79 for (int i = 0; i < NumDigitButtons; ++i) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
80 digitButtons[i] = createButton(Integer.toString(i), &digitClicked);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
81 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
82
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
83 Button pointButton = createButton(tr("."), &pointClicked);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
84 Button changeSignButton = createButton(tr("+/-"), &changeSignClicked);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
85
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
86 Button backspaceButton = createButton(tr("Backspace"), &backspaceClicked);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
87 Button clearButton = createButton(tr("Clear"), &clear);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
88 Button clearAllButton = createButton(tr("Clear All"), &clearAll);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
89
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
90 Button clearMemoryButton = createButton(tr("MC"), &clearMemory);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
91 Button readMemoryButton = createButton(tr("MR"), &readMemory);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
92 Button setMemoryButton = createButton(tr("MS"), &setMemory);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
93 Button addToMemoryButton = createButton(tr("M+"), &addToMemory);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
94
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
95 Button divisionButton = createButton(tr("/"), &multiplicativeOperatorClicked);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
96 Button timesButton = createButton(tr("*"), &multiplicativeOperatorClicked);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
97 Button minusButton = createButton(tr("-"), &additiveOperatorClicked);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
98 Button plusButton = createButton(tr("+"), &additiveOperatorClicked);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
99
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
100 Button squareRootButton = createButton(tr("Sqrt"), &unaryOperatorClicked);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
101 Button powerButton = createButton(tr("x^2"), &unaryOperatorClicked);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
102 Button reciprocalButton = createButton(tr("1/x"), &unaryOperatorClicked);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
103 Button equalButton = createButton(tr("="), &equalClicked);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
104
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
105 QGridLayout mainLayout = new QGridLayout();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
106
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
107 mainLayout.setSizeConstraint(QLayout.SetFixedSize);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
108
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
109 mainLayout.addWidget(display, 0, 0, 1, 6);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
110 mainLayout.addWidget(backspaceButton, 1, 0, 1, 2);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
111 mainLayout.addWidget(clearButton, 1, 2, 1, 2);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
112 mainLayout.addWidget(clearAllButton, 1, 4, 1, 2);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
113
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
114 mainLayout.addWidget(clearMemoryButton, 2, 0);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
115 mainLayout.addWidget(readMemoryButton, 3, 0);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
116 mainLayout.addWidget(setMemoryButton, 4, 0);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
117 mainLayout.addWidget(addToMemoryButton, 5, 0);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
118
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
119 for (int i = 1; i < NumDigitButtons; ++i) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
120 int row = ((9 - i) / 3) + 2;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
121 int column = ((i - 1) % 3) + 1;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
122 mainLayout.addWidget(digitButtons[i], row, column);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
123 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
124
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
125 mainLayout.addWidget(digitButtons[0], 5, 1);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
126 mainLayout.addWidget(pointButton, 5, 2);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
127 mainLayout.addWidget(changeSignButton, 5, 3);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
128
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
129 mainLayout.addWidget(divisionButton, 2, 4);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
130 mainLayout.addWidget(timesButton, 3, 4);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
131 mainLayout.addWidget(minusButton, 4, 4);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
132 mainLayout.addWidget(plusButton, 5, 4);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
133
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
134 mainLayout.addWidget(squareRootButton, 2, 5);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
135 mainLayout.addWidget(powerButton, 3, 5);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
136 mainLayout.addWidget(reciprocalButton, 4, 5);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
137 mainLayout.addWidget(equalButton, 5, 5);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
138 setLayout(mainLayout);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
139
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
140 setWindowTitle(tr("Calculator"));
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
141 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
142
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
143 //private slots:
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
144 void digitClicked()
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
145 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
146 Button clickedButton = cast(Button) signalSender();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
147 int digitValue = Integer.toInt(clickedButton.text);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
148 if (display.text() == "0" && digitValue == 0.0)
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
149 return;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
150
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
151 if (waitingForOperand) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
152 display.clear();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
153 waitingForOperand = false;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
154 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
155 display.setText(display.text() ~ Integer.toString(digitValue));
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
156 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
157
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
158 void unaryOperatorClicked()
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
159 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
160 Button clickedButton = cast(Button) signalSender();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
161 string clickedOperator = clickedButton.text();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
162 double operand = Float.toFloat(display.text);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
163 double result = 0.0;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
164
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
165 if (clickedOperator == tr("Sqrt")) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
166 if (operand < 0.0) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
167 abortOperation();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
168 return;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
169 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
170 result = sqrt(operand);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
171 } else if (clickedOperator == tr("x^2")) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
172 result = pow(operand, 2.0);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
173 } else if (clickedOperator == tr("1/x")) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
174 if (operand == 0.0) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
175 abortOperation();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
176 return;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
177 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
178 result = 1.0 / operand;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
179 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
180 display.setText(Float.toString(result, 4));
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
181 waitingForOperand = true;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
182 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
183
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
184 void additiveOperatorClicked()
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
185 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
186 Button clickedButton = cast(Button) signalSender();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
187 string clickedOperator = clickedButton.text();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
188 double operand = Float.toFloat(display.text);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
189
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
190 if (pendingMultiplicativeOperator.length) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
191 if (!calculate(operand, pendingMultiplicativeOperator)) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
192 abortOperation();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
193 return;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
194 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
195 display.setText(Float.toString(factorSoFar, 4));
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
196 operand = factorSoFar;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
197 factorSoFar = 0.0;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
198 pendingMultiplicativeOperator = null;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
199 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
200
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
201 if (pendingAdditiveOperator.length) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
202 if (!calculate(operand, pendingAdditiveOperator)) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
203 abortOperation();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
204 return;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
205 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
206 display.setText(Float.toString(sumSoFar, 4));
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
207 } else {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
208 sumSoFar = operand;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
209 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
210
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
211 pendingAdditiveOperator = clickedOperator;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
212 waitingForOperand = true;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
213 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
214
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
215 void multiplicativeOperatorClicked()
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
216 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
217 Button clickedButton = cast(Button) signalSender();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
218 string clickedOperator = clickedButton.text();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
219 double operand = Float.toFloat(display.text);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
220
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
221 if (pendingMultiplicativeOperator.length) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
222 if (!calculate(operand, pendingMultiplicativeOperator)) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
223 abortOperation();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
224 return;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
225 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
226 display.setText(Float.toString(factorSoFar, 4));
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
227 } else {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
228 factorSoFar = operand;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
229 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
230
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
231 pendingMultiplicativeOperator = clickedOperator;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
232 waitingForOperand = true;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
233 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
234
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
235 void equalClicked()
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
236 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
237 double operand = Float.toFloat(display.text);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
238
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
239 if (pendingMultiplicativeOperator.length) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
240 if (!calculate(operand, pendingMultiplicativeOperator)) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
241 abortOperation();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
242 return;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
243 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
244 operand = factorSoFar;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
245 factorSoFar = 0.0;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
246 pendingMultiplicativeOperator = null;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
247 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
248 if (pendingAdditiveOperator.length) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
249 if (!calculate(operand, pendingAdditiveOperator)) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
250 abortOperation();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
251 return;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
252 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
253 pendingAdditiveOperator = null;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
254 } else {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
255 sumSoFar = operand;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
256 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
257
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
258 display.setText(Float.toString(sumSoFar, 4));
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
259 sumSoFar = 0.0;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
260 waitingForOperand = true;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
261 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
262
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
263 void pointClicked()
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
264 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
265 string text = display.text;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
266
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
267 if (waitingForOperand)
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
268 display.setText("0");
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
269
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
270 if (find(text, '.') >= text.length)
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
271 display.setText(text ~ tr("."));
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
272
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
273 waitingForOperand = false;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
274 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
275
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
276 void changeSignClicked()
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
277 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
278 string text = display.text();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
279 double value = Float.toFloat(text);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
280
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
281 if (value > 0.0) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
282 text = "-" ~ text;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
283 } else if (value < 0.0) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
284 text = text[1..$];
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
285 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
286 display.setText(text);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
287 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
288
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
289 void backspaceClicked()
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
290 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
291 if (waitingForOperand)
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
292 return;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
293
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
294 string text = display.text();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
295 text = text[0..$-1];
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
296 if (text.length == 0) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
297 text = "0";
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
298 waitingForOperand = true;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
299 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
300 display.setText(text);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
301 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
302
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
303
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
304 void clear()
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
305 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
306 if (waitingForOperand)
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
307 return;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
308
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
309 display.setText("0");
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
310 waitingForOperand = true;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
311 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
312
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
313 void clearAll()
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
314 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
315 sumSoFar = 0.0;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
316 factorSoFar = 0.0;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
317 pendingAdditiveOperator = null;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
318 pendingMultiplicativeOperator = null;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
319 display.setText("0");
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
320 waitingForOperand = true;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
321 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
322
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
323 void clearMemory()
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
324 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
325 sumInMemory = 0.0;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
326 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
327
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
328 void readMemory()
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
329 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
330 display.setText(Float.toString(sumInMemory, 4));
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
331 waitingForOperand = true;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
332 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
333
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
334 void setMemory()
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
335 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
336 equalClicked();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
337 sumInMemory = Float.toFloat(display.text);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
338 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
339
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
340 void addToMemory()
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
341 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
342 equalClicked();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
343 sumInMemory += Float.toFloat(display.text);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
344 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
345
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
346 private:
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
347
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
348 Button createButton(string text, void delegate() member)
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
349 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
350 Button button = new Button(text);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
351 button.clicked.connect(member);
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
352 return button;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
353 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
354
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
355 void abortOperation()
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
356 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
357 clearAll();
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
358 display.setText(tr("####"));
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
359 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
360
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
361 bool calculate(double rightOperand, string pendingOperator)
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
362 {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
363 if (pendingOperator == tr("+")) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
364 sumSoFar += rightOperand;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
365 } else if (pendingOperator == tr("-")) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
366 sumSoFar -= rightOperand;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
367 } else if (pendingOperator == tr("*")) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
368 factorSoFar *= rightOperand;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
369 } else if (pendingOperator == tr("/")) {
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
370 if (rightOperand == 0.0)
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
371 return false;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
372 factorSoFar /= rightOperand;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
373 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
374 return true;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
375 }
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
376
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
377 double sumInMemory;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
378 double sumSoFar;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
379 double factorSoFar;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
380 string pendingAdditiveOperator;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
381 string pendingMultiplicativeOperator;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
382 bool waitingForOperand;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
383
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
384 QLineEdit display;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
385
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
386 enum { NumDigitButtons = 10 };
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
387 Button[NumDigitButtons] digitButtons;
06e7d3219464 ups....
SokoL_SD
parents:
diff changeset
388 }