File indexing completed on 2024-05-19 04:55:07
0001 /* 0002 SPDX-FileCopyrightText: 2017 Jean-Baptiste Mardelle <jb@kdenlive.org> 0003 0004 SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 */ 0006 0007 #include "trackdialog.h" 0008 0009 #include "kdenlivesettings.h" 0010 0011 #include <QIcon> 0012 #include <QPushButton> 0013 #include <utility> 0014 0015 TrackDialog::TrackDialog(std::shared_ptr<TimelineItemModel> model, int trackIndex, QWidget *parent, bool deleteMode, int activeTrackId) 0016 : QDialog(parent) 0017 , m_trackIndex(trackIndex) 0018 , m_model(std::move(model)) 0019 , m_deleteMode(deleteMode) 0020 , m_activeTrack(activeTrackId) 0021 { 0022 setWindowTitle(deleteMode ? i18n("Delete Track(s)") : i18n("Add Track")); 0023 // setFont(QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont)); 0024 setupUi(this); 0025 if (m_trackIndex > -1 && m_model->isAudioTrack(m_trackIndex)) { 0026 audio_track->setChecked(true); 0027 before_select->setCurrentIndex(1); 0028 } 0029 if (deleteMode) { 0030 tracks_count->setVisible(false); 0031 track_name->setVisible(false); 0032 video_track->setVisible(false); 0033 audio_track->setVisible(false); 0034 av_track->setVisible(false); 0035 arec_track->setVisible(false); 0036 name_label->setVisible(false); 0037 before_select->setVisible(false); 0038 comboTracks->setVisible(false); 0039 label->setText(i18n("Select tracks to be deleted :")); 0040 this->adjustSize(); 0041 } else { 0042 deleteTracks->setVisible(false); 0043 } 0044 buildCombo(); 0045 connect(audio_track, &QRadioButton::toggled, this, &TrackDialog::buildCombo); 0046 connect(arec_track, &QRadioButton::toggled, this, &TrackDialog::buildCombo); 0047 connect(tracks_count, QOverload<int>::of(&QSpinBox::valueChanged), this, [this](int count) { 0048 tracks_count->setSuffix(i18ncp("Spinbox suffix", " track", " tracks", count)); 0049 track_name->setEnabled(count == 1); 0050 }); 0051 } 0052 0053 void TrackDialog::buildCombo() 0054 { 0055 QIcon videoIcon = QIcon::fromTheme(QStringLiteral("kdenlive-show-video")); 0056 QIcon audioIcon = QIcon::fromTheme(QStringLiteral("kdenlive-show-audio")); 0057 m_positionByIndex.clear(); 0058 comboTracks->clear(); 0059 deleteTracks->clear(); 0060 bool audioMode = audio_track->isChecked() || arec_track->isChecked(); 0061 for (int i = m_model->getTracksCount() - 1; i >= 0; i--) { 0062 int tid = m_model->getTrackIndexFromPosition(i); 0063 bool audioTrack = m_model->isAudioTrack(tid); 0064 if (!m_deleteMode && audioMode != audioTrack) { 0065 continue; 0066 } 0067 const QString trackName = m_model->getTrackFullName(tid); 0068 if (m_deleteMode) { 0069 auto *track = new QListWidgetItem(audioTrack ? audioIcon : videoIcon, trackName); 0070 m_idByTrackname.insert(trackName, tid); 0071 track->setFlags(track->flags() | Qt::ItemIsUserCheckable); 0072 track->setCheckState(Qt::Unchecked); 0073 if (m_activeTrack == tid) { 0074 track->setCheckState(Qt::Checked); 0075 } 0076 deleteTracks->addItem(track); 0077 } else { 0078 comboTracks->addItem(audioTrack ? audioIcon : videoIcon, trackName.isEmpty() ? QString::number(i) : trackName, tid); 0079 } 0080 // Track index in in MLT, so add + 1 to compensate black track 0081 m_positionByIndex.insert(tid, i + 1); 0082 } 0083 if (m_trackIndex > -1) { 0084 int ix = qMax(0, comboTracks->findData(m_trackIndex)); 0085 comboTracks->setCurrentIndex(ix); 0086 } 0087 if (m_deleteMode) { 0088 deleteTracks->setMinimumWidth(deleteTracks->sizeHintForColumn(0)); 0089 connect(deleteTracks, &QListWidget::itemChanged, this, [=]() { 0090 // Ensure we cannot check all tracks 0091 int count = deleteTracks->count(); 0092 for (int i = 0; i < count; i++) { 0093 if (deleteTracks->item(i)->checkState() == Qt::Unchecked) { 0094 buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); 0095 return true; 0096 } 0097 } 0098 buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); 0099 return true; 0100 }); 0101 } 0102 } 0103 0104 int TrackDialog::selectedTrackPosition() const 0105 { 0106 bool audioMode = audio_track->isChecked() || arec_track->isChecked(); 0107 if (comboTracks->count() > 0) { 0108 int position = m_positionByIndex.value(comboTracks->currentData().toInt()); 0109 if (audioMode && KdenliveSettings::audiotracksbelow() == 0) { 0110 // In mixed track modes, indexes are sorted differently so above/under have different meaning 0111 if (before_select->currentIndex() == 0) { 0112 position--; 0113 } 0114 } else if (before_select->currentIndex() == 1) { 0115 position--; 0116 } 0117 return position; 0118 } 0119 return audioMode ? 0 : -1; 0120 } 0121 0122 int TrackDialog::selectedTrackId() const 0123 { 0124 if (comboTracks->count() > 0) { 0125 return comboTracks->currentData().toInt(); 0126 } 0127 return -1; 0128 } 0129 0130 QList<int> TrackDialog::toDeleteTrackIds() 0131 { 0132 QList<int> todeleteIds; 0133 for (int i = deleteTracks->count() - 1; i >= 0; i--) { 0134 QListWidgetItem *listitem = deleteTracks->item(i); 0135 if (listitem->checkState() == Qt::Checked) { 0136 todeleteIds.append(m_idByTrackname[listitem->text()]); 0137 } 0138 } 0139 m_idByTrackname.clear(); 0140 return todeleteIds; 0141 } 0142 0143 bool TrackDialog::addAVTrack() const 0144 { 0145 return av_track->isChecked(); 0146 } 0147 0148 bool TrackDialog::addRecTrack() const 0149 { 0150 return arec_track->isChecked(); 0151 } 0152 0153 bool TrackDialog::addAudioTrack() const 0154 { 0155 return audio_track->isChecked() || arec_track->isChecked(); 0156 } 0157 const QString TrackDialog::trackName() const 0158 { 0159 return track_name->text(); 0160 } 0161 0162 int TrackDialog::tracksCount() const 0163 { 0164 return tracks_count->value(); 0165 }