Hello community, here is the log from the commit of package kdenlive for openSUSE:Factory checked in at 2016-02-23 16:55:44 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kdenlive (Old) and /work/SRC/openSUSE:Factory/.kdenlive.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kdenlive" Changes: -------- --- /work/SRC/openSUSE:Factory/kdenlive/kdenlive.changes 2016-02-09 13:32:36.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.kdenlive.new/kdenlive.changes 2016-02-23 16:55:48.000000000 +0100 @@ -1,0 +2,9 @@ +Sat Feb 13 08:08:20 UTC 2016 - tittiatc...@gmail.com + +- Update to KDE Applications 15.12.2 + * KDE Applications 15.12.2 + * https://www.kde.org/announcements/announce-applications-15.12.2.php + * boo#966605 + + +------------------------------------------------------------------- Old: ---- kdenlive-15.12.1.tar.xz New: ---- kdenlive-15.12.2.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kdenlive.spec ++++++ --- /var/tmp/diff_new_pack.S2lqZN/_old 2016-02-23 16:55:49.000000000 +0100 +++ /var/tmp/diff_new_pack.S2lqZN/_new 2016-02-23 16:55:49.000000000 +0100 @@ -19,13 +19,13 @@ %define mlt_version 0.9.6 Name: kdenlive -Version: 15.12.1 +Version: 15.12.2 Release: 0 Summary: Non-linear video editor License: GPL-3.0+ Group: Productivity/Multimedia/Video/Editors and Convertors Url: http://www.kdenlive.org/ -Source0: http://download.kde.org/stable/applications/15.12.1/src/%{name}-%{version}.tar.xz +Source0: http://download.kde.org/stable/applications/15.12.2/src/%{name}-%{version}.tar.xz Patch1: use-mlt_datadir.patch BuildRequires: desktop-file-utils BuildRequires: fdupes ++++++ kdenlive-15.12.1.tar.xz -> kdenlive-15.12.2.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdenlive-15.12.1/CMakeLists.txt new/kdenlive-15.12.2/CMakeLists.txt --- old/kdenlive-15.12.1/CMakeLists.txt 2016-01-08 00:09:47.000000000 +0100 +++ new/kdenlive-15.12.2/CMakeLists.txt 2016-02-12 06:18:54.000000000 +0100 @@ -6,7 +6,7 @@ # KDE Application Version, managed by release script set (KDE_APPLICATIONS_VERSION_MAJOR "15") set (KDE_APPLICATIONS_VERSION_MINOR "12") -set (KDE_APPLICATIONS_VERSION_MICRO "1") +set (KDE_APPLICATIONS_VERSION_MICRO "2") set(KDENLIVE_VERSION ${KDE_APPLICATIONS_VERSION_MAJOR}.${KDE_APPLICATIONS_VERSION_MINOR}.${KDE_APPLICATIONS_VERSION_MICRO}) cmake_minimum_required(VERSION 2.8.12) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdenlive-15.12.1/data/kdenlive.appdata.xml new/kdenlive-15.12.2/data/kdenlive.appdata.xml --- old/kdenlive-15.12.1/data/kdenlive.appdata.xml 2016-01-08 00:09:47.000000000 +0100 +++ new/kdenlive-15.12.2/data/kdenlive.appdata.xml 2016-02-12 06:18:54.000000000 +0100 @@ -13,6 +13,7 @@ <name xml:lang="de">Kdenlive</name> <name xml:lang="en-GB">Kdenlive</name> <name xml:lang="es">Kdenlive</name> + <name xml:lang="et">Kdenlive</name> <name xml:lang="fi">Kdenlive</name> <name xml:lang="fr">Kdenlive</name> <name xml:lang="gl">Kdenlive</name> @@ -40,6 +41,7 @@ <summary xml:lang="de">Video-Editor</summary> <summary xml:lang="en-GB">Video Editor</summary> <summary xml:lang="es">Editor de video</summary> + <summary xml:lang="et">Videoredaktor</summary> <summary xml:lang="fi">Videoeditori</summary> <summary xml:lang="fr">Éditeur vidéo</summary> <summary xml:lang="gl">Editor de vídeo</summary> @@ -64,6 +66,7 @@ <p xml:lang="de">Kdenlive ist ein Video-Editor für nichtlinearen Schnitt. Es basiert auf MLT und verarbeitet viele Audio- und Video-Formate. Sie können Effekte und Übergänge benutzen und in Formate Ihrer Wahl umwandeln.</p> <p xml:lang="en-GB">Kdenlive is a non linear video editor. It is based on the MLT framework and accepts many audio and video formats, allows you to add effects, transitions and render into the format of your choice.</p> <p xml:lang="es">Kdenlive es un editor no lineal de video. Está basado en la infraestructura MLT y acepta numerosos formatos de audio y video, permitiendo agregar efectos, transiciones y procesar el video final en el formato deseado.</p> + <p xml:lang="et">Kdenline on mittelineaarne videoredaktor. See tugineb MTL raamistikule ja võimaldab tarvitada paljusid heli- ja videovorminguid, lisada efekte ja üleminekuid ning renderdada tulemuse vajalikku vormingusse.</p> <p xml:lang="fi">Kdenlive on epälineaarinen videoeditori. Se perustuu MLT-frameworkiin ja toimii monen eri ääni- ja videoformaatin kanssa. Voit lisätä efektejä ja siirtymiä, sekä renderöidä projektin haluamaasi tiedostomuotoon.</p> <p xml:lang="fr">Kdenlive est un éditeur vidéo non-linéaire. Il est basé sur le moteur MLT et accèpte de nombreux formats audio et vidéos, permet d'ajouter des effets et transitions, et exporte le rendu dans le format de votre choix.</p> <p xml:lang="gl">Kdenlive é un editor de vídeo non lineal. Está baseado na infraestrutura MLT e permite moitos formatos de son e vídeo, e permite engadir efectos, engadir transicións, e exportar en calquera formato.</p> @@ -91,6 +94,7 @@ <p xml:lang="de">Funktionen:</p> <p xml:lang="en-GB">Features:</p> <p xml:lang="es">Características:</p> + <p xml:lang="et">Omadused:</p> <p xml:lang="fi">Ominaisuuksia:</p> <p xml:lang="fr">Fonctionnalités :</p> <p xml:lang="gl">Funcionalidades:</p> @@ -115,6 +119,7 @@ <li xml:lang="de">Intuitive Mehrspur-Benutzeroberfläche.</li> <li xml:lang="en-GB">Intuitive multitrack interface.</li> <li xml:lang="es">Interfaz multipista intuitiva.</li> + <li xml:lang="et">Hõlpsasti mõistetav mitme paneeliga liides</li> <li xml:lang="fi">Selkeä moniraitainen käyttöliittymä</li> <li xml:lang="fr">Interface multipiste intuitive.</li> <li xml:lang="gl">Interface intuitiva con varias pistas.</li> @@ -139,6 +144,7 @@ <li xml:lang="de">Viele Effekte und Übergänge.</li> <li xml:lang="en-GB">Many effects and transitions.</li> <li xml:lang="es">Muchos efectos y transiciones.</li> + <li xml:lang="et">Palju efekte ja üleminekuid</li> <li xml:lang="fi">Monia erilaisia efektejä ja siirtymiä</li> <li xml:lang="fr">Nombreux effets et transitions.</li> <li xml:lang="gl">Moitos efectos e transicións.</li> @@ -162,6 +168,7 @@ <li xml:lang="de">Farbbereiche</li> <li xml:lang="en-GB">Colour scopes</li> <li xml:lang="es">Indicadores de color</li> + <li xml:lang="et">Värviskoobid</li> <li xml:lang="fi">Väriavaruuksien säätömahdollisuus</li> <li xml:lang="fr">Graphes des couleurs</li> <li xml:lang="gl">Ámbitos de cores.</li> @@ -186,6 +193,7 @@ <li xml:lang="de">Einfacher DVD-Assistent</li> <li xml:lang="en-GB">Basic DVD Wizard</li> <li xml:lang="es">Asistente básico de DVD</li> + <li xml:lang="et">Lihtne DVD nõustaja</li> <li xml:lang="fi">Yksinkertainen DVD:n luonti</li> <li xml:lang="fr">Assistant DVD de base</li> <li xml:lang="gl">Asistente básico para DVD</li> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdenlive-15.12.1/data/kdenlive.xml new/kdenlive-15.12.2/data/kdenlive.xml --- old/kdenlive-15.12.1/data/kdenlive.xml 2016-01-08 00:09:47.000000000 +0100 +++ new/kdenlive-15.12.2/data/kdenlive.xml 2016-02-12 06:18:54.000000000 +0100 @@ -12,6 +12,7 @@ <comment xml:lang="el">Έγγραφο έργου βίντεο Kdenlive</comment> <comment xml:lang="en_GB">Kdenlive video project document</comment> <comment xml:lang="es">Documento de proyecto de video de Kdenlive</comment> + <comment xml:lang="et">Kdenlive videoprojekti dokument</comment> <comment xml:lang="fi">Kdenlive-videoprojektitiedosto</comment> <comment xml:lang="fr">Projet vidéo Kdenlive</comment> <comment xml:lang="gl">Documento dun proxecto de vídeo de Kdenlive</comment> @@ -43,6 +44,7 @@ <comment xml:lang="el">Τίτλος βίντεο Kdenlive</comment> <comment xml:lang="en_GB">Kdenlive video title</comment> <comment xml:lang="es">Título de video de Kdenlive</comment> + <comment xml:lang="et">Kdenlive videotiitel</comment> <comment xml:lang="fi">Kdenlive-video-otsikko</comment> <comment xml:lang="fr">Titre vidéo Kdenlive</comment> <comment xml:lang="gl">Título de vídeo de Kdenlive</comment> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdenlive-15.12.1/data/org.kde.kdenlive.desktop new/kdenlive-15.12.2/data/org.kde.kdenlive.desktop --- old/kdenlive-15.12.1/data/org.kde.kdenlive.desktop 2016-01-08 00:09:47.000000000 +0100 +++ new/kdenlive-15.12.2/data/org.kde.kdenlive.desktop 2016-02-12 06:18:54.000000000 +0100 @@ -130,8 +130,10 @@ Keywords[ca]=edició;vídeo;àudio;mlt;kde; Keywords[ca@valencia]=edició;vídeo;àudio;mlt;kde; Keywords[da]=redigering;video;lyd;mlt;kde; +Keywords[de]=Editing;Bearbeitung;Schnitt;Videoschnitt;Video;Audio;MLT; Keywords[en_GB]=editing;video;audio;mlt;kde; Keywords[es]=edición;video;audio;mlt;kde; +Keywords[et]=redigeerimine;muutmine;video;audio;heli;mlt;kde; Keywords[fi]=editing;video;audio;mlt;kde;editointi;ääni; Keywords[fr]=montage;vidéo;audio;mlt;kde; Keywords[gl]=editing;edición;video;vídeo;audio;son;mlt;kde; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdenlive-15.12.1/src/dialogs/renderwidget.cpp new/kdenlive-15.12.2/src/dialogs/renderwidget.cpp --- old/kdenlive-15.12.1/src/dialogs/renderwidget.cpp 2016-01-08 00:09:47.000000000 +0100 +++ new/kdenlive-15.12.2/src/dialogs/renderwidget.cpp 2016-02-12 06:18:54.000000000 +0100 @@ -950,20 +950,19 @@ // script file QFile file(scriptPath); int stemCount = playlistPaths.count(); + bool stemExport = (trackNames.count() > 0); for (int stemIdx = 0; stemIdx < stemCount; stemIdx++) { QString dest(destBase); // on stem export append track name to each filename - if (stemCount > 1) { + if (stemExport) { QFileInfo dfi(dest); QStringList filePath; // construct the full file path filePath << dfi.absolutePath() << QDir::separator() << dfi.completeBaseName() + "_" << - QString(trackNames.at(stemIdx)).replace(" ","_") << "." << dfi.suffix(); - dest = filePath.join(""); - // debug output - qDebug() << "dest: " << dest; + QString(trackNames.at(stemIdx)).replace(QLatin1String(" "),QLatin1String("_")) << QStringLiteral(".") << dfi.suffix(); + dest = filePath.join(QLatin1String("")); } // Check whether target file has an extension. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdenlive-15.12.1/src/doc/documentchecker.cpp new/kdenlive-15.12.2/src/doc/documentchecker.cpp --- old/kdenlive-15.12.1/src/doc/documentchecker.cpp 2016-01-08 00:09:47.000000000 +0100 +++ new/kdenlive-15.12.2/src/doc/documentchecker.cpp 2016-02-12 06:18:54.000000000 +0100 @@ -201,7 +201,6 @@ item->setData(0, idRole, l); item->setData(0, statusRole, LUMAMISSING); } - m_ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(m_missingClips.isEmpty() && missingProxies.isEmpty() && missingSources.isEmpty()); max = m_missingClips.count(); m_missingProxyIds.clear(); @@ -241,6 +240,7 @@ item->setData(0, typeOriginalResource, e.attribute("resource")); } else if (status == TITLE_FONT_ELEMENT) { item->setIcon(0, KoIconUtils::themedIcon("dialog-warning")); + item->setData(0, statusRole, CLIPPLACEHOLDER); item->setToolTip(1, e.attribute("name")); QString ft = e.attribute("resource"); QString newft = QFontInfo(QFont(ft)).family(); @@ -892,7 +892,6 @@ } } - void DocumentChecker::slotCheckButtons() { if (m_ui.treeWidget->currentItem()) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdenlive-15.12.1/src/doc/documentvalidator.cpp new/kdenlive-15.12.2/src/doc/documentvalidator.cpp --- old/kdenlive-15.12.1/src/doc/documentvalidator.cpp 2016-01-08 00:09:47.000000000 +0100 +++ new/kdenlive-15.12.2/src/doc/documentvalidator.cpp 2016-02-12 06:18:54.000000000 +0100 @@ -1120,7 +1120,6 @@ else trackRenaming.insert(entryId, newId); entry.setAttribute("producer", newId); } - if (!trackRenaming.isEmpty()) { for (int i = 0; i < producers.count(); ++i) { QDomElement prod = producers.at(i).toElement(); @@ -1183,6 +1182,10 @@ QDomElement entry = m_doc.createElement("entry"); entry.setAttribute("producer", id); main_playlist.appendChild(entry); + QString service = EffectsList::property(prod, QStringLiteral("mlt_service")); + if (service == QLatin1String("kdenlivetitle")) { + fixTitleProducerLocale(prod); + } QDomElement source = m_source_producers.value(id); if (!source.isNull()) { updateProducerInfo(prod, source); @@ -1190,6 +1193,8 @@ entry.setAttribute("out", QString::number(source.attribute("duration").toInt() - 1)); } frag.appendChild(prod); + // Changing prod parent removes it from list, so rewind index + i--; } else { QDomElement originalProd = prod.cloneNode().toElement(); @@ -1264,6 +1269,9 @@ entry.setAttribute("out", QString::number(prod.attribute("duration").toInt() - 1)); entry.setAttribute("producer", id); main_playlist.appendChild(entry); + if (type == 6) { + fixTitleProducerLocale(originalProd); + } frag.appendChild(originalProd); ids << id; } @@ -1879,3 +1887,49 @@ } } + +void DocumentValidator::fixTitleProducerLocale(QDomElement &producer) +{ + QString data = EffectsList::property(producer, "xmldata"); + QDomDocument doc; + doc.setContent(data); + QDomNodeList nodes = doc.elementsByTagName(QStringLiteral("position")); + bool fixed = false; + for (int i = 0; i < nodes.count(); i++) { + QDomElement pos = nodes.at(i).toElement(); + QString x = pos.attribute(QStringLiteral("x")); + QString y = pos.attribute(QStringLiteral("y")); + if (x.contains(QLatin1Char(','))) { + // x pos was saved in locale format, fix + x = x.section(QStringLiteral(","), 0, 0); + pos.setAttribute(QStringLiteral("x"), x); + fixed = true; + } + if (y.contains(QLatin1Char(','))) { + // x pos was saved in locale format, fix + y = y.section(QStringLiteral(","), 0, 0); + pos.setAttribute(QStringLiteral("y"), y); + fixed = true; + } + } + nodes = doc.elementsByTagName(QStringLiteral("content")); + for (int i = 0; i < nodes.count(); i++) { + QDomElement pos = nodes.at(i).toElement(); + QString x = pos.attribute(QStringLiteral("font-outline")); + QString y = pos.attribute(QStringLiteral("textwidth")); + if (x.contains(QLatin1Char(','))) { + // x pos was saved in locale format, fix + x = x.section(QStringLiteral(","), 0, 0); + pos.setAttribute(QStringLiteral("font-outline"), x); + fixed = true; + } + if (y.contains(QLatin1Char(','))) { + // x pos was saved in locale format, fix + y = y.section(QStringLiteral(","), 0, 0); + pos.setAttribute(QStringLiteral("textwidth"), y); + fixed = true; + } + } + if (fixed) EffectsList::setProperty(producer, QStringLiteral("xmldata"), doc.toString()); +} + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdenlive-15.12.1/src/doc/documentvalidator.h new/kdenlive-15.12.2/src/doc/documentvalidator.h --- old/kdenlive-15.12.1/src/doc/documentvalidator.h 2016-01-08 00:09:47.000000000 +0100 +++ new/kdenlive-15.12.2/src/doc/documentvalidator.h 2016-02-12 06:18:54.000000000 +0100 @@ -59,6 +59,8 @@ bool updateEffectParameters(const QDomNodeList ¶meters, const QScriptValue *updateRules, const double serviceVersion, const double effectVersion); */ QString factorizeGeomValue(QString value, double factor); + /** @brief Kdenlive <= 0.9.10 saved title clip item position/opacity with locale which was wrong, fix. */ + void fixTitleProducerLocale(QDomElement &producer); }; #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdenlive-15.12.1/src/effectslist/effectslistview.cpp new/kdenlive-15.12.2/src/effectslist/effectslistview.cpp --- old/kdenlive-15.12.1/src/effectslist/effectslistview.cpp 2016-01-08 00:09:47.000000000 +0100 +++ new/kdenlive-15.12.2/src/effectslist/effectslistview.cpp 2016-02-12 06:18:54.000000000 +0100 @@ -126,7 +126,6 @@ connect(m_effectsList, &EffectsListWidget::itemSelectionChanged, this, &EffectsListView::slotUpdateInfo); connect(m_effectsList, &EffectsListWidget::itemDoubleClicked, this, &EffectsListView::slotEffectSelected); connect(m_effectsList, SIGNAL(displayMenu(QTreeWidgetItem *, const QPoint &)), this, SLOT(slotDisplayMenu(QTreeWidgetItem *, const QPoint &))); - connect(search_effect, SIGNAL(hiddenChanged(QTreeWidgetItem*,bool)), this, SLOT(slotUpdateSearch(QTreeWidgetItem*,bool))); connect(m_effectsList, &EffectsListWidget::applyEffect, this, &EffectsListView::addEffect); connect(search_effect, SIGNAL(textChanged(QString)), this, SLOT(slotAutoExpand(QString))); @@ -134,6 +133,7 @@ if (m_mode == TransitionMode) { return; } + connect(search_effect, SIGNAL(hiddenChanged(QTreeWidgetItem*,bool)), this, SLOT(slotUpdateSearch(QTreeWidgetItem*,bool))); switch (KdenliveSettings::selected_effecttab()) { case EffectsListWidget::EFFECT_VIDEO: effectsVideo->setChecked(true); @@ -378,7 +378,7 @@ QTreeWidgetItem *item = m_effectsList->currentItem(); QString effectId = item->text(0); - QString path = QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/effects"; + QString path = QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/effects/"; QDir directory = QDir(path); QStringList filter; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdenlive-15.12.1/src/effectstack/collapsibleeffect.cpp new/kdenlive-15.12.2/src/effectstack/collapsibleeffect.cpp --- old/kdenlive-15.12.1/src/effectstack/collapsibleeffect.cpp 2016-01-08 00:09:47.000000000 +0100 +++ new/kdenlive-15.12.2/src/effectstack/collapsibleeffect.cpp 2016-02-12 06:18:54.000000000 +0100 @@ -318,7 +318,9 @@ if (!disable || KdenliveSettings::disable_effect_parameters()) { widgetFrame->setEnabled(!disable); } - if (emitInfo) emit effectStateChanged(disable, effectIndex(), needsMonitorEffectScene()); + if (emitInfo) { + emit effectStateChanged(disable, effectIndex(), needsMonitorEffectScene()); + } } void CollapsibleEffect::slotDeleteEffect() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdenlive-15.12.1/src/effectstack/effectstackview2.cpp new/kdenlive-15.12.2/src/effectstack/effectstackview2.cpp --- old/kdenlive-15.12.1/src/effectstack/effectstackview2.cpp 2016-01-08 00:09:47.000000000 +0100 +++ new/kdenlive-15.12.2/src/effectstack/effectstackview2.cpp 2016-02-12 06:18:54.000000000 +0100 @@ -265,20 +265,18 @@ void EffectStackView2::slotTrackItemSelected(int ix, const TrackInfo &info, Monitor *m) { - if (m_status == TIMELINE_TRACK && ix == m_trackindex) { - // Track effects already displayed - return; + if (m_status != TIMELINE_TRACK || ix != m_trackindex) { + m_clipref = NULL; + m_status = TIMELINE_TRACK; + m_effectMetaInfo.monitor = m; + m_currentEffectList = info.effectsList; + m_trackInfo = info; + m_clipref = NULL; + m_masterclipref = NULL; + m_ui.checkAll->setToolTip(QString()); + m_ui.checkAll->setText(i18n("Effects for track %1", info.trackName.isEmpty() ? QString::number(ix) : info.trackName)); } - m_clipref = NULL; - m_status = TIMELINE_TRACK; - m_effectMetaInfo.monitor = m; - m_currentEffectList = info.effectsList; - m_trackInfo = info; - m_clipref = NULL; - m_masterclipref = NULL; setEnabled(true); - m_ui.checkAll->setToolTip(QString()); - m_ui.checkAll->setText(i18n("Effects for track %1", info.trackName.isEmpty() ? QString::number(ix) : info.trackName)); m_ui.checkAll->setEnabled(true); m_trackindex = ix; setupListView(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdenlive-15.12.1/src/effectstack/widgets/geometrywidget.cpp new/kdenlive-15.12.2/src/effectstack/widgets/geometrywidget.cpp --- old/kdenlive-15.12.1/src/effectstack/widgets/geometrywidget.cpp 2016-01-08 00:09:47.000000000 +0100 +++ new/kdenlive-15.12.2/src/effectstack/widgets/geometrywidget.cpp 2016-02-12 06:18:54.000000000 +0100 @@ -345,11 +345,12 @@ } Mlt::GeometryItem item; - m_geometry->fetch(&item, m_monitor->render->seekFramePosition() - m_clipPos); + int framePos = qBound<int>(0, m_monitor->render->seekFramePosition() - m_clipPos, maxframe - minframe); + m_geometry->fetch(&item, framePos); checkSingleKeyframe(); m_monitor->slotShowEffectScene(MonitorSceneGeometry); m_monitor->setUpEffectGeometry(QRect(item.x(), item.y(), item.w(), item.h()), calculateCenters()); - slotPositionChanged(m_monitor->render->seekFramePosition() - m_clipPos, false); + slotPositionChanged(framePos, false); } void GeometryWidget::addParameter(const QDomElement &elem) @@ -733,8 +734,15 @@ { int pos = m_timePos->getValue(); Mlt::GeometryItem item; - if (m_geometry->fetch(&item, pos) || item.key() == false) - return; + if (m_geometry->fetch(&item, pos) || item.key() == false) { + // Check if we are in a "one keyframe" situation + if (m_singleKeyframe && !m_geometry->next_key(&item, 0)) { + // Ok we have only one keyframe, edit this one + } else { + //TODO: show error message + return; + } + } item.mix(value); m_geometry->insert(item); emit parameterChanged(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdenlive-15.12.1/src/mainwindow.cpp new/kdenlive-15.12.2/src/mainwindow.cpp --- old/kdenlive-15.12.1/src/mainwindow.cpp 2016-01-08 00:09:47.000000000 +0100 +++ new/kdenlive-15.12.2/src/mainwindow.cpp 2016-02-12 06:18:54.000000000 +0100 @@ -35,6 +35,7 @@ #include "monitor/monitormanager.h" #include "doc/kdenlivedoc.h" #include "timeline/timeline.h" +#include "timeline/track.h" #include "timeline/customtrackview.h" #include "effectslist/effectslistview.h" #include "effectslist/effectbasket.h" @@ -122,6 +123,15 @@ return a.first < b.first; }*/ +// determine the the default KDE style as defined BY THE USER +// (as opposed to whatever style KDE considers default) +static QString defaultStyle(const char *fallback=Q_NULLPTR) +{ + KSharedConfigPtr kdeGlobals = KSharedConfig::openConfig(QStringLiteral("kdeglobals"), KConfig::NoGlobals); + KConfigGroup cg(kdeGlobals, "KDE"); + return cg.readEntry("widgetStyle", fallback); +} + MainWindow::MainWindow(const QString &MltPath, const QUrl &Url, const QString & clipsToLoad, QWidget *parent) : KXmlGuiWindow(parent), m_timelineArea(NULL), @@ -151,6 +161,19 @@ KActionMenu *stylesAction= new KActionMenu(i18n("Style"), this); QActionGroup *stylesGroup = new QActionGroup(stylesAction); + + // GTK theme does not work well with Kdenlive, and does not support color theming, so avoid it + QStringList availableStyles = QStyleFactory::keys(); + QString desktopStyle = QApplication::style()->objectName(); + if (QString::compare(desktopStyle, QLatin1String("GTK+"), Qt::CaseInsensitive) == 0 && KdenliveSettings::widgetstyle().isEmpty()) { + if (availableStyles.contains(QLatin1String("breeze"), Qt::CaseInsensitive)) { + // Auto switch to Breeze theme + KdenliveSettings::setWidgetstyle(QStringLiteral("Breeze")); + } else if (availableStyles.contains(QLatin1String("fusion"), Qt::CaseInsensitive)) { + KdenliveSettings::setWidgetstyle(QStringLiteral("Fusion")); + } + } + // Add default style action QAction *defaultStyle = new QAction(i18n("Default"), stylesGroup); defaultStyle->setCheckable(true); @@ -159,7 +182,6 @@ defaultStyle->setChecked(true); } - QStringList availableStyles = QStyleFactory::keys(); foreach(const QString &style, availableStyles) { QAction *a = new QAction(style, stylesGroup); a->setCheckable(true); @@ -177,14 +199,6 @@ ThemeManager::instance()->setCurrentTheme(KdenliveSettings::colortheme()); connect(ThemeManager::instance(), SIGNAL(signalThemeChanged(const QString &)), this, SLOT(slotThemeChanged(const QString &)), Qt::DirectConnection); - QString desktopStyle = QApplication::style()->objectName(); - if (!desktopStyle.isEmpty() && QString::compare(desktopStyle, QLatin1String("breeze"), Qt::CaseInsensitive) != 0 && QString::compare(desktopStyle, QLatin1String("oxygen"), Qt::CaseInsensitive) != 0 && KdenliveSettings::widgetstyle().isEmpty()) { - if (availableStyles.contains(QLatin1String("breeze"), Qt::CaseInsensitive)) { - // Auto switch to Breeze theme - KdenliveSettings::setWidgetstyle(QStringLiteral("Breeze")); - } - } - if (!KdenliveSettings::widgetstyle().isEmpty() && QString::compare(desktopStyle, KdenliveSettings::widgetstyle(), Qt::CaseInsensitive) != 0) { // User wants a custom widget style, init doChangeStyle(); @@ -2901,7 +2915,6 @@ QString mltSuffix(".mlt"); QList<QString> playlistPaths; QList<QString> trackNames; - const QList <TrackInfo> trackInfoList = pCore->projectManager()->currentTimeline()->getTracksInfo(); int tracksCount = 1; bool stemExport = m_renderWidget->isStemAudioExportEnabled(); @@ -2985,7 +2998,9 @@ bool exportAudio; if (m_renderWidget->automaticAudioExport()) { exportAudio = pCore->projectManager()->currentTimeline()->checkProjectAudio(); - } else exportAudio = m_renderWidget->selectedAudioExport(); + } else { + exportAudio = m_renderWidget->selectedAudioExport(); + } // Set playlist audio volume to 100% QDomDocument doc; @@ -3045,22 +3060,29 @@ // check which audio tracks have to be exported if (stemExport) { - CustomTrackView* ctv = pCore->projectManager()->currentTimeline()->projectView(); - int trackInfoCount = trackInfoList.count(); - tracksCount = 0; + Timeline* ct = pCore->projectManager()->currentTimeline(); + int allTracksCount = ct->tracksCount(); - for (int i = 0; i < trackInfoCount; i++) { - TrackInfo info = trackInfoList.at(trackInfoCount - i - 1); - if (!info.isMute && ctv->hasAudio(i)) { + // reset tracks count (tracks to be rendered) + tracksCount = 0; + // begin with track 1 (track zero is a hidden black track) + for (int i = 1; i < allTracksCount; i++) { + Track* track = ct->track(i); + // add only tracks to render list that are not muted and have audio + if (track && !track->info().isMute && track->hasAudio()) { QDomDocument docCopy = doc.cloneNode(true).toDocument(); + QString trackName = track->info().trackName; + // save track name - trackNames << info.trackName; - qDebug() << "Track-Name: " << info.trackName; - // create stem export playlist content - QDomNodeList tracks = docCopy.elementsByTagName("track"); - for (int j = trackInfoCount; j >= 0; j--) { - if (j != (trackInfoCount - i)) { - tracks.at(j).toElement().setAttribute("hide", "both"); + trackNames << trackName; + qDebug() << "Track-Name: " << trackName; + + // create stem export doc content + QDomNodeList tracks = docCopy.elementsByTagName(QStringLiteral("track")); + for (int j = 0; j < allTracksCount; j++) { + if (j != i) { + // mute other tracks + tracks.at(j).toElement().setAttribute(QStringLiteral("hide"), QStringLiteral("both")); } } docList << docCopy; @@ -3077,7 +3099,7 @@ // add track number to path name if (stemExport) { - plPath = plPath + "_" + QString(trackNames.at(i)).replace(" ", "_"); + plPath = plPath + "_" + QString(trackNames.at(i)).replace(QLatin1String(" "), QLatin1String("_")); } // add mlt suffix plPath += mltSuffix; @@ -3343,7 +3365,11 @@ void MainWindow::doChangeStyle() { - QApplication::setStyle(QStyleFactory::create(KdenliveSettings::widgetstyle())); + QString newStyle = KdenliveSettings::widgetstyle(); + if (newStyle.isEmpty() || newStyle == QStringLiteral("Default")) { + newStyle = defaultStyle("Breeze"); + } + QApplication::setStyle(QStyleFactory::create(newStyle)); // Changing widget style resets color theme, so update color theme again ThemeManager::instance()->slotChangePalette(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdenlive-15.12.1/src/renderer.cpp new/kdenlive-15.12.2/src/renderer.cpp --- old/kdenlive-15.12.1/src/renderer.cpp 2016-01-08 00:09:47.000000000 +0100 +++ new/kdenlive-15.12.2/src/renderer.cpp 2016-02-12 06:18:54.000000000 +0100 @@ -2373,6 +2373,11 @@ int x2 = keyFrames.at(i + 1).section('=', 0, 0).toInt(); double y2 = keyFrames.at(i + 1).section('=', 1, 1).toDouble(); if (x2 == -1) x2 = duration; + // non-overlapping sections + if (i > 0) { + y1 += (y2 - y1) / (x2 - x1); + ++x1; + } for (int j = 0; j < params.count(); ++j) { filter->set(params.at(j).name().toUtf8().constData(), params.at(j).value().toUtf8().constData()); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdenlive-15.12.1/src/timeline/customtrackview.cpp new/kdenlive-15.12.2/src/timeline/customtrackview.cpp --- old/kdenlive-15.12.1/src/timeline/customtrackview.cpp 2016-01-08 00:09:47.000000000 +0100 +++ new/kdenlive-15.12.2/src/timeline/customtrackview.cpp 2016-02-12 06:18:54.000000000 +0100 @@ -2388,12 +2388,13 @@ { if (pos < GenTime()) { // editing a track effect - if (!m_document->renderer()->mltEnableEffects(m_timeline->tracksCount() - track, pos, effectIndexes, disable)) { + if (!m_document->renderer()->mltEnableEffects(track, pos, effectIndexes, disable)) { emit displayMessage(i18n("Problem editing effect"), ErrorMessage); return; } - m_timeline->enableTrackEffects(track - 1, effectIndexes, disable); + m_timeline->enableTrackEffects(track, effectIndexes, disable); emit updateTrackEffectState(track); + emit showTrackEffects(track, m_timeline->getTrackInfo(track)); return; } // editing a clip effect