}
void CustomTrackView::dragEnterEvent(QDragEnterEvent * event) {
- if (event->mimeData()->hasFormat("kdenlive/producerslist")) {
+ if (event->mimeData()->hasFormat("kdenlive/clip")) {
+ QStringList list = QString(event->mimeData()->data("kdenlive/clip")).split(";");
+ kDebug() << "DRAG ENTER EVENT, DATA: " << list;
+ DocClipBase *clip = m_document->getBaseClip(list.at(0));
+ if (clip == NULL) kDebug() << " WARNING))))))))) CLIP NOT FOUND : " << list.at(0);
+ addItem(clip, event->pos(), QPoint(list.at(1).toInt(), list.at(2).toInt()));
+ event->acceptProposedAction();
+ } else 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
scene()->addItem(m_dropItem);
}
+void CustomTrackView::addItem(DocClipBase *clip, QPoint pos, QPoint zone) {
+ ItemInfo info;
+ info.startPos = GenTime((int)(mapToScene(pos).x()), m_document->fps());
+ info.cropStart = GenTime(zone.x(), m_document->fps());
+ info.endPos = info.startPos + GenTime(zone.y() - zone.x(), m_document->fps());
+ info.track = (int)(pos.y() / m_tracksHeight);
+ kDebug() << "------------ ADDING CLIP ZONE ITEM----: " << zone;
+ m_dropItem = new ClipItem(clip, info, m_document->fps());
+ scene()->addItem(m_dropItem);
+}
+
void CustomTrackView::dragMoveEvent(QDragMoveEvent * event) {
event->setDropAction(Qt::IgnoreAction);
int pos = mapToScene(event->pos()).x();
m_dropItem->setPos(pos, track * m_tracksHeight + 1);
event->setDropAction(Qt::MoveAction);
- if (event->mimeData()->hasFormat("kdenlive/producerslist")) {
+ if (event->mimeData()->hasFormat("kdenlive/producerslist") || event->mimeData()->hasFormat("kdenlive/clip")) {
event->acceptProposedAction();
}
} else {
// list of accepted mime types for drop
qstrList.append("text/plain");
qstrList.append("kdenlive/producerslist");
+ qstrList.append("kdenlive/clip");
return qstrList;
}
KdenliveDoc *m_document;
CustomTrackScene *m_scene;
void addItem(DocClipBase *clip, QPoint pos);
+ void addItem(DocClipBase *clip, QPoint pos, QPoint zone);
QGraphicsLineItem *m_cursorLine;
ItemInfo m_dragItemInfo;
OPERATIONTYPE m_operationMode;
#include "docclipbase.h"
Monitor::Monitor(QString name, MonitorManager *manager, QWidget *parent)
- : QWidget(parent), render(NULL), m_monitorManager(manager), m_name(name), m_isActive(false), m_currentClip(NULL) {
+ : QWidget(parent), render(NULL), m_monitorManager(manager), m_name(name), m_isActive(false), m_currentClip(NULL), m_dragStarted(false) {
ui.setupUi(this);
m_scale = 1;
m_ruler = new SmallRuler();
// virtual
void Monitor::mousePressEvent(QMouseEvent * event) {
if (event->button() != Qt::RightButton) {
- if (ui.video_frame->underMouse()) slotPlay();
+ if (ui.video_frame->underMouse()) {
+ m_dragStarted = true;
+ m_DragStartPosition = event->pos();
+ }
} else m_contextMenu->popup(event->globalPos());
}
+// virtual
+void Monitor::mouseReleaseEvent(QMouseEvent * event) {
+ if (m_dragStarted) {
+ if (ui.video_frame->underMouse()) {
+ slotPlay();
+ } else QWidget::mouseReleaseEvent(event);
+ m_dragStarted = false;
+ }
+}
+
+
+// virtual
+void Monitor::mouseMoveEvent(QMouseEvent *event) {
+ kDebug() << "// DRAG STARTED, MOUSE MOVED: ";
+ if (!m_dragStarted || m_currentClip == NULL) return;
+
+ if ((event->pos() - m_DragStartPosition).manhattanLength()
+ < QApplication::startDragDistance())
+ return;
+
+ {
+ QDrag *drag = new QDrag(this);
+ QMimeData *mimeData = new QMimeData;
+
+ QStringList list;
+ list.append(m_currentClip->getId());
+ QPoint p = m_ruler->zone();
+ list.append(QString::number(p.x()));
+ list.append(QString::number(p.y()));
+ QByteArray data;
+ data.append(list.join(";").toUtf8());
+ mimeData->setData("kdenlive/clip", data);
+ drag->setMimeData(mimeData);
+ QPixmap pix = m_currentClip->thumbnail();
+ drag->setPixmap(pix);
+ drag->setHotSpot(QPoint(0, 50));
+ drag->start(Qt::MoveAction);
+
+ //Qt::DropAction dropAction;
+ //dropAction = drag->start(Qt::CopyAction | Qt::MoveAction);
+
+ //Qt::DropAction dropAction = drag->exec();
+
+ }
+ //event->accept();
+}
+
+/*void Monitor::dragMoveEvent(QDragMoveEvent * event) {
+ event->setDropAction(Qt::IgnoreAction);
+ event->setDropAction(Qt::MoveAction);
+ if (event->mimeData()->hasText()) {
+ event->acceptProposedAction();
+ }
+}
+
+Qt::DropActions Monitor::supportedDropActions() const {
+ // returns what actions are supported when dropping
+ return Qt::MoveAction;
+}*/
+
+QStringList Monitor::mimeTypes() const {
+ QStringList qstrList;
+ // list of accepted mime types for drop
+ qstrList.append("kdenlive/clip");
+ return qstrList;
+}
+
+
// virtual
void Monitor::wheelEvent(QWheelEvent * event) {
if (event->modifiers() == Qt::ControlModifier) {
protected:
virtual void mousePressEvent(QMouseEvent * event);
+ virtual void mouseReleaseEvent(QMouseEvent * event);
virtual void wheelEvent(QWheelEvent * event);
+ virtual void mouseMoveEvent(QMouseEvent *event);
+ virtual QStringList mimeTypes() const;
+ /* virtual void dragMoveEvent(QDragMoveEvent * event);
+ virtual Qt::DropActions supportedDropActions() const;*/
+
// virtual void resizeEvent(QResizeEvent * event);
// virtual void paintEvent(QPaintEvent * event);
QAction *m_playAction;
QMenu *m_contextMenu;
DocClipBase *m_currentClip;
+ QPoint m_DragStartPosition;
+ bool m_dragStarted;
private slots:
void adjustRulerSize(int length);
}
}
+// virtual
void ProjectListView::dragMoveEvent(QDragMoveEvent * event) {
QTreeWidgetItem * item = itemAt(event->pos());
event->setDropAction(Qt::IgnoreAction);
mlt_service_lock(service.get_service());
Mlt::Producer trackProducer(tractor.track(info.track));
Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
-
- Mlt::Producer *clip = prod->cut(info.cropStart.frames(m_fps), (info.endPos - info.startPos).frames(m_fps) - 1);
+ //kDebug()<<"/// INSERT cLIP: "<<info.cropStart.frames(m_fps)<<", "<<info.startPos.frames(m_fps)<<"-"<<info.endPos.frames(m_fps);
+ Mlt::Producer *clip = prod->cut((int) info.cropStart.frames(m_fps), (int)(info.endPos - info.startPos + info.cropStart).frames(m_fps) - 1);
int newIndex = trackPlaylist.insert_at((int) info.startPos.frames(m_fps), *clip, 1);
if (QString(prod->get("transparency")).toInt() == 1)
void SmallRuler::setZone(int start, int end) {
if (start != -1) {
- if (end != -1 && start >= end) return;
- else if (end == -1 && start >= m_zoneEnd) return;
- m_zoneStart = start;
+ if (end != -1 && start >= end) {
+ m_zoneEnd = qMin(m_maxval, end + (start - m_zoneStart));
+ m_zoneStart = start;
+ } else if (end == -1 && start >= m_zoneEnd) {
+ m_zoneEnd = qMin(m_maxval, m_zoneEnd + (start - m_zoneStart));
+ m_zoneStart = start;
+ } else m_zoneStart = start;
}
if (end != -1) {
- if (start != -1 && end <= start) end = m_zoneEnd;
- else if (start == -1 && end <= m_zoneStart) end = m_zoneEnd;
- m_zoneEnd = end;
+ if (start != -1 && end <= start) {
+ m_zoneStart = qMax(0, start - (m_zoneEnd - end));
+ m_zoneEnd = end;
+ } else if (start == -1 && end <= m_zoneStart) {
+ m_zoneStart = qMax(0, m_zoneStart - (m_zoneEnd - end));
+ m_zoneEnd = end;
+ } else m_zoneEnd = end;
}
update();
}