Subversion Repositories Scribus

Rev

Rev 199 | Rev 272 | 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(",", ".");
199 Franz 114
        if ((su == QObject::tr( " pt" )) || (su == QObject::tr( "pt" )))
161 Franz 115
        {
239 Franz 116
                ts.replace(QObject::tr( "pt"), "");
117
                ts.replace(QObject::tr( "mm"), "/25.4*72");
118
                ts.replace(QObject::tr( "in"), "*72");
119
                ts.replace(QObject::tr( "p"), "*12");
161 Franz 120
        }
121
        else
199 Franz 122
                if ((su == QObject::tr( " mm" )) || (su == QObject::tr( "mm" )))
138 Franz 123
                {
239 Franz 124
                        ts.replace(QObject::tr( "pt"), "/72*25.4");
125
                        ts.replace(QObject::tr( "mm"), "");
126
                        ts.replace(QObject::tr( "in"), "*25.4");
127
                        ts.replace(QObject::tr( "p"), "/12*25.4");
138 Franz 128
                }
161 Franz 129
                else
199 Franz 130
                        if ((su == QObject::tr( " in" )) || (su == QObject::tr( "in" )))
161 Franz 131
                        {
239 Franz 132
                                ts.replace(QObject::tr( "pt"), "/72");
133
                                ts.replace(QObject::tr( "mm"), "/25.4");
134
                                ts.replace(QObject::tr( "in"), "");
135
                                ts.replace(QObject::tr( "p"), "/6");
161 Franz 136
                        }
137
                        else
199 Franz 138
                                if ((su == QObject::tr( " p" )) || (su == QObject::tr( "p" )))
161 Franz 139
                                {
239 Franz 140
                                        ts.replace(QObject::tr( "pt"), "/12");
141
                                        ts.replace(QObject::tr( "mm"), "/25.4*6");
142
                                        ts.replace(QObject::tr( "in"), "*6");
143
                                        ts.replace(QObject::tr( "p"), "");
161 Franz 144
                                }
145
                        else
146
                                if (su != "")
147
                                        ts.replace(su, " ");
148
        int ret = fp.Parse(ts.latin1(), "", true);
137 Franz 149
        if (ret >= 0)
150
                return 0;
161 Franz 151
        double erg = fp.Eval(NULL);
139 Franz 152
        return qRound(erg*Decimals);
3 paul 153
}
154
 
155
void MSpinBox::setDecimals(int deci)
156
{
157
        Decimals = deci;
146 Franz 158
        QSpinBox::setLineStep(Decimals);
138 Franz 159
        if (deci < 10)
160
                Width = 0;
199 Franz 161
        if ((deci > 9) && (deci < 100))
3 paul 162
                Width = 1;
199 Franz 163
        if ((deci > 99) && (deci < 1000))
3 paul 164
                Width = 2;
199 Franz 165
        if ((deci > 999) && (deci < 10000))
139 Franz 166
                Width = 3;
167
        if (deci > 9999)
168
                Width = 4;
3 paul 169
}
146 Franz 170
 
171
/*!
172
 \fn MSpinBox::setMaxValue()
173
 \author Franz Schmid
174
 \date
175
 \brief Sets the Maximum Value of the Spinbox
176
 \param val new Value
177
 \retval None
178
 */
179
 
180
void MSpinBox::setMaxValue(double val)
181
{
182
        QSpinBox::setMaxValue(qRound(val*Decimals));
183
}
184
 
185
/*!
186
 \fn MSpinBox::setMinValue()
187
 \author Franz Schmid
188
 \date
189
 \brief Sets the Minimum Value of the Spinbox
190
 \param val new Value
191
 \retval None
192
 */
193
 
194
void MSpinBox::setMinValue(double val)
195
{
196
        QSpinBox::setMinValue(qRound(val*Decimals));
197
}
198
 
199
/*!
200
 \fn MSpinBox::setValue()
201
 \author Franz Schmid
202
 \date
203
 \brief Sets the Value of the Spinbox
204
 \param val new Value
205
 \retval None
206
 */
207
 
208
void MSpinBox::setValue(double val)
209
{
210
        QSpinBox::setValue(qRound(val*Decimals));
211
}
212
 
213
/*!
214
 \fn MSpinBox::value()
215
 \author Franz Schmid
216
 \date
217
 \brief Returns the current Value of the SpinBox
218
 \param None
219
 \retval The Value
220
 */
221
 
222
double MSpinBox::value()
223
{
224
        return static_cast<double>(QSpinBox::value()) / Decimals;
225
}
199 Franz 226
 
227
/*!
228
 \fn MSpinBox::minValue()
229
 \author Franz Schmid
230
 \date
231
 \brief Gets the Minimum Value of the Spinbox
232
 \param None
233
 \retval The Value
234
 */
235
 
236
double MSpinBox::minValue()
237
{
238
        return static_cast<double>(QSpinBox::minValue()) / Decimals;
239
}
240
 
241
/*!
242
 \fn MSpinBox::maxValue()
243
 \author Franz Schmid
244
 \date
245
 \brief Gets the Maximum Value of the Spinbox
246
 \param None
247
 \retval The Value
248
 */
249
 
250
double MSpinBox::maxValue()
251
{
252
        return static_cast<double>(QSpinBox::maxValue()) / Decimals;
253
}