return m_clipIdCounter - 1;
}
+QString ClipManager::projectFolder() const {
+ return m_doc->projectFolder().path();
+}
+
+
void startAudioThumbsGeneration();
void endAudioThumbsGeneration(const QString &requestedId);
void askForAudioThumb(const QString &id);
+ QString projectFolder() const;
private: // Private attributes
/** the list of clips in the document */
setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount());
verticalScrollBar()->setMaximum(m_tracksHeight * m_document->tracksCount());
QTimer::singleShot(300, this, SIGNAL(trackHeightChanged()));
+ viewport()->update();
//setFixedHeight(50 * m_tracksCount);
}
setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount());
verticalScrollBar()->setMaximum(m_tracksHeight * m_document->tracksCount());
QTimer::singleShot(300, this, SIGNAL(trackHeightChanged()));
+ viewport()->update();
}
void CustomTrackView::changeTrack(int ix, TrackInfo type) {
}
void CustomTrackView::moveClip(const ItemInfo start, const ItemInfo end) {
+ if (m_selectionGroup) resetSelectionGroup(false);
ClipItem *item = getClipItemAt((int) start.startPos.frames(m_document->fps()) + 1, start.track);
if (!item) {
emit displayMessage(i18n("Cannot move clip at time: %1 on track %2", m_document->timecode().getTimecodeFromFrames(start.startPos.frames(m_document->fps())), start.track), ErrorMessage);
bool success = m_document->renderer()->mltMoveClip((int)(m_document->tracksCount() - start.track), (int)(m_document->tracksCount() - end.track), (int) start.startPos.frames(m_document->fps()), (int)end.startPos.frames(m_document->fps()), item->baseClip()->producer(end.track));
if (success) {
item->setPos((int) end.startPos.frames(m_document->fps()), (int)(end.track * m_tracksHeight + 1));
+ m_scene->clearSelection();
+ item->setSelected(true);
if (item->baseClip()->isTransparent()) {
// Also move automatic transition
Transition *tr = getTransitionItemAt((int) start.startPos.frames(m_document->fps()), start.track);
void CustomTrackView::slotUpdateAllThumbs() {
QList<QGraphicsItem *> itemList = items();
+ //if (itemList.isEmpty()) return;
ClipItem *item;
- Transition *transitionitem;
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i)->type() == AVWIDGET) {
item = static_cast <ClipItem *>(itemList.at(i));
//if (!url.isEmpty() && QFile::exists(url.path()))
{
- m_thumbProd = new KThumb(clipManager, url, m_id);
+ m_thumbProd = new KThumb(clipManager, url, m_id, m_properties.value("file_hash"));
if (m_clipType == AV || m_clipType == AUDIO) slotCreateAudioTimer();
}
//kDebug() << "type is video" << (m_clipType == AV) << " " << m_clipType;
bool DocClipBase::slotGetAudioThumbs() {
if (m_thumbProd == NULL) return false;
+ if (!KdenliveSettings::audiothumbnails()) {
+ if (m_audioTimer != NULL) m_audioTimer->stop();
+ return false;
+ }
if (m_audioThumbCreated) {
if (m_audioTimer != NULL) m_audioTimer->stop();
return false;
if (!infoXmlNode.isNull()) {
QDomElement infoXml = infoXmlNode.toElement();
QString profilePath = infoXml.attribute("profile");
+ QString projectFolderPath = infoXml.attribute("projectfolder");
+ if (!projectFolderPath.isEmpty()) m_projectFolder = KUrl(projectFolderPath);
+ if (m_projectFolder.isEmpty()) m_projectFolder = KUrl(KdenliveSettings::defaultprojectfolder());
m_startPos = infoXml.attribute("position").toInt();
m_zoom = infoXml.attribute("zoom", "7").toInt();
setProfilePath(profilePath);
m_document = createEmptyDocument(tracks.x(), tracks.y());
setProfilePath(profileName);
}
+ if (m_projectFolder.isEmpty()) m_projectFolder = KUrl(KdenliveSettings::defaultprojectfolder());
+
+ // make sure that the necessary folders exist
+ KStandardDirs::makeDir(m_projectFolder.path() + "/titles/");
+ KStandardDirs::makeDir(m_projectFolder.path() + "/thumbs/");
+
m_scenelist = m_document.toString();
kDebug() << "KDEnnlive document, init timecode: " << m_fps;
if (m_fps == 30000.0 / 1001.0) m_timecode.setFormat(30, true);
addedXml.setAttribute("version", "0.8");
addedXml.setAttribute("profile", profilePath());
addedXml.setAttribute("position", m_render->seekPosition().frames(m_fps));
+ addedXml.setAttribute("projectfolder", m_projectFolder.path());
addedXml.setAttribute("tracks", getTracksInfo());
addedXml.setAttribute("zoom", m_zoom);
}
KUrl KdenliveDoc::projectFolder() const {
- if (m_projectFolder.isEmpty()) return KUrl(KStandardDirs::locateLocal("appdata", "/projects/"));
+ //if (m_projectFolder.isEmpty()) return KUrl(KStandardDirs::locateLocal("appdata", "/projects/"));
return m_projectFolder;
}
<default>/tmp/</default>
</entry>
+ <entry name="defaultprojectfolder" type="Path">
+ <label>Default folder for project files.</label>
+ <default></default>
+ </entry>
+
<entry name="capturefolder" type="Path">
<label>Default folder for captured files.</label>
<default>$HOME</default>
m_configEnv.rendererpathurl->lineEdit()->setObjectName("kcfg_rendererpath");
m_configEnv.tmppathurl->setMode(KFile::Directory);
m_configEnv.tmppathurl->lineEdit()->setObjectName("kcfg_currenttmpfolder");
+ m_configEnv.projecturl->setMode(KFile::Directory);
+ m_configEnv.projecturl->lineEdit()->setObjectName("kcfg_defaultprojectfolder");
m_configEnv.capturefolderurl->setMode(KFile::Directory);
m_configEnv.capturefolderurl->lineEdit()->setObjectName("kcfg_capturefolder");
page2 = addPage(p2, i18n("Environment"), "terminal");
#include <qxml.h>
#include <QImage>
#include <QApplication>
-#include <QCryptographicHash>
#include <kio/netaccess.h>
#include <kdebug.h>
}
void MyThread::run() {
-
if (!f.open(QIODevice::WriteOnly)) {
kDebug() << "++++++++ ERROR WRITING TO FILE: " << f.fileName() << endl;
kDebug() << "++++++++ DISABLING AUDIO THUMBS" << endl;
}
-KThumb::KThumb(ClipManager *clipManager, KUrl url, const QString &id, QObject * parent, const char *name): QObject(parent), m_clipManager(clipManager), m_url(url), m_id(id), m_producer(NULL), m_dar(1), m_mainFrame(-1) {
- QCryptographicHash context(QCryptographicHash::Sha1);
- context.addData((KFileItem(m_url, "text/plain", S_IFREG).timeString() + m_url.fileName()).toAscii().data());
- m_thumbFile = KGlobal::dirs()->saveLocation("tmp" , "kdenlive") + context.result().toHex() + ".thumb";
- //kDebug() << "thumbfile=" << m_thumbFile;
+KThumb::KThumb(ClipManager *clipManager, KUrl url, const QString &id, const QString &hash, QObject * parent, const char *name): QObject(parent), m_clipManager(clipManager), m_url(url), m_id(id), m_producer(NULL), m_dar(1), m_mainFrame(-1) {
+ m_thumbFile = clipManager->projectFolder() + "/thumbs/" + hash + ".thumb";
connect(&audioThumbProducer, SIGNAL(audioThumbProgress(const int)), this, SLOT(slotAudioThumbProgress(const int)));
connect(&audioThumbProducer, SIGNAL(audioThumbOver()), this, SLOT(slotAudioThumbOver()));
Q_OBJECT public:
- KThumb(ClipManager *clipManager, KUrl url, const QString &id, QObject * parent = 0, const char *name = 0);
+ KThumb(ClipManager *clipManager, KUrl url, const QString &id, const QString &hash, QObject * parent = 0, const char *name = 0);
~KThumb();
void setProducer(Mlt::Producer *producer);
void askForAudioThumbs(const QString &id);
} else {
::exit(1);
}
+ } else if (initialGroup.readEntry("version") == "0.7") {
+ //Add new settings from 0.7.1
+ if (KdenliveSettings::defaultprojectfolder().isEmpty()) {
+ QString path = QDir::homePath() + "/kdenlive";
+ if (KStandardDirs::makeDir(path) == false) kDebug() << "/// ERROR CREATING PROJECT FOLDER: " << path;
+ KdenliveSettings::setDefaultprojectfolder(path);
+ }
}
KConfigGroup treecolumns(config, "Project Tree");
const QByteArray state = treecolumns.readEntry("columns", QByteArray());
if (!KdenliveSettings::activatetabs()) closeCurrentDocument();
profileName = KdenliveSettings::default_profile();
} else {
- ProjectSettings *w = new ProjectSettings(projectTracks.x(), projectTracks.y(), false, this);
+ ProjectSettings *w = new ProjectSettings(projectTracks.x(), projectTracks.y(), KdenliveSettings::defaultprojectfolder(), false, this);
if (w->exec() != QDialog::Accepted) return;
if (!KdenliveSettings::activatetabs()) closeCurrentDocument();
profileName = w->selectedProfile();
void MainWindow::slotEditProjectSettings() {
QPoint p = m_activeDocument->getTracksCount();
- ProjectSettings *w = new ProjectSettings(p.x(), p.y(), true, this);
+ ProjectSettings *w = new ProjectSettings(p.x(), p.y(), m_activeDocument->projectFolder().path(), true, this);
if (w->exec() == QDialog::Accepted) {
QString profile = w->selectedProfile();
#include "profilesdialog.h"
#include "projectsettings.h"
-ProjectSettings::ProjectSettings(int videotracks, int audiotracks, bool readOnlyTracks, QWidget * parent): QDialog(parent), m_isCustomProfile(false) {
+ProjectSettings::ProjectSettings(int videotracks, int audiotracks, const QString projectPath, bool readOnlyTracks, QWidget * parent): QDialog(parent), m_isCustomProfile(false) {
m_view.setupUi(this);
QMap <QString, QString> profilesInfo = ProfilesDialog::getProfilesInfo();
m_view.profiles_list->addItem(i.key(), i.value());
}
m_view.project_folder->setMode(KFile::Directory);
+ m_view.project_folder->setPath(projectPath);
QString currentProf = KdenliveSettings::current_profile();
for (int i = 0; i < m_view.profiles_list->count(); i++) {
Q_OBJECT
public:
- ProjectSettings(int videotracks, int audiotracks, bool readOnlyTracks, QWidget * parent = 0);
+ ProjectSettings(int videotracks, int audiotracks, const QString projectPath, bool readOnlyTracks, QWidget * parent = 0);
QString selectedProfile() const;
KUrl selectedFolder() const;
QPoint tracks();
<rect>
<x>0</x>
<y>0</y>
- <width>304</width>
- <height>236</height>
+ <width>365</width>
+ <height>240</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout" >
<attribute name="title" >
<string>Default folders</string>
</attribute>
- <layout class="QGridLayout" name="gridLayout_5" >
+ <layout class="QGridLayout" name="gridLayout_2" >
<item row="0" column="0" >
+ <widget class="QLabel" name="label_5" >
+ <property name="text" >
+ <string>Project folder</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="KUrlRequester" name="projecturl" />
+ </item>
+ <item row="1" column="0" >
<widget class="QLabel" name="label_3" >
<property name="text" >
<string>Temporary files</string>
</property>
</widget>
</item>
- <item row="0" column="1" >
+ <item row="1" column="1" >
<widget class="KUrlRequester" name="tmppathurl" />
</item>
- <item row="1" column="0" >
+ <item row="2" column="0" >
<widget class="QLabel" name="label_10" >
<property name="text" >
<string>Capture folder</string>
</property>
</widget>
</item>
- <item row="1" column="1" >
+ <item row="2" column="1" >
<widget class="KUrlRequester" name="capturefolderurl" />
</item>
- <item row="2" column="1" >
+ <item row="3" column="1" >
<spacer name="verticalSpacer_3" >
<property name="orientation" >
<enum>Qt::Vertical</enum>
<rect>
<x>0</x>
<y>0</y>
- <width>335</width>
- <height>156</height>
+ <width>429</width>
+ <height>282</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_2" >
<item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>Default folder for project files</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="KUrlRequester" name="projectfolder" />
+ </item>
+ <item row="2" column="0" >
<widget class="QFrame" name="frame" >
<property name="frameShape" >
<enum>QFrame::StyledPanel</enum>
</layout>
</widget>
</item>
- <item row="1" column="0" >
+ <item row="3" column="0" >
<widget class="QCheckBox" name="autosave" >
<property name="text" >
<string>Activate crash recovery (auto save)</string>
</property>
</widget>
</item>
- <item row="2" column="0" >
+ <item row="4" column="0" >
<widget class="QCheckBox" name="installmimes" >
<property name="text" >
<string>Install extra video mimetypes</string>
</property>
</widget>
</item>
- <item row="3" column="0" >
+ <item row="5" column="0" >
<spacer name="verticalSpacer" >
<property name="orientation" >
<enum>Qt::Vertical</enum>
</item>
</layout>
</widget>
+ <customwidgets>
+ <customwidget>
+ <class>KUrlRequester</class>
+ <extends>QFrame</extends>
+ <header>kurlrequester.h</header>
+ </customwidget>
+ </customwidgets>
<resources/>
<connections/>
</ui>
<rect>
<x>0</x>
<y>0</y>
- <width>233</width>
- <height>180</height>
+ <width>400</width>
+ <height>188</height>
</rect>
</property>
- <layout class="QGridLayout" name="gridLayout_3" >
- <item row="0" column="0" >
+ <layout class="QGridLayout" name="gridLayout_2" >
+ <item row="0" column="0" colspan="6" >
<widget class="QLabel" name="label_3" >
<property name="text" >
- <string>Please set your default video format</string>
+ <string>Please set your default video profile</string>
</property>
</widget>
</item>
<item row="1" column="0" >
- <widget class="QFrame" name="frame" >
- <property name="frameShape" >
- <enum>QFrame::StyledPanel</enum>
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>Video Resolution</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <spacer name="horizontalSpacer_2" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>1</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="2" colspan="2" >
+ <widget class="QRadioButton" name="button_dv" >
+ <property name="text" >
+ <string>DV</string>
</property>
- <property name="frameShadow" >
- <enum>QFrame::Raised</enum>
+ <property name="checked" >
+ <bool>true</bool>
</property>
- <layout class="QGridLayout" name="gridLayout" >
- <item row="0" column="0" >
- <widget class="QLabel" name="label" >
- <property name="text" >
- <string>Video Standard</string>
- </property>
- </widget>
- </item>
- <item row="0" column="2" >
- <widget class="QRadioButton" name="button_pal" >
- <property name="text" >
- <string>PAL</string>
- </property>
- <property name="checked" >
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="0" column="3" >
- <widget class="QRadioButton" name="button_ntsc" >
- <property name="text" >
- <string>NTSC</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1" >
- <spacer name="horizontalSpacer" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>9</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
</widget>
</item>
- <item row="2" column="0" >
- <widget class="QFrame" name="frame_2" >
- <property name="frameShape" >
- <enum>QFrame::StyledPanel</enum>
+ <item row="1" column="4" >
+ <widget class="QRadioButton" name="button_hdv" >
+ <property name="text" >
+ <string>HDV</string>
</property>
- <property name="frameShadow" >
- <enum>QFrame::Raised</enum>
+ </widget>
+ </item>
+ <item row="1" column="5" >
+ <widget class="QRadioButton" name="button_all" >
+ <property name="text" >
+ <string>Show All</string>
</property>
- <layout class="QGridLayout" name="gridLayout_2" >
- <item row="0" column="2" >
- <widget class="QRadioButton" name="button_dv" >
- <property name="text" >
- <string>DV</string>
- </property>
- <property name="checked" >
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="0" column="0" >
- <widget class="QLabel" name="label_2" >
- <property name="text" >
- <string>Video Resolution</string>
- </property>
- </widget>
- </item>
- <item row="0" column="3" >
- <widget class="QRadioButton" name="button_hdv" >
- <property name="text" >
- <string>HDV</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1" >
- <spacer name="horizontalSpacer_2" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>1</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
</widget>
</item>
- <item row="3" column="0" >
+ <item row="2" column="0" colspan="6" >
<widget class="QListWidget" name="profiles_list" >
<property name="sizePolicy" >
- <sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
+ <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
- <item row="4" column="0" >
- <spacer name="verticalSpacer" >
- <property name="orientation" >
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>20</width>
- <height>0</height>
- </size>
- </property>
- </spacer>
- </item>
</layout>
</widget>
<resources/>
QWizardPage *page2 = new QWizardPage;
page2->setTitle(i18n("Video Standard"));
m_standard.setupUi(page2);
- m_standard.profiles_list->setMaximumHeight(100);
- connect(m_standard.button_pal, SIGNAL(toggled(bool)), this, SLOT(slotCheckStandard()));
+ //m_standard.profiles_list->setMaximumHeight(100);
+ // build profiles lists
+ m_profilesInfo = ProfilesDialog::getProfilesInfo();
+ QMap<QString, QString>::const_iterator i = m_profilesInfo.constBegin();
+ while (i != m_profilesInfo.constEnd()) {
+ QMap< QString, QString > profileData = ProfilesDialog::getSettingsFromFile(i.value());
+ if (profileData.value("width") == "720") m_dvProfiles.append(i.key());
+ else if (profileData.value("width").toInt() >= 1080) m_hdvProfiles.append(i.key());
+ else m_otherProfiles.append(i.key());
+ ++i;
+ }
+
+ connect(m_standard.button_all, SIGNAL(toggled(bool)), this, SLOT(slotCheckStandard()));
+ connect(m_standard.button_hdv, SIGNAL(toggled(bool)), this, SLOT(slotCheckStandard()));
connect(m_standard.button_dv, SIGNAL(toggled(bool)), this, SLOT(slotCheckStandard()));
slotCheckStandard();
connect(m_standard.profiles_list, SIGNAL(itemSelectionChanged()), this, SLOT(slotCheckSelectedItem()));
QWizardPage *page3 = new QWizardPage;
page3->setTitle(i18n("Additional Settings"));
m_extra.setupUi(page3);
+ m_extra.projectfolder->setMode(KFile::Directory);
+ m_extra.projectfolder->setPath(QDir::homePath() + "/kdenlive");
m_extra.videothumbs->setChecked(KdenliveSettings::videothumbnails());
m_extra.audiothumbs->setChecked(KdenliveSettings::audiothumbnails());
m_extra.autosave->setChecked(KdenliveSettings::crashrecovery());
}
void Wizard::slotCheckStandard() {
+ m_standard.profiles_list->clear();
QStringList profiles;
- if (m_standard.button_pal->isChecked()) {
- // PAL standard
- if (m_standard.button_dv->isChecked()) {
- profiles << "dv_pal" << "dv_pal_wide";
- } else {
- profiles << "hdv_720_25p" << "hdv_720_50p" << "hdv_1080_50i" << "hdv_1080_25p" << "atsc_1080p_24" << "atsc_1080p_25";
- }
+ if (m_standard.button_dv->isChecked()) {
+ // DV standard
+ m_standard.profiles_list->addItems(m_dvProfiles);
+ } else if (m_standard.button_hdv->isChecked()) {
+ // HDV standard
+ m_standard.profiles_list->addItems(m_hdvProfiles);
} else {
- // NTSC standard
- if (m_standard.button_dv->isChecked()) {
- profiles << "dv_ntsc" << "dv_ntsc_wide";
- } else {
- profiles << "hdv_720_30p" << "hdv_720_60p" << "hdv_1080_30p" << "hdv_1080_60i" << "atsc_720p_30" << "atsc_1080i_60";
- }
+ m_standard.profiles_list->addItems(m_dvProfiles);
+ m_standard.profiles_list->addItems(m_hdvProfiles);
+ m_standard.profiles_list->addItems(m_otherProfiles);
+ //m_standard.profiles_list->sortItems();
}
- m_standard.profiles_list->clear();
- QStringList profilesDescription;
- foreach(const QString &prof, profiles) {
- QString desc = ProfilesDialog::getProfileDescription(prof);
- if (!desc.isEmpty()) {
- QListWidgetItem *item = new QListWidgetItem(desc, m_standard.profiles_list);
- item->setData(Qt::UserRole, prof);
- }
+
+ for (int i = 0; i < m_standard.profiles_list->count(); i++) {
+ QListWidgetItem *item = m_standard.profiles_list->item(i);
+ MltVideoProfile prof = ProfilesDialog::getVideoProfile(m_profilesInfo.value(item->text()));
+ const QString infoString = i18n("<b>Frame size:</b>%1x%2<br><b>Frame rate:</b>%3/%4<br><b>Aspect ratio:</b>%5/%6<br><b>Display ratio:</b>%7/%8").arg(QString::number(prof.width), QString::number(prof.height), QString::number(prof.frame_rate_num), QString::number(prof.frame_rate_den), QString::number(prof.sample_aspect_num), QString::number(prof.sample_aspect_den), QString::number(prof.display_aspect_num), QString::number(prof.display_aspect_den));
+ item->setToolTip(infoString);
}
+
m_standard.profiles_list->setSortingEnabled(true);
m_standard.profiles_list->setCurrentRow(0);
}
KdenliveSettings::setVideothumbnails(m_extra.videothumbs->isChecked());
KdenliveSettings::setCrashrecovery(m_extra.autosave->isChecked());
if (m_standard.profiles_list->currentItem()) {
- KdenliveSettings::setDefault_profile(m_standard.profiles_list->currentItem()->data(Qt::UserRole).toString());
+ QString selectedProfile = m_profilesInfo.value(m_standard.profiles_list->currentItem()->text());
+ if (selectedProfile.isEmpty()) selectedProfile = "dv_pal";
+ KdenliveSettings::setDefault_profile(selectedProfile);
}
+ QString path = m_extra.projectfolder->url().path();
+ if (KStandardDirs::makeDir(path) == false) kDebug() << "/// ERROR CREATING PROJECT FOLDER: " << path;
+ KdenliveSettings::setDefaultprojectfolder(path);
+
}
void Wizard::slotCheckMlt() {
Ui::WizardExtra_UI m_extra;
QVBoxLayout *m_startLayout;
bool m_systemCheckIsOk;
+ QStringList m_dvProfiles;
+ QStringList m_hdvProfiles;
+ QStringList m_otherProfiles;
+ QMap <QString, QString> m_profilesInfo;
private slots:
void slotCheckThumbs();