From 7166f0d922ef9511b6ce47be3a19d4da36d5b457 Mon Sep 17 00:00:00 2001 From: David Sansome Date: Sun, 29 Jan 2012 19:24:13 +0000 Subject: [PATCH] When pressing Ctrl+C on a playlist item, copy the text of all visible columns, rather than just the text of the "current" one. Fixes issue 2558 --- src/playlist/playlistview.cpp | 36 +++++++++++++++++++++++++++++++---- src/playlist/playlistview.h | 4 +++- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/playlist/playlistview.cpp b/src/playlist/playlistview.cpp index 93877f5ad..f0dc23f3a 100644 --- a/src/playlist/playlistview.cpp +++ b/src/playlist/playlistview.cpp @@ -23,6 +23,7 @@ #include "core/logging.h" #include +#include #include #include #include @@ -467,11 +468,9 @@ bool CompareSelectionRanges(const QItemSelectionRange& a, const QItemSelectionRa } void PlaylistView::keyPressEvent(QKeyEvent* event) { - if (!model()) { + if (!model() || state() == QAbstractItemView::EditingState) { QTreeView::keyPressEvent(event); - } else if (state() == QAbstractItemView::EditingState) { - QTreeView::keyPressEvent(event); - } else if (event->matches(QKeySequence::Delete)) { + } else if (event == QKeySequence::Delete) { RemoveSelected(); event->accept(); #ifdef Q_OS_DARWIN @@ -479,6 +478,8 @@ void PlaylistView::keyPressEvent(QKeyEvent* event) { RemoveSelected(); event->accept(); #endif + } else if (event == QKeySequence::Copy) { + CopyCurrentSongToClipboard(); } else if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) { if (currentIndex().isValid()) @@ -1006,3 +1007,30 @@ void PlaylistView::SetColumnAlignment(int section, Qt::Alignment alignment) { Qt::Alignment PlaylistView::column_alignment(int section) const { return column_alignment_.value(section, Qt::AlignLeft | Qt::AlignVCenter); } + +void PlaylistView::CopyCurrentSongToClipboard() const { + // Get the display text of all visible columns. + QStringList columns; + + for (int i=0 ; icount() ; ++i) { + if (header()->isSectionHidden(i)) { + continue; + } + + const QVariant data = model()->data( + currentIndex().sibling(currentIndex().row(), i)); + if (data.type() == QVariant::String) { + columns << data.toString(); + } + } + + // Get the song's URL + const QUrl url = model()->data(currentIndex().sibling( + currentIndex().row(), Playlist::Column_Filename)).toUrl(); + + QMimeData* mime_data = new QMimeData; + mime_data->setUrls(QList() << url); + mime_data->setText(columns.join(" - ")); + + QApplication::clipboard()->setMimeData(mime_data); +} diff --git a/src/playlist/playlistview.h b/src/playlist/playlistview.h index 5942a37a6..45ff59baa 100644 --- a/src/playlist/playlistview.h +++ b/src/playlist/playlistview.h @@ -82,7 +82,6 @@ class PlaylistView : public QTreeView { // QTreeView void drawTree(QPainter* painter, const QRegion& region) const; void drawRow(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; - void keyPressEvent(QKeyEvent* event); void setModel(QAbstractItemModel* model); public slots: @@ -95,6 +94,8 @@ class PlaylistView : public QTreeView { void DynamicModeChanged(bool dynamic); void SetColumnAlignment(int section, Qt::Alignment alignment); + void CopyCurrentSongToClipboard() const; + signals: void PlayItem(const QModelIndex& index); void PlayPause(); @@ -106,6 +107,7 @@ class PlaylistView : public QTreeView { protected: // QWidget + void keyPressEvent(QKeyEvent* event); void contextMenuEvent(QContextMenuEvent* e); void hideEvent(QHideEvent* event); void showEvent(QShowEvent* event);