QVariant AttachedFiltersModel::data(const QModelIndex &index, int role) const { if ( !m_producer || !m_producer->is_valid() || index.row() >= m_producer->filter_count()) return QVariant(); switch (role ) { case Qt::DisplayRole: { QVariant result; Mlt::Filter* filter = filterForRow(index.row()); if (filter && filter->is_valid()) { // Relabel by QML UI QmlMetadata* meta = MAIN.filtersDock()->qmlMetadataForService(filter); if (meta) result = meta->name(); // Fallback is raw mlt_service name else if (filter->get("mlt_service")) result = QString::fromUtf8(filter->get("mlt_service")); } // Relabel for widgets UIs if (result == "movit.blur" || result == "boxblur") result = tr("Blur"); else if (result == "movit.lift_gamma_gain" || result == "frei0r.coloradj_RGB") result = tr("Color Grading"); else if (result == "crop") result = tr("Crop"); else if (result == "movit.glow" || result == "frei0r.glow") result = tr("Glow"); else if (result == "movit.mirror" || result == "mirror") result = tr("Mirror"); else if (result == "webvfx") result = tr("Overlay HTML"); else if (result == "movit.sharpen" || result == "frei0r.sharpness") result = tr("Sharpen"); else if (result == "movit.white_balance" || result == "frei0r.colgate") result = tr("White Balance"); else if (result == "sox" && filter->get("use_peak")) result = tr("Normalize"); delete filter; return result; } case Qt::CheckStateRole: { Mlt::Filter* filter = filterForRow(index.row()); QVariant result = Qt::Unchecked; if (filter && filter->is_valid() && !filter->get_int("disable")) result = Qt::Checked; delete filter; return result; } break; default: break; } return QVariant(); }
QVariant AttachedFiltersModel::data(const QModelIndex &index, int role) const { if ( !m_producer || !m_producer->is_valid() || index.row() >= m_producer->filter_count()) return QVariant(); switch (role ) { case Qt::DisplayRole: { QVariant result; const QmlMetadata* meta = m_metaList[index.row()]; if (meta) { result = meta->name(); } else { // Fallback is raw mlt_service name Mlt::Filter* filter = getFilter(index.row()); if (filter && filter->is_valid() && filter->get("mlt_service")) { result = QString::fromUtf8(filter->get("mlt_service")); } delete filter; } return result; } case Qt::CheckStateRole: { Mlt::Filter* filter = getFilter(index.row()); QVariant result = Qt::Unchecked; if (filter && filter->is_valid() && !filter->get_int("disable")) result = Qt::Checked; delete filter; return result; } break; case TypeDisplayRole: { QVariant result; const QmlMetadata* meta = m_metaList[index.row()]; if (meta && meta->isAudio()) { result = tr("Audio"); } else if (meta && meta->needsGPU()) { result = tr("GPU"); } else { result = tr("Video"); } return result; } break; default: break; } return QVariant(); }
void BinController::duplicateFilters(Mlt::Producer original, Mlt::Producer clone) { Mlt::Service clipService(original.get_service()); Mlt::Service dupService(clone.get_service()); //delete original; //delete clone; int ct = 0; Mlt::Filter *filter = clipService.filter(ct); while (filter) { // Only duplicate Kdenlive filters, and skip the fade in effects //fprintf(stderr, "CHKNG FILTER: %s\n", filter->get("kdenlive_id")); if (filter->is_valid()/* && strcmp(filter->get("kdenlive_id"), "") && strcmp(filter->get("kdenlive_id"), "fadein") && strcmp(filter->get("kdenlive_id"), "fade_from_black")*/) { // looks like there is no easy way to duplicate a filter, // so we will create a new one and duplicate its properties Mlt::Filter *dup = new Mlt::Filter(*original.profile(), filter->get("mlt_service")); if (dup && dup->is_valid()) { Mlt::Properties entries(filter->get_properties()); for (int i = 0; i < entries.count(); ++i) { dup->set(entries.get_name(i), entries.get(i)); } dupService.attach(*dup); } } ct++; filter = clipService.filter(ct); } }
QVariant AttachedFiltersModel::data(const QModelIndex &index, int role) const { if ( !m_producer || !m_producer->is_valid() || index.row() >= m_producer->filter_count()) return QVariant(); switch (role ) { case Qt::DisplayRole: { QVariant result; Mlt::Filter* filter = filterForRow(index.row()); if (filter && filter->is_valid()) { // Relabel by QML UI QmlMetadata* meta = MAIN.filtersDock()->qmlMetadataForService(filter); if (meta) result = meta->name(); // Fallback is raw mlt_service name else if (filter->get("mlt_service")) result = QString::fromUtf8(filter->get("mlt_service")); } // Relabel for widgets UIs if (result == "movit.mirror" || result == "mirror") result = tr("Mirror"); delete filter; return result; } case Qt::CheckStateRole: { Mlt::Filter* filter = filterForRow(index.row()); QVariant result = Qt::Unchecked; if (filter && filter->is_valid() && !filter->get_int("disable")) result = Qt::Checked; delete filter; return result; } break; default: break; } return QVariant(); }
WebvfxFilter::WebvfxFilter(Mlt::Filter filter, QWidget *parent) : QWidget(parent), ui(new Ui::WebvfxFilter), m_filter(filter) { ui->setupUi(this); QString resource = filter.get("resource"); if (resource.startsWith("plain:")) resource.remove(0, 6); ui->fileLabel->setText(QFileInfo(resource).fileName()); ui->fileLabel->setToolTip(resource); if (resource.isEmpty()) { ui->editButton->setDisabled(true); ui->reloadButton->setDisabled(true); } else { ui->newButton->setDisabled(true); ui->openButton->setDisabled(true); } m_filter.set_in_and_out(0, MLT.producer()->get_playtime() - 1); }
bool EffectManager::removeEffect(int effectIndex, bool updateIndex) { m_producer.lock(); int ct = 0; bool success = false; Mlt::Filter *filter = m_producer.filter(ct); QList <Mlt::Filter *> filters; while (filter) { filters << filter; if ((effectIndex == -1 && strcmp(filter->get("kdenlive_id"), "")) || filter->get_int("kdenlive_ix") == effectIndex) { if (m_producer.detach(*filter) == 0) { success = true; } } else if (updateIndex) { // Adjust the other effects index if (filter->get_int("kdenlive_ix") > effectIndex) filter->set("kdenlive_ix", filter->get_int("kdenlive_ix") - 1); ct++; } else ct++; filter = m_producer.filter(ct); } m_producer.unlock(); qDeleteAll(filters); return success; }
bool EffectManager::editEffect(EffectsParameterList params, int duration, bool replaceEffect) { int index = params.paramValue(QStringLiteral("kdenlive_ix")).toInt(); QString tag = params.paramValue(QStringLiteral("tag")); if (!params.paramValue(QStringLiteral("keyframes")).isEmpty() || replaceEffect || tag.startsWith(QLatin1String("ladspa")) || tag == QLatin1String("sox") || tag == QLatin1String("autotrack_rectangle")) { // This is a keyframe effect, to edit it, we remove it and re-add it. if (removeEffect(index, false)) { return addEffect(params, duration); } } // find filter int ct = 0; Mlt::Filter *filter = m_producer.filter(ct); while (filter) { if (filter->get_int("kdenlive_ix") == index) { break; } delete filter; ct++; filter = m_producer.filter(ct); } if (!filter) { qDebug() << "WARINIG, FILTER FOR EDITING NOT FOUND, ADDING IT! " << index << ", " << tag; // filter was not found, it was probably a disabled filter, so add it to the correct place... bool success = addEffect(params, duration); return success; } ct = 0; QString ser = filter->get("mlt_service"); QList <Mlt::Filter *> filtersList; m_producer.lock(); if (ser != tag) { // Effect service changes, delete effect and re-add it m_producer.detach(*filter); delete filter; // Delete all effects after deleted one filter = m_producer.filter(ct); while (filter) { if (filter->get_int("kdenlive_ix") > index) { filtersList.append(filter); m_producer.detach(*filter); } else ct++; delete filter; filter = m_producer.filter(ct); } // re-add filter doAddFilter(params, duration); m_producer.unlock(); return true; } if (params.hasParam(QStringLiteral("kdenlive:sync_in_out"))) { if (params.paramValue(QStringLiteral("kdenlive:sync_in_out")) == QLatin1String("1")) { // This effect must sync in / out with parent clip //params.removeParam(QStringLiteral("sync_in_out")); Mlt::Producer prod(m_producer); filter->set_in_and_out(prod.get_in(), prod.get_out()); } else { // Reset in/out properties filter->set("in", (char*)NULL); filter->set("out", (char*)NULL); } } for (int j = 0; j < params.count(); ++j) { filter->set(params.at(j).name().toUtf8().constData(), params.at(j).value().toUtf8().constData()); } for (int j = 0; j < filtersList.count(); ++j) { m_producer.attach(*(filtersList.at(j))); } qDeleteAll(filtersList); m_producer.unlock(); delete filter; return true; }