]> git.sesse.net Git - kdenlive/blob - src/projectsettings.cpp
Correctly update monitor when changing a title clip duration
[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     } 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 &)));
74 }
75
76 void ProjectSettings::slotDeleteUnused()
77 {
78     QStringList toDelete;
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();
85         }
86     }
87     if (toDelete.count() == 0) {
88         KMessageBox::sorry(this, i18n("No clip to delete"));
89         return;
90     }
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);
94 }
95
96 bool ProjectSettings::deleteUnused() const
97 {
98     return m_deleteUnused;
99 }
100
101 void ProjectSettings::slotClearCache()
102 {
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);
108 }
109
110 void ProjectSettings::slotUpdateFiles(bool cacheOnly)
111 {
112     KIO::DirectorySizeJob * job = KIO::directorySize(project_folder->url().path(KUrl::AddTrailingSlash) + "thumbs/");
113     job->exec();
114     thumbs_count->setText(QString::number(job->totalFiles()));
115     thumbs_size->setText(KIO::convertSize(job->totalSize()));
116     delete job;
117     if (cacheOnly) return;
118     int unused = 0;
119     int used = 0;
120     KIO::filesize_t usedSize = 0;
121     KIO::filesize_t unUsedSize = 0;
122     QList <DocClipBase*> list = m_clipManager->documentClipList();
123
124     for (int i = 0; i < list.count(); i++) {
125         DocClipBase *clip = list.at(i);
126         if (clip->numReferences() == 0) {
127             unused++;
128             unUsedSize += clip->fileSize();
129         } else {
130             used++;
131             usedSize += clip->fileSize();
132         }
133     }
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);
139 }
140
141 void ProjectSettings::accept()
142 {
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;
145     QDialog::accept();
146 }
147
148 void ProjectSettings::slotUpdateDisplay()
149 {
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"));
158 }
159
160 void ProjectSettings::slotUpdateButton(const QString &path)
161 {
162     if (path.isEmpty()) m_buttonOk->setEnabled(false);
163     else {
164         m_buttonOk->setEnabled(true);
165         slotUpdateFiles(true);
166     }
167 }
168
169 QString ProjectSettings::selectedProfile() const
170 {
171     return profiles_list->itemData(profiles_list->currentIndex()).toString();
172 }
173
174 KUrl ProjectSettings::selectedFolder() const
175 {
176     return project_folder->url();
177 }
178
179 QPoint ProjectSettings::tracks()
180 {
181     QPoint p;
182     p.setX(video_tracks->value());
183     p.setY(audio_tracks->value());
184     return p;
185 }
186
187 bool ProjectSettings::enableVideoThumbs() const
188 {
189     return video_thumbs->isChecked();
190 }
191
192 bool ProjectSettings::enableAudioThumbs() const
193 {
194     return audio_thumbs->isChecked();
195 }
196
197 #include "projectsettings.moc"
198
199