Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/widget/wlibrarysidebar.cpp

Go to the documentation of this file.
00001 #include <QtCore>
00002 #include <QtGui>
00003 
00004 #include "library/sidebarmodel.h"
00005 #include "widget/wlibrarysidebar.h"
00006 
00007 const int expand_time = 250;
00008 
00009 WLibrarySidebar::WLibrarySidebar(QWidget* parent) : QTreeView(parent) {
00010     //Set some properties
00011     setHeaderHidden(true);
00012     setSelectionMode(QAbstractItemView::SingleSelection);
00013     //Drag and drop setup
00014     setDragEnabled(false);
00015     setDragDropMode(QAbstractItemView::DragDrop);
00016     setDropIndicatorShown(true);
00017     setAcceptDrops(true);
00018     setAutoScroll(true);
00019 }
00020 
00021 WLibrarySidebar::~WLibrarySidebar() {
00022 }
00023 
00024 
00025 void WLibrarySidebar::contextMenuEvent(QContextMenuEvent *event)
00026 {
00027     //if (event->state() & Qt::RightButton) { //Dis shiz don werk on windowze
00028     QModelIndex clickedItem = indexAt(event->pos());
00029     emit(rightClicked(event->globalPos(), clickedItem));
00030     //}
00031 }
00032 
00034 void WLibrarySidebar::dragEnterEvent(QDragEnterEvent * event)
00035 {
00036     qDebug() << "WLibrarySidebar::dragEnterEvent" << event->mimeData()->formats();
00037     if (event->mimeData()->hasUrls())
00038     {
00039         event->acceptProposedAction();
00040     }
00041     //QTreeView::dragEnterEvent(event);
00042 }
00043 
00046 void WLibrarySidebar::dragMoveEvent(QDragMoveEvent * event)
00047 {
00048     //qDebug() << "dragMoveEvent" << event->mimeData()->formats();
00049 
00050     // Start a timer to auto-expand sections the user hovers on.
00051     QPoint pos = event->pos();
00052     QModelIndex index = indexAt(pos);
00053     if (m_hoverIndex != index) {
00054         m_expandTimer.stop();
00055         m_hoverIndex = index;
00056         m_expandTimer.start(expand_time, this);
00057     }
00058 
00059     // This has to be here instead of after, otherwise all drags will be
00060     // rejected -- rryan 3/2011
00061     QTreeView::dragMoveEvent(event);
00062 
00063     if (event->mimeData()->hasUrls())
00064     {
00065         QList<QUrl> urls(event->mimeData()->urls());
00066 
00067         QUrl url;
00068 
00069         //Drag and drop within this widget
00070         if (event->source() == this && event->possibleActions() & Qt::MoveAction)
00071         {
00072             //Do nothing.
00073              event->ignore();
00074         }
00075         else
00076         {
00077             SidebarModel* sidebarModel = dynamic_cast<SidebarModel*>(model());
00078             bool accepted = true;
00079             if (sidebarModel) {
00080                 foreach (url, urls)
00081                 {
00082                     QModelIndex destIndex = this->indexAt(event->pos());
00083                     if (!sidebarModel->dragMoveAccept(destIndex, url))
00084                     {
00085                         //We only need one URL to be invalid for us
00086                         //to reject the whole drag...
00087                         //(eg. you may have tried to drag two MP3's and an EXE)
00088                         accepted = false;
00089                         break;
00090                     }
00091                 }
00092             }
00093             if (accepted)
00094                 event->acceptProposedAction();
00095             else
00096                 event->ignore();
00097         }
00098     }
00099     else
00100         event->ignore();
00101 
00102 }
00103 
00104 void WLibrarySidebar::timerEvent(QTimerEvent *event) {
00105     if (event->timerId() == m_expandTimer.timerId()) {
00106         QPoint pos = viewport()->mapFromGlobal(QCursor::pos());
00107         if (viewport()->rect().contains(pos)) {
00108             QModelIndex index = indexAt(pos);
00109             if (m_hoverIndex == index) {
00110                 setExpanded(index, !isExpanded(index));
00111             }
00112         }
00113         m_expandTimer.stop();
00114         return;
00115     }
00116     QTreeView::timerEvent(event);
00117 }
00118 
00120 void WLibrarySidebar::dropEvent(QDropEvent * event) {
00121     if (event->mimeData()->hasUrls()) {
00122         QList<QUrl> urls(event->mimeData()->urls());
00123         QUrl url;
00124 
00125         //Drag and drop within this widget
00126         if (event->source() == this && event->possibleActions() & Qt::MoveAction)
00127         {
00128             //Do nothing.
00129              event->ignore();
00130         }
00131         else
00132         {
00133             //Reset the selected items (if you had anything highlighted, it clears it)
00134             //this->selectionModel()->clear();
00135 
00136             //Drag-and-drop from an external application or the track table widget
00137             //eg. dragging a track from Windows Explorer onto the sidebar
00138 
00139             SidebarModel* sidebarModel = dynamic_cast<SidebarModel*>(model());
00140             bool accepted = false;
00141             if (sidebarModel) {
00142                 foreach (url, urls)
00143                 {
00144                     //qDebug() << "dropEvent" << url;
00145                     QModelIndex destIndex = indexAt(event->pos());
00146                     if (sidebarModel->dropAccept(destIndex, url))
00147                     {
00148                         accepted = true;
00149 
00150                     }
00151                 }
00152             }
00153 
00154             if (accepted)
00155                 event->acceptProposedAction();
00156             else
00157                 event->ignore();
00158         }
00159 
00160 
00161         //emit(trackDropped(name));
00162 
00163         //repaintEverything();
00164     } else {
00165         event->ignore();
00166     }
00167 }
00168 
00169 void WLibrarySidebar::keyPressEvent(QKeyEvent* event)
00170 {
00171     if (event->key() == Qt::Key_Return)
00172     {
00173         QModelIndexList selectedIndices = this->selectionModel()->selectedRows();
00174         if (selectedIndices.size() > 0) {
00175             QModelIndex index = selectedIndices.at(0);
00176             emit(pressed(index));
00177             //Expand or collapse the item as necessary.
00178             setExpanded(index, !isExpanded(index));
00179         }
00180     }
00181     else if (event->key() == Qt::Key_Down || event->key() == Qt::Key_Up)
00182     {
00183         //Let the tree view move up and down for us...
00184         QTreeView::keyPressEvent(event);
00185         //But force the index to be activated/clicked after the selection
00186         //changes. (Saves you from having to push "enter" after changing the selection.)
00187         QModelIndexList selectedIndices = this->selectionModel()->selectedRows();
00188         //Note: have to get the selected indices _after_ QTreeView::keyPressEvent()
00189         if (selectedIndices.size() > 0) {
00190             QModelIndex index = selectedIndices.at(0);
00191             emit(pressed(index));
00192         }
00193     }
00194     else
00195         QTreeView::keyPressEvent(event);
00196 }
00197 
00198 void WLibrarySidebar::selectIndex(const QModelIndex& index) {
00199     QItemSelectionModel* pModel = new QItemSelectionModel(model());
00200     pModel->select(index, QItemSelectionModel::Select);
00201     setSelectionModel(pModel);
00202 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines