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 }