![]() |
Mixxx
|
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 }