Subversion Repositories Scribus

Rev

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
}