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()));
72 else tabWidget->widget(1)->setEnabled(false);
73 connect(profiles_list, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdateDisplay()));
74 connect(project_folder, SIGNAL(textChanged(const QString &)), this, SLOT(slotUpdateButton(const QString &)));
77 void ProjectSettings::slotDeleteUnused()
80 QList <DocClipBase*> list = m_clipManager->documentClipList();
81 for (int i = 0; i < list.count(); i++) {
82 DocClipBase *clip = list.at(i);
83 if (clip->numReferences() == 0) {
84 KUrl url = clip->fileURL();
85 if (!url.isEmpty()) toDelete << url.path();
88 if (toDelete.count() == 0) {
89 KMessageBox::sorry(this, i18n("No clip to delete"));
92 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;
93 m_deleteUnused = true;
94 delete_unused->setEnabled(false);
97 bool ProjectSettings::deleteUnused() const
99 return m_deleteUnused;
102 void ProjectSettings::slotClearCache()
104 buttonBox->setEnabled(false);
105 KIO::NetAccess::del(KUrl(project_folder->url().path(KUrl::AddTrailingSlash) + "thumbs/"), this);
106 KStandardDirs::makeDir(project_folder->url().path(KUrl::AddTrailingSlash) + "thumbs/");
107 buttonBox->setEnabled(true);
108 slotUpdateFiles(true);
111 void ProjectSettings::slotUpdateFiles(bool cacheOnly)
113 KIO::DirectorySizeJob * job = KIO::directorySize( project_folder->url().path(KUrl::AddTrailingSlash) + "thumbs/" );
115 thumbs_count->setText(QString::number(job->totalFiles()));
116 thumbs_size->setText(KIO::convertSize(job->totalSize()));
118 if (cacheOnly) return;
121 KIO::filesize_t usedSize = 0;
122 KIO::filesize_t unUsedSize = 0;
123 QList <DocClipBase*> list = m_clipManager->documentClipList();
125 for (int i = 0; i < list.count(); i++) {
126 DocClipBase *clip = list.at(i);
127 if (clip->numReferences() == 0) {
129 unUsedSize += clip->fileSize();
133 usedSize += clip->fileSize();
136 used_count->setText(QString::number(used));
137 used_size->setText(KIO::convertSize(usedSize));
138 unused_count->setText(QString::number(unused));
139 unused_size->setText(KIO::convertSize(unUsedSize));
140 if (!m_deleteUnused) delete_unused->setEnabled(unused > 0);
143 void ProjectSettings::accept()
145 if (!m_savedProject && selectedProfile() != KdenliveSettings::current_profile())
146 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;
150 void ProjectSettings::slotUpdateDisplay()
152 QString currentProfile = profiles_list->itemData(profiles_list->currentIndex()).toString();
153 QMap< QString, QString > values = ProfilesDialog::getSettingsFromFile(currentProfile);
154 p_size->setText(values.value("width") + 'x' + values.value("height"));
155 p_fps->setText(values.value("frame_rate_num") + '/' + values.value("frame_rate_den"));
156 p_aspect->setText(values.value("sample_aspect_num") + '/' + values.value("sample_aspect_den"));
157 p_display->setText(values.value("display_aspect_num") + '/' + values.value("display_aspect_den"));
158 if (values.value("progressive").toInt() == 0) p_progressive->setText(i18n("Interlaced"));
159 else p_progressive->setText(i18n("Progressive"));
162 void ProjectSettings::slotUpdateButton(const QString &path)
164 if (path.isEmpty()) m_buttonOk->setEnabled(false);
166 m_buttonOk->setEnabled(true);
167 slotUpdateFiles(true);
171 QString ProjectSettings::selectedProfile() const
173 return profiles_list->itemData(profiles_list->currentIndex()).toString();
176 KUrl ProjectSettings::selectedFolder() const
178 return project_folder->url();
181 QPoint ProjectSettings::tracks()
184 p.setX(video_tracks->value());
185 p.setY(audio_tracks->value());
189 bool ProjectSettings::enableVideoThumbs() const
191 return video_thumbs->isChecked();
194 bool ProjectSettings::enableAudioThumbs() const
196 return audio_thumbs->isChecked();
199 #include "projectsettings.moc"