complexparameter.cpp
titlewidget.cpp
graphicsscenerectmove.cpp
+ effectslistwidget.cpp
)
kde4_add_kcfg_files(kdenlive_SRCS GENERATE_MOC kdenlivesettings.kcfgc )
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QScrollBar>
+#include <QMimeData>
+#include <QApplication>
+
#include <KDebug>
#include <mlt++/Mlt.h>
#include "clipitem.h"
#include "renderer.h"
+#include "events.h"
#include "kdenlivesettings.h"
ClipItem::ClipItem(DocClipBase *clip, int track, int startpos, const QRectF & rect, int duration)
QWidget *widget)
{
painter->setOpacity(m_opacity);
+ if (isSelected()) setBrush(QColor(150, 50, 100));
+ else setBrush(QColor(100, 100, 150));
QRectF br = rect();
QRect rectInView;//this is the rect that is visible by the user
if (scene()->views().size()>0){
painter->setFont(font);
}
- if (isSelected()) painter->fillRect(br.intersected(rectInView), QBrush(QColor(200,20,0,80)));
pen.setColor(Qt::red);
//pen.setStyle(Qt::DashDotDotLine); //Qt::DotLine);
if (isSelected()) painter->setPen(pen);
update(boundingRect());
}
+//virtual
+void ClipItem::dropEvent ( QGraphicsSceneDragDropEvent * event )
+{
+ QString effects = QString(event->mimeData()->data("kdenlive/effectslist"));
+ QDomDocument doc;
+ doc.setContent(effects, true);
+ QDomElement e = doc.documentElement();
+ if (QApplication::activeWindow())
+ QApplication::postEvent(QApplication::activeWindow(), new EffectEvent(GenTime(m_startPos, 25), m_track, e, (QEvent::Type)10010));
+}
+
+//virtual
+void ClipItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
+{
+ kDebug()<<"DRAGÂ EVNET, FORMAT: "<<event->mimeData()->formats();
+ event->setAccepted(event->mimeData()->hasFormat("kdenlive/effectslist"));
+}
+
+void ClipItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
+{
+ Q_UNUSED(event);
+}
// virtual
/*
virtual void mouseMoveEvent ( QGraphicsSceneMouseEvent * event );
virtual void mouseReleaseEvent ( QGraphicsSceneMouseEvent * event );
virtual void mousePressEvent ( QGraphicsSceneMouseEvent * event );
+ virtual void dragEnterEvent(QGraphicsSceneDragDropEvent *event);
+ virtual void dragLeaveEvent(QGraphicsSceneDragDropEvent *event);
+ virtual void dropEvent(QGraphicsSceneDragDropEvent *event);
private:
QDomElement m_xml;
void CustomTrackView::dragEnterEvent( QDragEnterEvent * event )
{
- if (event->mimeData()->hasText()) {
- kDebug()<<"/////////////// DRAG ENTERED, TEXT: "<<event->mimeData()->text();
- QStringList ids = QString(event->mimeData()->text()).split(";");
+ if (event->mimeData()->hasFormat("kdenlive/producerslist")) {
+ kDebug()<<"/////////////// DRAG ENTERED, TEXT: "<<event->mimeData()->data("kdenlive/producerslist");
+ QStringList ids = QString(event->mimeData()->data("kdenlive/producerslist")).split(";");
//TODO: drop of several clips
for (int i = 0; i < ids.size(); ++i) {
}
}
}
-void CustomTrackView::slotAddEffect(QDomElement effect)
+void CustomTrackView::slotAddEffect(QDomElement effect, GenTime pos, int track)
{
- QList<QGraphicsItem *> itemList = items();
+ QList<QGraphicsItem *> itemList;
+ if (track == -1)
+ itemList = items();
+ else {
+ ClipItem *clip = getClipItemAt(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;
for (int i = 0; i < itemList.count(); i++) {
- if (itemList.at(i)->type() == 70000 && itemList.at(i)->isSelected()) {
+ if (itemList.at(i)->type() == 70000 && (itemList.at(i)->isSelected() || track != -1)) {
ClipItem *item = (ClipItem *)itemList.at(i);
// the kdenlive_ix int is used to identify an effect in mlt's playlist, should
// not be changed
}
//if (item) {
event->setDropAction(Qt::MoveAction);
- if (event->mimeData()->hasText()) {
+ if (event->mimeData()->hasFormat("kdenlive/producerslist")) {
event->acceptProposedAction();
}
else QGraphicsView::dragMoveEvent(event);
QStringList qstrList;
// list of accepted mime types for drop
qstrList.append("text/plain");
- qstrList.append("application/x-qabstractitemmodeldatalist");
+ qstrList.append("kdenlive/producerslist");
return qstrList;
}
void deleteClip ( int track, int startpos, const QRectF &rect );
void setScale(double scaleFactor);
void deleteClip(int clipId);
- void slotAddEffect(QDomElement effect);
+ void slotAddEffect(QDomElement effect, GenTime pos, int track);
void addEffect(int track, GenTime pos, QDomElement effect);
void deleteEffect(int track, GenTime pos, QDomElement effect);
void updateEffect(int track, GenTime pos, QDomElement effect);
#include "effectslistview.h"
-#define EFFECT_VIDEO 1
-#define EFFECT_AUDIO 2
-#define EFFECT_CUSTOM 3
-
EffectsListView::EffectsListView(EffectsList *audioEffectList, EffectsList *videoEffectList, EffectsList *customEffectList, QWidget *parent)
- : QWidget(parent), m_audioList(audioEffectList), m_videoList(videoEffectList), m_customList(customEffectList)
+ : QWidget(parent)
{
+ m_effectsList = new EffectsListWidget(audioEffectList, videoEffectList, customEffectList);
+
ui.setupUi(this);
- ui.effectlist->setSortingEnabled(true);
- ui.search_effect->setListWidget(ui.effectlist);
+ QVBoxLayout *lyr = new QVBoxLayout(ui.effectlistframe);
+ lyr->addWidget(m_effectsList);
+ ui.search_effect->setListWidget(m_effectsList);
ui.buttonInfo->setIcon(KIcon("help-about"));
ui.infopanel->hide();
- initList();
-
connect(ui.type_combo, SIGNAL(currentIndexChanged(int)), this, SLOT(filterList(int)));
connect (ui.buttonInfo, SIGNAL (clicked()), this, SLOT (showInfoPanel()));
- connect(ui.effectlist, SIGNAL(itemSelectionChanged()), this, SLOT(slotUpdateInfo()));
- connect(ui.effectlist, SIGNAL(doubleClicked(QListWidgetItem *,const QPoint &)), this, SLOT(slotEffectSelected()));
+ connect(m_effectsList, SIGNAL(itemSelectionChanged()), this, SLOT(slotUpdateInfo()));
+ connect(m_effectsList, SIGNAL(doubleClicked(QListWidgetItem *,const QPoint &)), this, SLOT(slotEffectSelected()));
- ui.effectlist->setCurrentRow(0);
+ m_effectsList->setCurrentRow(0);
}
-void EffectsListView::initList()
-{
- ui.effectlist->clear();
- QStringList names = m_videoList->effectNames();
- QListWidgetItem *item;
- foreach (QString str, names) {
- item = new QListWidgetItem(str, ui.effectlist);
- item->setData(Qt::UserRole, QString::number((int) EFFECT_VIDEO));
- }
-
- names = m_audioList->effectNames();
- foreach (QString str, names) {
- item = new QListWidgetItem(str, ui.effectlist);
- item->setData(Qt::UserRole, QString::number((int) EFFECT_AUDIO));
- }
-
- names = m_customList->effectNames();
- foreach (QString str, names) {
- item = new QListWidgetItem(str, ui.effectlist);
- item->setData(Qt::UserRole, QString::number((int) EFFECT_CUSTOM));
- }
-}
void EffectsListView::filterList(int pos)
{
QListWidgetItem *item;
- for (int i = 0; i < ui.effectlist->count(); i++)
+ for (int i = 0; i < m_effectsList->count(); i++)
{
- item = ui.effectlist->item(i);
+ item = m_effectsList->item(i);
if (pos == 0) item->setHidden(false);
else if (item->data(Qt::UserRole).toInt() == pos) item->setHidden(false);
else item->setHidden(true);
}
- item = ui.effectlist->currentItem();
+ item = m_effectsList->currentItem();
if (item) {
if (item->isHidden()) {
int i;
- for (i = 0; i < ui.effectlist->count() && ui.effectlist->item(i)->isHidden(); i++);
- ui.effectlist->setCurrentRow(i);
+ for (i = 0; i < m_effectsList->count() && m_effectsList->item(i)->isHidden(); i++);
+ m_effectsList->setCurrentRow(i);
}
- else ui.effectlist->scrollToItem(item);
+ else m_effectsList->scrollToItem(item);
}
}
void EffectsListView::slotEffectSelected()
{
- QListWidgetItem *item = ui.effectlist->currentItem();
- if (!item) return;
- QDomElement effect;
- switch (item->data(Qt::UserRole).toInt())
- {
- case 1:
- effect = m_videoList->getEffectByName(ui.effectlist->currentItem()->text());
- break;
- case 2:
- effect = m_audioList->getEffectByName(ui.effectlist->currentItem()->text());
- break;
- default:
- effect = m_customList->getEffectByName(ui.effectlist->currentItem()->text());
- break;
- }
- emit addEffect(effect);
+ QDomElement effect = m_effectsList->currentEffect();
+ if (!effect.isNull()) emit addEffect(effect);
}
void EffectsListView::slotUpdateInfo()
{
- QListWidgetItem *item = ui.effectlist->currentItem();
- if (!item) return;
- QString info;
- switch (item->data(Qt::UserRole).toInt())
- {
- case 1:
- info = m_videoList->getInfo(ui.effectlist->currentItem()->text());
- break;
- case 2:
- info = m_audioList->getInfo(ui.effectlist->currentItem()->text());
- break;
- default:
- info = m_customList->getInfo(ui.effectlist->currentItem()->text());
- break;
- }
- ui.infopanel->setText(info);
+ QString info = m_effectsList->currentInfo();
+ if (!info.isEmpty()) ui.infopanel->setText(info);
}
KListWidget *EffectsListView::listView()
{
- return ui.effectlist;
+ return m_effectsList;
}
#include "effectslistview.moc"
#include <KIcon>
#include "ui_effectlist_ui.h"
+#include "effectslistwidget.h"
+#include "gentime.h"
#include "effectslist.h"
class EffectsListView : public QWidget
public:
EffectsListView(EffectsList *audioEffectList, EffectsList *videoEffectList, EffectsList *customEffectList, QWidget *parent=0);
KListWidget *listView();
+ //void slotAddEffect(GenTime pos, int track, QString name);
private:
Ui::EffectList_UI ui;
- EffectsList *m_audioList;
- EffectsList *m_videoList;
- EffectsList *m_customList;
+ EffectsListWidget *m_effectsList;
private slots:
- void initList();
void filterList(int pos);
void slotUpdateInfo();
void showInfoPanel();
signals:
void addEffect(QDomElement);
-
};
#endif
--- /dev/null
+/***************************************************************************
+ * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
+ ***************************************************************************/
+
+#include "QApplication"
+#include "QMouseEvent"
+
+#include "KDebug"
+
+#include "effectslistwidget.h"
+
+#define EFFECT_VIDEO 1
+#define EFFECT_AUDIO 2
+#define EFFECT_CUSTOM 3
+
+EffectsListWidget::EffectsListWidget(EffectsList *audioEffectList, EffectsList *videoEffectList, EffectsList *customEffectList, QWidget *parent)
+ : KListWidget(parent), m_audioList(audioEffectList), m_videoList(videoEffectList), m_customList(customEffectList)
+{
+ //setSelectionMode(QAbstractItemView::ExtendedSelection);
+ //setDragDropMode(QAbstractItemView::DragDrop);
+ setDropIndicatorShown(true);
+ setAlternatingRowColors(true);
+ setSortingEnabled(true);
+ setDragEnabled(true);
+ setAcceptDrops(true);
+ initList();
+}
+
+EffectsListWidget::~EffectsListWidget()
+{
+}
+
+void EffectsListWidget::initList()
+{
+ clear();
+ QStringList names = m_videoList->effectNames();
+ QListWidgetItem *item;
+ foreach (QString str, names) {
+ item = new QListWidgetItem(str, this);
+ item->setData(Qt::UserRole, QString::number((int) EFFECT_VIDEO));
+ }
+
+ names = m_audioList->effectNames();
+ foreach (QString str, names) {
+ item = new QListWidgetItem(str, this);
+ item->setData(Qt::UserRole, QString::number((int) EFFECT_AUDIO));
+ }
+
+ names = m_customList->effectNames();
+ foreach (QString str, names) {
+ item = new QListWidgetItem(str, this);
+ item->setData(Qt::UserRole, QString::number((int) EFFECT_CUSTOM));
+ }
+}
+
+QDomElement EffectsListWidget::currentEffect()
+{
+ return itemEffect(currentItem());
+}
+
+QDomElement EffectsListWidget::itemEffect(QListWidgetItem *item)
+{
+ QDomElement effect;
+ if (!item) return effect;
+ switch (item->data(Qt::UserRole).toInt())
+ {
+ case 1:
+ effect = m_videoList->getEffectByName(item->text());
+ break;
+ case 2:
+ effect = m_audioList->getEffectByName(item->text());
+ break;
+ default:
+ effect = m_customList->getEffectByName(item->text());
+ break;
+ }
+ return effect;
+}
+
+
+QString EffectsListWidget::currentInfo()
+{
+ QListWidgetItem *item = currentItem();
+ if (!item) return QString();
+ QString info;
+ switch (item->data(Qt::UserRole).toInt())
+ {
+ case 1:
+ info = m_videoList->getInfo(item->text());
+ break;
+ case 2:
+ info = m_audioList->getInfo(item->text());
+ break;
+ default:
+ info = m_customList->getInfo(item->text());
+ break;
+ }
+ return info;
+}
+
+// virtual
+void EffectsListWidget::mousePressEvent(QMouseEvent *event)
+{
+ if( event->button() == Qt::LeftButton )
+ {
+ this->m_DragStartPosition = event->pos();
+ m_dragStarted = true;
+ }
+ KListWidget::mousePressEvent(event);
+}
+
+// virtual
+void EffectsListWidget::mouseMoveEvent(QMouseEvent *event)
+{
+ if (!m_dragStarted) return;
+ if ((event->pos() - m_DragStartPosition).manhattanLength()
+ < QApplication::startDragDistance())
+ return;
+
+ {
+ QListWidgetItem *clickItem = itemAt(event->pos());
+ if (clickItem) {
+ QDrag *drag = new QDrag(this);
+ QMimeData *mimeData = new QMimeData;
+ QList <QListWidgetItem *> list;
+ list = selectedItems();
+ QDomDocument doc;
+ foreach (QListWidgetItem *item, list) {
+ doc.appendChild(doc.importNode(itemEffect(item), true));
+ }
+ QByteArray data;
+ data.append(doc.toString().toUtf8());
+ mimeData->setData("kdenlive/effectslist", data );
+ drag->setMimeData(mimeData);
+ //drag->setPixmap(clickItem->icon(0).pixmap(50 *16/9.0, 50));
+ drag->setHotSpot(QPoint(0, 50));
+ drag->start(Qt::MoveAction);
+ }
+ //event->accept();
+ }
+}
+
+void EffectsListWidget::dragMoveEvent(QDragMoveEvent * event) {
+ event->setDropAction(Qt::IgnoreAction);
+ //if (item) {
+ event->setDropAction(Qt::MoveAction);
+ if (event->mimeData()->hasText()) {
+ event->acceptProposedAction();
+ }
+ //}
+}
+
+
+
+#include "effectslistwidget.moc"
--- /dev/null
+/***************************************************************************
+ * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
+ ***************************************************************************/
+
+
+#ifndef EFFECTLISTWIDGET_H
+#define EFFECTLISTWIDGET_H
+
+#include <KListWidget>
+#include "effectslist.h"
+
+class EffectsListWidget : public KListWidget
+{
+ Q_OBJECT
+
+ public:
+ EffectsListWidget(EffectsList *audioEffectList, EffectsList *videoEffectList, EffectsList *customEffectList, QWidget *parent=0);
+ virtual ~EffectsListWidget();
+ QDomElement currentEffect();
+ QString currentInfo();
+ QDomElement itemEffect(QListWidgetItem *item);
+
+ protected:
+ virtual void mousePressEvent(QMouseEvent *event);
+ virtual void mouseMoveEvent(QMouseEvent *event);
+ virtual void dragMoveEvent(QDragMoveEvent *event);
+
+ private:
+ bool m_dragStarted;
+ QPoint m_DragStartPosition;
+ EffectsList *m_audioList;
+ EffectsList *m_videoList;
+ EffectsList *m_customList;
+ void initList();
+
+ };
+
+#endif
#include <QEvent>
+#include "gentime.h"
+
class ProgressEvent : public QEvent {
public:
ProgressEvent( int value, QEvent::Type eventType )
};
+
+class EffectEvent : public QEvent {
+public:
+ EffectEvent( GenTime pos, int track, QDomElement xml, QEvent::Type eventType )
+ : QEvent( eventType ), m_pos( pos ), m_track(track), m_xml(xml) {
+ if (xml.isNull()) kDebug()<<"--- ERROR, TRYING TO APPEND NULL EFFECT EVENT";
+ if (m_xml.isNull()) kDebug()<<"--- ERROR, TRYING TO APPEND NULL EFFECT EVENT 2";
+ };
+ GenTime pos() const { return m_pos; };
+ int track() const { return m_track; };
+ QDomElement xml() const { return m_xml; };
+private:
+ GenTime m_pos;
+ int m_track;
+ QDomElement m_xml;
+
+};
+
#endif
}
}
-void MainWindow::slotAddEffect(QDomElement effect)
+void MainWindow::slotAddEffect(QDomElement effect, GenTime pos, int track)
{
if (!m_activeDocument) return;
/*QMap <QString, QString> filter;
filter = m_audioEffects.effect(effectName);
else
filter = m_customEffects.effect(effectName);*/
+ if (effect.isNull()) {
+ kDebug()<<"--- ERROR, TRYING TO APPEND NULL EFFECT";
+ return;
+ }
TrackView *currentTimeLine = (TrackView *) m_timelineArea->currentWidget();
- currentTimeLine->projectView()->slotAddEffect(effect);
+ currentTimeLine->projectView()->slotAddEffect(effect, pos, track);
}
void MainWindow::slotRaiseMonitor(bool clipMonitor)
statusProgressBar->setVisible(false);
}
}
+ if (event->type()==10010){
+ EffectEvent* p=(EffectEvent*) event;
+ slotAddEffect(p->xml(), p->pos(), p->track());
+ }
+
}
#include "mainwindow.moc"
void slotRaiseMonitor(bool clipMonitor);
void slotSetClipDuration(int id, int duration);
void slotUpdateMousePosition(int pos);
- void slotAddEffect(QDomElement effect);
+ void slotAddEffect(QDomElement effect, GenTime pos = GenTime(), int track = -1);
void slotEditProfiles();
void slotEditProjectSettings();
void slotDisplayActionMessage( QAction *a);
if (!((ProjectItem *) item)->isGroup())
ids.append(QString::number(((ProjectItem *) item)->clipId()));
}
- //QByteArray data;
- //data.append(doc.toString().toUtf8());
- //mimeData->setData("kdenlive/westley",data );
- mimeData->setText(ids.join(";")); //doc.toString());
+ QByteArray data;
+ data.append(ids.join(";").toUtf8()); //doc.toString().toUtf8());
+ mimeData->setData("kdenlive/producerslist",data );
+ //mimeData->setText(ids.join(";")); //doc.toString());
//mimeData->setImageData(image);
drag->setMimeData(mimeData);
drag->setPixmap(clickItem->icon(0).pixmap(50 *16/9.0, 50));
</rect>
</property>
<layout class="QGridLayout" name="gridLayout" >
- <property name="margin" >
- <number>0</number>
- </property>
<item row="0" column="0" >
<widget class="KComboBox" name="type_combo" >
<item>
</widget>
</item>
<item row="1" column="0" colspan="3" >
- <widget class="QSplitter" name="splitter" >
- <property name="orientation" >
- <enum>Qt::Vertical</enum>
+ <widget class="QFrame" name="effectlistframe" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Expanding" hsizetype="Preferred" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="3" >
+ <widget class="QTextEdit" name="infopanel" >
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="readOnly" >
+ <bool>true</bool>
</property>
- <widget class="KListWidget" name="effectlist" >
- <property name="dragEnabled" >
- <bool>true</bool>
- </property>
- <property name="alternatingRowColors" >
- <bool>true</bool>
- </property>
- </widget>
- <widget class="QTextEdit" name="infopanel" >
- <property name="frameShape" >
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow" >
- <enum>QFrame::Sunken</enum>
- </property>
- <property name="readOnly" >
- <bool>true</bool>
- </property>
- </widget>
</widget>
</item>
</layout>
<extends>QComboBox</extends>
<header>kcombobox.h</header>
</customwidget>
- <customwidget>
- <class>KListWidget</class>
- <extends>QListWidget</extends>
- <header>klistwidget.h</header>
- </customwidget>
<customwidget>
<class>KListWidgetSearchLine</class>
<extends>KLineEdit</extends>