Rev 272 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3 | paul | 1 | /*************************************************************************** |
2 | mspinbox.cpp - description |
||
3 | ------------------- |
||
4 | begin : Sat Jun 16 2001 |
||
5 | copyright : (C) 2001 by Franz Schmid |
||
6 | email : Franz.Schmid@altmuehlnet.de |
||
7 | ***************************************************************************/ |
||
8 | |||
9 | /*************************************************************************** |
||
10 | * * |
||
11 | * This program is free software; you can redistribute it and/or modify * |
||
12 | * it under the terms of the GNU General Public License as published by * |
||
13 | * the Free Software Foundation; either version 2 of the License, or * |
||
14 | * (at your option) any later version. * |
||
15 | * * |
||
16 | ***************************************************************************/ |
||
17 | |||
18 | #include "mspinbox.h" |
||
280 | Franz | 19 | #include "mspinbox.moc" |
137 | Franz | 20 | #include <qapplication.h> |
21 | #include "fparser.h" |
||
3 | paul | 22 | |
146 | Franz | 23 | /*! |
24 | \fn MSpinBox(QWidget *pa, int s) |
||
25 | \author Franz Schmid |
||
26 | \date |
||
27 | \brief Constructor |
||
28 | \param pa Parent Widget |
||
29 | \param s Number of Decimals |
||
30 | \retval None |
||
31 | */ |
||
32 | |||
3 | paul | 33 | MSpinBox::MSpinBox(QWidget *pa, int s):QSpinBox(pa) |
34 | { |
||
35 | switch (s) |
||
161 | Franz | 36 | { |
138 | Franz | 37 | case 0: |
38 | Decimals = 1; |
||
39 | Width = 0; |
||
40 | break; |
||
3 | paul | 41 | case 1: |
42 | Decimals = 10; |
||
43 | Width = 1; |
||
44 | break; |
||
45 | case 2: |
||
46 | Decimals = 100; |
||
47 | Width = 2; |
||
139 | Franz | 48 | break; |
49 | case 3: |
||
50 | Decimals = 1000; |
||
51 | Width = 3; |
||
52 | break; |
||
53 | case 4: |
||
54 | Decimals = 10000; |
||
173 | Franz | 55 | Width = 4; |
139 | Franz | 56 | break; |
3 | paul | 57 | default: |
58 | Decimals = 100; |
||
59 | Width = 2; |
||
60 | break; |
||
161 | Franz | 61 | } |
3 | paul | 62 | setValidator(0); |
77 | Franz | 63 | ed = editor(); |
146 | Franz | 64 | QSpinBox::setLineStep(Decimals); |
3 | paul | 65 | } |
66 | |||
67 | bool MSpinBox::eventFilter( QObject* ob, QEvent* ev ) |
||
68 | { |
||
69 | bool retval = FALSE; |
||
70 | if ( ev->type() == QEvent::KeyPress ) |
||
161 | Franz | 71 | { |
3 | paul | 72 | QKeyEvent* k = (QKeyEvent*)ev; |
73 | if (k->key() == Key_Shift) |
||
161 | Franz | 74 | { |
138 | Franz | 75 | setLineStep(QMAX(Decimals / 10, 1)); |
3 | paul | 76 | retval = true; |
161 | Franz | 77 | qApp->sendEvent( this, ev ); |
3 | paul | 78 | return retval; |
79 | } |
||
161 | Franz | 80 | } |
3 | paul | 81 | if ( ev->type() == QEvent::KeyRelease ) |
161 | Franz | 82 | { |
3 | paul | 83 | QKeyEvent* k = (QKeyEvent*)ev; |
84 | if (k->key() == Key_Shift) |
||
161 | Franz | 85 | { |
3 | paul | 86 | setLineStep(Decimals); |
87 | retval = true; |
||
161 | Franz | 88 | qApp->sendEvent( this, ev ); |
3 | paul | 89 | return retval; |
161 | Franz | 90 | } |
91 | } |
||
3 | paul | 92 | return QSpinBox::eventFilter(ob, ev); |
93 | } |
||
94 | |||
95 | QString MSpinBox::mapValueToText(int value) |
||
96 | { |
||
139 | Franz | 97 | return QString::number(static_cast<double>(value) / Decimals, 'f', Width); |
3 | paul | 98 | } |
99 | |||
146 | Franz | 100 | /*! |
101 | \fn MSpinBox::mapTextToValue(bool *) |
||
102 | \author Franz Schmid |
||
103 | \date |
||
104 | \brief Maps the Text fo the Spinbox to the Value, does Unit Conversion and Calculations |
||
105 | \param None |
||
106 | \retval The Value |
||
107 | */ |
||
108 | |||
3 | paul | 109 | int MSpinBox::mapTextToValue(bool *) |
110 | { |
||
161 | Franz | 111 | FunctionParser fp; |
138 | Franz | 112 | QString ts = text(); |
113 | QString su = suffix(); |
||
114 | ts.replace(",", "."); |
||
272 | Franz | 115 | ts.replace("%", ""); |
199 | Franz | 116 | if ((su == QObject::tr( " pt" )) || (su == QObject::tr( "pt" ))) |
161 | Franz | 117 | { |
239 | Franz | 118 | ts.replace(QObject::tr( "pt"), ""); |
119 | ts.replace(QObject::tr( "mm"), "/25.4*72"); |
||
120 | ts.replace(QObject::tr( "in"), "*72"); |
||
121 | ts.replace(QObject::tr( "p"), "*12"); |
||
161 | Franz | 122 | } |
123 | else |
||
199 | Franz | 124 | if ((su == QObject::tr( " mm" )) || (su == QObject::tr( "mm" ))) |
138 | Franz | 125 | { |
239 | Franz | 126 | ts.replace(QObject::tr( "pt"), "/72*25.4"); |
127 | ts.replace(QObject::tr( "mm"), ""); |
||
128 | ts.replace(QObject::tr( "in"), "*25.4"); |
||
129 | ts.replace(QObject::tr( "p"), "/12*25.4"); |
||
138 | Franz | 130 | } |
161 | Franz | 131 | else |
199 | Franz | 132 | if ((su == QObject::tr( " in" )) || (su == QObject::tr( "in" ))) |
161 | Franz | 133 | { |
239 | Franz | 134 | ts.replace(QObject::tr( "pt"), "/72"); |
135 | ts.replace(QObject::tr( "mm"), "/25.4"); |
||
136 | ts.replace(QObject::tr( "in"), ""); |
||
137 | ts.replace(QObject::tr( "p"), "/6"); |
||
161 | Franz | 138 | } |
139 | else |
||
199 | Franz | 140 | if ((su == QObject::tr( " p" )) || (su == QObject::tr( "p" ))) |
161 | Franz | 141 | { |
239 | Franz | 142 | ts.replace(QObject::tr( "pt"), "/12"); |
143 | ts.replace(QObject::tr( "mm"), "/25.4*6"); |
||
144 | ts.replace(QObject::tr( "in"), "*6"); |
||
145 | ts.replace(QObject::tr( "p"), ""); |
||
161 | Franz | 146 | } |
147 | else |
||
148 | if (su != "") |
||
149 | ts.replace(su, " "); |
||
150 | int ret = fp.Parse(ts.latin1(), "", true); |
||
137 | Franz | 151 | if (ret >= 0) |
152 | return 0; |
||
161 | Franz | 153 | double erg = fp.Eval(NULL); |
139 | Franz | 154 | return qRound(erg*Decimals); |
3 | paul | 155 | } |
156 | |||
157 | void MSpinBox::setDecimals(int deci) |
||
158 | { |
||
159 | Decimals = deci; |
||
146 | Franz | 160 | QSpinBox::setLineStep(Decimals); |
138 | Franz | 161 | if (deci < 10) |
162 | Width = 0; |
||
199 | Franz | 163 | if ((deci > 9) && (deci < 100)) |
3 | paul | 164 | Width = 1; |
199 | Franz | 165 | if ((deci > 99) && (deci < 1000)) |
3 | paul | 166 | Width = 2; |
199 | Franz | 167 | if ((deci > 999) && (deci < 10000)) |
139 | Franz | 168 | Width = 3; |
169 | if (deci > 9999) |
||
170 | Width = 4; |
||
3 | paul | 171 | } |
146 | Franz | 172 | |
173 | /*! |
||
174 | \fn MSpinBox::setMaxValue() |
||
175 | \author Franz Schmid |
||
176 | \date |
||
177 | \brief Sets the Maximum Value of the Spinbox |
||
178 | \param val new Value |
||
179 | \retval None |
||
180 | */ |
||
181 | |||
182 | void MSpinBox::setMaxValue(double val) |
||
183 | { |
||
184 | QSpinBox::setMaxValue(qRound(val*Decimals)); |
||
185 | } |
||
186 | |||
187 | /*! |
||
188 | \fn MSpinBox::setMinValue() |
||
189 | \author Franz Schmid |
||
190 | \date |
||
191 | \brief Sets the Minimum Value of the Spinbox |
||
192 | \param val new Value |
||
193 | \retval None |
||
194 | */ |
||
195 | |||
196 | void MSpinBox::setMinValue(double val) |
||
197 | { |
||
198 | QSpinBox::setMinValue(qRound(val*Decimals)); |
||
199 | } |
||
200 | |||
201 | /*! |
||
202 | \fn MSpinBox::setValue() |
||
203 | \author Franz Schmid |
||
204 | \date |
||
205 | \brief Sets the Value of the Spinbox |
||
206 | \param val new Value |
||
207 | \retval None |
||
208 | */ |
||
209 | |||
210 | void MSpinBox::setValue(double val) |
||
211 | { |
||
212 | QSpinBox::setValue(qRound(val*Decimals)); |
||
213 | } |
||
214 | |||
215 | /*! |
||
216 | \fn MSpinBox::value() |
||
217 | \author Franz Schmid |
||
218 | \date |
||
219 | \brief Returns the current Value of the SpinBox |
||
220 | \param None |
||
221 | \retval The Value |
||
222 | */ |
||
223 | |||
224 | double MSpinBox::value() |
||
225 | { |
||
226 | return static_cast<double>(QSpinBox::value()) / Decimals; |
||
227 | } |
||
199 | Franz | 228 | |
229 | /*! |
||
230 | \fn MSpinBox::minValue() |
||
231 | \author Franz Schmid |
||
232 | \date |
||
233 | \brief Gets the Minimum Value of the Spinbox |
||
234 | \param None |
||
235 | \retval The Value |
||
236 | */ |
||
237 | |||
238 | double MSpinBox::minValue() |
||
239 | { |
||
240 | return static_cast<double>(QSpinBox::minValue()) / Decimals; |
||
241 | } |
||
242 | |||
243 | /*! |
||
244 | \fn MSpinBox::maxValue() |
||
245 | \author Franz Schmid |
||
246 | \date |
||
247 | \brief Gets the Maximum Value of the Spinbox |
||
248 | \param None |
||
249 | \retval The Value |
||
250 | */ |
||
251 | |||
252 | double MSpinBox::maxValue() |
||
253 | { |
||
254 | return static_cast<double>(QSpinBox::maxValue()) / Decimals; |
||
255 | } |