1
/* This file is part of the KDE libraries
2
Copyright (C) 1998 Jörg Habenicht (j.habenicht@europemail.com)
4
This library is free software; you can redistribute it and/or
5
modify it under the terms of the GNU Library General Public
6
License as published by the Free Software Foundation; either
7
version 2 of the License, or (at your option) any later version.
9
This library is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
Library General Public License for more details.
14
You should have received a copy of the GNU Library General Public License
15
along with this library; see the file COPYING.LIB. If not, write to
16
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17
Boston, MA 02110-1301, USA.
25
#include <QStylePainter>
28
#define INIT_MIN_VALUE 0
29
#define INIT_MAX_VALUE 100
30
#define INIT_TINY_MARK_DISTANCE 1
31
#define INIT_LITTLE_MARK_DISTANCE 5
32
#define INIT_MIDDLE_MARK_DISTANCE (INIT_LITTLE_MARK_DISTANCE * 2)
33
#define INIT_BIG_MARK_DISTANCE (INIT_LITTLE_MARK_DISTANCE * 10)
34
#define INIT_SHOW_TINY_MARK false
35
#define INIT_SHOW_LITTLE_MARK true
36
#define INIT_SHOW_MEDIUM_MARK true
37
#define INIT_SHOW_BIG_MARK true
38
#define INIT_SHOW_END_MARK true
39
#define INIT_SHOW_POINTER true
40
#define INIT_SHOW_END_LABEL true
42
#define INIT_PIXEL_PER_MARK (double)10.0 /* distance between 2 base marks in pixel */
43
#define INIT_OFFSET (-20)
44
#define INIT_LENGTH_FIX true
45
#define INIT_END_OFFSET 0
47
#define FIX_WIDTH 20 /* widget width in pixel */
48
#define LINE_END (FIX_WIDTH - 3)
49
#define END_MARK_LENGTH (FIX_WIDTH - 6)
50
#define END_MARK_X2 LINE_END
51
#define END_MARK_X1 (END_MARK_X2 - END_MARK_LENGTH)
52
#define BIG_MARK_LENGTH (END_MARK_LENGTH*3/4)
53
#define BIG_MARK_X2 LINE_END
54
#define BIG_MARK_X1 (BIG_MARK_X2 - BIG_MARK_LENGTH)
55
#define MIDDLE_MARK_LENGTH (END_MARK_LENGTH/2)
56
#define MIDDLE_MARK_X2 LINE_END
57
#define MIDDLE_MARK_X1 (MIDDLE_MARK_X2 - MIDDLE_MARK_LENGTH)
58
#define LITTLE_MARK_LENGTH (MIDDLE_MARK_LENGTH/2)
59
#define LITTLE_MARK_X2 LINE_END
60
#define LITTLE_MARK_X1 (LITTLE_MARK_X2 - LITTLE_MARK_LENGTH)
61
#define BASE_MARK_LENGTH (LITTLE_MARK_LENGTH/2)
62
#define BASE_MARK_X2 LINE_END
63
#define BASE_MARK_X1 (BASE_MARK_X2 - BASE_MARK_LENGTH)
67
#define END_LABEL_Y (END_LABEL_X + LABEL_SIZE - 2)
72
# include <qdatetime.h>
75
class KRuler::KRulerPrivate
81
int endOffset_length; /* marks the offset at the end of the ruler
82
* i.e. right side at horizontal and down side
84
* the ruler end mark is moved endOffset_length
85
* ticks away from the widget end.
86
* positive offset moves end mark inside the ruler.
87
* if lengthFix is true, endOffset_length holds the
88
* length of the ruler.
90
int fontWidth; // ONLY valid for vertical rulers
95
KRuler::KRuler(QWidget *parent)
96
: QAbstractSlider(parent),
100
setRange(INIT_MIN_VALUE, INIT_MAX_VALUE);
102
setValue(INIT_VALUE);
104
setFixedHeight(FIX_WIDTH);
108
KRuler::KRuler(Qt::Orientation orient,
109
QWidget *parent, Qt::WFlags f)
110
: QAbstractSlider(parent),
114
setRange(INIT_MIN_VALUE, INIT_MAX_VALUE);
116
setValue(INIT_VALUE);
119
if (orient == Qt::Horizontal)
120
setFixedHeight(FIX_WIDTH);
122
setFixedWidth(FIX_WIDTH);
126
KRuler::KRuler(Qt::Orientation orient, int widgetWidth,
127
QWidget *parent, Qt::WFlags f)
128
: QAbstractSlider(parent),
132
setRange(INIT_MIN_VALUE, INIT_MAX_VALUE);
134
setValue(INIT_VALUE);
137
if (orient == Qt::Horizontal)
138
setFixedHeight(widgetWidth);
140
setFixedWidth(widgetWidth);
147
#warning FIXME setFrameStyle(WinPanel | Raised);
150
tmDist = INIT_TINY_MARK_DISTANCE;
151
lmDist = INIT_LITTLE_MARK_DISTANCE;
152
mmDist = INIT_MIDDLE_MARK_DISTANCE;
153
bmDist = INIT_BIG_MARK_DISTANCE;
154
offset_= INIT_OFFSET;
155
showtm = INIT_SHOW_TINY_MARK;
156
showlm = INIT_SHOW_LITTLE_MARK;
157
showmm = INIT_SHOW_MEDIUM_MARK;
158
showbm = INIT_SHOW_BIG_MARK;
159
showem = INIT_SHOW_END_MARK;
160
ppm = INIT_PIXEL_PER_MARK;
162
d = new KRuler::KRulerPrivate;
163
d->showpointer = INIT_SHOW_POINTER;
164
d->showEndL = INIT_SHOW_END_LABEL;
165
d->lengthFix = INIT_LENGTH_FIX;
166
d->endOffset_length = INIT_END_OFFSET;
176
KRuler::setMinValue(int value)
182
KRuler::setMaxValue(int value)
189
KRuler::setTinyMarkDistance(int dist)
191
if (dist != tmDist) {
193
update(contentsRect());
198
KRuler::setLittleMarkDistance(int dist)
200
if (dist != lmDist) {
202
update(contentsRect());
207
KRuler::setMediumMarkDistance(int dist)
209
if (dist != mmDist) {
211
update(contentsRect());
216
KRuler::setBigMarkDistance(int dist)
218
if (dist != bmDist) {
220
update(contentsRect());
225
KRuler::setShowTinyMarks(bool show)
227
if (show != showtm) {
229
update(contentsRect());
234
KRuler::showTinyMarks() const
240
KRuler::setShowLittleMarks(bool show)
242
if (show != showlm) {
244
update(contentsRect());
249
KRuler::showLittleMarks() const
255
KRuler::setShowMediumMarks(bool show)
257
if (show != showmm) {
259
update(contentsRect());
264
KRuler::showMediumMarks() const
270
KRuler::setShowBigMarks(bool show)
272
if (show != showbm) {
274
update(contentsRect());
280
KRuler::showBigMarks() const
286
KRuler::setShowEndMarks(bool show)
288
if (show != showem) {
290
update(contentsRect());
295
KRuler::showEndMarks() const
301
KRuler::setShowPointer(bool show)
303
if (show != d->showpointer) {
304
d->showpointer = show;
305
update(contentsRect());
311
KRuler::showPointer() const
313
return d->showpointer;
318
KRuler::setShowEndLabel(bool show)
320
if (d->showEndL != show) {
322
update(contentsRect());
328
KRuler::showEndLabel() const
335
KRuler::setEndLabel(const QString& label)
339
// premeasure the fontwidth and save it
340
if (dir == Qt::Vertical) {
341
QFont font = this->font();
342
font.setPointSize(LABEL_SIZE);
343
QFontMetrics fm(font);
344
d->fontWidth = fm.width(endlabel);
346
update(contentsRect());
349
QString KRuler::endLabel() const
355
KRuler::setRulerMetricStyle(KRuler::MetricStyle style)
358
default: /* fall through */
362
setLittleMarkDistance(1);
363
setMediumMarkDistance(5);
364
setBigMarkDistance(10);
366
setShowTinyMarks(false);
367
setShowLittleMarks(true);
368
setShowMediumMarks(true);
369
setShowBigMarks(true);
370
setShowEndMarks(true);
372
update(contentsRect());
373
setPixelPerMark(10.0);
377
setTinyMarkDistance(1);
378
setLittleMarkDistance(2);
379
setMediumMarkDistance(4);
380
setBigMarkDistance(8);
382
setShowTinyMarks(true);
383
setShowLittleMarks(true);
384
setShowMediumMarks(true);
385
setShowBigMarks(true);
386
setShowEndMarks(true);
388
update(contentsRect());
389
setPixelPerMark(9.0);
392
case Millimetres: /* fall through */
393
case Centimetres: /* fall through */
395
setLittleMarkDistance(1);
396
setMediumMarkDistance(5);
397
setBigMarkDistance(10);
399
setShowTinyMarks(false);
400
setShowLittleMarks(true);
401
setShowMediumMarks(true);
402
setShowBigMarks(true);
403
setShowEndMarks(true);
405
update(contentsRect());
406
setPixelPerMark(3.0);
410
setEndLabel(QLatin1String("pixel"));
413
setEndLabel(QLatin1String("inch"));
416
setEndLabel(QLatin1String("mm"));
419
setEndLabel(QLatin1String("cm"));
422
setEndLabel(QLatin1String("m"));
423
default: /* never reached, see above switch */
426
// if the style changes one of the values,
427
// update would have been called inside the methods
428
// -> no update() call needed here !
432
KRuler::setPixelPerMark(double rate)
433
{ // never compare floats against each other :)
435
update(contentsRect());
440
KRuler::setLength(int length)
447
tmp = width() - length;
449
if (tmp != d->endOffset_length) {
450
d->endOffset_length = tmp;
451
update(contentsRect());
456
KRuler::length() const
459
return d->endOffset_length;
461
return (width() - d->endOffset_length);
466
KRuler::setLengthFixed(bool fix)
472
KRuler::lengthFixed() const
478
KRuler::setOffset(int _offset)
479
{// debug("set offset %i", _offset);
480
if (offset_ != _offset) {
482
update(contentsRect());
487
KRuler::endOffset() const
490
return (width() - d->endOffset_length);
492
return d->endOffset_length;
497
KRuler::slideUp(int count)
501
update(contentsRect());
506
KRuler::slideDown(int count)
510
update(contentsRect());
516
KRuler::slotNewValue(int _value)
518
int oldvalue = value();
519
if (oldvalue == _value) {
524
if (value() == oldvalue) {
527
// get the rectangular of the old and the new ruler pointer
528
// and repaint only him
529
if (dir == Qt::Horizontal) {
530
QRect oldrec(-5+oldvalue,10, 11,6);
531
QRect newrec(-5+_value,10, 11,6);
532
repaint( oldrec.unite(newrec) );
535
QRect oldrec(10,-5+oldvalue, 6,11);
536
QRect newrec(10,-5+_value, 6,11);
537
repaint( oldrec.unite(newrec) );
542
KRuler::slotNewOffset(int _offset)
544
if (offset_ != _offset) {
545
//setOffset(_offset);
547
repaint(contentsRect());
553
KRuler::slotEndOffset(int offset)
557
tmp = width() - offset;
562
if (d->endOffset_length != tmp) {
563
d->endOffset_length = tmp;
564
repaint(contentsRect());
569
KRuler::paintEvent(QPaintEvent * /*e*/)
571
// debug ("KRuler::drawContents, %s",(horizontal==dir)?"horizontal":"vertical");
573
QStylePainter p(this);
577
for (int profile=0; profile<10; profile++) {
580
int value = this->value(),
583
if (dir == Qt::Horizontal) {
586
- (d->lengthFix?(height()-d->endOffset_length):d->endOffset_length);
592
- (d->lengthFix?(width()-d->endOffset_length):d->endOffset_length);
594
//ioffsetval = value-offset;
595
// pixelpm = (int)ppm;
596
// left = clip.left(),
597
// right = clip.right();
599
offsetmin=(double)(minval-offset_),
600
offsetmax=(double)(maxval-offset_),
601
fontOffset = (((double)minval)>offsetmin)?(double)minval:offsetmin;
604
QFont font = p.font();
605
font.setPointSize(LABEL_SIZE);
607
// draw littlemarklabel
609
// draw mediummarklabel
615
if (dir == Qt::Horizontal) {
616
p.translate( fontOffset, 0 );
617
p.drawText( END_LABEL_X, END_LABEL_Y, endlabel );
619
else { // rotate text +pi/2 and move down a bit
620
//QFontMetrics fm(font);
621
#ifdef KRULER_ROTATE_TEST
622
p.rotate( -90.0 + rotate );
623
p.translate( -8.0 - fontOffset - d->fontWidth + xtrans,
627
p.translate( -8.0 - fontOffset - d->fontWidth, 0.0 );
629
p.drawText( END_LABEL_X, END_LABEL_Y, endlabel );
634
// draw the tiny marks
637
for ( f=offsetmin; f<offsetmax; f+=fend ) {
638
if (dir == Qt::Horizontal) {
639
p.drawLine((int)f, BASE_MARK_X1, (int)f, BASE_MARK_X2);
642
p.drawLine(BASE_MARK_X1, (int)f, BASE_MARK_X2, (int)f);
647
// draw the little marks
649
for ( f=offsetmin; f<offsetmax; f+=fend ) {
650
if (dir == Qt::Horizontal) {
651
p.drawLine((int)f, LITTLE_MARK_X1, (int)f, LITTLE_MARK_X2);
654
p.drawLine(LITTLE_MARK_X1, (int)f, LITTLE_MARK_X2, (int)f);
661
for ( f=offsetmin; f<offsetmax; f+=fend ) {
662
if (dir == Qt::Horizontal) {
663
p.drawLine((int)f, MIDDLE_MARK_X1, (int)f, MIDDLE_MARK_X2);
666
p.drawLine(MIDDLE_MARK_X1, (int)f, MIDDLE_MARK_X2, (int)f);
673
for ( f=offsetmin; f<offsetmax; f+=fend ) {
674
if (dir == Qt::Horizontal) {
675
p.drawLine((int)f, BIG_MARK_X1, (int)f, BIG_MARK_X2);
678
p.drawLine(BIG_MARK_X1, (int)f, BIG_MARK_X2, (int)f);
684
if (dir == Qt::Horizontal) {
685
p.drawLine(minval-offset_, END_MARK_X1, minval-offset_, END_MARK_X2);
686
p.drawLine(maxval-offset_, END_MARK_X1, maxval-offset_, END_MARK_X2);
689
p.drawLine(END_MARK_X1, minval-offset_, END_MARK_X2, minval-offset_);
690
p.drawLine(END_MARK_X1, maxval-offset_, END_MARK_X2, maxval-offset_);
695
if (d->showpointer) {
697
if (dir == Qt::Horizontal) {
698
pa.setPoints(3, value-5, 10, value+5, 10, value/*+0*/,15);
701
pa.setPoints(3, 10, value-5, 10, value+5, 15, value/*+0*/);
703
p.setBrush( p.background().color() );
709
int elapsed = time.elapsed();
710
debug("paint time %i",elapsed);
715
#include "kruler.moc"