Add autocompletion to artist & album tags in playlist.

Thanks to christoph.gysin
Updates issue #130
This commit is contained in:
John Maguire 2010-03-27 23:45:46 +00:00
parent 0e4fb1b789
commit ee9e676df1
6 changed files with 98 additions and 16 deletions

View File

@ -56,6 +56,11 @@ void LibraryQuery::AddWhere(const QString& column, const QVariant& value) {
}
}
void LibraryQuery::AddWhereLike(const QString& column, const QVariant& value) {
where_clauses_ << QString("%1 LIKE ?").arg(column);
bound_values_ << value;
}
void LibraryQuery::AddCompilationRequirement(bool compilation) {
where_clauses_ << QString("effective_compilation = %1").arg(compilation ? 1 : 0);
}

View File

@ -42,6 +42,7 @@ class LibraryQuery {
void SetColumnSpec(const QString& spec) { column_spec_ = spec; }
void SetOrderBy(const QString& order_by) { order_by_ = order_by; }
void AddWhere(const QString& column, const QVariant& value);
void AddWhereLike(const QString& column, const QVariant& value);
void AddCompilationRequirement(bool compilation);
QSqlQuery Query(QSqlDatabase db) const;

View File

@ -105,6 +105,7 @@ MainWindow::MainWindow(QNetworkAccessManager* network, QWidget *parent)
playlist_->IgnoreSorting(true);
ui_.playlist->setModel(playlist_);
ui_.playlist->setItemDelegates(library_);
playlist_->IgnoreSorting(false);
ui_.library_view->setModel(library_sort_model_);

View File

@ -91,31 +91,31 @@ bool Playlist::set_column_value(Song& song, Playlist::Column column,
return false;
switch(column) {
case Playlist::Column_Title:
case Column_Title:
song.set_title(value.toString());
break;
case Playlist::Column_Artist:
case Column_Artist:
song.set_artist(value.toString());
break;
case Playlist::Column_Album:
case Column_Album:
song.set_album(value.toString());
break;
case Playlist::Column_AlbumArtist:
case Column_AlbumArtist:
song.set_albumartist(value.toString());
break;
case Playlist::Column_Composer:
case Column_Composer:
song.set_composer(value.toString());
break;
case Playlist::Column_Track:
case Column_Track:
song.set_track(value.toInt());
break;
case Playlist::Column_Disc:
case Column_Disc:
song.set_disc(value.toInt());
break;
case Playlist::Column_Year:
case Column_Year:
song.set_year(value.toInt());
break;
case Playlist::Column_Genre:
case Column_Genre:
song.set_genre(value.toString());
break;
default:

View File

@ -28,6 +28,8 @@
#include <QMenu>
#include <QScrollBar>
#include <QDateTime>
#include <QLineEdit>
#include <QCompleter>
#include <math.h>
@ -172,6 +174,46 @@ QString FileTypeItemDelegate::displayText(const QVariant &value, const QLocale &
}
}
QWidget* TextItemDelegate::createEditor(
QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const {
return new QLineEdit(parent);
}
QWidget* TagCompletionItemDelegate::createEditor(
QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const {
QStringList choices;
switch(column_) {
case Playlist::Column_Artist: {
choices = library_->GetBackend()->GetAllArtists();
break;
}
case Playlist::Column_Album: {
// TODO: add optimised query to library backend?
LibraryBackend::AlbumList albums = library_->GetBackend()->GetAllAlbums();
foreach(const LibraryBackend::Album& album, albums)
choices << album.album_name;
break;
}
case Playlist::Column_AlbumArtist: {
// TODO: get all albumartists?
break;
}
default:
break;
}
QLineEdit* editor = new QLineEdit(parent);
if(!choices.isEmpty()) {
QCompleter* completer = new QCompleter(choices, editor);
completer->setCaseSensitivity(Qt::CaseInsensitive);
editor->setCompleter(completer);
}
return editor;
}
PlaylistView::PlaylistView(QWidget *parent)
: QTreeView(parent),
@ -182,13 +224,6 @@ PlaylistView::PlaylistView(QWidget *parent)
currenttrack_play_(":currenttrack_play.png"),
currenttrack_pause_(":currenttrack_pause.png")
{
setItemDelegate(new PlaylistDelegateBase(this));
setItemDelegateForColumn(Playlist::Column_Length, new LengthItemDelegate(this));
setItemDelegateForColumn(Playlist::Column_Filesize, new SizeItemDelegate(this));
setItemDelegateForColumn(Playlist::Column_Filetype, new FileTypeItemDelegate(this));
setItemDelegateForColumn(Playlist::Column_DateCreated, new DateItemDelegate(this));
setItemDelegateForColumn(Playlist::Column_DateModified, new DateItemDelegate(this));
setHeader(new PlaylistHeader(Qt::Horizontal, this));
header()->setMovable(true);
@ -201,6 +236,22 @@ PlaylistView::PlaylistView(QWidget *parent)
setAlternatingRowColors(true);
}
void PlaylistView::setItemDelegates(Library* library) {
setItemDelegate(new PlaylistDelegateBase(this));
setItemDelegateForColumn(Playlist::Column_Title, new TextItemDelegate(this));
setItemDelegateForColumn(Playlist::Column_Album,
new TagCompletionItemDelegate(this, library, Playlist::Column_Album));
setItemDelegateForColumn(Playlist::Column_Artist,
new TagCompletionItemDelegate(this, library, Playlist::Column_Artist));
setItemDelegateForColumn(Playlist::Column_AlbumArtist,
new TagCompletionItemDelegate(this, library, Playlist::Column_AlbumArtist));
setItemDelegateForColumn(Playlist::Column_Length, new LengthItemDelegate(this));
setItemDelegateForColumn(Playlist::Column_Filesize, new SizeItemDelegate(this));
setItemDelegateForColumn(Playlist::Column_Filetype, new FileTypeItemDelegate(this));
setItemDelegateForColumn(Playlist::Column_DateCreated, new DateItemDelegate(this));
setItemDelegateForColumn(Playlist::Column_DateModified, new DateItemDelegate(this));
}
void PlaylistView::setModel(QAbstractItemModel *model) {
QTreeView::setModel(model);
LoadGeometry();

View File

@ -17,6 +17,9 @@
#ifndef PLAYLISTVIEW_H
#define PLAYLISTVIEW_H
#include "playlist.h"
#include "library.h"
#include <QStyledItemDelegate>
#include <QTreeView>
@ -59,6 +62,26 @@ class FileTypeItemDelegate : public PlaylistDelegateBase {
QString displayText(const QVariant& value, const QLocale& locale) const;
};
class TextItemDelegate : public PlaylistDelegateBase {
public:
TextItemDelegate(QTreeView* view) : PlaylistDelegateBase(view) {};
QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option,
const QModelIndex& index) const;
};
class TagCompletionItemDelegate : public PlaylistDelegateBase {
public:
TagCompletionItemDelegate(QTreeView* view, Library* library, Playlist::Column column) :
PlaylistDelegateBase(view), library_(library), column_(column) {};
QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option,
const QModelIndex& index) const;
private:
Library* library_;
Playlist::Column column_;
};
class PlaylistView : public QTreeView {
Q_OBJECT
@ -66,6 +89,7 @@ class PlaylistView : public QTreeView {
public:
PlaylistView(QWidget* parent = 0);
void setItemDelegates(Library* library);
void RemoveSelected();
// QTreeView