]> git.sesse.net Git - kdenlive/blob - src/projectsettings.cpp
bbbda12e3f41f3626fd9b89d6ae3548ceb9fff8c
[kdenlive] / src / projectsettings.cpp
1 /***************************************************************************
2  *   Copyright (C) 2008 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 "projectsettings.h"
21 #include "kdenlivesettings.h"
22 #include "profilesdialog.h"
23 #include "docclipbase.h"
24
25 #include <KStandardDirs>
26 #include <KMessageBox>
27 #include <KDebug>
28 #include <kio/directorysizejob.h>
29 #include <KIO/NetAccess>
30
31 #include <QDir>
32 #include <kmessagebox.h>
33
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)
36 {
37     setupUi(this);
38
39     QMap <QString, QString> profilesInfo = ProfilesDialog::getProfilesInfo();
40     QMapIterator<QString, QString> i(profilesInfo);
41     while (i.hasNext()) {
42         i.next();
43         profiles_list->addItem(i.key(), i.value());
44     }
45     project_folder->setMode(KFile::Directory);
46     project_folder->setUrl(KUrl(projectPath));
47     QString currentProf = KdenliveSettings::current_profile();
48
49     for (int i = 0; i < profiles_list->count(); i++) {
50         if (profiles_list->itemData(i).toString() == currentProf) {
51             profiles_list->setCurrentIndex(i);
52             break;
53         }
54     }
55
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);
62     if (readOnlyTracks) {
63         video_tracks->setEnabled(false);
64         audio_tracks->setEnabled(false);
65     }
66     slotUpdateDisplay();
67     if (manager != NULL) {
68         slotUpdateFiles();
69         connect(clear_cache, SIGNAL(clicked()), this, SLOT(slotClearCache()));
70         connect(delete_unused, SIGNAL(clicked()), this, SLOT(slotDeleteUnused()));
71     }
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 &)));
75 }
76
77 void ProjectSettings::slotDeleteUnused()
78 {
79     QStringList toDelete;
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();
86         }
87     }
88     if (toDelete.count() == 0) {
89         KMessageBox::sorry(this, i18n("No clip to delete"));
90         return;
91     }
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);
95 }
96
97 bool ProjectSettings::deleteUnused() const
98 {
99     return m_deleteUnused;
100 }
101
102 void ProjectSettings::slotClearCache()
103 {
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);
109 }
110
111 void ProjectSettings::slotUpdateFiles(bool cacheOnly)
112 {   
113     KIO::DirectorySizeJob * job = KIO::directorySize( project_folder->url().path(KUrl::AddTrailingSlash) + "thumbs/" );
114     job->exec();
115     thumbs_count->setText(QString::number(job->totalFiles()));
116     thumbs_size->setText(KIO::convertSize(job->totalSize()));
117     delete job;
118     if (cacheOnly) return;
119     int unused = 0;
120     int used = 0;
121     KIO::filesize_t usedSize = 0;
122     KIO::filesize_t unUsedSize = 0;
123     QList <DocClipBase*> list = m_clipManager->documentClipList();
124
125     for (int i = 0; i < list.count(); i++) {
126         DocClipBase *clip = list.at(i);
127         if (clip->numReferences() == 0) {
128             unused++;
129             unUsedSize += clip->fileSize();
130         }
131         else {
132             used++;
133             usedSize += clip->fileSize();
134         }
135     }
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);
141 }
142
143 void ProjectSettings::accept()
144 {
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;
147     QDialog::accept();
148 }
149
150 void ProjectSettings::slotUpdateDisplay()
151 {
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"));
160 }
161
162 void ProjectSettings::slotUpdateButton(const QString &path)
163 {
164     if (path.isEmpty()) m_buttonOk->setEnabled(false);
165     else {
166         m_buttonOk->setEnabled(true);
167         slotUpdateFiles(true);
168     }
169 }
170
171 QString ProjectSettings::selectedProfile() const
172 {
173     return profiles_list->itemData(profiles_list->currentIndex()).toString();
174 }
175
176 KUrl ProjectSettings::selectedFolder() const
177 {
178     return project_folder->url();
179 }
180
181 QPoint ProjectSettings::tracks()
182 {
183     QPoint p;
184     p.setX(video_tracks->value());
185     p.setY(audio_tracks->value());
186     return p;
187 }
188
189 bool ProjectSettings::enableVideoThumbs() const
190 {
191     return video_thumbs->isChecked();
192 }
193
194 bool ProjectSettings::enableAudioThumbs() const
195 {
196     return audio_thumbs->isChecked();
197 }
198
199 #include "projectsettings.moc"
200
201