Subversion Repositories Scribus

Rev

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