diff options
author | RJ Ryan <rryan@mixxx.org> | 2013-06-19 00:46:54 -0400 |
---|---|---|
committer | RJ Ryan <rryan@mixxx.org> | 2013-06-19 00:46:54 -0400 |
commit | 25d57b59dff3947212909634864dd82365c9606b (patch) | |
tree | f0d0f8a048f8ed2f45c5ff015fc96891662f72f1 /src/widget/wlibrarysidebar.cpp | |
parent | e50f9f168fa08f2be6d0f13e8a225bbcc9de09bb (diff) |
Moving mixxx/* to the root. A new era begins!
Diffstat (limited to 'src/widget/wlibrarysidebar.cpp')
-rw-r--r-- | src/widget/wlibrarysidebar.cpp | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/src/widget/wlibrarysidebar.cpp b/src/widget/wlibrarysidebar.cpp new file mode 100644 index 0000000000..940a63f329 --- /dev/null +++ b/src/widget/wlibrarysidebar.cpp @@ -0,0 +1,179 @@ +#include <QtCore> +#include <QtGui> + +#include "library/sidebarmodel.h" +#include "widget/wlibrarysidebar.h" + +const int expand_time = 250; + +WLibrarySidebar::WLibrarySidebar(QWidget* parent) : QTreeView(parent) { + //Set some properties + setHeaderHidden(true); + setSelectionMode(QAbstractItemView::SingleSelection); + //Drag and drop setup + setDragEnabled(false); + setDragDropMode(QAbstractItemView::DragDrop); + setDropIndicatorShown(true); + setAcceptDrops(true); + setAutoScroll(true); + header()->setStretchLastSection(false); + header()->setResizeMode(QHeaderView::ResizeToContents); + header()->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); +} + +WLibrarySidebar::~WLibrarySidebar() { +} + + +void WLibrarySidebar::contextMenuEvent(QContextMenuEvent *event) { + //if (event->state() & Qt::RightButton) { //Dis shiz don werk on windowze + QModelIndex clickedItem = indexAt(event->pos()); + emit(rightClicked(event->globalPos(), clickedItem)); + //} +} + +// Drag enter event, happens when a dragged item enters the track sources view +void WLibrarySidebar::dragEnterEvent(QDragEnterEvent * event) +{ + qDebug() << "WLibrarySidebar::dragEnterEvent" << event->mimeData()->formats(); + if (event->mimeData()->hasUrls()) { + event->acceptProposedAction(); + } + //QTreeView::dragEnterEvent(event); +} + +// Drag move event, happens when a dragged item hovers over the track sources view... +void WLibrarySidebar::dragMoveEvent(QDragMoveEvent * event) +{ + //qDebug() << "dragMoveEvent" << event->mimeData()->formats(); + // Start a timer to auto-expand sections the user hovers on. + QPoint pos = event->pos(); + QModelIndex index = indexAt(pos); + if (m_hoverIndex != index) { + m_expandTimer.stop(); + m_hoverIndex = index; + m_expandTimer.start(expand_time, this); + } + // This has to be here instead of after, otherwise all drags will be + // rejected -- rryan 3/2011 + QTreeView::dragMoveEvent(event); + if (event->mimeData()->hasUrls()) { + QList<QUrl> urls(event->mimeData()->urls()); + // Drag and drop within this widget + if ((event->source() == this) + && (event->possibleActions() & Qt::MoveAction)) { + // Do nothing. + event->ignore(); + } else { + SidebarModel* sidebarModel = dynamic_cast<SidebarModel*>(model()); + bool accepted = true; + if (sidebarModel) { + foreach (QUrl url, urls) { + QModelIndex destIndex = this->indexAt(event->pos()); + if (!sidebarModel->dragMoveAccept(destIndex, url)) { + //We only need one URL to be invalid for us + //to reject the whole drag... + //(eg. you may have tried to drag two MP3's and an EXE) + accepted = false; + break; + } + } + } + if (accepted) { + event->acceptProposedAction(); + } else { + event->ignore(); + } + } + } else { + event->ignore(); + } +} + +void WLibrarySidebar::timerEvent(QTimerEvent *event) { + if (event->timerId() == m_expandTimer.timerId()) { + QPoint pos = viewport()->mapFromGlobal(QCursor::pos()); + if (viewport()->rect().contains(pos)) { + QModelIndex index = indexAt(pos); + if (m_hoverIndex == index) { + setExpanded(index, !isExpanded(index)); + } + } + m_expandTimer.stop(); + return; + } + QTreeView::timerEvent(event); +} + +// Drag-and-drop "drop" event. Occurs when something is dropped onto the track sources view +void WLibrarySidebar::dropEvent(QDropEvent * event) { + if (event->mimeData()->hasUrls()) { + QList<QUrl> urls(event->mimeData()->urls()); + // Drag and drop within this widget + if ((event->source() == this) + && (event->possibleActions() & Qt::MoveAction)) { + // Do nothing. + event->ignore(); + } else { + //Reset the selected items (if you had anything highlighted, it clears it) + //this->selectionModel()->clear(); + //Drag-and-drop from an external application or the track table widget + //eg. dragging a track from Windows Explorer onto the sidebar + SidebarModel* sidebarModel = dynamic_cast<SidebarModel*>(model()); + if (sidebarModel) { + QModelIndex destIndex = indexAt(event->pos()); + // event->source() will return NULL if something is droped from + // a different application + if (sidebarModel->dropAccept(destIndex, urls, event->source())) { + event->acceptProposedAction(); + } else { + event->ignore(); + } + } + } + //emit(trackDropped(name)); + //repaintEverything(); + } else { + event->ignore(); + } +} + +void WLibrarySidebar::keyPressEvent(QKeyEvent* event) +{ + if (event->key() == Qt::Key_Return) + { + QModelIndexList selectedIndices = this->selectionModel()->selectedRows(); + if (selectedIndices.size() > 0) { + QModelIndex index = selectedIndices.at(0); + emit(pressed(index)); + //Expand or collapse the item as necessary. + setExpanded(index, !isExpanded(index)); + } + } + else if (event->key() == Qt::Key_Down || event->key() == Qt::Key_Up) + { + //Let the tree view move up and down for us... + QTreeView::keyPressEvent(event); + //But force the index to be activated/clicked after the selection + //changes. (Saves you from having to push "enter" after changing the selection.) + QModelIndexList selectedIndices = this->selectionModel()->selectedRows(); + //Note: have to get the selected indices _after_ QTreeView::keyPressEvent() + if (selectedIndices.size() > 0) { + QModelIndex index = selectedIndices.at(0); + emit(pressed(index)); + } + } + else + QTreeView::keyPressEvent(event); +} + +void WLibrarySidebar::selectIndex(const QModelIndex& index) { + QItemSelectionModel* pModel = new QItemSelectionModel(model()); + pModel->select(index, QItemSelectionModel::Select); + setSelectionModel(pModel); + + if (index.parent().isValid()) { + expand(index.parent()); + } + scrollTo(index); +} |