1 /***************************************************************************
2 * Copyright (C) 2008 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
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. *
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. *
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 ***************************************************************************/
20 #include "projectsettings.h"
21 #include "kdenlivesettings.h"
22 #include "profilesdialog.h"
23 #include "docclipbase.h"
25 #include <KStandardDirs>
26 #include <KMessageBox>
28 #include <kio/directorysizejob.h>
29 #include <KIO/NetAccess>
32 #include <kmessagebox.h>
34 ProjectSettings::ProjectSettings(ClipManager *manager, int videotracks, int audiotracks, const QString projectPath, bool readOnlyTracks, bool savedProject, QWidget * parent) :
35 QDialog(parent), m_savedProject(savedProject), m_clipManager(manager), m_deleteUnused(false)
39 QMap <QString, QString> profilesInfo = ProfilesDialog::getProfilesInfo();
40 QMapIterator<QString, QString> i(profilesInfo);
43 profiles_list->addItem(i.key(), i.value());
45 project_folder->setMode(KFile::Directory);
46 project_folder->setUrl(KUrl(projectPath));
47 QString currentProf = KdenliveSettings::current_profile();
49 for (int i = 0; i < profiles_list->count(); i++) {
50 if (profiles_list->itemData(i).toString() == currentProf) {
51 profiles_list->setCurrentIndex(i);
56 m_buttonOk = buttonBox->button(QDialogButtonBox::Ok);
57 //buttonOk->setEnabled(false);
58 audio_thumbs->setChecked(KdenliveSettings::audiothumbnails());
59 video_thumbs->setChecked(KdenliveSettings::videothumbnails());
60 audio_tracks->setValue(audiotracks);
61 video_tracks->setValue(videotracks);
63 video_tracks->setEnabled(false);
64 audio_tracks->setEnabled(false);
67 if (manager != NULL) {
69 connect(clear_cache, SIGNAL(clicked()), this, SLOT(slotClearCache()));
70 connect(delete_unused, SIGNAL(clicked()), this, SLOT(slotDeleteUnused()));
71 } else tabWidget->widget(1)->setEnabled(false);
72 connect(profiles_list, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdateDisplay()));
73 connect(project_folder, SIGNAL(textChanged(const QString &)), this, SLOT(slotUpdateButton(const QString &)));
76 void ProjectSettings::slotDeleteUnused()
79 QList <DocClipBase*> list = m_clipManager->documentClipList();
80 for (int i = 0; i < list.count(); i++) {
81 DocClipBase *clip = list.at(i);
82 if (clip->numReferences() == 0) {
83 KUrl url = clip->fileURL();
84 if (!url.isEmpty()) toDelete << url.path();
87 if (toDelete.count() == 0) {
88 KMessageBox::sorry(this, i18n("No clip to delete"));
91 if (KMessageBox::warningYesNoList(this, i18n("This will remove the following files from your hard drive.\nThis action cannot be undone, only use if you know what you are doing.\nAre you sure you want to continue?"), toDelete, i18n("Delete unused clips")) != KMessageBox::Yes) return;
92 m_deleteUnused = true;
93 delete_unused->setEnabled(false);
96 bool ProjectSettings::deleteUnused() const
98 return m_deleteUnused;
101 void ProjectSettings::slotClearCache()
103 buttonBox->setEnabled(false);
104 KIO::NetAccess::del(KUrl(project_folder->url().path(KUrl::AddTrailingSlash) + "thumbs/"), this);
105 KStandardDirs::makeDir(project_folder->url().path(KUrl::AddTrailingSlash) + "thumbs/");
106 buttonBox->setEnabled(true);
107 slotUpdateFiles(true);
110 void ProjectSettings::slotUpdateFiles(bool cacheOnly)
112 KIO::DirectorySizeJob * job = KIO::directorySize(project_folder->url().path(KUrl::AddTrailingSlash) + "thumbs/");
114 thumbs_count->setText(QString::number(job->totalFiles()));
115 thumbs_size->setText(KIO::convertSize(job->totalSize()));
117 if (cacheOnly) return;
120 KIO::filesize_t usedSize = 0;
121 KIO::filesize_t unUsedSize = 0;
122 QList <DocClipBase*> list = m_clipManager->documentClipList();
124 for (int i = 0; i < list.count(); i++) {
125 DocClipBase *clip = list.at(i);
126 if (clip->numReferences() == 0) {
128 unUsedSize += clip->fileSize();
131 usedSize += clip->fileSize();
134 used_count->setText(QString::number(used));
135 used_size->setText(KIO::convertSize(usedSize));
136 unused_count->setText(QString::number(unused));
137 unused_size->setText(KIO::convertSize(unUsedSize));
138 if (!m_deleteUnused) delete_unused->setEnabled(unused > 0);
141 void ProjectSettings::accept()
143 if (!m_savedProject && selectedProfile() != KdenliveSettings::current_profile())
144 if (KMessageBox::warningContinueCancel(this, i18n("Changing the profile of your project cannot be undone.\nIt is recommended to save your project before attempting this operation that might cause some corruption in transitions.\n Are you sure you want to proceed?"), i18n("Confirm profile change")) == KMessageBox::Cancel) return;
148 void ProjectSettings::slotUpdateDisplay()
150 QString currentProfile = profiles_list->itemData(profiles_list->currentIndex()).toString();
151 QMap< QString, QString > values = ProfilesDialog::getSettingsFromFile(currentProfile);
152 p_size->setText(values.value("width") + 'x' + values.value("height"));
153 p_fps->setText(values.value("frame_rate_num") + '/' + values.value("frame_rate_den"));
154 p_aspect->setText(values.value("sample_aspect_num") + '/' + values.value("sample_aspect_den"));
155 p_display->setText(values.value("display_aspect_num") + '/' + values.value("display_aspect_den"));
156 if (values.value("progressive").toInt() == 0) p_progressive->setText(i18n("Interlaced"));
157 else p_progressive->setText(i18n("Progressive"));
160 void ProjectSettings::slotUpdateButton(const QString &path)
162 if (path.isEmpty()) m_buttonOk->setEnabled(false);
164 m_buttonOk->setEnabled(true);
165 slotUpdateFiles(true);
169 QString ProjectSettings::selectedProfile() const
171 return profiles_list->itemData(profiles_list->currentIndex()).toString();
174 KUrl ProjectSettings::selectedFolder() const
176 return project_folder->url();
179 QPoint ProjectSettings::tracks()
182 p.setX(video_tracks->value());
183 p.setY(audio_tracks->value());
187 bool ProjectSettings::enableVideoThumbs() const
189 return video_thumbs->isChecked();
192 bool ProjectSettings::enableAudioThumbs() const
194 return audio_thumbs->isChecked();
197 #include "projectsettings.moc"