if (info.cropStart + (info.endPos - info.startPos) == m_cropStart + m_cropDuration) duplicate->slotSetEndThumb(m_endPix);
}
//kDebug() << "// CLoning clip: " << (info.cropStart + (info.endPos - info.startPos)).frames(m_fps) << ", CURRENT end: " << (cropStart() + duration()).frames(m_fps);
- duplicate->setEffectList(m_effectList.clone());
+ duplicate->setEffectList(m_effectList);
duplicate->setVideoOnly(m_videoOnly);
duplicate->setAudioOnly(m_audioOnly);
//duplicate->setSpeed(m_speed);
void ClipItem::setEffectList(const EffectsList effectList)
{
- m_effectList = effectList;
+ m_effectList.clone(effectList);
m_effectNames = m_effectList.effectNames().join(" / ");
if (!m_effectList.isEmpty()) setSelectedEffect(0);
}
-const EffectsList ClipItem::effectList()
+const EffectsList ClipItem::effectList() const
{
return m_effectList;
}
void ClipItem::checkEffectsKeyframesPos(const int previous, const int current, bool fromStart)
{
- for (int i = 0; i < m_effectList.size(); i++) {
+ for (int i = 0; i < m_effectList.count(); i++) {
QDomElement effect = m_effectList.at(i);
QDomNodeList params = effect.elementsByTagName("parameter");
for (int j = 0; j < params.count(); j++) {
int ClipItem::effectsCount()
{
- return m_effectList.size();
+ return m_effectList.count();
}
int ClipItem::hasEffect(const QString &tag, const QString &id) const
return m_effectList.effectNames();
}
-QDomElement ClipItem::effectAt(int ix)
+QDomElement ClipItem::effectAt(int ix) const
{
- if (ix > m_effectList.count() - 1 || ix < 0) return QDomElement();
- return m_effectList.at(ix);
+ if (ix > m_effectList.count() - 1 || ix < 0 || m_effectList.at(ix).isNull()) return QDomElement();
+ return m_effectList.at(ix).cloneNode().toElement();
}
void ClipItem::setEffectAt(int ix, QDomElement effect)
}
}
-EffectsParameterList ClipItem::addEffect(QDomElement effect, bool animate)
+EffectsParameterList ClipItem::addEffect(const QDomElement effect, bool animate)
{
-
bool needRepaint = false;
- /*QDomDocument doc;
- doc.appendChild(doc.importNode(effect, true));
- kDebug() << "/////// CLIP ADD EFFECT: " << doc.toString();*/
m_effectList.append(effect);
-
EffectsParameterList parameters;
parameters.addParam("tag", effect.attribute("tag"));
parameters.addParam("kdenlive_ix", effect.attribute("kdenlive_ix"));
bool needRepaint = false;
QString ix;
- for (int i = 0; i < m_effectList.size(); ++i) {
+ for (int i = 0; i < m_effectList.count(); ++i) {
ix = m_effectList.at(i).attribute("kdenlive_ix");
if (ix == index) {
QString effectId = m_effectList.at(i).attribute("id");
m_effectList.removeAt(i);
i--;
} else if (ix.toInt() > index.toInt()) {
- m_effectList[i].setAttribute("kdenlive_ix", ix.toInt() - 1);
+ m_effectList.item(i).setAttribute("kdenlive_ix", ix.toInt() - 1);
}
}
m_effectNames = m_effectList.effectNames().join(" / ");
//virtual
void ClipItem::dropEvent(QGraphicsSceneDragDropEvent * event)
{
- QString effects = QString(event->mimeData()->data("kdenlive/effectslist"));
+ const QString effects = QString(event->mimeData()->data("kdenlive/effectslist"));
QDomDocument doc;
doc.setContent(effects, true);
- QDomElement e = doc.documentElement();
- CustomTrackView *view = (CustomTrackView *) scene()->views()[0];
- if (view) view->slotAddEffect(e, m_startPos, track());
+ const QDomElement e = doc.documentElement();
+ if (scene() && !scene()->views().isEmpty()) {
+ event->accept();
+ CustomTrackView *view = (CustomTrackView *) scene()->views()[0];
+ if (view) view->slotAddEffect(e, m_startPos, track());
+ }
}
//virtual
void setClipName(const QString &name);
QDomElement xml() const;
ClipItem *clone(ItemInfo info) const;
- const EffectsList effectList();
+ const EffectsList effectList() const;
void setFadeOut(int pos);
void setFadeIn(int pos);
/** Give a string list of the clip's effect names */
QStringList effectNames();
/** Add an effect to the clip and return the parameters that will be passed to Mlt */
- EffectsParameterList addEffect(QDomElement effect, bool animate = true);
+ EffectsParameterList addEffect(const QDomElement effect, bool animate = true);
/** Get the effect parameters that will be passed to Mlt */
EffectsParameterList getEffectArgs(QDomElement effect);
/** Delete effect with id index */
/** return a unique effect id */
int effectsCounter();
/** return the xml of effect at index ix in stack */
- QDomElement effectAt(int ix);
+ QDomElement effectAt(int ix) const;
/** Replace effect at pos ix with given value */
void setEffectAt(int ix, QDomElement effect);
void flashClip();
}
m_blockRefresh = true;
- m_dragItem = NULL;
m_dragGuide = NULL;
bool collision = false;
// Find first clip, transition or group under mouse (when no guides selected)
int ct = 0;
AbstractGroupItem *dragGroup = NULL;
+ AbstractClipItem *collisionClip = NULL;
+ bool found = false;
while (!m_dragGuide && ct < collisionList.count()) {
if (collisionList.at(ct)->type() == AVWIDGET || collisionList.at(ct)->type() == TRANSITIONWIDGET) {
- m_dragItem = static_cast <AbstractClipItem *>(collisionList.at(ct));
+ collisionClip = static_cast <AbstractClipItem *>(collisionList.at(ct));
+ if (collisionClip == m_dragItem) {
+ collisionClip = NULL;
+ } else m_dragItem = collisionClip;
+ found = true;
m_dragItemInfo = m_dragItem->info();
if (m_dragItem->parentItem() && m_dragItem->parentItem()->type() == GROUPWIDGET && m_dragItem->parentItem() != m_selectionGroup) {
// kDebug()<<"// KLIK FOUND GRP: "<<m_dragItem->sceneBoundingRect();
}
ct++;
}
+ if (!found) m_dragItem = NULL;
if (m_dragItem && m_dragItem->type() == TRANSITIONWIDGET) {
// update transition menu action
m_operationMode = SPACER;
} else setCursorPos((int)(mapToScene(event->x(), 0).x()));
QGraphicsView::mousePressEvent(event);
- kDebug() << "END mousePress EVENT ";
return;
}
}
}
- if (m_dragItem->type() == AVWIDGET && !m_dragItem->isItemLocked()) emit clipItemSelected((ClipItem*) m_dragItem);
- else emit clipItemSelected(NULL);
-
bool itemSelected = false;
if (m_dragItem->isSelected()) itemSelected = true;
else if (m_dragItem->parentItem() && m_dragItem->parentItem()->isSelected()) itemSelected = true;
else if (dragGroup && dragGroup->isSelected()) itemSelected = true;
if (event->modifiers() == Qt::ControlModifier || itemSelected == false) {
- resetSelectionGroup();
if (event->modifiers() != Qt::ControlModifier) m_scene->clearSelection();
+ resetSelectionGroup();
dragGroup = NULL;
if (m_dragItem->parentItem() && m_dragItem->parentItem()->type() == GROUPWIDGET) {
//kDebug()<<"// KLIK FOUND GRP: "<<m_dragItem->sceneBoundingRect();
m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1);
}
+ if (collisionClip != NULL || m_dragItem == NULL) {
+ if (m_dragItem && m_dragItem->type() == AVWIDGET && !m_dragItem->isItemLocked()) {
+ kDebug() << "//////// CLIP ITEM SELECTED, TRANSMITTING . . . . . . .";
+ ClipItem *selected = static_cast <ClipItem*>(m_dragItem);
+ emit clipItemSelected(selected);
+ } else emit clipItemSelected(NULL);
+ }
+
// If clicked item is selected, allow move
if (event->modifiers() != Qt::ControlModifier && m_operationMode == NONE/* && (m_dragItem->isSelected() || (dragGroup && dragGroup->isSelected()))*/) QGraphicsView::mousePressEvent(event);
void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event)
{
- kDebug() << "++++++++++++ DBL CLK";
if (m_dragItem && m_dragItem->hasKeyFrames()) {
if (m_moveOpMode == KEYFRAME) {
// user double clicked on a keyframe, open edit dialog
if (d.exec() == QDialog::Accepted) {
int pos = m_document->timecode().getFrameCount(view.kfr_position->text());
m_dragItem->updateKeyFramePos(GenTime(pos, m_document->fps()) + m_dragItem->cropStart(), (double) view.kfr_value->value() * m_dragItem->keyFrameFactor());
- ClipItem *item = (ClipItem *)m_dragItem;
+ ClipItem *item = static_cast <ClipItem *>(m_dragItem);
QString previous = item->keyframes(item->selectedEffectIndex());
item->updateKeyframeEffect();
QString next = item->keyframes(item->selectedEffectIndex());
// add keyframe
GenTime keyFramePos = GenTime((int)(mapToScene(event->pos()).x()), m_document->fps()) - m_dragItem->startPos() + m_dragItem->cropStart();
m_dragItem->addKeyFrame(keyFramePos, mapToScene(event->pos()).toPoint().y());
- ClipItem * item = (ClipItem *) m_dragItem;
+ ClipItem * item = static_cast <ClipItem *>(m_dragItem);
QString previous = item->keyframes(item->selectedEffectIndex());
item->updateKeyframeEffect();
QString next = item->keyframes(item->selectedEffectIndex());
if (strobe == 0) strobe = 1;
doChangeClipSpeed(info, speed, 1.0, strobe, clip->baseClip()->getId());
clip->addEffect(effect);
- emit clipItemSelected(clip);
+ if (clip->isSelected()) emit clipItemSelected(clip);
return;
}
- if (!m_document->renderer()->mltAddEffect(track, pos, clip->addEffect(effect)))
+ EffectsParameterList params = clip->addEffect(effect);
+ if (!m_document->renderer()->mltAddEffect(track, pos, params))
emit displayMessage(i18n("Problem adding effect to clip"), ErrorMessage);
- emit clipItemSelected(clip);
+ if (clip->isSelected()) emit clipItemSelected(clip);
} else emit displayMessage(i18n("Cannot find clip to add effect"), ErrorMessage);
}
int count = 0;
if (track == -1) itemList = scene()->selectedItems();
if (itemList.isEmpty()) {
- ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()) + 1, track);
+ ClipItem *clip = getClipItemAt((int) pos.frames(m_document->fps()), track);
if (clip) itemList.append(clip);
else emit displayMessage(i18n("Select a clip if you want to apply an effect"), ErrorMessage);
}
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);
+ ClipItem *item = static_cast <ClipItem *>(itemList.at(i));
if (effect.attribute("type") == "audio") {
// Don't add audio effects on video clips
if (item->isVideoOnly() || (item->clipType() != AUDIO && item->clipType() != AV && item->clipType() != PLAYLIST)) {
item->baseClip()->addReference();
m_document->updateClip(item->baseClip()->getId());
setDocumentModified();
- kDebug() << "///////// CUTTING CLIP RESULT: (" << item->startPos().frames(25) << "-" << item->endPos().frames(25) << "), DUP: (" << dup->startPos().frames(25) << "-" << dup->endPos().frames(25) << ")" << ", CUT: " << cutTime.frames(25);
- kDebug() << "// CUTTING CLIP dONE";
+ //kDebug() << "///////// CUTTING CLIP RESULT: (" << item->startPos().frames(25) << "-" << item->endPos().frames(25) << "), DUP: (" << dup->startPos().frames(25) << "-" << dup->endPos().frames(25) << ")" << ", CUT: " << cutTime.frames(25);
} else {
// uncut clip
return;
}
- kDebug() << "// UNCUTTING CLIPS: ITEM 1 (" << item->startPos().frames(25) << "x" << item->endPos().frames(25) << ")";
+ /*kDebug() << "// UNCUTTING CLIPS: ITEM 1 (" << item->startPos().frames(25) << "x" << item->endPos().frames(25) << ")";
kDebug() << "// UNCUTTING CLIPS: ITEM 2 (" << dup->startPos().frames(25) << "x" << dup->endPos().frames(25) << ")";
- kDebug() << "// UNCUTTING CLIPS, INFO (" << info.startPos.frames(25) << "x" << info.endPos.frames(25) << ") , CUT: " << cutTime.frames(25);;
+ kDebug() << "// UNCUTTING CLIPS, INFO (" << info.startPos.frames(25) << "x" << info.endPos.frames(25) << ") , CUT: " << cutTime.frames(25);;*/
//deleteClip(dup->info());
void CustomTrackView::slotTransitionUpdated(Transition *tr, QDomElement old)
{
- kDebug() << "TRANS UPDATE, TRACKS: " << old.attribute("transition_btrack") << ", NEW: " << tr->toXML().attribute("transition_btrack");
+ //kDebug() << "TRANS UPDATE, TRACKS: " << old.attribute("transition_btrack") << ", NEW: " << tr->toXML().attribute("transition_btrack");
EditTransitionCommand *command = new EditTransitionCommand(this, tr->track(), tr->startPos(), old, tr->toXML(), false);
m_commandStack->push(command);
setDocumentModified();
else if (clip->isVideoOnly()) prod = clip->baseClip()->videoProducer();
else prod = clip->baseClip()->producer(clipinfo.track);
m_document->renderer()->mltUpdateClipProducer((int)(m_document->tracksCount() - clipinfo.track), clipinfo.startPos.frames(m_document->fps()), prod);
- kDebug() << "// UPDATING CLIP TO TRACK PROD: " << clipinfo.track;
}
} else if (item->type() == TRANSITIONWIDGET) {
Transition *tr = static_cast <Transition *>(item);
bool success = m_document->renderer()->mltMoveClip((int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - m_dragItem->track()), (int) m_dragItemInfo.startPos.frames(m_document->fps()), (int)(m_dragItem->startPos().frames(m_document->fps())), prod);
if (success) {
- kDebug() << "// get trans info";
int tracknumber = m_document->tracksCount() - item->track() - 1;
bool isLocked = m_document->trackInfoAt(tracknumber).isLocked;
if (isLocked) item->setItemLocked(true);
new MoveClipCommand(this, m_dragItemInfo, info, false, moveCommand);
// Also move automatic transitions (on lower track)
Transition *tr = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track);
- kDebug() << "// get trans info2";
if (tr && tr->isAutomatic()) {
ItemInfo trInfo = tr->info();
ItemInfo newTrInfo = trInfo;
//m_document->renderer()->doRefresh();
} else if (m_operationMode == FADEIN) {
// resize fade in effect
- ClipItem * item = (ClipItem *) m_dragItem;
+ ClipItem * item = static_cast <ClipItem *>(m_dragItem);
int ix = item->hasEffect("volume", "fadein");
if (ix != -1) {
QDomElement oldeffect = item->effectAt(ix).cloneNode().toElement();
}
} else if (m_operationMode == FADEOUT) {
// resize fade in effect
- ClipItem * item = (ClipItem *) m_dragItem;
+ ClipItem * item = static_cast <ClipItem *>(m_dragItem);
int ix = item->hasEffect("volume", "fadeout");
if (ix != -1) {
QDomElement oldeffect = item->effectAt(ix).cloneNode().toElement();
}
} else if (m_operationMode == KEYFRAME) {
// update the MLT effect
- ClipItem * item = (ClipItem *) m_dragItem;
+ ClipItem * item = static_cast <ClipItem *>(m_dragItem);
QString previous = item->keyframes(item->selectedEffectIndex());
item->updateKeyframeEffect();
QString next = item->keyframes(item->selectedEffectIndex());
m_selectionGroup->moveBy(offset.frames(m_document->fps()), trackOffset *(qreal) m_tracksHeight);
- kDebug() << "%% GRP NEW POS: " << m_selectionGroup->scenePos().x();
-
QList<QGraphicsItem *> children = m_selectionGroup->childItems();
// Expand groups
int max = children.count();
children += children.at(i)->childItems();
}
}
- kDebug() << "// GRP MOVE; FOUND CHILDREN:" << children.count();
for (int i = 0; i < children.count(); i++) {
// re-add items in correct place
void CustomTrackView::slotRefreshGuides()
{
if (KdenliveSettings::showmarkers()) {
- kDebug() << "// refresh GUIDES";
for (int i = 0; i < m_guides.count(); i++) {
m_guides.at(i)->update();
}
}
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i)->type() == AVWIDGET) {
- ClipItem *dup = static_cast <ClipItem *>(itemList.at(i));
- m_copiedItems.append(dup->clone(dup->info()));
+ ClipItem *clip = static_cast <ClipItem *>(itemList.at(i));
+ ClipItem *clone = clip->clone(clip->info());
+ m_copiedItems.append(clone);
} else if (itemList.at(i)->type() == TRANSITIONWIDGET) {
Transition *dup = static_cast <Transition *>(itemList.at(i));
m_copiedItems.append(dup->clone());
return;
}
ClipItem *clip = static_cast < ClipItem *>(m_copiedItems.at(0));
- EffectsList effects = clip->effectList();
QUndoCommand *paste = new QUndoCommand();
paste->setText("Paste effects");
for (int i = 0; i < clips.count(); ++i) {
if (clips.at(i)->type() == AVWIDGET) {
ClipItem *item = static_cast < ClipItem *>(clips.at(i));
- for (int i = 0; i < clip->effectsCount(); i++) {
- new AddEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), clip->effectAt(i), true, paste);
+ for (int j = 0; j < clip->effectsCount(); j++) {
+ new AddEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), clip->effectAt(j), true, paste);
}
}
}
#include <KLocale>
-EffectsList::EffectsList() :
- QList < QDomElement > ()
+EffectsList::EffectsList()
{
+ m_baseElement = createElement("list");
+ appendChild(m_baseElement);
}
EffectsList::~EffectsList()
QDomElement EffectsList::getEffectByName(const QString & name) const
{
QString effectName;
- for (int i = 0; i < size(); ++i) {
- QDomElement effect = at(i);
+ QDomNodeList effects = m_baseElement.childNodes();
+ for (int i = 0; i < effects.count(); i++) {
+ QDomElement effect = effects.at(i).toElement();
QDomNode namenode = effect.elementsByTagName("name").item(0);
if (!namenode.isNull()) effectName = i18n(namenode.toElement().text().toUtf8().data());
if (name == effectName) {
QDomElement EffectsList::getEffectByTag(const QString & tag, const QString & id) const
{
-
- if (!id.isEmpty()) for (int i = 0; i < size(); ++i) {
- QDomElement effect = at(i);
- //kDebug() << "// SRCH EFFECT; " << id << ", LKING: " << effect.attribute("id");
+ QDomNodeList effects = m_baseElement.childNodes();
+ for (int i = 0; i < effects.count(); i++) {
+ QDomElement effect = effects.at(i).toElement();
+ if (!id.isEmpty()) {
if (effect.attribute("id") == id) {
QDomNodeList params = effect.elementsByTagName("parameter");
for (int i = 0; i < params.count(); i++) {
}
return effect;
}
- }
-
- if (!tag.isEmpty()) for (int i = 0; i < size(); ++i) {
- QDomElement effect = at(i);
+ } else if (!tag.isEmpty()) {
if (effect.attribute("tag") == tag) {
QDomNodeList params = effect.elementsByTagName("parameter");
for (int i = 0; i < params.count(); i++) {
return effect;
}
}
-
+ }
return QDomElement();
}
int EffectsList::hasEffect(const QString & tag, const QString & id) const
{
- for (int i = 0; i < size(); ++i) {
- QDomElement effect = at(i);
+ QDomNodeList effects = m_baseElement.childNodes();
+ for (int i = 0; i < effects.count(); i++) {
+ QDomElement effect = effects.at(i).toElement();
if (!id.isEmpty()) {
if (effect.attribute("id") == id) return i;
} else if (!tag.isEmpty() && effect.attribute("tag") == tag) return i;
QStringList EffectsList::effectIdInfo(const int ix) const
{
QStringList info;
- QDomElement effect = at(ix);
+ QDomElement effect = m_baseElement.childNodes().at(ix).toElement();
QDomNode namenode = effect.elementsByTagName("name").item(0);
info << i18n(namenode.toElement().text().toUtf8().data()) << effect.attribute("tag") << effect.attribute("id");
return info;
QStringList EffectsList::effectNames()
{
QStringList list;
- for (int i = 0; i < size(); ++i) {
- QDomElement effect = at(i);
+ QDomNodeList effects = m_baseElement.childNodes();
+ for (int i = 0; i < effects.count(); i++) {
+ QDomElement effect = effects.at(i).toElement();
QDomNode namenode = effect.elementsByTagName("name").item(0);
if (!namenode.isNull()) list.append(i18n(namenode.toElement().text().toUtf8().data()));
}
QString EffectsList::getInfoFromIndex(const int ix) const
{
QString info;
- QDomElement effect = at(ix);
+ QDomElement effect = m_baseElement.childNodes().at(ix).toElement();
QDomNode namenode = effect.elementsByTagName("description").item(0);
if (!namenode.isNull()) info = i18n(namenode.toElement().text().toUtf8().data());
namenode = effect.elementsByTagName("author").item(0);
return info;
}
+// static
bool EffectsList::hasKeyFrames(QDomElement effect)
{
QDomNodeList params = effect.elementsByTagName("parameter");
return false;
}
-EffectsList EffectsList::clone() const
+void EffectsList::clone(const EffectsList original)
{
- EffectsList list;
- for (int i = 0; i < size(); ++i) {
- list.append(at(i).cloneNode().toElement());
- }
- return list;
+ setContent(original.toString());
+ m_baseElement = documentElement();
}
// static
return QString();
}
+void EffectsList::append(QDomElement e)
+{
+ m_baseElement.appendChild(importNode(e, true));
+}
+
+int EffectsList::count() const
+{
+ return m_baseElement.childNodes().count();
+}
+
+bool EffectsList::isEmpty() const
+{
+ return m_baseElement.childNodes().count() == 0;
+}
+
+const QDomElement EffectsList::at(int ix) const
+{
+ QDomNodeList effects = m_baseElement.childNodes();
+ if (ix >= effects.count()) return QDomElement();
+ return effects.at(ix).toElement();
+}
+
+void EffectsList::removeAt(int ix)
+{
+ QDomNodeList effects = m_baseElement.childNodes();
+ if (ix >= effects.count()) return;
+ m_baseElement.removeChild(effects.at(ix));
+}
+
+QDomElement EffectsList::item(int ix)
+{
+ QDomNodeList effects = m_baseElement.childNodes();
+ if (ix >= effects.count()) return QDomElement();
+ return effects.at(ix).toElement();
+}
+
+void EffectsList::insert(int ix, QDomElement effect)
+{
+ QDomNodeList effects = m_baseElement.childNodes();
+ if (ix >= effects.count()) m_baseElement.appendChild(effect);
+ else m_baseElement.insertBefore(effect, effects.at(ix));
+}
+
#ifndef EFFECTSLIST_H
#define EFFECTSLIST_H
-#include <QList>
-#include <QDomElement>
+#include <QDomDocument>
/**A List for DocClipBase objects. Use this instead of QList<DocClipBase> so as to sort lists correctly.
* Also contains the ability to set a "master clip", which can be used by a number of operations where
*/
-class EffectsList: public QList < QDomElement >
+class EffectsList: public QDomDocument
{
public:
EffectsList();
QStringList effectNames();
QString getInfo(const QString & tag, const QString & id) const;
QString getInfoFromIndex(const int ix) const;
- EffectsList clone() const;
+ void clone(const EffectsList original);
+ void append(QDomElement e);
+ bool isEmpty() const;
+ int count() const;
+ const QDomElement at(int ix) const;
+ void removeAt(int ix);
+ QDomElement item(int ix);
+ void insert(int ix, QDomElement effect);
static bool hasKeyFrames(QDomElement effect);
static void setParameter(QDomElement effect, const QString &name, const QString &value);
static QString parameter(QDomElement effect, const QString &name);
+
+private:
+ QDomElement m_baseElement;
+
};
#endif
void EffectsListView::slotEffectSelected()
{
- QDomElement effect = m_effectsList->currentEffect().cloneNode().toElement();
+ QDomElement effect = m_effectsList->currentEffect();
if (!effect.isNull()) emit addEffect(effect);
}
public slots:
signals:
- void addEffect(QDomElement);
+ void addEffect(const QDomElement);
void reloadEffects();
};
}
}
-QDomElement EffectsListWidget::currentEffect()
+const QDomElement EffectsListWidget::currentEffect() const
{
return itemEffect(currentItem());
}
-QDomElement EffectsListWidget::itemEffect(QListWidgetItem *item)
+const QDomElement EffectsListWidget::itemEffect(QListWidgetItem *item) const
{
QDomElement effect;
if (!item) return effect;
kDebug() << "// EFFECT SELECTED: " << effectInfo;
switch (item->data(TypeRole).toInt()) {
case 1:
- effect = MainWindow::videoEffects.getEffectByTag(effectInfo.at(0), effectInfo.at(1));
+ effect = MainWindow::videoEffects.getEffectByTag(effectInfo.at(0), effectInfo.at(1)).cloneNode().toElement();
break;
case 2:
- effect = MainWindow::audioEffects.getEffectByTag(effectInfo.at(0), effectInfo.at(1));
+ effect = MainWindow::audioEffects.getEffectByTag(effectInfo.at(0), effectInfo.at(1)).cloneNode().toElement();
break;
default:
- effect = MainWindow::customEffects.getEffectByTag(effectInfo.at(0), effectInfo.at(1));
+ effect = MainWindow::customEffects.getEffectByTag(effectInfo.at(0), effectInfo.at(1)).cloneNode().toElement();
break;
}
return effect;
const QList <QListWidgetItem *>list = selectedItems();
QDomDocument doc;
foreach(QListWidgetItem *item, list) {
- QDomElement e = itemEffect(item);
+ const QDomElement e = itemEffect(item);
if (!e.isNull()) doc.appendChild(doc.importNode(e, true));
}
QByteArray data;
//QPixmap pix = qVariantValue<QPixmap>(clickItem->data(Qt::DecorationRole));
//drag->setPixmap(pix);
//drag->setHotSpot(QPoint(0, 50));
- drag->start(Qt::MoveAction);
+ drag->start(Qt::CopyAction);
}
- //event->accept();
+ event->accept();
}
}
void EffectsListWidget::dragMoveEvent(QDragMoveEvent * event)
{
- event->setDropAction(Qt::IgnoreAction);
- //if (item) {
- event->setDropAction(Qt::MoveAction);
+ event->setDropAction(Qt::CopyAction);
if (event->mimeData()->hasText()) {
event->acceptProposedAction();
}
public:
explicit EffectsListWidget(QMenu *menu, QWidget *parent = 0);
virtual ~EffectsListWidget();
- QDomElement currentEffect();
+ const QDomElement currentEffect() const;
QString currentInfo();
- QDomElement itemEffect(QListWidgetItem *item);
+ const QDomElement itemEffect(QListWidgetItem *item) const;
void initList();
protected:
#include <QScrollArea>
-class Boolval: public EffectStackEdit::UiItem, public Ui::Boolval_UI
+class Boolval: public QWidget, public Ui::Boolval_UI
{
};
-class Colorval: public EffectStackEdit::UiItem, public Ui::Colorval_UI
+class Colorval: public QWidget, public Ui::Colorval_UI
{
};
-class Constval: public EffectStackEdit::UiItem, public Ui::Constval_UI
+class Constval: public QWidget, public Ui::Constval_UI
{
};
-class Listval: public EffectStackEdit::UiItem, public Ui::Listval_UI
+class Listval: public QWidget, public Ui::Listval_UI
{
};
-class Wipeval: public EffectStackEdit::UiItem, public Ui::Wipeval_UI
+class Wipeval: public QWidget, public Ui::Wipeval_UI
{
};
vbox1->setSpacing(0);
QScrollArea *area = new QScrollArea;
- QWidget *wid = new QWidget(parent);
+ m_baseWidget = new QWidget(parent);
area->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
area->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
area->setFrameStyle(QFrame::NoFrame);
area->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::MinimumExpanding));
vbox1->addWidget(area);
- area->setWidget(wid);
+ area->setWidget(m_baseWidget);
area->setWidgetResizable(true);
- m_vbox = new QVBoxLayout(wid);
+ m_vbox = new QVBoxLayout(m_baseWidget);
m_vbox->setContentsMargins(0, 0, 0, 0);
m_vbox->setSpacing(0);
//wid->show();
void EffectStackEdit::transferParamDesc(const QDomElement d, int in, int out)
{
- kDebug() << " + + + +DELETING EFFECT STACK";
clearAllItems();
m_params = d;
m_in = in;
m_out = out;
if (m_params.isNull()) {
+ kDebug() << "// EMPTY EFFECT STACK";
return;
}
for (int i = 0; i < namenode.count() ; i++) {
- kDebug() << "in form";
QDomElement pa = namenode.item(i).toElement();
QDomNode na = pa.firstChildElement("name");
QString type = pa.attribute("type");
QString paramName = i18n(na.toElement().text().toUtf8().data());
- QWidget * toFillin = new QWidget;
+ QWidget * toFillin = new QWidget(m_baseWidget);
QString value = pa.attribute("value").isNull() ?
pa.attribute("default") : pa.attribute("value");
m_vbox->addWidget(pl);
m_valueItems[paramName+"complex"] = pl;
connect(pl, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters()));
- m_items.append(pl);
} else if (type == "geometry") {
Geometryval *geo = new Geometryval(m_profile, m_frameSize);
geo->setupParam(pa, minFrame, maxFrame);
m_valueItems[paramName+"geometry"] = geo;
connect(geo, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters()));
connect(geo, SIGNAL(seekToPos(int)), this, SLOT(slotSeekToPos(int)));
- m_items.append(geo);
} else if (type == "keyframe") {
// keyframe editor widget
kDebug() << "min: " << m_in << ", MAX: " << m_out;
m_vbox->addWidget(geo);
m_valueItems[paramName+"keyframe"] = geo;
connect(geo, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters()));
- m_items.append(geo);
} else if (type == "color") {
Colorval *cval = new Colorval;
cval->setupUi(toFillin);
m_vbox->addWidget(posedit);
m_valueItems[paramName+"position"] = posedit;
connect(posedit, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters()));
- m_items.append(posedit);
} else if (type == "wipe") {
Wipeval *wpval = new Wipeval;
wpval->setupUi(toFillin);
}
if (toFillin) {
- m_items.append(toFillin);
m_vbox->addWidget(toFillin);
}
}
void EffectStackEdit::collectAllParameters()
{
if (m_valueItems.isEmpty() || m_params.isNull()) return;
-
const QDomElement oldparam = m_params.cloneNode().toElement();
QDomElement newparam = oldparam.cloneNode().toElement();
QDomNodeList namenode = newparam.elementsByTagName("parameter");
void EffectStackEdit::createSliderItem(const QString& name, int val , int min, int max, const QString suffix)
{
- QWidget* toFillin = new QWidget;
+ QWidget* toFillin = new QWidget(m_baseWidget);
Constval *ctval = new Constval;
ctval->setupUi(toFillin);
ctval->horizontalSlider->setMinimum(min);
m_valueItems[name] = ctval;
m_uiItems.append(ctval);
connect(ctval->horizontalSlider, SIGNAL(valueChanged(int)) , this, SLOT(collectAllParameters()));
- m_items.append(toFillin);
m_vbox->addWidget(toFillin);
}
{
blockSignals(true);
m_valueItems.clear();
-
- while (!m_items.isEmpty()) {
- QWidget * die = m_items.takeFirst();
+ m_uiItems.clear();
+ /*while (!m_items.isEmpty()) {
+ QWidget *die = m_items.takeFirst();
die->disconnect();
delete die;
- }
-
- qDeleteAll(m_uiItems);
- m_uiItems.clear();
- m_items.clear();
- QLayoutItem *item = m_vbox->itemAt(0);
- while (item) {
- m_vbox->removeItem(item);
- delete item;
- item = m_vbox->itemAt(0);
+ }*/
+ //qDeleteAll(m_uiItems);
+ QLayoutItem *child;
+ while ((child = m_vbox->takeAt(0)) != 0) {
+ if (child->widget()) delete child->widget();
+ delete child;
}
blockSignals(false);
}
void updateParameter(const QString &name, const QString &value);
void setFrameSize(QPoint p);
- class UiItem
- {
- public:
- UiItem() {};
- ~UiItem() {};
- };
-
private:
void clearAllItems();
QVBoxLayout *m_vbox;
- QList<QWidget*> m_items;
- QList<UiItem*> m_uiItems;
+ QList<QWidget*> m_uiItems;
+ QWidget *m_baseWidget;
QDomElement m_params;
- QMap<QString, void*> m_valueItems;
+ QMap<QString, QWidget*> m_valueItems;
void createSliderItem(const QString& name, int val , int min, int max, const QString);
wipeInfo getWipeInfo(QString value);
QString getWipeString(wipeInfo info);
else ix = 0;
}
if (m_clipref == NULL) {
+ m_ui.effectlist->blockSignals(true);
m_ui.effectlist->clear();
m_effectedit->transferParamDesc(QDomElement(), 0, 0);
+ m_ui.effectlist->blockSignals(false);
setEnabled(false);
return;
}
QListWidgetItem* item;
for (int i = 0; i < m_clipref->effectsCount(); i++) {
- QDomElement d = m_clipref->effectAt(i);
+ const QDomElement d = m_clipref->effectAt(i);
+ if (d.isNull()) {
+ kDebug() << " . . . . WARNING, NULL EFFECT IN STACK!!!!!!!!!";
+ continue;
+ }
+
+ /*QDomDocument doc;
+ doc.appendChild(doc.importNode(d, true));
+ kDebug() << "IMPORTED STK: " << doc.toString();*/
QDomNode namenode = d.elementsByTagName("name").item(0);
if (!namenode.isNull()) {
else item->setCheckState(Qt::Checked);
}
}
- if (m_clipref->effectsCount() == 0) {
+ if (m_ui.effectlist->count() == 0) {
m_ui.buttonDel->setEnabled(false);
m_ui.buttonSave->setEnabled(false);
m_ui.buttonReset->setEnabled(false);
}
m_ui.effectlist->blockSignals(false);
if (m_ui.effectlist->count() == 0) m_effectedit->transferParamDesc(QDomElement(), 0, 0);
- else slotItemSelectionChanged();
+ else slotItemSelectionChanged(false);
}
-void EffectStackView::slotItemSelectionChanged()
+void EffectStackView::slotItemSelectionChanged(bool update)
{
bool hasItem = m_ui.effectlist->currentItem();
int activeRow = m_ui.effectlist->currentRow();
if (hasItem && m_ui.effectlist->currentItem()->isSelected()) {
m_effectedit->transferParamDesc(m_clipref->effectAt(activeRow), m_clipref->cropStart().frames(KdenliveSettings::project_fps()), m_clipref->cropDuration().frames(KdenliveSettings::project_fps()));//minx max frame
}
- if (m_clipref) m_clipref->setSelectedEffect(activeRow);
+ if (m_clipref && update) m_clipref->setSelectedEffect(activeRow);
m_ui.buttonDel->setEnabled(hasItem);
m_ui.buttonSave->setEnabled(hasItem);
m_ui.buttonReset->setEnabled(hasItem && isChecked);
void slotUpdateEffectParams(const QDomElement, const QDomElement);
private slots:
- void slotItemSelectionChanged();
+ void slotItemSelectionChanged(bool update = true);
void slotItemUp();
void slotItemDown();
void slotItemDel();
connect(m_clipMonitorDock, SIGNAL(visibilityChanged(bool)), m_clipMonitor, SLOT(refreshMonitor(bool)));
//connect(m_monitorManager, SIGNAL(connectMonitors()), this, SLOT(slotConnectMonitors()));
connect(m_monitorManager, SIGNAL(raiseClipMonitor(bool)), this, SLOT(slotRaiseMonitor(bool)));
- connect(m_effectList, SIGNAL(addEffect(QDomElement)), this, SLOT(slotAddEffect(QDomElement)));
+ connect(m_effectList, SIGNAL(addEffect(const QDomElement)), this, SLOT(slotAddEffect(const QDomElement)));
connect(m_effectList, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects()));
m_monitorManager->initMonitors(m_clipMonitor, m_projectMonitor);
KToggleFullScreenAction::setFullScreen(this, actionCollection()->action("fullscreen")->isChecked());
}
-void MainWindow::slotAddEffect(QDomElement effect, GenTime pos, int track)
+void MainWindow::slotAddEffect(const QDomElement effect, GenTime pos, int track)
{
if (!m_activeDocument) return;
if (effect.isNull()) {
kDebug() << "--- ERROR, TRYING TO APPEND NULL EFFECT";
return;
}
- m_activeTimeline->projectView()->slotAddEffect(effect.cloneNode().toElement(), pos, track);
+ QDomElement effectToAdd = effect.cloneNode().toElement();
+ m_activeTimeline->projectView()->slotAddEffect(effectToAdd, pos, track);
}
void MainWindow::slotRaiseMonitor(bool clipMonitor)
collection->addAction("manage_profiles", profilesAction);
connect(profilesAction, SIGNAL(triggered(bool)), this, SLOT(slotEditProfiles()));
-#if KDE_IS_VERSION(4,3,63)
- KNS::standardAction(i18n("Download New Wipes..."), this, SLOT(slotGetNewLumaStuff()), actionCollection(), QString("get_new_lumas"));
-
- KNS::standardAction(i18n("Download New Render Profiles..."), this, SLOT(slotGetNewRenderStuff()), actionCollection(), QString("get_new_profiles"));
-
- KNS::standardAction(i18n("Download New Project Profiles..."), this, SLOT(slotGetNewMltProfileStuff()), actionCollection(), QString("get_new_mlt_profiles"));
-#else
KNS::standardAction(i18n("Download New Wipes..."), this, SLOT(slotGetNewLumaStuff()), actionCollection(), "get_new_lumas");
KNS::standardAction(i18n("Download New Render Profiles..."), this, SLOT(slotGetNewRenderStuff()), actionCollection(), "get_new_profiles");
KNS::standardAction(i18n("Download New Project Profiles..."), this, SLOT(slotGetNewMltProfileStuff()), actionCollection(), "get_new_mlt_profiles");
-#endif
KAction* wizAction = new KAction(KIcon("configure"), i18n("Run Config Wizard"), this);
collection->addAction("run_wizard", wizAction);
void slotRaiseMonitor(bool clipMonitor);
void slotUpdateClip(const QString &id);
void slotUpdateMousePosition(int pos);
- void slotAddEffect(QDomElement effect, GenTime pos = GenTime(), int track = -1);
+ void slotAddEffect(const QDomElement effect, GenTime pos = GenTime(), int track = -1);
void slotEditProfiles();
void slotDetectAudioDriver();
void slotEditProjectSettings();