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 }