Add autocompletion to artist & album tags in playlist.
Thanks to christoph.gysin Updates issue #130
This commit is contained in:
parent
0e4fb1b789
commit
ee9e676df1
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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_);
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue