void PlaylistView::moveItems(int steps) { PlaylistModel *playlistModel = dynamic_cast<PlaylistModel *>(this->model()); if (playlistModel == nullptr) { return; } QItemSelection indexList = this->selectionModel()->selection(); std::sort(indexList.begin(), indexList.end(), steps > 0 ? sortQItemSelectionDesc : sortQItemSelectionAsc); for (QItemSelection::const_iterator i = indexList.cbegin(); i != indexList.cend(); ++i) { int top = i->top(); int btm = i->bottom(); int count = abs(top - btm); int srcRow = min(top, btm); int destRow = srcRow + steps; QModelIndex newIdx = steps > 0 ? playlistModel->index(destRow + count, 0) : playlistModel->index(srcRow - 1, 0); QModelIndex oldIdx = steps > 0 ? playlistModel->index(srcRow, 0) : playlistModel->index(srcRow + count, 0); if (newIdx.isValid()) { this->selectionModel()->select(newIdx, QItemSelectionModel::SelectionFlag::Select | QItemSelectionModel::SelectionFlag::Rows); this->selectionModel()->select(oldIdx, QItemSelectionModel::SelectionFlag::Deselect | QItemSelectionModel::SelectionFlag::Rows); playlistModel->moveRows(playlistModel->index(0, 0), srcRow, count, playlistModel->index(playlistModel->rowCount(QModelIndex()) - 1, playlistModel->columnCount(QModelIndex()) - 1), destRow); } } }
void TextureList::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) { QListView::selectionChanged(selected, deselected); emit this->selected(selected.begin()->topLeft()); }