Commit 564a3362 authored by Jean-Baptiste Mardelle's avatar Jean-Baptiste Mardelle

Merge branch 'frameworks' of git.kde.org:kdenlive into frameworks

parents 71203e25 10388cee
function get_files
{
echo kdenlive.xml
}
function po_for_file
{
case "$1" in
kdenlive.xml)
echo kdenlive_xml_mimetypes.po
;;
esac
}
function tags_for_file
{
case "$1" in
kdenlive.xml)
echo comment
;;
esac
}
......@@ -2,11 +2,33 @@
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<mime-type type="application/x-kdenlive">
<comment>Kdenlive video project document</comment>
<comment xml:lang="ca">document de projecte de vídeo del Kdenlive</comment>
<comment xml:lang="cs">Dokument video projektu Kdenlive</comment>
<comment xml:lang="de">Kdenlive-Videoprojektdokument</comment>
<comment xml:lang="en_GB">Kdenlive video project document</comment>
<comment xml:lang="nl">Video projectdocument van Kdenlive</comment>
<comment xml:lang="pl">Dokument projektowy filmu w Kdenlive</comment>
<comment xml:lang="pt">Documento de projecto de vídeo do Kdenlive</comment>
<comment xml:lang="pt_BR">Documento de projeto de vídeo do Kdenlive</comment>
<comment xml:lang="sk">Dokument projektu videa Kdenlive</comment>
<comment xml:lang="sl">Dokument video projekta Kdenlive</comment>
<comment xml:lang="uk">документ відеопроекту Kdenlive</comment>
<sub-class-of type="video/mlt-playlist"/>
<glob pattern="*.kdenlive"/>
</mime-type>
<mime-type type="application/x-kdenlivetitle">
<comment>Kdenlive video title</comment>
<comment xml:lang="ca">títol de vídeo del Kdenlive</comment>
<comment xml:lang="cs">Název videa Kdenlive</comment>
<comment xml:lang="de">Kdenlive-Videotitel</comment>
<comment xml:lang="en_GB">Kdenlive video title</comment>
<comment xml:lang="nl">Titel van Kdenlive-video</comment>
<comment xml:lang="pl">Tytuł filmu w Kdenlive</comment>
<comment xml:lang="pt">Título de vídeo do Kdenlive</comment>
<comment xml:lang="pt_BR">Título de vídeo do Kdenlive</comment>
<comment xml:lang="sk">Titulok videa Kdenlive</comment>
<comment xml:lang="sl">Naslov videa Kdenlive</comment>
<comment xml:lang="uk">заголовок відео Kdenlive</comment>
<sub-class-of type="application/xml"/>
<glob pattern="*.kdenlivetitle"/>
</mime-type>
......
......@@ -235,7 +235,6 @@ target_link_libraries(kdenlive
${Qt5_LIBRARIES}
Qt5::Svg
${OPENGL_LIBRARIES}
${QT_LIBRARIES}
${MLT_LIBRARIES}
${MLTPP_LIBRARIES}
${CMAKE_DL_LIBS}
......@@ -270,6 +269,6 @@ if(BUILD_JogShuttle)
target_link_libraries(kdenlive
media_ctrl
)
endif(BUILD_JogShuttle)
endif()
install(TARGETS kdenlive DESTINATION ${BIN_INSTALL_DIR})
......@@ -15,7 +15,6 @@
* *
***************************************************************************/
#include "mltdevicecapture.h"
#include "kdenlivesettings.h"
......@@ -173,7 +172,7 @@ void MltDeviceCapture::stop()
if (m_mltConsumer) {
m_mltConsumer->set("refresh", 0);
m_mltConsumer->purge();
m_mltConsumer->stop();
m_mltConsumer->stop();
//if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
}
if (m_mltProducer) {
......@@ -363,14 +362,6 @@ bool MltDeviceCapture::slotStartCapture(const QString &params, const QString &pa
char *tmp = qstrdup(m_activeProfile.toUtf8().constData());
m_mltProfile = new Mlt::Profile(tmp);
delete[] tmp;
//m_mltProfile->get_profile()->is_explicit = 1;
/*//qDebug()<<"-- CREATING CAP: "<<params<<", PATH: "<<path;
tmp = qstrdup(QString("avformat:" + path).toUtf8().constData());
m_mltConsumer = new Mlt::Consumer(*m_mltProfile, tmp);
m_mltConsumer->set("real_time", -1);
delete[] tmp;*/
m_mltConsumer = new Mlt::Consumer(*m_mltProfile, "multi");
if (m_mltConsumer == NULL || !m_mltConsumer->is_valid()) {
......@@ -387,11 +378,11 @@ bool MltDeviceCapture::slotStartCapture(const QString &params, const QString &pa
Mlt::Properties *renderProps = new Mlt::Properties;
renderProps->set("mlt_service", "avformat");
renderProps->set("target", path.toUtf8().constData());
renderProps->set("real_time", -1);
//renderProps->set("terminate_on_pause", 0);
renderProps->set("real_time", -KdenliveSettings::mltthreads());
renderProps->set("terminate_on_pause", 0);// was commented out. restoring it fixes mantis#3415 - FFmpeg recording freezes
// without this line a call to mlt_properties_get_int(terminate on pause) for in mlt/src/modules/core/consumer_multi.c is returning 1
// and going into and endless loop.
renderProps->set("mlt_profile", m_activeProfile.toUtf8().constData());
QStringList paramList = params.split(' ', QString::SkipEmptyParts);
for (int i = 0; i < paramList.count(); ++i) {
tmp = qstrdup(paramList.at(i).section('=', 0, 0).toUtf8().constData());
......
......@@ -15,11 +15,16 @@
* *
***************************************************************************/
/**
/*!
* @class MltDeviceCapture
* @brief Interface for MLT capture.
* Capturing started by MltDeviceCapture::slotStartCapture ()
*
* Capturing is stopped by RecMonitor::slotStopCapture()
*/
#ifndef MLTDEVICECAPTURE_H
#define MLTDEVICECAPTURE_H
......@@ -71,6 +76,7 @@ Q_OBJECT public:
/** @brief Starts the MLT Video4Linux process.
* @param surface The widget onto which the frame should be painted
* Called by RecMonitor::slotRecord ()
*/
bool slotStartCapture(const QString &params, const QString &path, const QString &playlist, bool livePreview, bool xmlPlaylist = true);
bool slotStartPreview(const QString &producer, bool xmlFormat = false);
......
......@@ -86,6 +86,7 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(const QMap<QString, QString>& map
m_configEnv.rendererpathurl->lineEdit()->setObjectName("kcfg_rendererpath");
m_configEnv.ffmpegurl->lineEdit()->setObjectName("kcfg_ffmpegpath");
m_configEnv.ffplayurl->lineEdit()->setObjectName("kcfg_ffplaypath");
m_configEnv.kcfg_mltthreads->setMaximum( QThread::idealThreadCount() < 4 ? QThread::idealThreadCount() : 3 );
m_configEnv.tmppathurl->setMode(KFile::Directory);
m_configEnv.tmppathurl->lineEdit()->setObjectName("kcfg_currenttmpfolder");
m_configEnv.projecturl->setMode(KFile::Directory);
......
......@@ -1029,7 +1029,7 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const
if (!renderArgs.contains("threads=")) {
renderArgs.append(QString(" threads=%1").arg(KdenliveSettings::encodethreads()));
}
renderArgs.append(QString(" real_time=-1"));
renderArgs.append(QString(" real_time=-%1").arg(KdenliveSettings::mltthreads()));
// Check if the rendering profile is different from project profile,
// in which case we need to use the producer_comsumer from MLT
......
......@@ -35,6 +35,13 @@ class DocumentChecker: public QObject
public:
explicit DocumentChecker(const QDomNodeList &infoproducers, const QDomDocument &doc);
~DocumentChecker();
/**
* @brief checks for problems with the clips in the project
* Checks for missing proxies, wrong duration clips, missing fonts, missing images, missing source clips
* Calls DocumentChecker::checkMissingImagesAndFonts () /n
* Called by KdenliveDoc::checkDocumentClips () /n
* @return
*/
bool hasErrorInClips();
private slots:
......
......@@ -16,10 +16,11 @@
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
/*! \class KdenliveDoc
\brief Represents a kdenlive project file
Instances of KdeliveDoc classes are created by void MainWindow::newFile(bool showProjectSettings, bool force)
\brief Represents a kdenlive project file
Instances of KdeliveDoc classes are created by void MainWindow::newFile(bool showProjectSettings, bool force)
*/
#ifndef KDENLIVEDOC_H
#define KDENLIVEDOC_H
......@@ -199,6 +200,12 @@ private:
void setNewClipResource(const QString &id, const QString &path);
QString searchFileRecursively(const QDir &dir, const QString &matchSize, const QString &matchHash) const;
void moveProjectData(const QUrl &url);
/**
* @brief check for issues with the clips in the project
* Instansiates DocumentChecker objects to do this task.
* @param infoproducers
* @return
*/
bool checkDocumentClips(QDomNodeList infoproducers);
/** @brief Creates a new project. */
......@@ -217,6 +224,13 @@ public slots:
void slotCreateXmlClip(const QString &name, const QDomElement &xml, const QString &group, const QString &groupId);
void slotCreateColorClip(const QString &name, const QString &color, const QString &duration, const QString &group, const QString &groupId);
void slotCreateSlideshowClipFile(const QMap<QString, QString> &properties, const QString &group, const QString &groupId);
/**
* @brief Create a title clip.
* Instansiates TitleWidget objects
* @param group
* @param groupId
* @param templatePath
*/
void slotCreateTextClip(QString group, const QString &groupId, const QString &templatePath = QString());
void slotCreateTextTemplateClip(const QString &group, const QString &groupId, QUrl path);
......@@ -230,7 +244,7 @@ public slots:
private slots:
/** @brief Saves the current project at the autosave location.
* @description The autosave files are in ~/.kde/data/stalefiles/kdenlive/ */
* @description The autosave files are in ~/.kde/data/stalefiles/kdenlive/ */
void slotAutoSave();
signals:
......
......@@ -272,6 +272,11 @@
<label>FFplay / avplay binary path.</label>
<default></default>
</entry>
<entry name="mltthreads" type="Int">
<label>Mlt processing thread count.</label>
<default>1</default>
</entry>
<entry name="proxythreads" type="Int">
<label>Proxy creation processing thread count.</label>
......
......@@ -643,6 +643,8 @@ void MainWindow::slotConnectMonitors()
connect(m_projectMonitor->render, SIGNAL(replyGetImage(QString,QImage)), m_projectList, SLOT(slotReplyGetImage(QString,QImage)));
connect(m_projectMonitor->render, SIGNAL(replyGetFileProperties(QString,Mlt::Producer*,stringMap,stringMap,bool)), m_projectList, SLOT(slotReplyGetFileProperties(QString,Mlt::Producer*,stringMap,stringMap,bool)), Qt::DirectConnection);
//DirectConnection was necessary not to mess the analyze queue, but the monitor thread shouldn't show any UI widget (profile dialog), so adding an AutoConnection in between?
connect(m_projectList, SIGNAL(firstClip(ProjectItem*)), m_projectList, SLOT(adjustProjectProfileToItem(ProjectItem*)));
connect(m_projectMonitor->render, SIGNAL(removeInvalidClip(QString,bool)), m_projectList, SLOT(slotRemoveInvalidClip(QString,bool)));
......@@ -1145,6 +1147,7 @@ void MainWindow::setupActions()
connect(proxyClip, SIGNAL(toggled(bool)), m_projectList, SLOT(slotProxyCurrentItem(bool)));
addAction("stopmotion", i18n("Stop Motion Capture"), this, SLOT(slotOpenStopmotion()), QIcon::fromTheme("image-x-generic"));
addAction("ripple_delete", i18n("Ripple Delete"), this, SLOT(slotRippleDelete()), QIcon(), Qt::CTRL + Qt::Key_X);
addClips->addAction(reloadClip);
addClips->addAction(proxyClip);
......@@ -1921,6 +1924,45 @@ void MainWindow::slotRemoveSpace()
pCore->projectManager()->currentTrackView()->projectView()->slotRemoveSpace();
}
void MainWindow::slotRippleDelete()
{
if (!m_projectMonitor->isActive() || !pCore->projectManager()->currentTrackView()) return;
int zoneStart = m_projectMonitor->getZoneStart();
int zoneEnd = m_projectMonitor->getZoneEnd();
if (!zoneStart && zoneEnd == (pCore->projectManager()->currentTrackView()->duration() - 1)) return;
int zoneFrameCount = zoneEnd - zoneStart;
m_projectMonitor->slotZoneStart();
pCore->projectManager()->currentTrackView()->projectView()->setCursorPos(zoneStart);
pCore->projectManager()->currentTrackView()->projectView()->slotSelectAllClips();
pCore->projectManager()->currentTrackView()->projectView()->cutSelectedClips();
pCore->projectManager()->currentTrackView()->projectView()->resetSelectionGroup(false);
m_projectMonitor->slotZoneEnd();
pCore->projectManager()->currentTrackView()->projectView()->setCursorPos(zoneEnd);
zoneEnd++;
pCore->projectManager()->currentTrackView()->projectView()->selectItemsRightOfFrame(zoneEnd);
pCore->projectManager()->currentTrackView()->projectView()->setInPoint();
pCore->projectManager()->currentTrackView()->projectView()->resetSelectionGroup(false);
zoneEnd++;
pCore->projectManager()->currentTrackView()->projectView()->selectItemsRightOfFrame(zoneEnd);
pCore->projectManager()->currentTrackView()->projectView()->spaceToolMoveToSnapPos((double) zoneEnd);
pCore->projectManager()->currentTrackView()->projectView()->spaceToolMoveToSnapPos((double) zoneStart);
GenTime timeOffset = GenTime(zoneFrameCount * -1, pCore->projectManager()->current()->fps());
pCore->projectManager()->currentTrackView()->projectView()->completeSpaceOperation(-1, timeOffset);
m_projectMonitor->slotZoneStart();
pCore->projectManager()->currentTrackView()->projectView()->setCursorPos(zoneStart);
pCore->projectManager()->currentTrackView()->projectView()->resetSelectionGroup(false);
return;
}
void MainWindow::slotInsertTrack(int ix)
{
pCore->monitorManager()->activateMonitor(Kdenlive::ProjectMonitor);
......
......@@ -286,6 +286,8 @@ private slots:
void slotSwitchSnap();
void slotRenderProject();
void slotFullScreen();
/** @brief if modified is true adds "modified" to the caption and enables the save button.
* (triggered by KdenliveDoc::setModified()) */
void slotUpdateDocumentState(bool modified);
/** @brief Sets the timeline zoom slider to @param value.
......@@ -446,6 +448,9 @@ private slots:
/** @brief Move playhead to mouse curser position if defined key is pressed */
void slotAlignPlayheadToMousePos();
// Ripple Edit
void slotRippleDelete();
signals:
Q_SCRIPTABLE void abortRenderJob(const QString &url);
void configurationChanged();
......
......@@ -678,6 +678,16 @@ void Monitor::slotEnd()
render->seekToFrame(render->getLength());
}
int Monitor::getZoneStart()
{
return m_ruler->zone().x();
}
int Monitor::getZoneEnd()
{
return m_ruler->zone().y();
}
void Monitor::slotZoneStart()
{
slotActivateMonitor();
......
......@@ -98,6 +98,9 @@ public:
/** @brief Get url for the clip's thumbnail */
QString getMarkerThumb(GenTime pos);
int getZoneStart();
int getZoneEnd();
protected:
void mousePressEvent(QMouseEvent * event);
void mouseReleaseEvent(QMouseEvent * event);
......
......@@ -581,6 +581,11 @@ void RecMonitor::slotStartPreview(bool play)
void RecMonitor::slotRecord()
{
m_error.clear();
video_frame->setText(i18n(""));// clear error text from previous run if any.
// ^^ This does clear the error text but the change is not visible straight way in the UI
// it only becomes visible after the capture is complete. Vincent and JBM - how come? What can
// we do to make the error text go way as soon as a new capture starts. It is missleading to the user
// to have the error still display while we are happily capturing.
if (m_captureProcess->state() == QProcess::NotRunning && device_selector->currentIndex() == Firewire) {
slotStartPreview();
}
......@@ -636,7 +641,7 @@ void RecMonitor::slotRecord()
if (capturename.isEmpty()) capturename = "capture";
switch (device_selector->currentIndex()) {
case Video4Linux:
case Video4Linux: //ffmpeg capture
if (rec_video->isChecked()) slotActivateMonitor();
path = QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/profiles/video4linux";
profile = ProfilesDialog::getVideoProfile(path);
......@@ -686,19 +691,19 @@ void RecMonitor::slotRecord()
m_recAction->setEnabled(false);
m_stopAction->setEnabled(true);
m_previewSettings->setEnabled(false);
control_frame->setEnabled(false);
control_frame->setEnabled(false);
}
else {
video_frame->setText(i18n("Failed to start Video4Linux,\ncheck your parameters..."));
video_frame->setText(i18n("Failed to start ffmpeg capture,\ncheck your parameters..."));
videoBox->setHidden(true);
m_recAction->blockSignals(true);
m_recAction->setChecked(false);
m_recAction->blockSignals(false);
m_recAction->blockSignals(true);
m_recAction->setChecked(false);
m_recAction->blockSignals(false);
m_isCapturing = false;
}
break;
case BlackMagic:
case BlackMagic:// BlackMagic capture
slotActivateMonitor();
path = KdenliveSettings::current_profile();
profile = ProfilesDialog::getVideoProfile(path);
......@@ -722,7 +727,7 @@ void RecMonitor::slotRecord()
}
break;
case ScreenBag:
case ScreenBag:// screen grab capture
m_captureArgs << "-f" << "x11grab";
if (KdenliveSettings::grab_follow_mouse()) m_captureArgs << "-follow_mouse" << "centered";
if (!KdenliveSettings::grab_hide_frame()) m_captureArgs << "-show_region" << "1";
......
......@@ -17,10 +17,12 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
/**
/*!
* @class RecMonitor
* @brief Records video via dvgrab, video4linux and recordmydesktop
* @brief Records video via dvgrab (firewire), ffmpeg=video4linux and screen capture also via ffmpeg
* @author Jean-Baptiste Mardelle
* Recording is started by RecMonitor::slotRecord ()
* Recording stoped in RecMonitor::slotStopCapture ()
*/
#ifndef RECMONITOR_H
......@@ -120,6 +122,12 @@ private:
private slots:
void slotStartPreview(bool play = true);
/**
* @brief Starts recording from the Record Monitor tab.
* 4 different recording modes
* Firewire, ScreenBag (=Screen Grab), Video4Linux (=Ffmepg) and BlackMagic. \n
* calls MltDeviceCapture::slotStartCapture ()
*/
void slotRecord();
void slotProcessStatus(QProcess::ProcessState status);
void slotVideoDeviceChanged(int ix);
......@@ -141,6 +149,9 @@ public slots:
void slotPlay();
void stop();
void start();
/**
* @brief Stops the RecMonitor capturing
*/
void slotStopCapture();
void slotUpdateCaptureFolder(const QString &currentProjectFolder);
void slotUpdateFullScreenGrab();
......
......@@ -56,6 +56,8 @@ MeltJob::MeltJob(ClipType cType, const QString &id, const QStringList &parameter
void MeltJob::setProducer(Mlt::Producer *producer, const QUrl &url)
{
Q_UNUSED(producer)
//FIX stabilize in proxy clips?
//m_url = QString::fromUtf8(producer->get("resource"));
//if (m_url == QLatin1String("<playlist>") || m_url == QLatin1String("<tractor>") || m_url == QLatin1String("<producer>"))
......@@ -143,7 +145,7 @@ void MeltJob::startJob()
//m_consumer->set("terminate_on_pause", 1 );
//m_consumer->set("eof", "pause" );
m_consumer->set("real_time", -1 );
m_consumer->set("real_time", -KdenliveSettings::mltthreads() );
list = consumerParams.split(QLatin1Char(' '), QString::SkipEmptyParts);
......
......@@ -64,7 +64,7 @@ void ProxyJob::startJob()
mltParameters << t;
}
mltParameters.append(QString::fromLatin1("real_time=-1"));
mltParameters.append(QString::fromLatin1("real_time=-%1").arg(KdenliveSettings::mltthreads()));
//TODO: currently, when rendering an xml file through melt, the display ration is lost, so we enforce it manualy
double display_ratio;
......
......@@ -2297,14 +2297,7 @@ void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Produce
static_cast <FolderProjectItem *>(item->parent())->switchIcon();
} else if (KdenliveSettings::checkfirstprojectclip() && m_listView->topLevelItemCount() == 1 && m_refreshed && m_allClipsProcessed) {
// this is the first clip loaded in project, check if we want to adjust project settings to the clip
//TODO: KF5 fix threading issue causing crash
/*updatedProfile = adjustProjectProfileToItem(item);
if (updatedProfile == false) {
emit clipSelected(item->referencedClip());
}*/
}
if (updatedProfile == false) {
// emit clipSelected(item->referencedClip());
emit firstClip(item);
}
} else {
int max = m_doc->clipManager()->clipsCount();
......
......@@ -381,6 +381,7 @@ private slots:
signals:
void clipSelected(DocClipBase *, const QPoint &zone = QPoint(), bool forceUpdate = false);
void receivedClipDuration(const QString &);
void firstClip(ProjectItem *);
void projectModified();
void loadingIsOver();
void displayMessage(const QString&, int progress, MessageType type = DefaultMessage);
......
......@@ -196,8 +196,8 @@ void Render::buildConsumer(const QString &profileName)
m_mltConsumer->set("terminate_on_pause", 0);
m_mltConsumer->set("deinterlace_method", KdenliveSettings::mltdeinterlacer().toUtf8().constData());
m_mltConsumer->set("rescale", KdenliveSettings::mltinterpolation().toUtf8().constData());
m_mltConsumer->set("buffer", "5");
m_mltConsumer->set("real_time", 1);
m_mltConsumer->set("buffer", "1");
m_mltConsumer->set("real_time", KdenliveSettings::mltthreads());
}
if (m_mltConsumer && m_mltConsumer->is_valid()) {
return;
......@@ -277,7 +277,7 @@ void Render::buildConsumer(const QString &profileName)
m_mltConsumer->set("audio_driver", audioDriver.toUtf8().constData());
m_mltConsumer->set("frequency", 48000);
m_mltConsumer->set("real_time", 1);
m_mltConsumer->set("real_time", KdenliveSettings::mltthreads());
}
Mlt::Producer *Render::invalidProducer(const QString &id)
......@@ -1647,7 +1647,7 @@ void Render::setDropFrames(bool show)
{
QMutexLocker locker(&m_mutex);
if (m_mltConsumer) {
int dropFrames = 1;
int dropFrames = KdenliveSettings::mltthreads();
if (show == false) dropFrames = -dropFrames;
m_mltConsumer->stop();
m_mltConsumer->set("real_time", dropFrames);
......
This diff is collapsed.
......@@ -211,6 +211,16 @@ public:
/** @brief Get effect parameters ready for MLT*/
static void adjustEffectParameters(EffectsParameterList &parameters, QDomNodeList params, MltVideoProfile profile, const QString &prefix = QString());
void completeSpaceOperation(int track, GenTime &timeOffset);
void spaceToolMoveToSnapPos(double snappedPos);
void createRectangleSelection(QMouseEvent * event);
void spaceToolSelect(QMouseEvent * event);
int spaceToolSelectTrackOnly(int track, QList<QGraphicsItem *> &selection);
QList<QGraphicsItem *> selectAllItemsToTheRight(int x);
void createGroupForSelectedItems(QList<QGraphicsItem *> &selection);
void selectItemsRightOfFrame(int frame);
void resetSelectionGroup(bool selectItems = true);
public slots:
/** @brief Send seek request to MLT. */
void seekCursorPos(int pos);
......@@ -405,7 +415,6 @@ private:
bool canBeMoved(QList<AbstractClipItem *> items, GenTime offset, int trackOffset) const;
ClipItem *getClipUnderCursor() const;
AbstractClipItem *getMainActiveClip() const;
void resetSelectionGroup(bool selectItems = true);
void groupSelectedItems(QList <QGraphicsItem *> selection = QList <QGraphicsItem *>(), bool createNewGroup = false, bool selectNewGroup = false);
/** Get available space for clip move (min and max free positions) */
void getClipAvailableSpace(AbstractClipItem *item, GenTime &minimum, GenTime &maximum);
......
......@@ -50,7 +50,10 @@ public:
double rotatex, rotatey, rotatez;
};
/*! \class KdenliveDoc
\brief Represents a kdenlive project file
Instances of TitleWidget classes are instansiated by KdenliveDoc::slotCreateTextClip ()
*/
class TitleWidget : public QDialog , public Ui::TitleWidget_UI
{
Q_OBJECT
......@@ -73,9 +76,10 @@ public:
* @return list of the image files */
static QStringList extractImageList(const QString &xml);
/** @brief Checks for the fonts referenced by a title clip.
/** @brief Checks for the fonts referenced by a title clip.\n
* Called by DocumentChecker::hasErrorInClips () \n
* @param xml XML data representing the title
* @return list of the fonts */
* @return list of the fonts in the title */
static QStringList extractFontList(const QString &xml);
/** @brief Returns clip duration. */
......
......@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>367</width>
<height>253</height>
<height>318</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
......@@ -34,7 +34,7 @@
<string>MLT environment</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_3">
<item row="4" column="1">
<item row="5" column="1">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
......@@ -47,7 +47,7 @@
</property>
</spacer>
</item>
<item row="3" column="1" colspan="2">
<item row="3" column="1" colspan="3">
<widget class="KUrlRequester" name="rendererpathurl"/>
</item>
<item row="3" column="0">
......@@ -57,6 +57,33 @@
</property>
</widget>
</item>
<item row="4" column="3">
<widget class="QLabel" name="label_7">
<property name="text">
<string>(&gt;1 is experimental)</string>
</property>
</widget>
</item>
<item row="4" column="1" colspan="2">
<widget class="QSpinBox" name="kcfg_mltthreads">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimum">
<number>1</number>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Processing threads</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
......@@ -71,10 +98,10 @@
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<item row="2" column="1" colspan="3">
<widget class="KUrlRequester" name="mltpathurl"/>
</item>
<item row="0" column="1" colspan="2">
<item row="0" column="1" colspan="3">
<widget class="KUrlRequester" name="ffmpegurl"/>
</item>
<item row="1" column="0">
......@@ -84,7 +111,7 @@
</property>
</widget>
</item>
<item row="1" column="1" colspan="2">
<item row="1" column="1" colspan="3">
<widget class="KUrlRequester" name="ffplayurl"/>
</item>
</layout>
......@@ -231,6 +258,19 @@
</widget>
</widget>
</item>
<item row="3" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox">
<property name="title">
......@@ -263,16 +303,6 @@