void CustomTrackView::deleteClip(ItemInfo info)
{
- ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()) + 1, info.track);
+ ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()), info.track);
if (!item || m_document->renderer()->mltRemoveClip(m_document->tracksCount() - info.track, info.startPos) == false) {
emit displayMessage(i18n("Error removing clip at %1 on track %2", m_document->timecode().getTimecodeFromFrames(info.startPos.frames(m_document->fps())), info.track), ErrorMessage);
void CustomTrackView::doChangeClipSpeed(ItemInfo info, const double speed, const double oldspeed, const QString &id)
{
DocClipBase *baseclip = m_document->clipManager()->getClipById(id);
- ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()) + 1, info.track);
+ ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()), info.track);
if (!item) {
kDebug() << "ERROR: Cannot find clip for speed change";
emit displayMessage(i18n("Cannot find clip for speed change"), ErrorMessage);
switch (KMessageBox::warningYesNoCancel(this, i18n("You have %1 rendering jobs waiting in the queue.\nWhat do you want to do with these jobs?", waitingJobs), QString(), KGuiItem(i18n("Start them now")), KGuiItem(i18n("Delete them")))) {
case KMessageBox::Yes :
// create script with waiting jobs and start it
- //startWaitingRenderJobs();
- KMessageBox::sorry(this, "not implementd yet");
- return false;
+ if (m_renderWidget->startWaitingRenderJobs() == false) return false;
break;
case KMessageBox::No :
// Don't do anything, jobs will be deleted
m_activeDocument->setModified(true);
}
-void MainWindow::startWaitingRenderJobs()
-{
-
-}
void MainWindow::slotPrepareRendering(bool scriptExport, bool zoneOnly, const QString &chapterFile)
{
QStringList m_pluginFileNames;
QByteArray m_timelineState;
void loadTranscoders();
- void startWaitingRenderJobs();
+
public slots:
void openFile(const KUrl &url);
mlt_service_lock(service.get_service());
Mlt::Producer trackProducer(tractor.track(startTrack));
Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
- int clipIndex = trackPlaylist.get_clip_index_at(moveStart + 1);
+ int clipIndex = trackPlaylist.get_clip_index_at(moveStart);
kDebug() << "////// LOOKING FOR CLIP TO MOVE, INDEX: " << clipIndex;
bool checkLength = false;
if (endTrack == startTrack) {
RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent) :
QDialog(parent),
- m_projectFolder(projectfolder)
+ m_projectFolder(projectfolder),
+ m_blockProcessing(false)
{
m_view.setupUi(this);
setWindowTitle(i18n("Rendering"));
void RenderWidget::checkRenderStatus()
{
+ if (m_blockProcessing) return;
QTreeWidgetItem *item = m_view.running_jobs->topLevelItem(0);
while (item) {
if (item->data(1, Qt::UserRole + 2).toInt() == RUNNINGJOB) break;
}
-QMap <QStringList, QStringList> RenderWidget::waitingJobsData()
+bool RenderWidget::startWaitingRenderJobs()
{
+ m_blockProcessing = true;
+ QString autoscriptFile = getFreeScriptName("auto");
+ QFile file(autoscriptFile);
+ if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+ kWarning() << "////// ERROR writing to file: " << autoscriptFile;
+ KMessageBox::error(0, i18n("Cannot write to file %1", autoscriptFile));
+ return false;
+ }
- QMap <QStringList, QStringList> renderData;
- /* QTreeWidgetItem *item = m_view.running_jobs->topLevelItem(0);
- while (item) {
- if (item->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB) {
- if (item->data(1, Qt::UserRole + 4).isNull()) {
- // We only start straight jobs, script jobs are already saved somewhere...
- const QStringList params = item->data(1, Qt::UserRole + 3).toStringList();
- const QStringList ov_params = item->data(1, Qt::UserRole + 2).toStringList();
- renderData.insert(params, ov_params);
- }
+ QString renderer = QCoreApplication::applicationDirPath() + QString("/kdenlive_render");
+ if (!QFile::exists(renderer)) renderer = "kdenlive_render";
+ QTextStream outStream(&file);
+ outStream << "#! /bin/sh" << "\n" << "\n";
+ QTreeWidgetItem *item = m_view.running_jobs->topLevelItem(0);
+ while (item) {
+ if (item->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB) {
+ // Add render process for item
+ const QString params = item->data(1, Qt::UserRole + 3).toStringList().join(" ");
+ outStream << renderer << " " << params << "\n";
+ }
+ item = m_view.running_jobs->itemBelow(item);
}
- item = m_view.running_jobs->itemBelow(item);
- }*/
- return renderData;
+ // erase itself when rendering is finished
+ outStream << "rm " << autoscriptFile << "\n" << "\n";
+ if (file.error() != QFile::NoError) {
+ KMessageBox::error(0, i18n("Cannot write to file %1", autoscriptFile));
+ file.close();
+ return false;
+ }
+ file.close();
+ QFile::setPermissions(autoscriptFile, file.permissions() | QFile::ExeUser);
+ QProcess::startDetached(autoscriptFile, QStringList());
+ return true;
}
-QString RenderWidget::getFreeScriptName()
+QString RenderWidget::getFreeScriptName(const QString &prefix)
{
int ix = 0;
QString scriptsFolder = m_projectFolder + "/scripts/";
KStandardDirs::makeDir(scriptsFolder);
- QString path = scriptsFolder + i18n("script") + QString::number(ix).rightJustified(3, '0', false) + ".sh";
- while (QFile::exists(path)) {
+ QString path;
+ while (path.isEmpty() || QFile::exists(path)) {
ix++;
- path = scriptsFolder + i18n("script") + QString::number(ix).rightJustified(3, '0', false) + ".sh";
+ path = scriptsFolder + prefix + i18n("script") + QString::number(ix).rightJustified(3, '0', false) + ".sh";
}
return path;
}
void reloadProfiles();
void setRenderProfile(const QString &dest, const QString &name);
int waitingJobsCount() const;
- QMap <QStringList, QStringList> waitingJobsData();
- QString getFreeScriptName();
+ QString getFreeScriptName(const QString &prefix = QString());
+ bool startWaitingRenderJobs();
public slots:
void slotExport(bool scriptExport, int zoneIn, int zoneOut, const QString &playlistPath, const QString &scriptPath);
Ui::RenderWidget_UI m_view;
MltVideoProfile m_profile;
QString m_projectFolder;
+ bool m_blockProcessing;
void parseProfiles(QString meta = QString(), QString group = QString(), QString profile = QString());
void parseFile(QString exportFile, bool editable);
void updateButtons();
// Found a clip
int in = elem.attribute("in").toInt();
int out = elem.attribute("out").toInt();
- if (in > out || in == out || m_invalidProducers.contains(elem.attribute("producer"))) {
+ if (in > out || /*in == out ||*/ m_invalidProducers.contains(elem.attribute("producer"))) {
m_documentErrors.append(i18n("Invalid clip removed from track %1 at %2\n", ix, position));
xml.removeChild(children.at(nodeindex));
nodeindex--;