]> git.sesse.net Git - kdenlive/blob - src/dvdwizardchapters.cpp
Various changes for getting an OpenGL context (almost) everywhere it is needed.
[kdenlive] / src / dvdwizardchapters.cpp
1 /***************************************************************************
2  *   Copyright (C) 2009 by Jean-Baptiste Mardelle (jb@kdenlive.org)        *
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 "dvdwizardchapters.h"
21
22 #include <KDebug>
23
24 #include <QFile>
25
26 DvdWizardChapters::DvdWizardChapters(MonitorManager *manager, DVDFORMAT format, QWidget *parent) :
27     QWizardPage(parent),
28     m_format(format),
29     m_monitor(NULL),
30     m_manager(manager)
31
32 {
33     m_view.setupUi(this);
34     connect(m_view.vob_list, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdateChaptersList()));
35     connect(m_view.button_add, SIGNAL(clicked()), this, SLOT(slotAddChapter()));
36     connect(m_view.button_delete, SIGNAL(clicked()), this, SLOT(slotRemoveChapter()));
37     connect(m_view.chapters_list, SIGNAL(itemSelectionChanged()), this, SLOT(slotGoToChapter()));
38
39     // Build monitor for chapters
40
41     if (m_format == PAL || m_format == PAL_WIDE) m_tc.setFormat(25);
42     else m_tc.setFormat(30000.0 / 1001);
43     //m_view.monitor_frame->setVisible(false);
44 }
45
46 DvdWizardChapters::~DvdWizardChapters()
47 {
48     if (m_monitor) {
49         m_manager->removeMonitor(m_monitor);
50         m_monitor->stop();
51         delete m_monitor;
52     }
53 }
54
55 // virtual
56
57 bool DvdWizardChapters::isComplete() const
58 {
59     return true;
60 }
61
62 void DvdWizardChapters::stopMonitor()
63 {
64     if (m_monitor) m_monitor->stop();
65 }
66
67 void DvdWizardChapters::refreshMonitor()
68 {
69     if (m_monitor) m_monitor->refreshMonitor();
70 }
71
72 void DvdWizardChapters::slotUpdateChaptersList()
73 {
74     m_monitor->slotOpenFile(m_view.vob_list->currentText());
75     m_monitor->adjustRulerSize(m_view.vob_list->itemData(m_view.vob_list->currentIndex(), Qt::UserRole).toInt());
76     QStringList currentChaps = m_view.vob_list->itemData(m_view.vob_list->currentIndex(), Qt::UserRole + 1).toStringList();
77
78     // insert chapters
79     QStringList chaptersString;
80     for (int i = 0; i < currentChaps.count(); ++i) {
81         chaptersString.append(Timecode::getStringTimecode(currentChaps.at(i).toInt(), m_tc.fps(), true));
82     }
83     m_view.chapters_list->clear();
84     m_view.chapters_list->addItems(chaptersString);
85     updateMonitorMarkers();
86
87     //bool modified = m_view.vob_list->itemData(m_view.vob_list->currentIndex(), Qt::UserRole + 2).toInt();
88 }
89
90 void DvdWizardChapters::slotAddChapter()
91 {
92     int pos = m_monitor->position().frames(m_tc.fps());
93     QStringList currentChaps = m_view.vob_list->itemData(m_view.vob_list->currentIndex(), Qt::UserRole + 1).toStringList();
94     if (currentChaps.contains(QString::number(pos))) return;
95     else currentChaps.append(QString::number(pos));
96     QList <int> chapterTimes;
97     for (int i = 0; i < currentChaps.count(); ++i)
98         chapterTimes.append(currentChaps.at(i).toInt());
99     qSort(chapterTimes);
100
101     // rebuild chapters
102     QStringList chaptersString;
103     currentChaps.clear();
104     for (int i = 0; i < chapterTimes.count(); ++i) {
105         chaptersString.append(Timecode::getStringTimecode(chapterTimes.at(i), m_tc.fps(), true));
106         currentChaps.append(QString::number(chapterTimes.at(i)));
107     }
108     // Save item chapters
109     m_view.vob_list->setItemData(m_view.vob_list->currentIndex(), currentChaps, Qt::UserRole + 1);
110     // Mark item as modified
111     m_view.vob_list->setItemData(m_view.vob_list->currentIndex(), 1, Qt::UserRole + 2);
112     m_view.chapters_list->clear();
113     m_view.chapters_list->addItems(chaptersString);
114     updateMonitorMarkers();
115 }
116
117 void DvdWizardChapters::updateMonitorMarkers()
118 {
119     QStringList chapters = m_view.vob_list->itemData(m_view.vob_list->currentIndex(), Qt::UserRole + 1).toStringList();
120     QList <CommentedTime> markers;
121     foreach(const QString &frame, chapters) {
122         markers << CommentedTime(GenTime(frame.toInt(), m_tc.fps()), QString());
123     }
124     m_monitor->setMarkers(markers);
125 }
126
127 void DvdWizardChapters::slotRemoveChapter()
128 {
129     int ix = m_view.chapters_list->currentRow();
130     QStringList currentChaps = m_view.vob_list->itemData(m_view.vob_list->currentIndex(), Qt::UserRole + 1).toStringList();
131     currentChaps.removeAt(ix);
132
133     // Save item chapters
134     m_view.vob_list->setItemData(m_view.vob_list->currentIndex(), currentChaps, Qt::UserRole + 1);
135     // Mark item as modified
136     m_view.vob_list->setItemData(m_view.vob_list->currentIndex(), 1, Qt::UserRole + 2);
137
138     // rebuild chapters
139     QStringList chaptersString;
140     for (int i = 0; i < currentChaps.count(); ++i) {
141         chaptersString.append(Timecode::getStringTimecode(currentChaps.at(i).toInt(), m_tc.fps(), true));
142     }
143     m_view.chapters_list->clear();
144     m_view.chapters_list->addItems(chaptersString);
145     updateMonitorMarkers();
146 }
147
148 void DvdWizardChapters::slotGoToChapter()
149 {
150     if (m_view.chapters_list->currentItem()) m_monitor->setTimePos(m_tc.reformatSeparators(m_view.chapters_list->currentItem()->text()));
151 }
152
153 void DvdWizardChapters::createMonitor(DVDFORMAT format)
154 {
155     QString profile = DvdWizardVob::getDvdProfile(format);
156     if (m_monitor == NULL) {
157         m_monitor = new Monitor(Kdenlive::DvdMonitor, m_manager, NULL, profile, this);
158         //m_monitor->start();
159         QVBoxLayout *vbox = new QVBoxLayout;
160         vbox->addWidget(m_monitor);
161         m_view.video_frame->setLayout(vbox);
162         m_monitor->setSizePolicy(QSizePolicy ( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding));
163         m_manager->appendMonitor(m_monitor);
164         vbox->insertWidget(0, m_monitor, 10);
165     }
166 }
167
168 void DvdWizardChapters::setVobFiles(DVDFORMAT format, const QStringList &movies, const QStringList &durations, const QStringList &chapters)
169 {
170     m_format = format;
171     QString profile = DvdWizardVob::getDvdProfile(format);
172     if (m_format == PAL || m_format == PAL_WIDE) {
173         m_tc.setFormat(25);
174     } else {
175         m_tc.setFormat(30000.0 / 1001);
176     }
177
178     if (m_monitor == NULL) createMonitor(format);
179     m_monitor->setCustomProfile(profile, m_tc);
180
181     m_view.vob_list->blockSignals(true);
182     m_view.vob_list->clear();
183     for (int i = 0; i < movies.count(); ++i) {
184         m_view.vob_list->addItem(movies.at(i), durations.at(i));
185         m_view.vob_list->setItemData(i, chapters.at(i).split(';'), Qt::UserRole + 1);
186     }
187     m_view.vob_list->blockSignals(false);
188     slotUpdateChaptersList();
189     setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
190     adjustSize();
191     updateGeometry();
192     m_manager->activateMonitor(Kdenlive::DvdMonitor);
193     m_monitor->refreshMonitor();
194 }
195
196 QMap <QString, QString> DvdWizardChapters::chaptersData() const
197 {
198     QMap <QString, QString> result;
199     int max = m_view.vob_list->count();
200     for (int i = 0; i < max; ++i) {
201         QString chapters = m_view.vob_list->itemData(i, Qt::UserRole + 1).toStringList().join(";");
202         result.insert(m_view.vob_list->itemText(i), chapters);
203     }
204     return result;
205 }
206
207 QStringList DvdWizardChapters::selectedTitles() const
208 {
209     QStringList result;
210     int max = m_view.vob_list->count();
211     for (int i = 0; i < max; ++i) {
212         result.append(m_view.vob_list->itemText(i));
213         QStringList chapters = m_view.vob_list->itemData(i, Qt::UserRole + 1).toStringList();
214         for (int j = 0; j < chapters.count(); j++) {
215             result.append(Timecode::getStringTimecode(chapters.at(j).toInt(), m_tc.fps(), true));
216         }
217     }
218     return result;
219 }
220
221 QStringList DvdWizardChapters::chapters(int ix) const
222 {
223     QStringList result;
224     QStringList chapters = m_view.vob_list->itemData(ix, Qt::UserRole + 1).toStringList();
225     for (int j = 0; j < chapters.count(); j++) {
226         result.append(Timecode::getStringTimecode(chapters.at(j).toInt(), m_tc.fps(), true));
227     }
228     return result;
229 }
230
231 QStringList DvdWizardChapters::selectedTargets() const
232 {
233     QStringList result;
234     int max = m_view.vob_list->count();
235     for (int i = 0; i < max; ++i) {
236         // rightJustified: fill with 0s to make menus with more than 9 buttons work (now up to 99 buttons possible)
237         result.append("jump title " + QString::number(i + 1).rightJustified(2, '0'));
238         QStringList chapters = m_view.vob_list->itemData(i, Qt::UserRole + 1).toStringList();
239         for (int j = 0; j < chapters.count(); j++) {
240             result.append("jump title " + QString::number(i + 1).rightJustified(2, '0') + " chapter " + QString::number(j + 1).rightJustified(2, '0'));
241         }
242     }
243     return result;
244 }
245
246
247 QDomElement DvdWizardChapters::toXml() const
248 {
249     QDomDocument doc;
250     QDomElement xml = doc.createElement("xml");
251     doc.appendChild(xml);
252     for (int i = 0; i < m_view.vob_list->count(); ++i) {
253         QDomElement vob = doc.createElement("vob");
254         vob.setAttribute("file", m_view.vob_list->itemText(i));
255         vob.setAttribute("chapters", m_view.vob_list->itemData(i, Qt::UserRole + 1).toStringList().join(";"));
256         xml.appendChild(vob);
257     }
258     return doc.documentElement();
259 }
260
261 #include "dvdwizardchapters.moc"