]> git.sesse.net Git - kdenlive/blob - src/tracksconfigdialog.cpp
Add "Configure Tracks" dialog to change the settings (name, type, ...) of all tracks...
[kdenlive] / src / tracksconfigdialog.cpp
1 /***************************************************************************
2  *   Copyright (C) 2010 by Till Theato (root@ttill.de)                     *
3  *                                                                         *
4  *   This program is free software; you can redistribute it and/or modify  *
5  *   it under the terms of the GNU General Public License as published by  *
6  *   the Free Software Foundation; either version 2 of the License, or     *
7  *   (at your option) any later version.                                   *
8  *                                                                         *
9  *   This program is distributed in the hope that it will be useful,       *
10  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12  *   GNU General Public License for more details.                          *
13  *                                                                         *
14  *   You should have received a copy of the GNU General Public License     *
15  *   along with this program; if not, write to the                         *
16  *   Free Software Foundation, Inc.,                                       *
17  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
18  ***************************************************************************/
19
20 #include "tracksconfigdialog.h"
21 #include "kdenlivedoc.h"
22
23 #include <QTableWidget>
24 #include <QComboBox>
25 #include <KDebug>
26
27 TracksDelegate::TracksDelegate(QObject *parent) :
28         QItemDelegate(parent)
29 {
30 }
31
32 QWidget *TracksDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem & /* option */, const QModelIndex & /*index*/) const
33 {
34     QComboBox *comboBox = new QComboBox(parent);
35     comboBox->addItem(i18n("Video"));
36     comboBox->addItem(i18n("Audio"));
37     connect(comboBox, SIGNAL(activated(int)), this, SLOT(emitCommitData()));
38     return comboBox;
39 }
40
41 void TracksDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
42 {
43     QComboBox *comboBox = qobject_cast<QComboBox *>(editor);
44     if (!comboBox)
45         return;
46     int pos = comboBox->findText(index.model()->data(index).toString(), Qt::MatchExactly);
47     comboBox->setCurrentIndex(pos);
48 }
49
50 void TracksDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
51 {
52     QComboBox *comboBox = qobject_cast<QComboBox *>(editor);
53     if (!comboBox)
54         return;
55     model->setData(index, comboBox->currentText());
56 }
57
58 void TracksDelegate::emitCommitData()
59 {
60     emit commitData(qobject_cast<QWidget *>(sender()));
61 }
62
63
64 TracksConfigDialog::TracksConfigDialog(KdenliveDoc * doc, int selected, QWidget* parent) :
65         QDialog(parent),
66         m_doc(doc)
67 {
68     setupUi(this);
69
70     table->setColumnCount(5);
71     table->setHorizontalHeaderLabels(QStringList() << i18n("Name") << i18n("Type") << i18n("Hidden") << i18n("Muted") << i18n("Locked"));
72     table->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
73     table->horizontalHeader()->setResizeMode(1, QHeaderView::Fixed);
74     table->horizontalHeader()->setResizeMode(2, QHeaderView::Fixed);
75     table->horizontalHeader()->setResizeMode(3, QHeaderView::Fixed);
76     table->horizontalHeader()->setResizeMode(4, QHeaderView::Fixed);
77
78     table->setItemDelegateForColumn(1, new TracksDelegate(this));
79
80     setupOriginal(selected);
81     connect(table, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(slotUpdateRow(QTableWidgetItem *)));
82 }
83
84 const QList <TrackInfo> TracksConfigDialog::tracksList()
85 {
86     QList <TrackInfo> tracks;
87     TrackInfo info;
88     for (int i = table->rowCount() - 1; i >= 0; i--) {
89         info.trackName = table->item(i, 0)->text();
90         QTableWidgetItem *item = table->item(i, 1);
91         if (item->text() == i18n("Audio")) {
92             info.type = AUDIOTRACK;
93             info.isBlind = true;
94         } else {
95             info.type = VIDEOTRACK;
96             info.isBlind = (table->item(i, 2)->checkState() == Qt::Checked);
97         }
98         info.isMute = (table->item(i, 3)->checkState() == Qt::Checked);
99         info.isLocked = (table->item(i, 4)->checkState() == Qt::Checked);
100         tracks << info;
101     }
102     return tracks;
103 }
104
105 void TracksConfigDialog::setupOriginal(int selected)
106 {
107     table->setRowCount(m_doc->tracksCount());
108
109     QStringList numbers;
110     TrackInfo info;
111     for (int i = m_doc->tracksCount() - 1; i >= 0; i--) {
112         numbers << QString::number(i);
113         info = m_doc->trackInfoAt(m_doc->tracksCount() - i - 1);
114         table->setItem(i, 0, new QTableWidgetItem(info.trackName));
115
116         QTableWidgetItem *item1 = new QTableWidgetItem(i18n("Video"));
117         if (info.type == AUDIOTRACK)
118             item1->setText(i18n("Audio"));
119         table->setItem(i, 1, item1);
120         table->openPersistentEditor(item1);
121
122         QTableWidgetItem *item2 = new QTableWidgetItem("");
123         item2->setFlags(item2->flags() & ~Qt::ItemIsEditable);
124         item2->setCheckState(info.isBlind ? Qt::Checked : Qt::Unchecked);
125         if (info.type == AUDIOTRACK)
126             item2->setFlags(item2->flags() & ~Qt::ItemIsEnabled);
127         table->setItem(i, 2, item2);
128
129         QTableWidgetItem *item3 = new QTableWidgetItem("");
130         item3->setFlags(item3->flags() & ~Qt::ItemIsEditable);
131         item3->setCheckState(info.isMute ? Qt::Checked : Qt::Unchecked);
132         table->setItem(i, 3, item3);
133
134         QTableWidgetItem *item4 = new QTableWidgetItem("");
135         item4->setFlags(item4->flags() & ~Qt::ItemIsEditable);
136         item4->setCheckState(info.isLocked ? Qt::Checked : Qt::Unchecked);
137         table->setItem(i, 4, item4);
138     }
139     table->setVerticalHeaderLabels(numbers);
140
141     table->resizeColumnsToContents();
142     if (selected != -1)
143         table->selectRow(selected);
144 }
145
146 void TracksConfigDialog::slotUpdateRow(QTableWidgetItem* item)
147 {
148     if (table->column(item) == 1) {
149         QTableWidgetItem *item2 = table->item(table->row(item), 2);
150         if (item->text() == i18n("Audio")) {
151             item2->setFlags(item2->flags() & ~Qt::ItemIsEnabled);
152             item2->setCheckState(Qt::Checked);
153         } else {
154             item2->setFlags(item2->flags() | Qt::ItemIsEnabled);
155             item2->setCheckState(Qt::Unchecked);
156         }
157     }
158 }
159
160 #include "tracksconfigdialog.moc"