widgets/keyframewidget_ui.ui
widgets/constval_ui.ui
widgets/listval_ui.ui
+ widgets/wipeval_ui.ui
widgets/boolval_ui.ui
widgets/colorval_ui.ui
widgets/titlewidget_ui.ui
void CustomTrackView::slotAddEffect(QDomElement effect, GenTime pos, int track) {
QList<QGraphicsItem *> itemList;
- if (track == -1) itemList = scene()->selectedItems();
+ if (track == -1) itemList = scene()->selectedItems();
if (itemList.isEmpty()) {
ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()) + 1, track);
if (clip) itemList.append(clip);
else kDebug() << "------ wrning, clip eff not found";
}
- kDebug() << "// REQUESTING EFFECT ON CLIP: " << pos.frames(25) << ", TRK: " << track << "SELECTED ITEMS: "<<itemList.count();
+ kDebug() << "// REQUESTING EFFECT ON CLIP: " << pos.frames(25) << ", TRK: " << track << "SELECTED ITEMS: " << itemList.count();
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i)->type() == AVWIDGET) {
ClipItem *item = (ClipItem *)itemList.at(i);
Transition *item = getTransitionItemAt((int)transitionInfo.startPos.frames(m_document->fps()) + 1, transitionInfo.track);
m_document->renderer()->mltDeleteTransition(item->transitionTag(), endTrack, m_tracksList.count() - transitionInfo.track, transitionInfo.startPos, transitionInfo.endPos, item->toXML());
delete item;
- emit transitionItemSelected(NULL);
+ emit transitionItemSelected(NULL);
m_document->setModified(true);
}
QGraphicsView::mouseReleaseEvent(event);
setDragMode(QGraphicsView::NoDrag);
if (m_dragItem == NULL) {
- emit transitionItemSelected(NULL);
- return;
- }
+ emit transitionItemSelected(NULL);
+ return;
+ }
ItemInfo info;
info.startPos = m_dragItem->startPos();
info.endPos = m_dragItem->endPos();
}
Transition *CustomTrackView::getTransitionItemAt(int pos, int track) {
- QList<QGraphicsItem *> list = scene()->items(QPointF(pos * m_scale, ( track + 1 ) * m_tracksHeight));
+ QList<QGraphicsItem *> list = scene()->items(QPointF(pos * m_scale, (track + 1) * m_tracksHeight));
Transition *clip = NULL;
for (int i = 0; i < list.size(); ++i) {
if (list.at(i)->type() == TRANSITIONWIDGET) {
#include "ui_listval_ui.h"
#include "ui_boolval_ui.h"
#include "ui_colorval_ui.h"
+#include "ui_wipeval_ui.h"
#include "complexparameter.h"
QMap<QString, QImage> EffectStackEdit::iconCache;
delete toFillin;
toFillin = NULL;
} else if (type == "list") {
-
Ui::Listval_UI *lsval = new Ui::Listval_UI;
lsval->setupUi(toFillin);
QStringList listitems = pa.attribute("paramlist").split(",");
- lsval->list->addItems(listitems);
+ QStringList listitemsdisplay = pa.attribute("paramlistdisplay").split(",");
+ if (listitemsdisplay.count() != listitems.count()) listitemsdisplay = listitems;
+ //lsval->list->addItems(listitems);
+ for (int i = 0;i < listitems.count();i++) {
+ lsval->list->addItem(listitemsdisplay.at(i), listitems.at(i));
+ }
lsval->list->setCurrentIndex(listitems.indexOf(value));
for (int i = 0;i < lsval->list->count();i++) {
- QString entry = lsval->list->itemText(i);
+ QString entry = lsval->list->itemData(i).toString();
if (!entry.isEmpty() && (entry.endsWith(".png") || entry.endsWith(".pgm"))) {
if (!EffectStackEdit::iconCache.contains(entry)) {
QImage pix(entry);
cval->label->setText(na.toElement().text());
valueItems[paramName] = cval;
uiItems.append(cval);
+ } else if (type == "wipe") {
+ Ui::Wipeval_UI *wpval = new Ui::Wipeval_UI;
+ wpval->setupUi(toFillin);
+ wipeInfo w = getWipeInfo(value);
+ switch (w.start) {
+ case UP:
+ wpval->start_up->setChecked(true);
+ break;
+ case DOWN:
+ wpval->start_down->setChecked(true);
+ break;
+ case RIGHT:
+ wpval->start_right->setChecked(true);
+ break;
+ case LEFT:
+ wpval->start_left->setChecked(true);
+ break;
+ default:
+ wpval->start_center->setChecked(true);
+ break;
+ }
+ switch (w.end) {
+ case UP:
+ wpval->end_up->setChecked(true);
+ break;
+ case DOWN:
+ wpval->end_down->setChecked(true);
+ break;
+ case RIGHT:
+ wpval->end_right->setChecked(true);
+ break;
+ case LEFT:
+ wpval->end_left->setChecked(true);
+ break;
+ default:
+ wpval->end_center->setChecked(true);
+ break;
+ }
+
+ connect(wpval->end_up, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
+ connect(wpval->end_down, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
+ connect(wpval->end_left, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
+ connect(wpval->end_right, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
+ connect(wpval->end_center, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
+ connect(wpval->start_up, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
+ connect(wpval->start_down, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
+ connect(wpval->start_left, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
+ connect(wpval->start_right, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
+ connect(wpval->start_center, SIGNAL(clicked()), this, SLOT(collectAllParameters()));
+
+ //wpval->title->setTitle(na.toElement().text());
+ valueItems[paramName] = wpval;
+ uiItems.append(wpval);
} else {
delete toFillin;
toFillin = NULL;
}
}
}
+
+wipeInfo EffectStackEdit::getWipeInfo(QString value) {
+ wipeInfo info;
+ QString start = value.section(";", 0, 0);
+ QString end = value.section(";", 1, 1).section("=", 1, 1);
+ if (start.startsWith("-100%,0")) info.start = LEFT;
+ else if (start.startsWith("100%,0")) info.start = RIGHT;
+ else if (start.startsWith("0%,100%")) info.start = DOWN;
+ else if (start.startsWith("0%,-100%")) info.start = UP;
+ else if (start.startsWith("0%,0%")) info.start = CENTER;
+
+ if (end.startsWith("-100%,0")) info.end = LEFT;
+ else if (end.startsWith("100%,0")) info.end = RIGHT;
+ else if (end.startsWith("0%,100%")) info.end = DOWN;
+ else if (end.startsWith("0%,-100%")) info.end = UP;
+ else if (end.startsWith("0%,0%")) info.end = CENTER;
+
+ return info;
+}
+
+QString EffectStackEdit::getWipeString(wipeInfo info) {
+
+ QString start;
+ QString end;
+ switch (info.start) {
+ case LEFT:
+ start = "-100%,0%:100%x100%";
+ break;
+ case RIGHT:
+ start = "100%,0%:100%x100%";
+ break;
+ case DOWN:
+ start = "0%,100%:100%x100%";
+ break;
+ case UP:
+ start = "0%,-100%:100%x100%";
+ break;
+ default:
+ start = "0%,0%:100%x100%";
+ break;
+ }
+ switch (info.end) {
+ case LEFT:
+ end = "-100%,0%:100%x100%";
+ break;
+ case RIGHT:
+ end = "100%,0%:100%x100%";
+ break;
+ case DOWN:
+ end = "0%,100%:100%x100%";
+ break;
+ case UP:
+ end = "0%,-100%:100%x100%";
+ break;
+ default:
+ end = "0%,0%:100%x100%";
+ break;
+ }
+ return QString(start + ";-1=" + end);
+}
+
void EffectStackEdit::collectAllParameters() {
QDomElement oldparam = params.cloneNode().toElement();
QDomNodeList namenode = params.elementsByTagName("parameter");
if (type == "double" || type == "constant") {
QSlider* slider = ((Ui::Constval_UI*)valueItems[na.toElement().text()])->horizontalSlider;
setValue = QString::number(slider->value());
- } else
- if (type == "list") {
- KComboBox *box = ((Ui::Listval_UI*)valueItems[na.toElement().text()])->list;
- setValue = box->currentText();
- } else
- if (type == "bool") {
- QCheckBox *box = ((Ui::Boolval_UI*)valueItems[na.toElement().text()])->checkBox;
- setValue = box->checkState() == Qt::Checked ? "1" : "0" ;
- } else
- if (type == "color") {
- KColorButton *color = ((Ui::Colorval_UI*)valueItems[na.toElement().text()])->kcolorbutton;
- setValue.sprintf("0x%08x", color->color().rgba());
- } else
- if (type == "complex" || type == "geometry") {
- ComplexParameter *complex = ((ComplexParameter*)valueItems[na.toElement().text()+"complex"]);
- namenode.item(i) = complex->getParamDesc();
- }
+ } else if (type == "list") {
+ KComboBox *box = ((Ui::Listval_UI*)valueItems[na.toElement().text()])->list;
+ setValue = box->itemData(box->currentIndex()).toString();
+ } else if (type == "bool") {
+ QCheckBox *box = ((Ui::Boolval_UI*)valueItems[na.toElement().text()])->checkBox;
+ setValue = box->checkState() == Qt::Checked ? "1" : "0" ;
+ } else if (type == "color") {
+ KColorButton *color = ((Ui::Colorval_UI*)valueItems[na.toElement().text()])->kcolorbutton;
+ setValue.sprintf("0x%08x", color->color().rgba());
+ } else if (type == "complex" || type == "geometry") {
+ ComplexParameter *complex = ((ComplexParameter*)valueItems[na.toElement().text()+"complex"]);
+ namenode.item(i) = complex->getParamDesc();
+ } else if (type == "wipe") {
+ Ui::Wipeval_UI *wp = (Ui::Wipeval_UI*)valueItems[na.toElement().text()];
+ wipeInfo info;
+ if (wp->start_left->isChecked()) info.start = LEFT;
+ else if (wp->start_right->isChecked()) info.start = RIGHT;
+ else if (wp->start_up->isChecked()) info.start = UP;
+ else if (wp->start_down->isChecked()) info.start = DOWN;
+ else if (wp->start_center->isChecked()) info.start = CENTER;
+
+ if (wp->end_left->isChecked()) info.end = LEFT;
+ else if (wp->end_right->isChecked()) info.end = RIGHT;
+ else if (wp->end_up->isChecked()) info.end = UP;
+ else if (wp->end_down->isChecked()) info.end = DOWN;
+ else if (wp->end_center->isChecked()) info.end = CENTER;
+
+ setValue = getWipeString(info);
+ }
+
if (!setValue.isNull()) {
pa.attributes().namedItem("value").setNodeValue(setValue);
}
#include <QList>
#include <QMap>
+enum WIPE_DIRECTON { UP = 0, DOWN = 1, LEFT = 2, RIGHT = 3, CENTER = 4 };
+
+struct wipeInfo {
+ WIPE_DIRECTON start;
+ WIPE_DIRECTON end;
+ int startTransparency;
+ int endTransparency;
+};
+
class QFrame;
class EffectStackEdit : public QObject {
EffectStackEdit(QFrame* frame, QWidget *parent);
~EffectStackEdit();
static QMap<QString, QImage> iconCache;
+
private:
void clearAllItems();
QVBoxLayout *vbox;
QDomElement params;
QMap<QString, void*> valueItems;
void createSliderItem(const QString& name, int val , int min, int max);
+ wipeInfo getWipeInfo(QString value);
+ QString getWipeString(wipeInfo info);
+
public slots:
void transferParamDesc(const QDomElement&, int , int);
void slotSliderMoved(int);
void collectAllParameters();
+
signals:
void parameterChanged(const QDomElement&, const QDomElement&);
};
//kDebug() << ret.toString();
} else {
-
-
if (name == "luma") {
tname.appendChild(ret.createTextNode("Luma"));
mlt_properties_dir_list(entries.get_properties(), path.toAscii().data(), "*.*", 1);
kDebug() << path << entries.count();
QString imagefiles;
- QStringList imagelist;
+ //QStringList imagelist;
+ QString imagenamelist;
for (int i = 0;i < entries.count();i++) {
//if (!imagefiles.isEmpty()) // add empty entry too
imagefiles.append(",");
imagefiles.append(entries.get(i));
- imagelist << entries.get(i);
+ //imagelist << entries.get(i);
+ imagenamelist.append(",");
+ imagenamelist.append(KUrl(entries.get(i)).fileName());
}
- paramList.append(quickParameterFill(ret, "Softness", "softness", "double", "0", "0", "100", "", "100"));
+ paramList.append(quickParameterFill(ret, "Softness", "softness", "double", "0", "0", "100", "", "", "100"));
paramList.append(quickParameterFill(ret, "Invert", "invert", "bool", "0", "0", "1"));
- paramList.append(quickParameterFill(ret, "ImageFile", "resource", "list", "", "", "", imagefiles));
+ paramList.append(quickParameterFill(ret, "ImageFile", "resource", "list", "", "", "", imagefiles, imagenamelist));
//thumbnailer.prepareThumbnailsCall(imagelist);
} else if (name == "composite") {
}
- paramList.append(quickParameterFill(ret, "Reverse Transition", "reverse", "bool", "1", "0", "1"));
+ paramList.append(quickParameterFill(ret, "Reverse Transition", "reverse", "bool", "0", "0", "1"));
ktrans.appendChild(tname);
foreach(const QDomElement &e, paramList) {
transitions->append(ret.documentElement());
+ kDebug() << "//// //// TRANSITON XML";
+ kDebug() << ret.toString();
/*
<transition fill="1" in="11" a_track="1" out="73" mlt_service="luma" b_track="2" softness="0" resource="/home/marco/Projekte/kdenlive/install_cmake/share/apps/kdenlive/pgm/PAL/square2.pgm" />
*/
}
+
+ QString wipetrans = "<ktransition tag=\"composite\" ><name>Wipe</name> <parameter tag=\"geometry\" type=\"wipe\" default=\"-100%,0%:100%x100%;-1=0%,0%:100%x100%\" name=\"geometry\"><name>Direction</name> </parameter><parameter tag=\"reverse\" default=\"0\" type=\"bool\" min=\"0\" name=\"reverse\" max=\"1\" ><name>Reverse Transition</name></parameter></ktransition>";
+ QDomDocument ret;
+ ret.setContent(wipetrans);
+ transitions->append(ret.documentElement());
}
-QDomElement initEffects::quickParameterFill(QDomDocument & doc, QString name, QString tag, QString type, QString def, QString min, QString max, QString list, QString factor, QString namedesc, QString format) {
+QDomElement initEffects::quickParameterFill(QDomDocument & doc, QString name, QString tag, QString type, QString def, QString min, QString max, QString list, QString listdisplaynames, QString factor, QString namedesc, QString format) {
QDomElement parameter = doc.createElement("parameter");
parameter.setAttribute("tag", tag);
parameter.setAttribute("default", def);
parameter.setAttribute("min", min);
if (!list.isEmpty())
parameter.setAttribute("paramlist", list);
+ if (!listdisplaynames.isEmpty())
+ parameter.setAttribute("paramlistdisplay", listdisplaynames);
if (!factor.isEmpty())
parameter.setAttribute("factor", factor);
if (!namedesc.isEmpty())
static Mlt::Repository *parseEffectFiles();
static QDomDocument createDescriptionFromMlt(Mlt::Repository* repository, const QString& type, const QString& name);
static void fillTransitionsList(Mlt::Repository *, EffectsList* transitions, QStringList names);
- static QDomElement quickParameterFill(QDomDocument & doc, QString name, QString tag, QString type, QString def = QString(), QString min = QString(), QString max = QString(), QString list = QString(), QString factor = QString(), QString namedesc = QString(), QString format = QString());
+ static QDomElement quickParameterFill(QDomDocument & doc, QString name, QString tag, QString type, QString def = QString(), QString min = QString(), QString max = QString(), QString list = QString(), QString listdisplaynames = QString(), QString factor = QString(), QString namedesc = QString(), QString format = QString());
static void parseEffectFile(EffectsList *audioEffectList, EffectsList *videoEffectList, QString name, QStringList filtersList, QStringList producersList);
static char* ladspaEffectString(int ladspaId, QStringList params);
static void ladspaEffectFile(const QString & fname, int ladspaId, QStringList params);
if (!infoXmlNode.isNull()) {
QDomElement infoXml = infoXmlNode.toElement();
QString profilePath = infoXml.attribute("profile");
+ m_startPos = infoXml.attribute("position").toInt();
if (!profilePath.isEmpty()) setProfilePath(profilePath);
double version = infoXml.attribute("version").toDouble();
if (version < 0.7) convertDocument(version);
QDomElement markers = doc.createElement("markers");
addedXml.setAttribute("version", "0.7");
addedXml.setAttribute("profile", profilePath());
+ addedXml.setAttribute("position", m_render->seekPosition().frames(m_fps));
QList <DocClipBase*> list = m_clipManager->documentClipList();
for (int i = 0; i < list.count(); i++) {
e = list.at(i)->toXML();
m_render = render;
emit progressInfo(i18n("Loading playlist..."), 0);
qApp->processEvents();
- if (m_render) m_render->setSceneList(m_scenelist);
+ if (m_render) m_render->setSceneList(m_scenelist, m_startPos);
emit progressInfo(QString(), -1);
}
QDomDocument m_document;
QString m_projectName;
double m_fps;
+ /** Cursor position at document opening */
+ int m_startPos;
int m_width;
int m_height;
Timecode m_timecode;
}
void MainWindow::saveFileAs() {
- QString outputFile = KFileDialog::getSaveFileName();
+ QString outputFile = KFileDialog::getSaveFileName(KUrl(), "*.kdenlive|Kdenlive project files (*.kdenlive)");
if (QFile::exists(outputFile)) {
if (KMessageBox::questionYesNo(this, i18n("File already exists.\nDo you want to overwrite it ?")) == KMessageBox::No) return;
}
delete[] tmp;
if (!m_mltProducer || !m_mltProducer->is_valid()) kDebug() << " WARNING - - - - -INVALID PLAYLIST: " << tmp;
//m_mltProducer->optimise();
- if (position != 0) m_mltProducer->seek(position);
/*if (KdenliveSettings::osdtimecode()) {
// Attach filter for on screen display of timecode
emit durationChanged(m_mltProducer->get_playtime());
//m_connectTimer->start( 1000 );
connectPlaylist();
+ if (position != 0) {
+ m_mltProducer->seek(position);
+ emit rendererPosition((int) position);
+ }
m_generateScenelist = false;
}
QDomElement black = doc.createElement("producer");
black.setAttribute("mlt_service", "colour");
black.setAttribute("colour", "black");
- //black.setAttribute("id", "black");
+ black.setAttribute("id", "black");
black.setAttribute("in", "0");
black.setAttribute("out", "13999");
while (dur > 14000) {
for (int k = 0; k < transitionparams.count(); k++) {
p = transitionparams.item(k).toElement();
if (!p.isNull()) {
- QString paramName = p.attribute("name");
+ QString paramName = p.attribute("name");
// do not add audio mixing transitions
if (paramName == "internal_added" && p.text() == "237") {
transitionAdd = false;
if (transitionAdd) {
// Transition should be added to the scene
ItemInfo transitionInfo;
- QDomElement base = MainWindow::transitions.getEffectByTag(mlt_service);
-
- for (int k = 0; k < transitionparams.count(); k++) {
- p = transitionparams.item(k).toElement();
- if (!p.isNull()) {
- QString paramName = p.attribute("name");
- QString paramValue = p.text();
-
- QDomNodeList params = base.elementsByTagName("parameter");
- for (int i = 0; i < params.count(); i++) {
- QDomElement e = params.item(i).toElement();
- if (!e.isNull() && e.attribute("tag") == paramName) {
- if (e.attribute("type") == "double") {
- QString factor = e.attribute("factor");
- if (!factor.isEmpty()) {
- double val = paramValue.toDouble() * factor.toDouble();
- paramValue = QString::number(val);
- }
- }
- e.setAttribute("value", paramValue);
- break;
- }
- }
- }
- }
-
- /*QDomDocument doc;
- doc.appendChild(doc.importNode(base, true));
- kDebug() << "/////// TRANSITION XML: "<< doc.toString();*/
-
+ QDomElement base = MainWindow::transitions.getEffectByTag(mlt_service);
+
+ for (int k = 0; k < transitionparams.count(); k++) {
+ p = transitionparams.item(k).toElement();
+ if (!p.isNull()) {
+ QString paramName = p.attribute("name");
+ QString paramValue = p.text();
+
+ QDomNodeList params = base.elementsByTagName("parameter");
+ if (paramName != "a_track" && paramName != "b_track") for (int i = 0; i < params.count(); i++) {
+ QDomElement e = params.item(i).toElement();
+ if (!e.isNull() && e.attribute("tag") == paramName) {
+ if (e.attribute("type") == "double") {
+ QString factor = e.attribute("factor");
+ if (!factor.isEmpty()) {
+ double val = paramValue.toDouble() * factor.toDouble();
+ paramValue = QString::number(val);
+ }
+ }
+ e.setAttribute("value", paramValue);
+ break;
+ }
+ }
+ }
+ }
+
+ /*QDomDocument doc;
+ doc.appendChild(doc.importNode(base, true));
+ kDebug() << "/////// TRANSITION XML: "<< doc.toString();*/
+
transitionInfo.startPos = GenTime(e.attribute("in").toInt(), m_doc->fps());
transitionInfo.endPos = GenTime(e.attribute("out").toInt(), m_doc->fps());
transitionInfo.track = b_track;
radialGrad.setColorAt(1, QColor(100, 100, 0, 100));
painter->fillRect(br.intersected(rectInView), QBrush(radialGrad)/*,Qt::Dense4Pattern*/);
#else
- m_gradient.setStart(0, br.y());
- m_gradient.setFinalStop(0, br.bottom());
+ m_gradient.setStart(0, br.y());
+ m_gradient.setFinalStop(0, br.bottom());
painter->fillRect(br.intersected(rectInView), m_gradient);
#endif
painter->setClipRect(option->exposedRect);
- int top = (int)(br.y() + br.height() / 2 - 7);
+ int top = (int)(br.y() + br.height() / 2 - 7);
painter->drawPixmap((int)(br.x() + 10), top, transitionPixmap());
painter->drawPath(resultClipPath.intersected(clippath));
painter->setPen(QColor(0, 0, 0, 180));
- top += painter->fontInfo().pixelSize();
+ top += painter->fontInfo().pixelSize();
painter->drawText((int)br.x() + 31, top + 1, transitionName());
painter->setPen(QColor(255, 255, 255, 180));
painter->drawText((int)br.x() + 30, top, transitionName());
private:
bool m_singleClip;
- QLinearGradient m_gradient;
+ QLinearGradient m_gradient;
QString m_name;
/** contains the transition parameters */
QDomElement m_parameters;
void TransitionSettings::slotTransitionChanged(bool reinit) {
QDomElement e = m_usedTransition->toXML().cloneNode().toElement();
- if (reinit) {
- QDomElement newTransition = MainWindow::transitions.getEffectByName(ui.listWidget->currentItem()->text());
- slotUpdateEffectParams(e, newTransition);
- emit transferParamDesc(newTransition, 0, 0);
- }
- else {
- //slotUpdateEffectParams(e, e);
- emit transferParamDesc(e, 0, 0);
- }
+ if (reinit) {
+ QDomElement newTransition = MainWindow::transitions.getEffectByName(ui.listWidget->currentItem()->text());
+ slotUpdateEffectParams(e, newTransition);
+ emit transferParamDesc(newTransition, 0, 0);
+ } else {
+ //slotUpdateEffectParams(e, e);
+ emit transferParamDesc(e, 0, 0);
+ }
}
void TransitionSettings::slotTransitionItemSelected(Transition* t) {
setEnabled(t != NULL);
if (t == m_usedTransition) {
- return;
- }
+ return;
+ }
m_usedTransition = t;
if (m_usedTransition) {
QList<QListWidgetItem*> list = ui.listWidget->findItems(m_usedTransition->transitionName(), Qt::MatchExactly);