X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcustomruler.cpp;h=461a58034cf4a09fceeba205971b6dcea24dd04e;hb=95265b50de041c51b5111bc397709fe3ce83b1fc;hp=478abcfc67d8ead6cd992e3620bd24bdbaf484d0;hpb=7931e3703f53c9eb89490b3d209c31674989cf95;p=kdenlive diff --git a/src/customruler.cpp b/src/customruler.cpp index 478abcfc..461a5803 100644 --- a/src/customruler.cpp +++ b/src/customruler.cpp @@ -21,7 +21,8 @@ #include #include - +#include +#include #include "customruler.h" @@ -46,9 +47,9 @@ #define INIT_LENGTH_FIX true #define INIT_END_OFFSET 0 -#define FIX_WIDTH 20 /* widget width in pixel */ +#define FIX_WIDTH 24 /* widget width in pixel */ #define LINE_END (FIX_WIDTH - 3) -#define END_MARK_LENGTH (FIX_WIDTH - 6) +#define END_MARK_LENGTH (FIX_WIDTH - 8) #define END_MARK_X2 LINE_END #define END_MARK_X1 (END_MARK_X2 - END_MARK_LENGTH) #define BIG_MARK_LENGTH (END_MARK_LENGTH*3/4) @@ -64,181 +65,264 @@ #define BASE_MARK_X2 LINE_END #define BASE_MARK_X1 (BASE_MARK_X2 - 3) //BASE_MARK_LENGTH -#define LABEL_SIZE 8 +#define LABEL_SIZE 9 #define END_LABEL_X 4 #define END_LABEL_Y (END_LABEL_X + LABEL_SIZE - 2) #include "definitions.h" -const int CustomRuler::comboScale[] = - { 1, 2, 5, 10, 25, 50, 125, 250, 500, 725, 1500, 3000, 6000, - 12000 }; - -CustomRuler::CustomRuler(Timecode tc, QWidget *parent) - : KRuler(parent), m_timecode(tc) -{ - slotNewOffset(0); - setRulerMetricStyle(KRuler::Pixel); - setLength(1024); - setMaximum(1024); - setPixelPerMark(3); - setLittleMarkDistance (FRAME_SIZE); - setMediumMarkDistance (FRAME_SIZE * 25); - setBigMarkDistance (FRAME_SIZE * 25 * 60); +const int CustomRuler::comboScale[] = { 1, 2, 5, 10, 25, 50, 125, 250, 500, 725, 1500, 3000, 6000, 12000}; + +CustomRuler::CustomRuler(Timecode tc, CustomTrackView *parent) + : KRuler(parent), m_timecode(tc), m_view(parent), m_duration(0) { + setFont(KGlobalSettings::toolBarFont()); + slotNewOffset(0); + setRulerMetricStyle(KRuler::Pixel); + setLength(1024); + setMaximum(1024); + setPixelPerMark(3); + setLittleMarkDistance(FRAME_SIZE); + setMediumMarkDistance(FRAME_SIZE * m_timecode.fps()); + setBigMarkDistance(FRAME_SIZE * m_timecode.fps() * 60); + m_zoneStart = 2 * m_timecode.fps(); + m_zoneEnd = 10 * m_timecode.fps(); + m_contextMenu = new QMenu(this); + QAction *addGuide = m_contextMenu->addAction(KIcon("document-new"), i18n("Add Guide")); + connect(addGuide, SIGNAL(triggered()), m_view, SLOT(slotAddGuide())); + QAction *delGuide = m_contextMenu->addAction(KIcon("document-new"), i18n("Delete Guide")); + connect(delGuide, SIGNAL(triggered()), m_view, SLOT(slotDeleteGuide())); + QAction *editGuide = m_contextMenu->addAction(KIcon("document-new"), i18n("Edit Guide")); + connect(editGuide, SIGNAL(triggered()), m_view, SLOT(slotEditGuide())); } -// virtual -void CustomRuler::mousePressEvent ( QMouseEvent * event ) -{ - int pos = event->x(); - slotMoveCursor( pos, true ); - kDebug()<button() == Qt::RightButton) { + m_contextMenu->exec(event->globalPos()); + return; + } + m_view->activateMonitor(); + int pos = (int)((event->x() + offset())); + m_moveCursor = RULER_CURSOR; + if (event->y() > 10) { + if (qAbs(pos - m_zoneStart * pixelPerMark() * FRAME_SIZE) < 4) m_moveCursor = RULER_START; + else if (qAbs(pos - (m_zoneStart + (m_zoneEnd - m_zoneStart) / 2) * pixelPerMark() * FRAME_SIZE) < 4) m_moveCursor = RULER_MIDDLE; + else if (qAbs(pos - m_zoneEnd * pixelPerMark() * FRAME_SIZE) < 4) m_moveCursor = RULER_END; + } + if (m_moveCursor == RULER_CURSOR) + m_view->setCursorPos((int) pos / pixelPerMark() / FRAME_SIZE); } // virtual -void CustomRuler::mouseMoveEvent ( QMouseEvent * event ) -{ - int pos = event->x(); - slotMoveCursor( pos, true ); +void CustomRuler::mouseMoveEvent(QMouseEvent * event) { + int pos = (int)((event->x() + offset()) / pixelPerMark() / FRAME_SIZE); + if (pos < 0) pos = 0; + if (m_moveCursor == RULER_CURSOR) { + m_view->setCursorPos(pos); + return; + } else if (m_moveCursor == RULER_START) m_zoneStart = pos; + else if (m_moveCursor == RULER_END) m_zoneEnd = pos; + else if (m_moveCursor == RULER_MIDDLE) { + int move = pos - (m_zoneStart + (m_zoneEnd - m_zoneStart) / 2); + m_zoneStart += move; + m_zoneEnd += move; + } + update(); } -void CustomRuler::slotMoveRuler(int newPos) -{ - int diff = offset() - newPos; - KRuler::slotNewOffset(newPos); - KRuler::slotNewValue(value() + diff); + +// virtual +void CustomRuler::wheelEvent(QWheelEvent * e) { + int delta = 1; + if (e->modifiers() == Qt::ControlModifier) delta = m_timecode.fps(); + if (e->delta() < 0) delta = 0 - delta; + m_view->moveCursorPos(delta); } -void CustomRuler::slotMoveCursor( int _value, bool emitSignal ) -{ - KRuler::slotNewValue(_value ); - m_cursorPosition= (_value + offset()) / pixelPerMark(); - if (emitSignal) emit cursorMoved(m_cursorPosition / FRAME_SIZE); +int CustomRuler::inPoint() const { + return m_zoneStart; } +int CustomRuler::outPoint() const { + return m_zoneEnd; +} + +void CustomRuler::slotMoveRuler(int newPos) { + KRuler::slotNewOffset(newPos); +} -void CustomRuler::slotNewValue ( int _value, bool emitSignal ) -{ - m_cursorPosition= _value / pixelPerMark(); - if (emitSignal) emit cursorMoved(m_cursorPosition / FRAME_SIZE); - KRuler::slotNewValue(_value * pixelPerMark() - offset()); +void CustomRuler::slotCursorMoved(int oldpos, int newpos) { + update(oldpos - offset() - 6, 2, 17, 16); + update(newpos - offset() - 6, 2, 17, 16); } -void CustomRuler::setPixelPerMark (double rate) -{ +void CustomRuler::setPixelPerMark(double rate) { int scale = comboScale[(int) rate]; - int newPos = m_cursorPosition * (1.0 / scale); KRuler::setPixelPerMark(1.0 / scale); - KRuler::slotNewValue( newPos ); + double fend = pixelPerMark() * littleMarkDistance(); + switch ((int) rate) { + case 0: + m_textSpacing = fend; + break; + case 1: + m_textSpacing = fend * 5; + break; + case 2: + case 3: + case 4: + m_textSpacing = fend * m_timecode.fps(); + break; + case 5: + m_textSpacing = fend * m_timecode.fps() * 5; + break; + case 6: + m_textSpacing = fend * m_timecode.fps() * 10; + break; + case 7: + m_textSpacing = fend * m_timecode.fps() * 30; + break; + case 8: + case 9: + case 10: + m_textSpacing = fend * m_timecode.fps() * 60; + break; + case 11: + case 12: + m_textSpacing = fend * m_timecode.fps() * 300; + break; + case 13: + m_textSpacing = fend * m_timecode.fps() * 600; + break; + } } -// virtual -void CustomRuler::paintEvent(QPaintEvent * /*e*/) - { - // debug ("KRuler::drawContents, %s",(horizontal==dir)?"horizontal":"vertical"); - - QStylePainter p(this); - - - int value = this->value(); - int minval = minimum(); - int maxval = maximum() + offset() - endOffset(); - - //ioffsetval = value-offset; - // pixelpm = (int)ppm; - // left = clip.left(), - // right = clip.right(); - double f, fend, - offsetmin=(double)(minval-offset()), - offsetmax=(double)(maxval-offset()), - fontOffset = (((double)minval)>offsetmin)?(double)minval:offsetmin; - QRect bg = QRect(offsetmin, 0, offsetmax, height()); - - QPalette palette; - //p.fillRect(bg, palette.light()); - // draw labels - QFont font = p.font(); - font.setPointSize(LABEL_SIZE); - p.setFont( font ); - p.setPen(palette.dark().color()); - // draw littlemarklabel - - // draw mediummarklabel - - // draw bigmarklabel - - // draw endlabel - /*if (d->showEndL) { - if (d->dir == Qt::Horizontal) { - p.translate( fontOffset, 0 ); - p.drawText( END_LABEL_X, END_LABEL_Y, d->endlabel ); - }*/ - - // draw the tiny marks - //if (showTinyMarks()) - /*{ - fend = pixelPerMark()*tinyMarkDistance(); - if (fend > 5) for ( f=offsetmin; f 5) for ( f=offsetmin; f 60) { - QString lab = m_timecode.getTimecodeFromFrames((int) ((f - offsetmin) / pixelPerMark() / FRAME_SIZE + 0.5)); - p.drawText( (int)f + 2, LABEL_SIZE, lab ); - } - } - } - if (showMediumMarks()) { - // draw medium marks - fend = pixelPerMark()*mediumMarkDistance(); - if (fend > 5) for ( f=offsetmin; f 60) { - QString lab = m_timecode.getTimecodeFromFrames((int) ((f - offsetmin) / pixelPerMark() / FRAME_SIZE + 0.5) ); - p.drawText( (int)f + 2, LABEL_SIZE, lab ); - } - } - } - if (showBigMarks()) { - // draw big marks - fend = pixelPerMark()*bigMarkDistance(); - if (fend > 5) for ( f=offsetmin; f 60) { - QString lab = m_timecode.getTimecodeFromFrames((int) ((f - offsetmin) / pixelPerMark() / FRAME_SIZE + 0.5) ); - p.drawText( (int)f + 2, LABEL_SIZE, lab ); - } - else if (((int) (f - offsetmin)) % ((int)(fend * 5)) == 0) { - QString lab = m_timecode.getTimecodeFromFrames((int) ((f - offsetmin) / pixelPerMark() / FRAME_SIZE + 0.5) ); - p.drawText( (int)f + 2, LABEL_SIZE, lab ); - } - } - } -/* if (d->showem) { - // draw end marks - if (d->dir == Qt::Horizontal) { - p.drawLine(minval-d->offset, END_MARK_X1, minval-d->offset, END_MARK_X2); - p.drawLine(maxval-d->offset, END_MARK_X1, maxval-d->offset, END_MARK_X2); - } - else { - p.drawLine(END_MARK_X1, minval-d->offset, END_MARK_X2, minval-d->offset); - p.drawLine(END_MARK_X1, maxval-d->offset, END_MARK_X2, maxval-d->offset); - } - }*/ - - // draw pointer - if (showPointer() && value > 0) { - QPolygon pa(4); - pa.setPoints(3, value-6, 9, value+6, 9, value/*+0*/, 16); - p.setBrush( QBrush(Qt::yellow) ); - p.drawPolygon( pa ); - } - - } +void CustomRuler::setDuration(int d) { + m_duration = d; + update(); +} + +// virtual +void CustomRuler::paintEvent(QPaintEvent *e) { + // debug ("KRuler::drawContents, %s",(horizontal==dir)?"horizontal":"vertical"); + + QStylePainter p(this); + p.setClipRect(e->rect()); + + //p.fillRect(e->rect(), QBrush(QColor(200, 200, 200))); + //kDebug()<<"RULER ZONE: "<rect().y(), projectEnd, e->rect().height()), QBrush(QColor(245, 245, 245))); + + + int zoneStart = (int)(m_zoneStart * pixelPerMark() * FRAME_SIZE); + int zoneEnd = (int)(m_zoneEnd * pixelPerMark() * FRAME_SIZE); + + p.fillRect(QRect(zoneStart - offset(), e->rect().y() + e->rect().height() / 2, zoneEnd - zoneStart, e->rect().height() / 2), QBrush(QColor(133, 255, 143))); + + int value = m_view->cursorPos() - offset(); + int minval = minimum(); + int maxval = maximum() + offset() - endOffset(); + + //ioffsetval = value-offset; + // pixelpm = (int)ppm; + // left = clip.left(), + // right = clip.right(); + double f, fend, + offsetmin = (double)(minval - offset()), + offsetmax = (double)(maxval - offset()), + fontOffset = (((double)minval) > offsetmin) ? (double)minval : offsetmin; + QRect bg = QRect((int)offsetmin, 0, (int)offsetmax, height()); + + QPalette palette; + //p.fillRect(bg, palette.light()); + // draw labels + p.setPen(palette.dark().color()); + // draw littlemarklabel + + // draw mediummarklabel + + // draw bigmarklabel + + // draw endlabel + /*if (d->showEndL) { + if (d->dir == Qt::Horizontal) { + p.translate( fontOffset, 0 ); + p.drawText( END_LABEL_X, END_LABEL_Y, d->endlabel ); + }*/ + + // draw the tiny marks + //if (showTinyMarks()) + /*{ + fend = pixelPerMark()*tinyMarkDistance(); + if (fend > 5) for ( f=offsetmin; f 5) for (f = offsetmin; f < offsetmax; f += fend) + p.drawLine((int)f, LITTLE_MARK_X1, (int)f, LITTLE_MARK_X2); + } + if (showMediumMarks()) { + // draw medium marks + fend = pixelPerMark() * mediumMarkDistance(); + if (fend > 5) for (f = offsetmin; f < offsetmax; f += fend) + p.drawLine((int)f, MIDDLE_MARK_X1, (int)f, MIDDLE_MARK_X2); + } + if (showBigMarks()) { + // draw big marks + fend = pixelPerMark() * bigMarkDistance(); + if (fend > 5) for (f = offsetmin; f < offsetmax; f += fend) + p.drawLine((int)f, BIG_MARK_X1, (int)f, BIG_MARK_X2); + } + /* if (d->showem) { + // draw end marks + if (d->dir == Qt::Horizontal) { + p.drawLine(minval-d->offset, END_MARK_X1, minval-d->offset, END_MARK_X2); + p.drawLine(maxval-d->offset, END_MARK_X1, maxval-d->offset, END_MARK_X2); + } + else { + p.drawLine(END_MARK_X1, minval-d->offset, END_MARK_X2, minval-d->offset); + p.drawLine(END_MARK_X1, maxval-d->offset, END_MARK_X2, maxval-d->offset); + } + }*/ + + + // draw zone cursors + int off = offset(); + if (zoneStart > 0) { + QPolygon pa(4); + pa.setPoints(4, zoneStart - off + 3, 9, zoneStart - off, 9, zoneStart - off, 18, zoneStart - off + 3, 18); + p.drawPolyline(pa); + } + + if (zoneEnd > 0) { + QRect rec(zoneStart - off + (zoneEnd - zoneStart) / 2 - 4, 9, 8, 9); + p.fillRect(rec, QColor(255, 255, 255, 150)); + p.drawRect(rec); + + QPolygon pa(4); + pa.setPoints(4, zoneEnd - off - 3, 9, zoneEnd - off, 9, zoneEnd - off, 18, zoneEnd - off - 3, 18); + p.drawPolyline(pa); + } + + // draw pointer + if (showPointer() && value >= 0) { + QPolygon pa(3); + pa.setPoints(3, value - 6, 7, value + 6, 7, value, 16); + p.setBrush(QBrush(Qt::yellow)); + p.drawPolygon(pa); + } + + + +} #include "customruler.moc"