]> git.sesse.net Git - kdenlive/blob - src/customruler.cpp
Add license, continue work on project tree view
[kdenlive] / src / customruler.cpp
1
2 #include <QMouseEvent>
3 #include <QStylePainter>
4
5 #include <KDebug>
6
7
8 #include "customruler.h"
9
10
11 #define INIT_VALUE 0
12 #define INIT_MIN_VALUE 0
13 #define INIT_MAX_VALUE 100
14 #define INIT_TINY_MARK_DISTANCE 1
15 #define INIT_LITTLE_MARK_DISTANCE 5
16 #define INIT_MIDDLE_MARK_DISTANCE (INIT_LITTLE_MARK_DISTANCE * 2)
17 #define INIT_BIG_MARK_DISTANCE (INIT_LITTLE_MARK_DISTANCE * 10)
18 #define INIT_SHOW_TINY_MARK false
19 #define INIT_SHOW_LITTLE_MARK true
20 #define INIT_SHOW_MEDIUM_MARK true
21 #define INIT_SHOW_BIG_MARK true
22 #define INIT_SHOW_END_MARK true
23 #define INIT_SHOW_POINTER true
24 #define INIT_SHOW_END_LABEL true
25
26 #define INIT_PIXEL_PER_MARK (double)10.0 /* distance between 2 base marks in pixel */
27 #define INIT_OFFSET (-20)
28 #define INIT_LENGTH_FIX true
29 #define INIT_END_OFFSET 0
30
31 #define FIX_WIDTH 20 /* widget width in pixel */
32 #define LINE_END (FIX_WIDTH - 3)
33 #define END_MARK_LENGTH (FIX_WIDTH - 6)
34 #define END_MARK_X2 LINE_END
35 #define END_MARK_X1 (END_MARK_X2 - END_MARK_LENGTH)
36 #define BIG_MARK_LENGTH (END_MARK_LENGTH*3/4)
37 #define BIG_MARK_X2 LINE_END
38 #define BIG_MARK_X1 (BIG_MARK_X2 - BIG_MARK_LENGTH)
39 #define MIDDLE_MARK_LENGTH (END_MARK_LENGTH/2)
40 #define MIDDLE_MARK_X2 LINE_END
41 #define MIDDLE_MARK_X1 (MIDDLE_MARK_X2 - MIDDLE_MARK_LENGTH)
42 #define LITTLE_MARK_LENGTH (MIDDLE_MARK_LENGTH/2)
43 #define LITTLE_MARK_X2 LINE_END
44 #define LITTLE_MARK_X1 (LITTLE_MARK_X2 - LITTLE_MARK_LENGTH)
45 #define BASE_MARK_LENGTH (LITTLE_MARK_LENGTH/2)
46 #define BASE_MARK_X2 LINE_END
47 #define BASE_MARK_X1 (BASE_MARK_X2 - 3) //BASE_MARK_LENGTH
48
49 #define LABEL_SIZE 8
50 #define END_LABEL_X 4
51 #define END_LABEL_Y (END_LABEL_X + LABEL_SIZE - 2)
52
53 #include "definitions.h"
54
55 const int CustomRuler::comboScale[] =
56         { 1, 2, 5, 10, 25, 50, 125, 250, 500, 725, 1500, 3000, 6000,
57             12000 };
58
59 CustomRuler::CustomRuler(Timecode tc, QWidget *parent)
60     : KRuler(parent), m_timecode(tc)
61 {
62   slotNewOffset(0);
63   setRulerMetricStyle(KRuler::Pixel);
64   setLength(1024);
65   setMaximum(1024);
66   setPixelPerMark(3);
67   setLittleMarkDistance (FRAME_SIZE);
68   setMediumMarkDistance (FRAME_SIZE * 25);
69   setBigMarkDistance (FRAME_SIZE * 25 * 60);
70 }
71
72 // virtual 
73 void CustomRuler::mousePressEvent ( QMouseEvent * event )
74 {
75   int pos = event->x();
76   slotNewValue( pos );
77   kDebug()<<pos;
78 }
79
80 // virtual
81 void CustomRuler::mouseMoveEvent ( QMouseEvent * event )
82 {
83   int pos = event->x();
84   slotNewValue( pos );
85   kDebug()<<pos;
86 }
87
88 void CustomRuler::slotNewValue ( int _value )
89 {
90   m_cursorPosition = _value / pixelPerMark();
91   KRuler::slotNewValue(_value);
92 }
93
94 void CustomRuler::setPixelPerMark (double rate)
95 {
96     int scale = comboScale[(int) rate];
97     int newPos = m_cursorPosition * (1.0 / scale); 
98     KRuler::setPixelPerMark(1.0 / scale);
99     KRuler::slotNewValue( newPos );
100 }
101
102 // virtual 
103 void CustomRuler::paintEvent(QPaintEvent * /*e*/)
104  {
105    //  debug ("KRuler::drawContents, %s",(horizontal==dir)?"horizontal":"vertical");
106  
107    QStylePainter p(this);
108
109  
110    int value  = this->value(),
111      minval = minimum(),
112      maxval;
113      maxval = maximum() + offset() - endOffset();
114
115      //ioffsetval = value-offset;
116      //    pixelpm = (int)ppm;
117    //    left  = clip.left(),
118    //    right = clip.right();
119    double f, fend,
120      offsetmin=(double)(minval-offset()),
121      offsetmax=(double)(maxval-offset()),
122      fontOffset = (((double)minval)>offsetmin)?(double)minval:offsetmin;
123    QRect bg = QRect(offsetmin, 0, offsetmax, height());
124
125    QPalette palette;
126    //p.fillRect(bg, palette.light());
127    // draw labels
128    QFont font = p.font();
129    font.setPointSize(LABEL_SIZE);
130    p.setFont( font );
131    p.setPen(palette.dark().color());
132    // draw littlemarklabel
133  
134    // draw mediummarklabel
135  
136    // draw bigmarklabel
137  
138    // draw endlabel
139    /*if (d->showEndL) {
140      if (d->dir == Qt::Horizontal) {
141        p.translate( fontOffset, 0 );
142        p.drawText( END_LABEL_X, END_LABEL_Y, d->endlabel );
143      }*/
144  
145    // draw the tiny marks
146    //if (showTinyMarks()) 
147    /*{
148      fend =   pixelPerMark()*tinyMarkDistance();
149      if (fend > 5) for ( f=offsetmin; f<offsetmax; f+=fend ) {
150          p.drawLine((int)f, BASE_MARK_X1, (int)f, BASE_MARK_X2);
151      }
152    }*/
153    if (showLittleMarks()) {
154      // draw the little marks
155      fend = pixelPerMark()*littleMarkDistance();
156      if (fend > 5) for ( f=offsetmin; f<offsetmax; f+=fend ) {
157          p.drawLine((int)f, LITTLE_MARK_X1, (int)f, LITTLE_MARK_X2);
158          if (fend > 60) {
159           QString lab = m_timecode.getTimecodeFromFrames((int) ((f - offsetmin) / pixelPerMark() / FRAME_SIZE + 0.5));
160           p.drawText( (int)f + 2, LABEL_SIZE, lab );
161          }
162      }
163    }
164    if (showMediumMarks()) {
165      // draw medium marks
166      fend = pixelPerMark()*mediumMarkDistance();
167      if (fend > 5) for ( f=offsetmin; f<offsetmax; f+=fend ) {
168          p.drawLine((int)f, MIDDLE_MARK_X1, (int)f, MIDDLE_MARK_X2);
169          if (fend > 60) {
170           QString lab = m_timecode.getTimecodeFromFrames((int) ((f - offsetmin) / pixelPerMark() / FRAME_SIZE + 0.5) );
171           p.drawText( (int)f + 2, LABEL_SIZE, lab );
172          }
173      }
174    }
175    if (showBigMarks()) {
176      // draw big marks
177      fend = pixelPerMark()*bigMarkDistance();
178      if (fend > 5) for ( f=offsetmin; f<offsetmax; f+=fend ) {
179          p.drawLine((int)f, BIG_MARK_X1, (int)f, BIG_MARK_X2);
180          if (fend > 60) {
181           QString lab = m_timecode.getTimecodeFromFrames((int) ((f - offsetmin) / pixelPerMark() / FRAME_SIZE + 0.5) );
182           p.drawText( (int)f + 2, LABEL_SIZE, lab );
183          }
184          else if (((int) (f - offsetmin)) % ((int)(fend * 5)) == 0) {
185             QString lab = m_timecode.getTimecodeFromFrames((int) ((f - offsetmin) / pixelPerMark() / FRAME_SIZE + 0.5) );
186           p.drawText( (int)f + 2, LABEL_SIZE, lab );
187          }
188      }
189    }
190 /*   if (d->showem) {
191      // draw end marks
192      if (d->dir == Qt::Horizontal) {
193        p.drawLine(minval-d->offset, END_MARK_X1, minval-d->offset, END_MARK_X2);
194        p.drawLine(maxval-d->offset, END_MARK_X1, maxval-d->offset, END_MARK_X2);
195      }
196      else {
197        p.drawLine(END_MARK_X1, minval-d->offset, END_MARK_X2, minval-d->offset);
198        p.drawLine(END_MARK_X1, maxval-d->offset, END_MARK_X2, maxval-d->offset);
199      }
200    }*/
201  
202    // draw pointer
203    if (showPointer()) {
204      QPolygon pa(4);
205        pa.setPoints(3, value-6, 9, value+6, 9, value/*+0*/, 16);
206      p.setBrush( QBrush(Qt::yellow) );
207      p.drawPolygon( pa );
208    }
209  
210  }
211
212 #include "customruler.moc"