+const int CustomRuler::comboScale[] = { 1, 2, 5, 10, 25, 50, 125, 250, 500, 750, 1500, 3000, 6000, 12000};
+
+CustomRuler::CustomRuler(Timecode tc, CustomTrackView *parent) :
+ QWidget(parent),
+ m_timecode(tc),
+ m_view(parent),
+ m_duration(0),
+ m_offset(0),
+ m_lastSeekPosition(SEEK_INACTIVE),
+ m_clickedGuide(-1),
+ m_rate(-1),
+ m_mouseMove(NO_MOVE),
+ m_cursorColor(palette().text())
+{
+ setFont(KGlobalSettings::toolBarFont());
+ QFontMetricsF fontMetrics(font());
+ // Define size variables
+ LABEL_SIZE = fontMetrics.ascent();
+ setMinimumHeight(LABEL_SIZE * 2);
+ setMaximumHeight(LABEL_SIZE * 2);
+ MAX_HEIGHT = height();
+ BIG_MARK_X = LABEL_SIZE + 1;
+ int mark_length = MAX_HEIGHT - BIG_MARK_X;
+ MIDDLE_MARK_X = BIG_MARK_X + mark_length / 2;
+ LITTLE_MARK_X = BIG_MARK_X + mark_length / 3;
+ updateFrameSize();
+ m_scale = 3;
+ m_zoneColor = KStatefulBrush(KColorScheme::View, KColorScheme::FocusColor, KSharedConfig::openConfig(KdenliveSettings::colortheme())).brush(this).color();
+ m_zoneColor.setAlpha(180);
+ m_zoneStart = 0;
+ m_zoneEnd = 100;
+ m_contextMenu = new QMenu(this);
+ QAction *addGuide = m_contextMenu->addAction(KIcon("document-new"), i18n("Add Guide"));
+ connect(addGuide, SIGNAL(triggered()), m_view, SLOT(slotAddGuide()));
+ m_editGuide = m_contextMenu->addAction(KIcon("document-properties"), i18n("Edit Guide"));
+ connect(m_editGuide, SIGNAL(triggered()), this, SLOT(slotEditGuide()));
+ m_deleteGuide = m_contextMenu->addAction(KIcon("edit-delete"), i18n("Delete Guide"));
+ connect(m_deleteGuide , SIGNAL(triggered()), this, SLOT(slotDeleteGuide()));
+ QAction *delAllGuides = m_contextMenu->addAction(KIcon("edit-delete"), i18n("Delete All Guides"));
+ connect(delAllGuides, SIGNAL(triggered()), m_view, SLOT(slotDeleteAllGuides()));
+ m_goMenu = m_contextMenu->addMenu(i18n("Go To"));
+ connect(m_goMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotGoToGuide(QAction *)));
+ setMouseTracking(true);
+}
+
+void CustomRuler::updatePalette()
+{
+ m_zoneColor = KStatefulBrush(KColorScheme::View, KColorScheme::FocusColor, KSharedConfig::openConfig(KdenliveSettings::colortheme())).brush(this).color();
+ m_zoneColor.setAlpha(180);
+}
+
+void CustomRuler::updateProjectFps(Timecode t)
+{
+ m_timecode = t;
+ mediumMarkDistance = FRAME_SIZE * m_timecode.fps();
+ bigMarkDistance = FRAME_SIZE * m_timecode.fps() * 60;
+ update();
+}
+
+void CustomRuler::updateFrameSize()
+{
+ FRAME_SIZE = m_view->getFrameWidth();
+ littleMarkDistance = FRAME_SIZE;
+ mediumMarkDistance = FRAME_SIZE * m_timecode.fps();
+ bigMarkDistance = FRAME_SIZE * m_timecode.fps() * 60;
+ updateProjectFps(m_timecode);
+ if (m_rate > 0) setPixelPerMark(m_rate);
+}
+
+void CustomRuler::slotEditGuide()
+{
+ m_view->slotEditGuide(m_clickedGuide);
+}
+
+void CustomRuler::slotDeleteGuide()
+{
+ m_view->slotDeleteGuide(m_clickedGuide);
+}
+
+void CustomRuler::slotGoToGuide(QAction *act)
+{
+ m_view->seekCursorPos(act->data().toInt());
+ m_view->initCursorPos(act->data().toInt());
+}
+
+void CustomRuler::setZone(QPoint p)
+{
+ m_zoneStart = p.x();
+ m_zoneEnd = p.y();
+ update();
+}
+
+void CustomRuler::mouseReleaseEvent(QMouseEvent * /*event*/)
+{
+ if (m_moveCursor == RULER_START || m_moveCursor == RULER_END || m_moveCursor == RULER_MIDDLE) {
+ emit zoneMoved(m_zoneStart, m_zoneEnd);
+ m_view->setDocumentModified();
+ }
+ m_mouseMove = NO_MOVE;
+
+}
+
+// virtual
+void CustomRuler::mousePressEvent(QMouseEvent * event)
+{
+ int pos = (int)((event->x() + offset()));
+ if (event->button() == Qt::RightButton) {
+ m_clickedGuide = m_view->hasGuide((int)(pos / m_factor), (int)(5 / m_factor + 1));
+ m_editGuide->setEnabled(m_clickedGuide > 0);
+ m_deleteGuide->setEnabled(m_clickedGuide > 0);
+ m_view->buildGuidesMenu(m_goMenu);
+ m_contextMenu->exec(event->globalPos());
+ return;
+ }
+ setFocus(Qt::MouseFocusReason);
+ m_view->activateMonitor();
+ m_moveCursor = RULER_CURSOR;
+ if (event->y() > 10) {
+ if (qAbs(pos - m_zoneStart * m_factor) < 4) m_moveCursor = RULER_START;
+ else if (qAbs(pos - (m_zoneStart + (m_zoneEnd - m_zoneStart) / 2.0) * m_factor) < 4) m_moveCursor = RULER_MIDDLE;
+ else if (qAbs(pos - m_zoneEnd * m_factor) < 4) m_moveCursor = RULER_END;
+ m_view->updateSnapPoints(NULL);
+ }
+ if (m_moveCursor == RULER_CURSOR) {
+ m_view->seekCursorPos((int) pos / m_factor);
+ m_clickPoint = event->pos();
+ m_startRate = m_rate;
+ }
+}