#include "addclipcommand.h"
-AddClipCommand::AddClipCommand(ProjectList *list, const QStringList &names, const QDomElement &xml, const int id, const KUrl &url, bool doIt)
- : m_list(list), m_names(names), m_xml(xml), m_id(id), m_url(url), m_doIt(doIt) {
+AddClipCommand::AddClipCommand(ProjectList *list, const QStringList &names, const QDomElement &xml, const int id, const KUrl &url, const QString &group, bool doIt)
+ : m_list(list), m_names(names), m_xml(xml), m_id(id), m_url(url), m_group(group), m_doIt(doIt) {
if (doIt) setText(i18n("Add clip"));
else setText(i18n("Delete clip"));
}
if (!m_list) kDebug()<<"---- ERROR, NO LIST FOR undoing action";
kDebug()<<"---- undoing action";
if (m_doIt) m_list->deleteClip(m_id);
- else m_list->addClip(m_names, m_xml, m_id, m_url);
+ else m_list->addClip(m_names, m_xml, m_id, m_url, m_group);
}
// virtual
void AddClipCommand::redo()
{
if (!m_list) kDebug()<<"---- ERROR, NO LIST FOR redoing action";
kDebug()<<"---- redoing action";
- if (m_doIt) m_list->addClip(m_names, m_xml, m_id, m_url);
+ if (m_doIt) m_list->addClip(m_names, m_xml, m_id, m_url, m_group);
else m_list->deleteClip(m_id);
}
class AddClipCommand : public QUndoCommand
{
public:
- AddClipCommand(ProjectList *list, const QStringList &names, const QDomElement &xml, const int id, const KUrl &url, bool doIt);
+ AddClipCommand(ProjectList *list, const QStringList &names, const QDomElement &xml, const int id, const KUrl &url, const QString &group, bool doIt);
virtual void undo();
virtual void redo();
int m_id;
KUrl m_url;
bool m_doIt;
+ QString m_group;
};
#endif
}
}
-ProjectItem::ProjectItem(QTreeWidget * parent, const QStringList & strings)
- : QTreeWidgetItem(parent, strings, QTreeWidgetItem::UserType), m_element(QDomElement()), m_clipType(DocClipBase::NONE), m_clipId(-1), m_isGroup(true)
+ProjectItem::ProjectItem(QTreeWidget * parent, const QStringList & strings, int clipId)
+ : QTreeWidgetItem(parent, strings, QTreeWidgetItem::UserType), m_element(QDomElement()), m_clipType(DocClipBase::NONE), m_clipId(clipId), m_isGroup(true)
{
setSizeHint(0, QSize(65, 45));
setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled);
{
}
-int ProjectItem::clipId()
+ProjectItem *ProjectItem::clone() const
+{
+ ProjectItem *item = (ProjectItem *) this->QTreeWidgetItem::clone();
+ /*if (isGroup())
+ {
+ item = new ProjectItem(new QTreeWidget(), names(), clipId());
+ }
+ else {
+ if (parent())
+ item = new ProjectItem(new QTreeWidgetItem(), names(), toXml().cloneNode().toElement(), clipId());
+ else
+ item = new ProjectItem(new QTreeWidget(), names(), toXml().cloneNode().toElement(), clipId());
+ }*/
+ return item;
+}
+
+int ProjectItem::clipId() const
{
return m_clipId;
}
-bool ProjectItem::isGroup()
+bool ProjectItem::isGroup() const
{
return m_isGroup;
}
+const QString &ProjectItem::groupName() const
+{
+ if (isGroup()) return text(1);
+ else return QString::null;
+}
-QStringList ProjectItem::names()
+QStringList ProjectItem::names() const
{
QStringList result;
result.append(text(0));
return result;
}
-QDomElement ProjectItem::toXml()
+QDomElement ProjectItem::toXml() const
{
return m_element;
}
public:
ProjectItem(QTreeWidget * parent, const QStringList & strings, QDomElement xml, int clipId);
ProjectItem(QTreeWidgetItem * parent, const QStringList & strings, QDomElement xml, int clipId);
- ProjectItem(QTreeWidget * parent, const QStringList & strings);
+ ProjectItem(QTreeWidget * parent, const QStringList & strings, int clipId);
virtual ~ProjectItem();
- QDomElement toXml();
+ QDomElement toXml() const;
void setProperties(const QMap < QString, QString > &attributes, const QMap < QString, QString > &metadata);
- int clipId();
- QStringList names();
- bool isGroup();
+ int clipId() const;
+ QStringList names() const;
+ bool isGroup() const;
+ const QString &groupName() const;
+ virtual ProjectItem *clone() const;
private:
QDomElement m_element;
#include <KAction>
#include <KLocale>
#include <KFileDialog>
+#include <KInputDialog>
#include <nepomuk/resourcemanager.h>
#include <kio/netaccess.h>
addButton->setMenu( addMenu );
addButton->setPopupMode(QToolButton::MenuButtonPopup);
m_toolbar->addWidget (addButton);
-
+
QAction *addClipButton = addMenu->addAction (KIcon("document-new"), i18n("Add Clip"));
connect(addClipButton, SIGNAL(triggered()), this, SLOT(slotAddClip()));
m_editAction = m_toolbar->addAction (KIcon("document-properties"), i18n("Edit Clip"));
connect(m_editAction, SIGNAL(triggered()), this, SLOT(slotEditClip()));
+ QAction *addFolderButton = addMenu->addAction (KIcon("folder-new"), i18n("Create Folder"));
+ connect(addFolderButton, SIGNAL(triggered()), this, SLOT(slotAddFolder()));
+
addButton->setDefaultAction( addClipButton );
layout->addWidget( m_toolbar );
searchView->setTreeWidget(listView);
listView->setColumnCount(3);
- listView->setDragEnabled(true);
- listView->setDragDropMode(QAbstractItemView::DragDrop);
QStringList headers;
headers<<i18n("Thumbnail")<<i18n("Filename")<<i18n("Description");
listView->setHeaderLabels(headers);
m_menu->addAction(addColorClip);
m_menu->addAction(m_editAction);
m_menu->addAction(m_deleteAction);
+ m_menu->addAction(addFolderButton);
m_menu->insertSeparator(m_deleteAction);
connect(listView, SIGNAL(itemSelectionChanged()), this, SLOT(slotClipSelected()));
connect(listView, SIGNAL(requestMenu ( const QPoint &, QTreeWidgetItem * )), this, SLOT(slotContextMenu(const QPoint &, QTreeWidgetItem *)));
connect(listView, SIGNAL(addClip ()), this, SLOT(slotAddClip()));
+ connect(listView, SIGNAL(addClip (QUrl, const QString &)), this, SLOT(slotAddClip(QUrl, const QString &)));
listView->setItemDelegate(new ItemDelegate(listView));
if (!m_commandStack) kDebug()<<"!!!!!!!!!!!!!!!! NO CMD STK";
if (!listView->currentItem()) return;
ProjectItem *item = ((ProjectItem *)listView->currentItem());
- AddClipCommand *command = new AddClipCommand(this, item->names(), item->toXml(), item->clipId(), KUrl(item->data(1, FullPathRole).toString()), false);
+ AddClipCommand *command = new AddClipCommand(this, item->names(), item->toXml(), item->clipId(), KUrl(item->data(1, FullPathRole).toString()), item->groupName(), false);
m_commandStack->push(command);
}
if (item) listView->setCurrentItem(item);
}
-void ProjectList::addClip(const QStringList &name, const QDomElement &elem, const int clipId, const KUrl &url, int parentId)
+void ProjectList::addClip(const QStringList &name, const QDomElement &elem, const int clipId, const KUrl &url, const QString &group, int parentId)
{
kDebug()<<"///////// ADDING VCLIP=: "<<name;
ProjectItem *item;
ProjectItem *groupItem = NULL;
- QString group = elem.attribute("group", QString::null);
+ QString groupName;
+ if (group.isEmpty()) groupName = elem.attribute("group", QString::null);
+ else groupName = group;
+ if (elem.isNull() && url.isEmpty()) {
+ // this is a folder
+ groupName = name.at(1);
+ QList<QTreeWidgetItem *> groupList = listView->findItems(groupName, Qt::MatchExactly, 1);
+ if (groupList.isEmpty()) {
+ (void) new ProjectItem(listView, name, clipId);
+ }
+ return;
+ }
+
if (parentId != -1) {
groupItem = getItemById(parentId);
}
- else if (!group.isEmpty()) {
+ else if (!groupName.isEmpty()) {
// Clip is in a group
- QList<QTreeWidgetItem *> groupList = listView->findItems(group, Qt::MatchExactly, 1);
+ QList<QTreeWidgetItem *> groupList = listView->findItems(groupName, Qt::MatchExactly, 1);
if (groupList.isEmpty()) {
- QStringList groupName;
- groupName<<QString::null<<group;
- kDebug()<<"------- CREATING NEW GRP: "<<groupName;
- groupItem = new ProjectItem(listView, groupName);
+ QStringList itemName;
+ itemName<<QString::null<<groupName;
+ kDebug()<<"------- CREATING NEW GRP: "<<itemName;
+ groupItem = new ProjectItem(listView, itemName, m_clipIdCounter++);
}
else groupItem = (ProjectItem *) groupList.first();
}
if (item) delete item;
}
-void ProjectList::slotAddClip()
+void ProjectList::slotAddFolder()
+{
+ QString folderName = KInputDialog::getText(i18n("New Folder"), i18n("Enter new folder name: "));
+ if (folderName.isEmpty()) return;
+ QStringList itemEntry;
+ itemEntry.append(QString::null);
+ itemEntry.append(folderName);
+ AddClipCommand *command = new AddClipCommand(this, itemEntry, QDomElement(), m_clipIdCounter++, KUrl(), folderName, true);
+ m_commandStack->push(command);
+}
+
+void ProjectList::slotAddClip(QUrl givenUrl, const QString &group)
{
if (!m_commandStack) kDebug()<<"!!!!!!!!!!!!!!!! NO CMD STK";
- KUrl::List list = KFileDialog::getOpenUrls( KUrl(), "application/vnd.kde.kdenlive application/vnd.westley.scenelist application/flv application/vnd.rn-realmedia video/x-dv video/x-msvideo video/mpeg video/x-ms-wmv audio/x-mp3 audio/x-wav application/ogg *.m2t *.dv video/mp4 video/quicktime image/gif image/jpeg image/png image/x-bmp image/svg+xml image/tiff image/x-xcf-gimp image/x-vnd.adobe.photoshop image/x-pcx image/x-exr");
+ KUrl::List list;
+ if (givenUrl.isEmpty())
+ list = KFileDialog::getOpenUrls( KUrl(), "application/vnd.kde.kdenlive application/vnd.westley.scenelist application/flv application/vnd.rn-realmedia video/x-dv video/x-msvideo video/mpeg video/x-ms-wmv audio/x-mp3 audio/x-wav application/ogg *.m2t *.dv video/mp4 video/quicktime image/gif image/jpeg image/png image/x-bmp image/svg+xml image/tiff image/x-xcf-gimp image/x-vnd.adobe.photoshop image/x-pcx image/x-exr");
+ else list.append(givenUrl);
if (list.isEmpty()) return;
KUrl::List::Iterator it;
KUrl url;
QStringList itemEntry;
itemEntry.append(QString::null);
itemEntry.append((*it).fileName());
- AddClipCommand *command = new AddClipCommand(this, itemEntry, QDomElement(), m_clipIdCounter++, *it, true);
+ AddClipCommand *command = new AddClipCommand(this, itemEntry, QDomElement(), m_clipIdCounter++, *it, group, true);
m_commandStack->push(command);
//item = new ProjectItem(listView, itemEntry, QDomElement());
//item->setData(1, FullPathRole, (*it).path());
QStringList itemEntry;
itemEntry.append(QString::null);
itemEntry.append(dia_ui->clip_name->text());
- AddClipCommand *command = new AddClipCommand(this, itemEntry, element, m_clipIdCounter++, KUrl(), true);
+ AddClipCommand *command = new AddClipCommand(this, itemEntry, element, m_clipIdCounter++, KUrl(), QString::null, true);
m_commandStack->push(command);
// ProjectItem *item = new ProjectItem(listView, itemEntry, element, m_clipIdCounter++);
/*QPixmap pix(60, 40);
//kDebug()<<"////// ADDING PRODUCER:\n "<<doc.toString()<<"\n+++++++++++++++++";
int id = producer.attribute("id").toInt();
+ QString groupName = producer.attribute("group");
if (id >= m_clipIdCounter) m_clipIdCounter = id + 1;
else if (id == 0) id = m_clipIdCounter++;
QStringList itemEntry;
itemEntry.append(QString::null);
itemEntry.append(resource.fileName());
- addClip(itemEntry, producer, id, resource, parentId);
+ addClip(itemEntry, producer, id, resource, groupName, parentId);
/*AddClipCommand *command = new AddClipCommand(this, itemEntry, producer, id, resource, true);
m_commandStack->push(command);*/
QStringList itemEntry;
itemEntry.append(QString::null);
itemEntry.append(producer.attribute("name", i18n("Color clip")));
- addClip(itemEntry, producer, id, KUrl(), parentId);
+ addClip(itemEntry, producer, id, KUrl(), groupName, parentId);
/*AddClipCommand *command = new AddClipCommand(this, itemEntry, producer, id, KUrl(), true);
m_commandStack->push(command);*/
//ProjectItem *item = new ProjectItem(listView, itemEntry, producer);
QDomElement producersList();
void setRenderer(Render *projectRender);
- void addClip(const QStringList &name, const QDomElement &elem, const int clipId, const KUrl &url = KUrl(), int parentId = -1);
+ void addClip(const QStringList &name, const QDomElement &elem, const int clipId, const KUrl &url = KUrl(), const QString &group = QString::null, int parentId = -1);
void deleteClip(const int clipId);
public slots:
QAction *m_deleteAction;
private slots:
- void slotAddClip();
+ void slotAddClip(QUrl givenUrl = QUrl(), const QString &group = QString::null);
void slotRemoveClip();
void slotEditClip();
void slotClipSelected();
void slotAddColorClip();
void slotEditClip(QTreeWidgetItem *, int);
void slotContextMenu( const QPoint &pos, QTreeWidgetItem * );
+ void slotAddFolder();
//void slotShowMenu(const QPoint &pos);
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
+#include "QApplication"
+
+#include "KDebug"
+
+#include "projectitem.h"
#include "projectlistview.h"
ProjectListView::ProjectListView(QWidget *parent)
- : QTreeWidget(parent)
+ : QTreeWidget(parent), m_dragStarted(false)
{
-
+ setSelectionMode(QAbstractItemView::ExtendedSelection);
+ setDragDropMode(QAbstractItemView::DragDrop);
+ setDropIndicatorShown(true);
+ setDragEnabled(true);
+ setAcceptDrops(true);
}
ProjectListView::~ProjectListView()
// virtual
void ProjectListView::contextMenuEvent ( QContextMenuEvent * event )
{
- emit requestMenu(event->globalPos(), itemAt(event->pos()));
+ emit requestMenu(event->globalPos(), itemAt(event->pos()));
}
// virtual
void ProjectListView::mouseDoubleClickEvent ( QMouseEvent * event )
{
- if (!itemAt(event->pos())) emit addClip();
+ if (!itemAt(event->pos())) emit addClip();
+}
+
+// virtual
+void ProjectListView::dragEnterEvent(QDragEnterEvent *event)
+{
+ if (event->mimeData()->hasUrls() || event->mimeData()->hasText()) {
+ kDebug()<<"//////////////// DRAG ENTR OK";
+ }
+ event->acceptProposedAction();
+}
+
+// virtual
+void ProjectListView::dropEvent(QDropEvent *event)
+{
+ kDebug()<<"//////////////// DROPPED EVENT";
+ if (event->mimeData()->hasUrls()) {
+ QTreeWidgetItem *item = itemAt(event->pos());
+ QString groupName;
+ if (item) {
+ if (((ProjectItem *) item)->isGroup()) groupName = item->text(1);
+ else if (item->parent() && ((ProjectItem *) item->parent())->isGroup())
+ groupName = item->parent()->text(1);
+ }
+ QList <QUrl> list;
+ list = event->mimeData()->urls();
+ foreach (QUrl url, list) {
+ emit addClip(url, groupName);
+ }
+
+ }
+ else if (event->mimeData()->hasText())
+ {
+ QTreeWidgetItem *item = itemAt(event->pos());
+ if (item) {
+ if (item->parent()) item = item->parent();
+ if (((ProjectItem *) item)->isGroup()) {
+ //emit addClip(event->mimeData->text());
+ kDebug()<<"//////////////// DROPPED RIGHT 1";
+ QList <QTreeWidgetItem *> list;
+ list = selectedItems ();
+ ProjectItem *clone;
+ foreach (QTreeWidgetItem *it, list) {
+ // TODO allow dragging of folders
+ if (!((ProjectItem *) it)->isGroup()) {
+ if (it->parent()) clone = (ProjectItem* ) it->parent()->takeChild(it->parent()->indexOfChild(it));
+ else clone = (ProjectItem* ) takeTopLevelItem(indexOfTopLevelItem(it));
+ if (clone) item->addChild(clone);
+ }
+ }
+ }
+ else item = NULL;
+ }
+ if (!item) {
+ kDebug()<<"//////////////// DROPPED ON EMPTY ZONE";
+ // item dropped in empty zone, move it to top level
+ QList <QTreeWidgetItem *> list;
+ list = selectedItems();
+ ProjectItem *clone;
+ foreach (QTreeWidgetItem *it, list) {
+ QTreeWidgetItem *parent = it->parent();
+ if (parent) {
+ kDebug()<<"++ item parent: "<<parent->text(1);
+ clone = (ProjectItem* ) parent->takeChild(parent->indexOfChild(it));
+ if (clone) addTopLevelItem(clone);
+ }
+ }
+ }
+ }
+ event->acceptProposedAction();
+}
+
+// virtual
+void ProjectListView::mousePressEvent(QMouseEvent *event)
+{
+ if( event->button() == Qt::LeftButton )
+ {
+ this->m_DragStartPosition = event->pos();
+ m_dragStarted = true;
+ }
+ QTreeWidget::mousePressEvent(event);
}
+// virtual
+void ProjectListView::mouseMoveEvent(QMouseEvent *event)
+{
+ kDebug()<<"// DRAG STARTED, MOUSE MOVED: ";
+ if (!m_dragStarted) return;
+
+ if ((event->pos() - m_DragStartPosition).manhattanLength()
+ < QApplication::startDragDistance())
+ return;
+
+ {
+ ProjectItem *clickItem = (ProjectItem *) itemAt(event->pos());
+ if (clickItem) {
+ QDrag *drag = new QDrag(this);
+ QMimeData *mimeData = new QMimeData;
+ QDomDocument doc;
+ QList <QTreeWidgetItem *> list;
+ list = selectedItems ();
+ foreach (QTreeWidgetItem *item, list) {
+ // TODO allow dragging of folders
+ if (!((ProjectItem *) item)->isGroup())
+ doc.appendChild(doc.importNode(((ProjectItem *) item)->toXml(), true));
+ }
+ //QByteArray data;
+ //data.append(doc.toString().toUtf8());
+ //mimeData->setData("kdenlive/westley",data );
+ mimeData->setText(doc.toString());
+ //mimeData->setImageData(image);
+ drag->setMimeData(mimeData);
+ drag->setPixmap(clickItem->icon(0).pixmap(40 *16/9.0, 40));
+ drag->setHotSpot(QPoint(0, 20));
+ drag->start(Qt::MoveAction);
+
+ //Qt::DropAction dropAction;
+ //dropAction = drag->start(Qt::CopyAction | Qt::MoveAction);
+
+ //Qt::DropAction dropAction = drag->exec();
+
+ }
+ //event->accept();
+ }
+}
+
+void ProjectListView::dragMoveEvent(QDragMoveEvent * event) {
+ QTreeWidgetItem * item = itemAt(event->pos());
+ event->setDropAction(Qt::IgnoreAction);
+ //if (item) {
+ event->setDropAction(Qt::MoveAction);
+ if (event->mimeData()->hasText()) {
+ event->acceptProposedAction();
+ }
+ //}
+}
+
+QStringList ProjectListView::mimeTypes () const
+{
+ QStringList qstrList;
+ // list of accepted mime types for drop
+ qstrList.append("text/uri-list");
+ qstrList.append("text/plain");
+ return qstrList;
+}
+
+
+Qt::DropActions ProjectListView::supportedDropActions () const
+{
+ // returns what actions are supported when dropping
+ return Qt::MoveAction | Qt::MoveAction;
+}
+
#include "projectlistview.moc"
protected:
virtual void contextMenuEvent ( QContextMenuEvent * event );
virtual void mouseDoubleClickEvent ( QMouseEvent * event );
+ virtual void mousePressEvent(QMouseEvent *event);
+ virtual void mouseMoveEvent(QMouseEvent *event);
+ virtual void dragEnterEvent(QDragEnterEvent *event);
+ virtual void dropEvent(QDropEvent *event);
+ virtual QStringList mimeTypes() const;
+ virtual Qt::DropActions supportedDropActions () const;
+ virtual void dragMoveEvent(QDragMoveEvent * event);
public slots:
private:
-
+ bool m_dragStarted;
+ QPoint m_DragStartPosition;
private slots:
signals:
void requestMenu(const QPoint &, QTreeWidgetItem *);
void addClip();
+ void addClip(QUrl, const QString &);
};
#endif