Subversion Repositories Scribus

Rev

Rev 138 | Rev 146 | 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
 
22
MSpinBox::MSpinBox(QWidget *pa, int s):QSpinBox(pa)
23
{
24
        switch (s)
25
                {
138 Franz 26
                case 0:
27
                        Decimals = 1;
28
                        Width = 0;
29
                        break;
3 paul 30
                case 1:
31
                        Decimals = 10;
32
                        Width = 1;
33
                        break;
34
                case 2:
35
                        Decimals = 100;
36
                        Width = 2;
139 Franz 37
                        break;
38
                case 3:
39
                        Decimals = 1000;
40
                        Width = 3;
41
                        break;
42
                case 4:
43
                        Decimals = 10000;
44
                        Width = 3;
45
                        break;
3 paul 46
                default:
47
                        Decimals = 100;
48
                        Width = 2;
49
                        break;
50
                }
51
        setValidator(0);
77 Franz 52
        ed = editor();
3 paul 53
}
54
 
55
bool MSpinBox::eventFilter( QObject* ob, QEvent* ev )
56
{
57
        bool retval = FALSE;
58
        if ( ev->type() == QEvent::KeyPress )
59
                {
60
                QKeyEvent* k = (QKeyEvent*)ev;
61
                if (k->key() == Key_Shift)
62
                        {
138 Franz 63
                        setLineStep(QMAX(Decimals / 10, 1));
3 paul 64
                        retval = true;
65
            qApp->sendEvent( this, ev );
66
                        return retval;
67
                        }
68
                }
69
        if ( ev->type() == QEvent::KeyRelease )
70
                {
71
                QKeyEvent* k = (QKeyEvent*)ev;
72
                if (k->key() == Key_Shift)
73
                        {
74
                        setLineStep(Decimals);
75
                        retval = true;
76
            qApp->sendEvent( this, ev );
77
                        return retval;
78
                        }
79
                }
80
        return QSpinBox::eventFilter(ob, ev);
81
}
82
 
83
QString MSpinBox::mapValueToText(int value)
84
{
139 Franz 85
//      double dez = Width == 1 ? 10.0 : 100.0;
86
        return QString::number(static_cast<double>(value) / Decimals, 'f', Width);
3 paul 87
}
88
 
89
int MSpinBox::mapTextToValue(bool *)
90
{
139 Franz 91
//      double dez = Width == 1 ? 10.0 : 100.0;
137 Franz 92
  FunctionParser fp;
138 Franz 93
        QString ts = text();
94
        QString su = suffix();
95
        ts.replace(",", ".");
96
        if (su == tr( " pt" ))
97
                {
98
                ts.replace("pt", "");
99
                ts.replace("mm", "/25.4*72");
100
                ts.replace("in", "*72");
101
                ts.replace("p", "*12");
102
                }
103
        else if (su == tr( " mm" ))
104
                {
105
                ts.replace("pt", "/72*25.4");
106
                ts.replace("mm", "");
107
                ts.replace("in", "*25.4");
108
                ts.replace("p", "/12*25.4");
109
                }
110
        else if (su == tr( " in" ))
111
                {
112
                ts.replace("pt", "/72");
113
                ts.replace("mm", "/25.4");
114
                ts.replace("in", "");
115
                ts.replace("p", "/6");
116
                }
117
        else if (su == tr( " p" ))
118
                {
119
                ts.replace("pt", "/12");
120
                ts.replace("mm", "/25.4*6");
121
                ts.replace("in", "*6");
122
                ts.replace("p", "");
123
                }
124
        else if (su != "")
125
                {
126
                ts.replace(su, " ");
127
                }
128
  int ret = fp.Parse(ts.latin1(), "", true);
137 Franz 129
        if (ret >= 0)
130
                return 0;
131
  double erg = fp.Eval(NULL);
139 Franz 132
        return qRound(erg*Decimals);
3 paul 133
}
134
 
135
void MSpinBox::setDecimals(int deci)
136
{
137
        Decimals = deci;
138
        setLineStep(Decimals);
138 Franz 139
        if (deci < 10)
140
                Width = 0;
80 Franz 141
        if (deci > 9 && deci < 100)
3 paul 142
                Width = 1;
139 Franz 143
        if (deci > 99 && deci < 1000)
3 paul 144
                Width = 2;
139 Franz 145
        if (deci > 999 && deci < 10000)
146
                Width = 3;
147
        if (deci > 9999)
148
                Width = 4;
3 paul 149
}