File indexing completed on 2024-05-12 04:52:54

0001 /*
0002     SPDX-FileCopyrightText: 2008 Marco Gittler <g.marco@freenet.de>
0003     SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 */
0005 
0006 #include "positioneditwidget.hpp"
0007 #include "assets/model/assetparametermodel.hpp"
0008 #include "core.h"
0009 #include "kdenlivesettings.h"
0010 #include "monitor/monitormanager.h"
0011 #include "widgets/timecodedisplay.h"
0012 
0013 #include <QHBoxLayout>
0014 #include <QLabel>
0015 #include <QSlider>
0016 
0017 PositionEditWidget::PositionEditWidget(std::shared_ptr<AssetParameterModel> model, QModelIndex index, QWidget *parent)
0018     : AbstractParamWidget(std::move(model), index, parent)
0019 {
0020     auto *layout = new QHBoxLayout(this);
0021     QString name = m_model->data(m_index, Qt::DisplayRole).toString();
0022     QString comment = m_model->data(m_index, AssetParameterModel::CommentRole).toString();
0023     QLabel *label = new QLabel(name, this);
0024     m_slider = new QSlider(Qt::Horizontal, this);
0025     m_slider->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred));
0026 
0027     m_display = new TimecodeDisplay(this);
0028     m_display->setSizePolicy(QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred));
0029 
0030     layout->addWidget(label);
0031     layout->addWidget(m_slider);
0032     layout->addWidget(m_display);
0033     m_inverted = m_model->data(m_index, AssetParameterModel::DefaultRole).toInt() < 0;
0034     m_toTime = m_model->data(m_index, AssetParameterModel::ToTimePosRole).toBool();
0035     slotRefresh();
0036     setMinimumHeight(m_display->sizeHint().height());
0037 
0038     connect(m_slider, &QAbstractSlider::valueChanged, m_display, static_cast<void (TimecodeDisplay::*)(int)>(&TimecodeDisplay::setValue));
0039     connect(m_display, &TimecodeDisplay::timeCodeEditingFinished, m_slider, &QAbstractSlider::setValue);
0040     connect(m_slider, &QAbstractSlider::valueChanged, this, &PositionEditWidget::valueChanged);
0041 
0042     // Q_EMIT the signal of the base class when appropriate
0043     connect(this->m_slider, &QAbstractSlider::valueChanged, this, [this](int val) {
0044         if (m_inverted) {
0045             val = m_model->data(m_index, AssetParameterModel::ParentInRole).toInt() + m_model->data(m_index, AssetParameterModel::ParentDurationRole).toInt() -
0046                   1 - val;
0047         } else if (!m_model->data(m_index, AssetParameterModel::RelativePosRole).toBool()) {
0048             val += m_model->data(m_index, AssetParameterModel::ParentInRole).toInt();
0049         }
0050 
0051         QString value;
0052         if (m_toTime) {
0053             value = m_model->framesToTime(val);
0054         } else {
0055             value = QString::number(val);
0056         }
0057 
0058         Q_EMIT AbstractParamWidget::valueChanged(m_index, value, true);
0059     });
0060 
0061     setToolTip(comment);
0062 }
0063 
0064 PositionEditWidget::~PositionEditWidget() = default;
0065 
0066 int PositionEditWidget::getPosition() const
0067 {
0068     return m_slider->value();
0069 }
0070 
0071 void PositionEditWidget::setPosition(int pos)
0072 {
0073     m_slider->setValue(pos);
0074 }
0075 
0076 void PositionEditWidget::slotUpdatePosition()
0077 {
0078     m_slider->blockSignals(true);
0079     m_slider->setValue(m_display->getValue());
0080     m_slider->blockSignals(false);
0081     Q_EMIT valueChanged();
0082 }
0083 
0084 void PositionEditWidget::slotRefresh()
0085 {
0086     const QSignalBlocker bk(m_slider);
0087     int min = m_model->data(m_index, AssetParameterModel::ParentInRole).toInt();
0088     int max = min + m_model->data(m_index, AssetParameterModel::ParentDurationRole).toInt();
0089     const QSignalBlocker blocker(m_slider);
0090     const QSignalBlocker blocker2(m_display);
0091     QVariant value = m_model->data(m_index, AssetParameterModel::ValueRole);
0092     int val;
0093     if (value.isNull()) {
0094         val = m_model->data(m_index, AssetParameterModel::DefaultRole).toInt();
0095         if (m_inverted) {
0096             val = -val - 1;
0097         }
0098     } else {
0099         if (value.userType() == QMetaType::QString) {
0100             val = m_model->time_to_frames(value.toString());
0101         } else {
0102             val = value.toInt();
0103         }
0104         if (m_inverted) {
0105             if (val < 0) {
0106                 val = -val;
0107             } else {
0108                 val = max - val - 1;
0109             }
0110         }
0111     }
0112     m_slider->setRange(0, max - min - 1);
0113     m_display->setRange(0, max - min - 1);
0114     if (!m_inverted && !m_model->data(m_index, AssetParameterModel::RelativePosRole).toBool()) {
0115         val -= min;
0116     }
0117     m_slider->setValue(val);
0118     m_display->setValue(val);
0119 }
0120 
0121 bool PositionEditWidget::isValid() const
0122 {
0123     return m_slider->minimum() != m_slider->maximum();
0124 }
0125 
0126 void PositionEditWidget::slotShowComment(bool show)
0127 {
0128     Q_UNUSED(show);
0129 }