Subversion Repositories Scribus

Rev

Rev 139 | Rev 161 | 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)
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;
54
                        Width = 3;
55
                        break;
3 paul 56
                default:
57
                        Decimals = 100;
58
                        Width = 2;
59
                        break;
60
                }
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 )
70
                {
71
                QKeyEvent* k = (QKeyEvent*)ev;
72
                if (k->key() == Key_Shift)
73
                        {
138 Franz 74
                        setLineStep(QMAX(Decimals / 10, 1));
3 paul 75
                        retval = true;
76
            qApp->sendEvent( this, ev );
77
                        return retval;
78
                        }
79
                }
80
        if ( ev->type() == QEvent::KeyRelease )
81
                {
82
                QKeyEvent* k = (QKeyEvent*)ev;
83
                if (k->key() == Key_Shift)
84
                        {
85
                        setLineStep(Decimals);
86
                        retval = true;
87
            qApp->sendEvent( this, ev );
88
                        return retval;
89
                        }
90
                }
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
{
137 Franz 110
  FunctionParser fp;
138 Franz 111
        QString ts = text();
112
        QString su = suffix();
113
        ts.replace(",", ".");
114
        if (su == tr( " pt" ))
115
                {
116
                ts.replace("pt", "");
117
                ts.replace("mm", "/25.4*72");
118
                ts.replace("in", "*72");
119
                ts.replace("p", "*12");
120
                }
121
        else if (su == tr( " mm" ))
122
                {
123
                ts.replace("pt", "/72*25.4");
124
                ts.replace("mm", "");
125
                ts.replace("in", "*25.4");
126
                ts.replace("p", "/12*25.4");
127
                }
128
        else if (su == tr( " in" ))
129
                {
130
                ts.replace("pt", "/72");
131
                ts.replace("mm", "/25.4");
132
                ts.replace("in", "");
133
                ts.replace("p", "/6");
134
                }
135
        else if (su == tr( " p" ))
136
                {
137
                ts.replace("pt", "/12");
138
                ts.replace("mm", "/25.4*6");
139
                ts.replace("in", "*6");
140
                ts.replace("p", "");
141
                }
142
        else if (su != "")
143
                {
144
                ts.replace(su, " ");
145
                }
146
  int ret = fp.Parse(ts.latin1(), "", true);
137 Franz 147
        if (ret >= 0)
148
                return 0;
149
  double erg = fp.Eval(NULL);
139 Franz 150
        return qRound(erg*Decimals);
3 paul 151
}
152
 
153
void MSpinBox::setDecimals(int deci)
154
{
155
        Decimals = deci;
146 Franz 156
        QSpinBox::setLineStep(Decimals);
138 Franz 157
        if (deci < 10)
158
                Width = 0;
80 Franz 159
        if (deci > 9 && deci < 100)
3 paul 160
                Width = 1;
139 Franz 161
        if (deci > 99 && deci < 1000)
3 paul 162
                Width = 2;
139 Franz 163
        if (deci > 999 && deci < 10000)
164
                Width = 3;
165
        if (deci > 9999)
166
                Width = 4;
3 paul 167
}
146 Franz 168
 
169
/*!
170
 \fn MSpinBox::setMaxValue()
171
 \author Franz Schmid
172
 \date
173
 \brief Sets the Maximum Value of the Spinbox
174
 \param val new Value
175
 \retval None
176
 */
177
 
178
void MSpinBox::setMaxValue(double val)
179
{
180
        QSpinBox::setMaxValue(qRound(val*Decimals));
181
}
182
 
183
/*!
184
 \fn MSpinBox::setMinValue()
185
 \author Franz Schmid
186
 \date
187
 \brief Sets the Minimum Value of the Spinbox
188
 \param val new Value
189
 \retval None
190
 */
191
 
192
void MSpinBox::setMinValue(double val)
193
{
194
        QSpinBox::setMinValue(qRound(val*Decimals));
195
}
196
 
197
/*!
198
 \fn MSpinBox::setValue()
199
 \author Franz Schmid
200
 \date
201
 \brief Sets the Value of the Spinbox
202
 \param val new Value
203
 \retval None
204
 */
205
 
206
void MSpinBox::setValue(double val)
207
{
208
        QSpinBox::setValue(qRound(val*Decimals));
209
}
210
 
211
/*!
212
 \fn MSpinBox::value()
213
 \author Franz Schmid
214
 \date
215
 \brief Returns the current Value of the SpinBox
216
 \param None
217
 \retval The Value
218
 */
219
 
220
double MSpinBox::value()
221
{
222
        return static_cast<double>(QSpinBox::value()) / Decimals;
223
}