Git commit adbdc888eb39b0bb6b65856c8d2bda280fb89a12 by Jean-Baptiste Mardel= le. Committed on 04/02/2017 at 15:39. Pushed by mardelle into branch 'master'. Merge branch '16.12' M +1 -1 src/bin/projectclip.cpp M +16 -0 src/dialogs/clipcreationdialog.cpp M +15 -0 src/dialogs/kdenlivesettingsdialog.cpp M +3 -4 src/doc/kthumb.cpp M +1 -1 src/doc/kthumb.h M +3 -1 src/effectslist/initeffects.cpp M +8 -4 src/effectstack/graphicsscenerectmove.cpp M +2 -1 src/effectstack/graphicsscenerectmove.h M +4 -0 src/kdenlivesettings.kcfg M +6 -5 src/mltcontroller/producerqueue.cpp M +1 -1 src/monitor/monitor.cpp M +0 -1 src/timeline/transitionhandler.cpp https://commits.kde.org/kdenlive/adbdc888eb39b0bb6b65856c8d2bda280fb89a12 diff --cc src/bin/projectclip.cpp index 29be9b029,dd5d1003e..c9d3a7c4a --- a/src/bin/projectclip.cpp +++ b/src/bin/projectclip.cpp @@@ -961,12 -916,12 +961,12 @@@ void ProjectClip::doExtractImage( emit thumbReady(pos, img); continue; } - prod->seek(pos); - Mlt::Frame *frame =3D prod->get_frame(); + prod->seek(pos); + Mlt::Frame *frame =3D prod->get_frame(); frame->set("deinterlace_method", "onefield"); - frame->set("top_field_first", -1 ); - if (frame && frame->is_valid()) { + frame->set("top_field_first", -1); + if (frame && frame->is_valid()) { - img =3D KThumb::getFrame(frame, frameWidth, 150); + img =3D KThumb::getFrame(frame, frameWidth, 150, prod->profil= e()->sar() !=3D 1); bin()->cachePixmap(path, img); emit thumbReady(pos, img); } diff --cc src/dialogs/kdenlivesettingsdialog.cpp index 517e047ba,91bcee8d6..d8706a5b0 --- a/src/dialogs/kdenlivesettingsdialog.cpp +++ b/src/dialogs/kdenlivesettingsdialog.cpp @@@ -113,8 -115,13 +114,13 @@@ KdenliveSettingsDialog::KdenliveSetting m_configEnv.libraryfolderurl->lineEdit()->setObjectName(QStringLitera= l("kcfg_libraryfolder")); m_configEnv.libraryfolderurl->setEnabled(!KdenliveSettings::libraryto= defaultfolder()); m_configEnv.kcfg_librarytodefaultfolder->setToolTip(QStandardPaths::w= ritableLocation(QStandardPaths::AppDataLocation) + QStringLiteral("/library= ")); - connect(m_configEnv.kcfg_librarytodefaultfolder, SIGNAL(clicked()), t= his, SLOT(slotEnableLibraryFolder())); + connect(m_configEnv.kcfg_librarytodefaultfolder, &QAbstractButton::cl= icked, this, &KdenliveSettingsDialog::slotEnableLibraryFolder); = + // Mime types + QStringList mimes =3D ClipCreationDialog::getExtensions(); + qSort(mimes); + m_configEnv.supportedmimes->setPlainText(mimes.join(QStringLiteral(" = "))); + = m_page2 =3D addPage(p2, i18n("Environment")); m_page2->setIcon(KoIconUtils::themedIcon(QStringLiteral("application-= x-executable-script"))); = @@@ -868,22 -863,28 +874,31 @@@ void KdenliveSettingsDialog::updateSett = bool restart =3D false; if (m_configSdl.kcfg_gpu_accel->isChecked() !=3D KdenliveSettings::gp= u_accel()) { - // GPU setting was changed, we need to restart Kdenlive or everything wi= ll be corrupted - if (KMessageBox::warningContinueCancel(this, i18n("Kdenlive must be rest= arted to change this setting")) =3D=3D KMessageBox::Continue) { - restart =3D true; - } - else { - m_configSdl.kcfg_gpu_accel->setChecked(KdenliveSettings::gpu_accel()= ); - } + // GPU setting was changed, we need to restart Kdenlive or everyt= hing will be corrupted + if (KMessageBox::warningContinueCancel(this, i18n("Kdenlive must = be restarted to change this setting")) =3D=3D KMessageBox::Continue) { + restart =3D true; + } else { + m_configSdl.kcfg_gpu_accel->setChecked(KdenliveSettings::gpu_= accel()); + } } = + // Mimes + if (m_configEnv.kcfg_addedExtensions->text() !=3D KdenliveSettings::a= ddedExtensions()) { + // Update list + KdenliveSettings::setAddedExtensions(m_configEnv.kcfg_addedExtens= ions->text()); + QStringList mimes =3D ClipCreationDialog::getExtensions(); + qSort(mimes); + m_configEnv.supportedmimes->setPlainText(mimes.join(QStringLitera= l(" "))); + } + = KConfigDialog::settingsChangedSlot(); //KConfigDialog::updateSettings(); - if (resetProfile) emit doResetProfile(); - if (restart) emit restartKdenlive(); + if (resetProfile) { + emit doResetProfile(); + } + if (restart) { + emit restartKdenlive(); + } emit checkTabPosition(); } = diff --cc src/doc/kthumb.cpp index ce9c91644,eb633e258..4d6d178ae --- a/src/doc/kthumb.cpp +++ b/src/doc/kthumb.cpp @@@ -84,20 -80,20 +84,19 @@@ QImage KThumb::getFrame(Mlt::Producer * return p; } = - //static - QImage KThumb::getFrame(Mlt::Frame *frame, int width, int height) + QImage KThumb::getFrame(Mlt::Frame *frame, int width, int height, bool fo= rceRescale) { - if (frame =3D=3D NULL || !frame->is_valid()) { + if (frame =3D=3D nullptr || !frame->is_valid()) { QImage p(width, height, QImage::Format_ARGB32_Premultiplied); p.fill(QColor(Qt::red).rgb()); return p; } - int ow =3D width; - int oh =3D height; + int ow =3D forceRescale ? 0 : width; + int oh =3D forceRescale ? 0 : height; mlt_image_format format =3D mlt_image_rgb24a; - //frame->set("progressive", "1"); ow +=3D ow % 2; - const uchar* imagedata =3D frame->get_image(format, ow, oh); + const uchar *imagedata =3D frame->get_image(format, ow, oh); if (imagedata) { QImage image(ow, oh, QImage::Format_RGBA8888); memcpy(image.bits(), imagedata, ow * oh * 4); diff --cc src/doc/kthumb.h index a610df6ed,a36e8f647..4c495bc47 --- a/src/doc/kthumb.h +++ b/src/doc/kthumb.h @@@ -35,14 -36,14 +35,14 @@@ class Frame = namespace KThumb { - QPixmap getImage(const QUrl &url, int width, int height =3D -1); - QPixmap getImage(const QUrl &url, int frame, int width, int height = =3D -1); - QImage getFrame(Mlt::Producer *producer, int framepos, int displayWid= th, int height); - QImage getFrame(Mlt::Frame *frame, int width, int height, bool forceR= escale =3D false); - /** @brief Calculates image variance, useful to know if a thumbnail i= s interesting. = - * @return an integer between 0 and 100. 0 means no variance, eg. bl= ack image while bigger values mean contrasted image - * */ - uint imageVariance(const QImage &image); +QPixmap getImage(const QUrl &url, int width, int height =3D -1); +QPixmap getImage(const QUrl &url, int frame, int width, int height =3D -1= ); +QImage getFrame(Mlt::Producer *producer, int framepos, int displayWidth, = int height); - QImage getFrame(Mlt::Frame *frame, int width, int height); ++QImage getFrame(Mlt::Frame *frame, int width, int height, bool forceResca= le =3D false); +/** @brief Calculates image variance, useful to know if a thumbnail is in= teresting. + * @return an integer between 0 and 100. 0 means no variance, eg. black = image while bigger values mean contrasted image + * */ +uint imageVariance(const QImage &image); }; = #endif diff --cc src/effectslist/initeffects.cpp index 6f3f52ebf,61110036b..c0efabd78 --- a/src/effectslist/initeffects.cpp +++ b/src/effectslist/initeffects.cpp @@@ -785,12 -756,14 +785,14 @@@ void initEffects::fillTransitionsList(M tname.appendChild(ret.createTextNode(i18n("Composite"))); desc.appendChild(ret.createTextNode(i18n("A key-framable = alpha-channel compositor for two frames."))); paramList.append(quickParameterFill(ret, i18n("Geometry")= , QStringLiteral("geometry"), QStringLiteral("geometry"), QStringLiteral("0= %/0%:100%x100%:100"), QStringLiteral("-500;-500;-500;-500;0"), QStringLiter= al("500;500;500;500;100"))); - paramList.append(quickParameterFill(ret, i18n("Alpha Chan= nel Operation"), QStringLiteral("operator"), QStringLiteral("list"), QStrin= gLiteral("over"), QLatin1String(""), QLatin1String(""), QStringLiteral("ove= r,and,or,xor"), i18n("Over,And,Or,Xor"))); + paramList.append(quickParameterFill(ret, i18n("Alpha Chan= nel Operation"), QStringLiteral("operator"), QStringLiteral("list"), QStrin= gLiteral("over"), QString(), QString(), QStringLiteral("over,and,or,xor"), = i18n("Over,And,Or,Xor"))); - paramList.append(quickParameterFill(ret, i18n("Align"), Q= StringLiteral("aligned"), QStringLiteral("bool"), QStringLiteral("0"), QStr= ingLiteral("0"), QStringLiteral("1"))); + paramList.append(quickParameterFill(ret, i18n("Align"), Q= StringLiteral("aligned"), QStringLiteral("bool"), QStringLiteral("1"), QStr= ingLiteral("0"), QStringLiteral("1"))); + paramList.append(quickParameterFill(ret, i18n("Align"), Q= StringLiteral("valign"), QStringLiteral("fixed"), QStringLiteral("middle"),= QStringLiteral("middle"), QStringLiteral("middle"))); + paramList.append(quickParameterFill(ret, i18n("Align"), Q= StringLiteral("halign"), QStringLiteral("fixed"), QStringLiteral("centre"),= QStringLiteral("centre"), QStringLiteral("centre"))); paramList.append(quickParameterFill(ret, i18n("Fill"), QS= tringLiteral("fill"), QStringLiteral("bool"), QStringLiteral("1"), QStringL= iteral("0"), QStringLiteral("1"))); paramList.append(quickParameterFill(ret, i18n("Distort"),= QStringLiteral("distort"), QStringLiteral("bool"), QStringLiteral("0"), QS= tringLiteral("0"), QStringLiteral("1"))); - paramList.append(quickParameterFill(ret, i18n("Wipe Metho= d"), QStringLiteral("luma"), QStringLiteral("list"), QLatin1String(""), QLa= tin1String(""), QLatin1String(""), QStringLiteral("%lumaPaths"), QLatin1Str= ing(""))); - paramList.append(quickParameterFill(ret, i18n("Wipe Softn= ess"), QStringLiteral("softness"), QStringLiteral("double"), QStringLiteral= ("0"), QStringLiteral("0"), QStringLiteral("100"), QLatin1String(""), QLati= n1String(""), QStringLiteral("100"))); + paramList.append(quickParameterFill(ret, i18n("Wipe Metho= d"), QStringLiteral("luma"), QStringLiteral("list"), QString(), QString(), = QString(), QStringLiteral("%lumaPaths"), QString())); + paramList.append(quickParameterFill(ret, i18n("Wipe Softn= ess"), QStringLiteral("softness"), QStringLiteral("double"), QStringLiteral= ("0"), QStringLiteral("0"), QStringLiteral("100"), QString(), QString(), QS= tringLiteral("100"))); paramList.append(quickParameterFill(ret, i18n("Wipe Inver= t"), QStringLiteral("luma_invert"), QStringLiteral("bool"), QStringLiteral(= "0"), QStringLiteral("0"), QStringLiteral("1"))); paramList.append(quickParameterFill(ret, i18n("Force Prog= ressive Rendering"), QStringLiteral("progressive"), QStringLiteral("bool"),= QStringLiteral("1"), QStringLiteral("0"), QStringLiteral("1"))); paramList.append(quickParameterFill(ret, i18n("Force Dein= terlace Overlay"), QStringLiteral("deinterlace"), QStringLiteral("bool"), Q= StringLiteral("0"), QStringLiteral("0"), QStringLiteral("1"))); diff --cc src/effectstack/graphicsscenerectmove.cpp index 4f84c7120,014cdfdcd..a3f5dc056 --- a/src/effectstack/graphicsscenerectmove.cpp +++ b/src/effectstack/graphicsscenerectmove.cpp @@@ -695,12 -670,15 +694,15 @@@ void GraphicsSceneRectMove::mousePressE break; } } - if (item =3D=3D NULL || (e->modifiers() !=3D Qt::ShiftModifier &&= !alreadySelected)) { + if (item =3D=3D nullptr || (e->modifiers() !=3D Qt::ShiftModifier= && !alreadySelected)) { clearTextSelection(); - } else if (item && item->flags() & QGraphicsItem::ItemIsMovable) { + } else if (e->modifiers() & Qt::ShiftModifier) { + clearTextSelection(false); + } + if (item && item->flags() & QGraphicsItem::ItemIsMovable) { m_sceneClickPoint =3D e->scenePos(); m_selectedItem =3D item; - //qDebug() << "///////// ITEM TYPE: " << item->type(); + //qCDebug(KDENLIVE_LOG) << "///////// ITEM TYPE: " << item->= type(); if (item->type() =3D=3D QGraphicsTextItem::Type) { MyTextItem *t =3D static_cast(item); if (t->textInteractionFlags() =3D=3D Qt::TextEditorIntera= ction) { @@@ -765,10 -742,10 +767,10 @@@ m_selectedItem->setSelected(true); m_createdText =3D true; } - //qDebug() << "////// MOUSE CLICK, RESIZE MODE: " << m_resizeMode; + //qCDebug(KDENLIVE_LOG) << "////// MOUSE CLICK, RESIZE MODE: " << m_= resizeMode; } = - void GraphicsSceneRectMove::clearTextSelection() + void GraphicsSceneRectMove::clearTextSelection(bool reset) { if (m_selectedItem && m_selectedItem->type() =3D=3D QGraphicsTextItem= ::Type) { // disable text editing @@@ -778,11 -755,13 +780,14 @@@ t->setTextCursor(QTextCursor(cur)); t->setTextInteractionFlags(Qt::NoTextInteraction); } - m_selectedItem =3D NULL; + m_selectedItem =3D nullptr; + clearSelection(); + if (reset) { + clearSelection(); + } } = -void GraphicsSceneRectMove::mouseMoveEvent(QGraphicsSceneMouseEvent* e) +void GraphicsSceneRectMove::mouseMoveEvent(QGraphicsSceneMouseEvent *e) { QList viewlist =3D views(); if (viewlist.isEmpty()) { diff --cc src/mltcontroller/producerqueue.cpp index 7a949a890,95be8c306..6d136a467 --- a/src/mltcontroller/producerqueue.cpp +++ b/src/mltcontroller/producerqueue.cpp @@@ -485,12 -481,10 +486,12 @@@ void ProducerQueue::processFileProperti } delete glProd; } else { - if (frameNumber > 0) producer->seek(frameNumber); + if (frameNumber > 0) { + producer->seek(frameNumber); + } frame =3D producer->get_frame(); if (frame && frame->is_valid()) { - img =3D KThumb::getFrame(frame, fullWidth, info.i= mageHeight); + img =3D KThumb::getFrame(frame, fullWidth, info.i= mageHeight, forceThumbScale); emit replyGetImage(info.clipId, img); } } @@@ -683,10 -660,11 +684,10 @@@ img =3D KThumb::getFrame(frame, fullWidth, info.image= Height); delete glProd; } else { - img =3D KThumb::getFrame(frame, fullWidth, info.image= Height); + img =3D KThumb::getFrame(frame, fullWidth, info.image= Height, forceThumbScale); } emit replyGetImage(info.clipId, img); - } - else { + } else { filePropertyMap[QStringLiteral("frame_size")] =3D QString= ::number(frame->get_int("width")) + 'x' + QString::number(frame->get_int("h= eight")); int af =3D frame->get_int("audio_frequency"); int ac =3D frame->get_int("audio_channels"); @@@ -727,20 -694,21 +728,20 @@@ tmpProd->attach(scaler); tmpProd->attach(converter); frame =3D tmpProd->get_frame(); - } - else { + } else { tmpProd =3D producer; } - QImage img =3D KThumb::getFrame(frame, fullWidth, inf= o.imageHeight); + QImage img =3D KThumb::getFrame(frame, fullWidth, inf= o.imageHeight, forceThumbScale); if (frameNumber =3D=3D -1) { // No user specipied frame, look for best one int variance =3D KThumb::imageVariance(img); if (variance < 6) { // Thumbnail is not interesting (for example = all black, seek to fetch better thumb delete frame; - frameNumber =3D duration > 100 ? 100 : durat= ion / 2 ; + frameNumber =3D duration > 100 ? 100 : durat= ion / 2; tmpProd->seek(frameNumber); frame =3D tmpProd->get_frame(); - img =3D KThumb::getFrame(frame, fullWidth, in= fo.imageHeight); + img =3D KThumb::getFrame(frame, fullWidth, in= fo.imageHeight, forceThumbScale); } } if (KdenliveSettings::gpu_accel()) { diff --cc src/monitor/monitor.cpp index 18cd051fd,a1c1ad99f..f7a5c3c3a --- a/src/monitor/monitor.cpp +++ b/src/monitor/monitor.cpp @@@ -531,12 -520,12 +531,12 @@@ void Monitor::slotForceSize(QAction *a if (resizeType > 0) { // calculate size QRect r =3D QApplication::desktop()->screenGeometry(); - profileWidth =3D m_glMonitor->profileSize().width() * resizeType = / 100; profileHeight =3D m_glMonitor->profileSize().height() * resizeTyp= e / 100; + profileWidth =3D m_glMonitor->profile()->dar() * profileHeight; if (profileWidth > r.width() * 0.8 || profileHeight > r.height() = * 0.7) { // reset action to free resize - QList< QAction * > list =3D m_forceSize->actions (); - foreach(QAction *ac, list) { + QList< QAction * > list =3D m_forceSize->actions(); + foreach (QAction *ac, list) { if (ac->data().toInt() =3D=3D m_forceSizeFactor) { m_forceSize->setCurrentAction(ac); break;