File indexing completed on 2024-04-21 04:52:32

0001 /*
0002     SPDX-FileCopyrightText: 2008 Marco Gittler <g.marco@freenet.de>
0003 
0004     SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "positionwidget.h"
0008 
0009 #include "kdenlivesettings.h"
0010 #include "timecodedisplay.h"
0011 
0012 #include <QHBoxLayout>
0013 #include <QLabel>
0014 #include <QSlider>
0015 
0016 PositionWidget::PositionWidget(const QString &name, int pos, int min, int max, const QString &comment, QWidget *parent)
0017     : QWidget(parent)
0018 {
0019     auto *layout = new QHBoxLayout(this);
0020     QLabel *label = new QLabel(name, this);
0021     m_slider = new QSlider(Qt::Horizontal, this);
0022     m_slider->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred));
0023     m_slider->setRange(min, max);
0024 
0025     m_display = new TimecodeDisplay(this);
0026     m_display->setSizePolicy(QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred));
0027     m_display->setRange(min, max);
0028 
0029     layout->addWidget(label);
0030     layout->addWidget(m_slider);
0031     layout->addWidget(m_display);
0032 
0033     m_slider->setValue(pos);
0034     m_display->setValue(pos);
0035     connect(m_slider, SIGNAL(valueChanged(int)), m_display, SLOT(setValue(int)));
0036     connect(m_slider, &QAbstractSlider::valueChanged, this, &PositionWidget::valueChanged);
0037     connect(m_display, &TimecodeDisplay::timeCodeEditingFinished, this, &PositionWidget::slotUpdatePosition);
0038 
0039     setToolTip(comment);
0040 }
0041 
0042 PositionWidget::~PositionWidget() = default;
0043 
0044 int PositionWidget::getPosition() const
0045 {
0046     return m_slider->value();
0047 }
0048 
0049 void PositionWidget::setPosition(int pos)
0050 {
0051     m_slider->setValue(pos);
0052 }
0053 
0054 void PositionWidget::slotUpdatePosition()
0055 {
0056     m_slider->blockSignals(true);
0057     m_slider->setValue(m_display->getValue());
0058     m_slider->blockSignals(false);
0059     Q_EMIT valueChanged();
0060 }
0061 
0062 void PositionWidget::setRange(int min, int max, bool absolute)
0063 {
0064     if (absolute) {
0065         m_slider->setRange(min, max);
0066         m_display->setRange(min, max);
0067     } else {
0068         m_slider->setRange(0, max - min);
0069         m_display->setRange(0, max - min);
0070     }
0071     m_slider->setSingleStep(std::ceil((max - min) / 10.));
0072 }
0073 
0074 bool PositionWidget::isValid() const
0075 {
0076     return m_slider->minimum() != m_slider->maximum();
0077 }
0078 
0079 void PositionWidget::slotShowComment(bool show)
0080 {
0081     Q_UNUSED(show);
0082 }