X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fprojectlistview.cpp;h=b424ebef1de1f43fb72e41ca7887e77479620c53;hb=5fdf3dfaacd0d5144b1fc2c3949e2cb774e50d25;hp=1eae496a1f44a077c2925fe7666a33c93707992e;hpb=0a21eb6dd5c5a44882c51c2c857eec96758d5285;p=kdenlive diff --git a/src/projectlistview.cpp b/src/projectlistview.cpp index 1eae496a..b424ebef 100644 --- a/src/projectlistview.cpp +++ b/src/projectlistview.cpp @@ -17,194 +17,262 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ -#include "QApplication" +#include +#include +#include -#include "KDebug" +#include +#include +#include #include "projectitem.h" #include "projectlistview.h" +#include "kdenlivesettings.h" ProjectListView::ProjectListView(QWidget *parent) - : QTreeWidget(parent), m_dragStarted(false) -{ - setSelectionMode(QAbstractItemView::ExtendedSelection); - setDragDropMode(QAbstractItemView::DragDrop); - setDropIndicatorShown(true); - setDragEnabled(true); - setAcceptDrops(true); + : QTreeWidget(parent), m_dragStarted(false) { + setSelectionMode(QAbstractItemView::ExtendedSelection); + setDragDropMode(QAbstractItemView::DragDrop); + setDropIndicatorShown(true); + setAlternatingRowColors(true); + setDragEnabled(true); + setAcceptDrops(true); + + setColumnCount(4); + QStringList headers; + headers << i18n("Thumbnail") << i18n("Filename") << i18n("Description") << i18n("Rating"); + setHeaderLabels(headers); + sortByColumn(1, Qt::AscendingOrder); + + QHeaderView* headerView = header(); + headerView->setContextMenuPolicy(Qt::CustomContextMenu); + connect(headerView, SIGNAL(customContextMenuRequested(const QPoint&)), + this, SLOT(configureColumns(const QPoint&))); + + //connect(this, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(slotFocusOut(QTreeWidgetItem *, QTreeWidgetItem *))); + + if (!KdenliveSettings::showdescriptioncolumn()) hideColumn(2); + if (!KdenliveSettings::showratingcolumn()) hideColumn(3); + + setIconSize(QSize(60, 40)); + setSortingEnabled(true); } -ProjectListView::~ProjectListView() -{ +ProjectListView::~ProjectListView() { } -void ProjectListView::editItem ( QTreeWidgetItem * item, int column ) -{ - kDebug()<<"//////////////// EDIT ITEM, COL: "<count(); ++i) { + const int logicalIndex = headerView->logicalIndex(i); + const QString text = model()->headerData(i, Qt::Horizontal).toString(); + QAction* action = popup.addAction(text); + action->setCheckable(true); + action->setChecked(!headerView->isSectionHidden(logicalIndex)); + action->setData(i); + } + + QAction* activatedAction = popup.exec(header()->mapToGlobal(pos)); + if (activatedAction != 0) { + const bool show = activatedAction->isChecked(); + + // remember the changed column visibility in the settings + const int columnIndex = activatedAction->data().toInt(); + switch (columnIndex) { + case 2: + KdenliveSettings::setShowdescriptioncolumn(show); + break; + case 3: + KdenliveSettings::setShowratingcolumn(show); + break; + default: + break; + } + + // apply the changed column visibility + if (show) { + showColumn(columnIndex); + } else { + hideColumn(columnIndex); + } + } } // virtual -void ProjectListView::contextMenuEvent ( QContextMenuEvent * event ) -{ - emit requestMenu(event->globalPos(), itemAt(event->pos())); +void ProjectListView::contextMenuEvent(QContextMenuEvent * event) { + emit requestMenu(event->globalPos(), itemAt(event->pos())); } // virtual -void ProjectListView::mouseDoubleClickEvent ( QMouseEvent * event ) -{ - if (!itemAt(event->pos())) emit addClip(); - else if (columnAt(event->pos().x()) == 2) QTreeWidget::mouseDoubleClickEvent( event ); +void ProjectListView::mouseDoubleClickEvent(QMouseEvent * event) { + ProjectItem *item = static_cast (itemAt(event->pos())); + if (!item) emit addClip(); + else if (item->isGroup()) { + if ((columnAt(event->pos().x()) == 1)) QTreeWidget::mouseDoubleClickEvent(event); + } else emit showProperties(item->referencedClip()); } // virtual -void ProjectListView::dragEnterEvent(QDragEnterEvent *event) -{ - if (event->mimeData()->hasUrls() || event->mimeData()->hasText()) { - kDebug()<<"//////////////// DRAG ENTR OK"; - } - event->acceptProposedAction(); +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 list; - list = event->mimeData()->urls(); - foreach (QUrl url, list) { - emit addClip(url, groupName); - } +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); + } + const QList list = event->mimeData()->urls(); + foreach(const 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 list; - list = selectedItems (); - ProjectItem *clone; - foreach (QTreeWidgetItem *it, list) { - // TODO allow dragging of folders ? - if (!((ProjectItem *) it)->isGroup() && ((ProjectItem *) it)->clipId() < 10000) { - 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; + } else if (event->mimeData()->hasFormat("kdenlive/producerslist")) { + ProjectItem *item = static_cast (itemAt(event->pos())); + if (item) { + if (item->parent()) item = static_cast (item->parent()); + if (item->isGroup()) { + //emit addClip(event->mimeData->text()); + kDebug() << "//////////////// DROPPED RIGHT 1 "; + const QList list = selectedItems(); + ProjectItem *clone; + QString parentId = item->clipId(); + foreach(QTreeWidgetItem *it, list) { + // TODO allow dragging of folders ? + if (!((ProjectItem *) it)->isGroup()/* && ((ProjectItem *) it)->clipId() < 10000*/) { + if (it->parent()) clone = (ProjectItem*) it->parent()->takeChild(it->parent()->indexOfChild(it)); + else clone = (ProjectItem*) takeTopLevelItem(indexOfTopLevelItem(it)); + if (clone) { + item->addChild(clone); + QMap props; + props.insert("groupname", item->groupName()); + props.insert("groupid", parentId); + clone->setProperties(props); + } + } + } + } else item = NULL; + } + if (!item) { + kDebug() << "//////////////// DROPPED ON EMPTY ZONE"; + // item dropped in empty zone, move it to top level + const QList list = selectedItems(); + ProjectItem *clone; + foreach(QTreeWidgetItem *it, list) { + QTreeWidgetItem *parent = it->parent(); + if (parent/* && ((ProjectItem *) it)->clipId() < 10000*/) { + kDebug() << "++ item parent: " << parent->text(1); + clone = static_cast (parent->takeChild(parent->indexOfChild(it))); + if (clone) { + addTopLevelItem(clone); + clone->clearProperty("groupname"); + clone->clearProperty("groupid"); + } + } + } + } } - if (!item) { - kDebug()<<"//////////////// DROPPED ON EMPTY ZONE"; - // item dropped in empty zone, move it to top level - QList list; - list = selectedItems(); - ProjectItem *clone; - foreach (QTreeWidgetItem *it, list) { - QTreeWidgetItem *parent = it->parent(); - if (parent && ((ProjectItem *) it)->clipId() < 10000) { - kDebug()<<"++ item parent: "<text(1); - clone = (ProjectItem* ) parent->takeChild(parent->indexOfChild(it)); - if (clone) addTopLevelItem(clone); - } - } - } - } - event->acceptProposedAction(); + event->acceptProposedAction(); } // virtual -void ProjectListView::mousePressEvent(QMouseEvent *event) -{ - if( event->button() == Qt::LeftButton ) - { +void ProjectListView::mousePressEvent(QMouseEvent *event) { + if (event->button() == Qt::LeftButton) { this->m_DragStartPosition = event->pos(); m_dragStarted = true; + QTreeWidgetItem *underMouse = itemAt(event->pos()); + if (underMouse && underMouse->isSelected()) emit focusMonitor(); } QTreeWidget::mousePressEvent(event); } // virtual -void ProjectListView::mouseMoveEvent(QMouseEvent *event) -{ - kDebug()<<"// DRAG STARTED, MOUSE MOVED: "; - if (!m_dragStarted) return; +void ProjectListView::mouseMoveEvent(QMouseEvent *event) { + kDebug() << "// DRAG STARTED, MOUSE MOVED: "; + if (!m_dragStarted) return; - if ((event->pos() - m_DragStartPosition).manhattanLength() + 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 list; - list = selectedItems (); - QStringList ids; - foreach (QTreeWidgetItem *item, list) { - // TODO allow dragging of folders - 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()); - //mimeData->setImageData(image); - drag->setMimeData(mimeData); - drag->setPixmap(clickItem->icon(0).pixmap(50 *16/9.0, 50)); - drag->setHotSpot(QPoint(0, 50)); - drag->start(Qt::MoveAction); - - //Qt::DropAction dropAction; - //dropAction = drag->start(Qt::CopyAction | Qt::MoveAction); - - //Qt::DropAction dropAction = drag->exec(); - + + { + ProjectItem *clickItem = (ProjectItem *) itemAt(m_DragStartPosition); //event->pos()); + if (clickItem) { + QDrag *drag = new QDrag(this); + QMimeData *mimeData = new QMimeData; + QDomDocument doc; + const QList list = selectedItems(); + QStringList ids; + foreach(const QTreeWidgetItem *item, list) { + const ProjectItem *clip = static_cast (item); + if (!clip->isGroup()) ids.append(clip->clipId()); + else { + const int children = item->childCount(); + for (int i = 0; i < children; i++) { + ids.append(static_cast (item->child(i))->clipId()); + } + } + } + if (ids.isEmpty()) return; + 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((int)(50 *16 / 9.0), 50)); + 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(); } - //event->accept(); - } } +// virtual 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(); - } - //} + 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 ProjectListView::mimeTypes() const { QStringList qstrList; + qstrList << QTreeWidget::mimeTypes(); // list of accepted mime types for drop qstrList.append("text/uri-list"); qstrList.append("text/plain"); + qstrList.append("kdenlive/producerslist"); return qstrList; } - - -Qt::DropActions ProjectListView::supportedDropActions () const -{ + + +Qt::DropActions ProjectListView::supportedDropActions() const { // returns what actions are supported when dropping return Qt::MoveAction; }