Option to group the library by file type

This commit is contained in:
David Sansome 2010-07-31 14:14:03 +00:00
parent 7ca3612bea
commit a236861dfa
7 changed files with 72 additions and 28 deletions

View File

@ -97,6 +97,28 @@ QString Song::JoinSpec(const QString& table) {
return Prepend(table + ".", kColumns).join(", ");
}
QString Song::TextForFiletype(FileType type) {
switch (type) {
case Song::Type_Asf: return QObject::tr("ASF");
case Song::Type_Flac: return QObject::tr("FLAC");
case Song::Type_Mp4: return QObject::tr("MP4");
case Song::Type_Mpc: return QObject::tr("MPC");
case Song::Type_Mpeg: return QObject::tr("MP3"); // Not technically correct
case Song::Type_OggFlac: return QObject::tr("Ogg FLAC");
case Song::Type_OggSpeex: return QObject::tr("Ogg Speex");
case Song::Type_OggVorbis: return QObject::tr("Ogg Vorbis");
case Song::Type_Aiff: return QObject::tr("AIFF");
case Song::Type_Wav: return QObject::tr("WAV");
case Song::Type_TrueAudio: return QObject::tr("TrueAudio");
case Song::Type_Stream: return QObject::tr("Stream");
case Song::Type_Unknown:
default:
return QObject::tr("Unknown");
}
}
static TagLib::String QStringToTaglibString(const QString& s);

View File

@ -117,6 +117,8 @@ class Song {
Type_Stream = 99,
};
static QString TextForFiletype(FileType type);
QString TextForFiletype() const { return TextForFiletype(filetype()); }
// Constructors
void Init(const QString& title, const QString& artist, const QString& album, int length);

View File

@ -31,9 +31,10 @@ GroupByDialog::GroupByDialog(QWidget *parent)
mapping_.insert(Mapping(LibraryModel::GroupBy_Artist, 2));
mapping_.insert(Mapping(LibraryModel::GroupBy_AlbumArtist, 3));
mapping_.insert(Mapping(LibraryModel::GroupBy_Composer, 4));
mapping_.insert(Mapping(LibraryModel::GroupBy_Genre, 5));
mapping_.insert(Mapping(LibraryModel::GroupBy_Year, 6));
mapping_.insert(Mapping(LibraryModel::GroupBy_YearAlbum, 7));
mapping_.insert(Mapping(LibraryModel::GroupBy_FileType, 5));
mapping_.insert(Mapping(LibraryModel::GroupBy_Genre, 6));
mapping_.insert(Mapping(LibraryModel::GroupBy_Year, 7));
mapping_.insert(Mapping(LibraryModel::GroupBy_YearAlbum, 8));
connect(ui_->button_box->button(QDialogButtonBox::Reset), SIGNAL(clicked()),
SLOT(Reset()));

View File

@ -68,6 +68,11 @@
<string>Composer</string>
</property>
</item>
<item>
<property name="text">
<string>File type</string>
</property>
</item>
<item>
<property name="text">
<string>Genre</string>
@ -119,6 +124,11 @@
<string>Composer</string>
</property>
</item>
<item>
<property name="text">
<string>File type</string>
</property>
</item>
<item>
<property name="text">
<string>Genre</string>
@ -170,6 +180,11 @@
<string>Composer</string>
</property>
</item>
<item>
<property name="text">
<string>File type</string>
</property>
</item>
<item>
<property name="text">
<string>Genre</string>

View File

@ -101,6 +101,7 @@ void LibraryModel::SongsDiscovered(const SongList& songs) {
key = QString::number(qMax(0, song.year())); break;
case GroupBy_YearAlbum:
key = PrettyYearAlbum(qMax(0, song.year()), song.album()); break;
case GroupBy_FileType: key = song.filetype();
case GroupBy_None: Q_ASSERT(0); break;
}
@ -158,6 +159,7 @@ QString LibraryModel::DividerKey(GroupBy type, LibraryItem* item) const {
case GroupBy_Composer:
case GroupBy_Genre:
case GroupBy_AlbumArtist:
case GroupBy_FileType:
if (item->sort_text[0].isDigit())
return "0";
if (item->sort_text[0] == ' ')
@ -171,10 +173,11 @@ QString LibraryModel::DividerKey(GroupBy type, LibraryItem* item) const {
return SortTextForYear(item->metadata.year());
case GroupBy_None:
default:
Q_ASSERT(0);
return QString();
// fallthrough
;
}
Q_ASSERT(0);
return QString();
}
QString LibraryModel::DividerDisplayText(GroupBy type, const QString& key) const {
@ -186,6 +189,7 @@ QString LibraryModel::DividerDisplayText(GroupBy type, const QString& key) const
case GroupBy_Composer:
case GroupBy_Genre:
case GroupBy_AlbumArtist:
case GroupBy_FileType:
if (key == "0")
return "0-9";
return key.toUpper();
@ -201,10 +205,11 @@ QString LibraryModel::DividerDisplayText(GroupBy type, const QString& key) const
return QString::number(key.toInt()); // To remove leading 0s
case GroupBy_None:
default:
Q_ASSERT(0);
return QString();
// fallthrough
;
}
Q_ASSERT(0);
return QString();
}
void LibraryModel::SongsDeleted(const SongList& songs) {
@ -433,6 +438,9 @@ void LibraryModel::InitQuery(GroupBy type, LibraryQuery* q) {
case GroupBy_None:
q->SetColumnSpec("%songs_table.ROWID, " + Song::kColumnSpec);
break;
case GroupBy_FileType:
q->SetColumnSpec("DISTINCT filetype");
break;
}
}
@ -469,6 +477,9 @@ void LibraryModel::FilterQuery(GroupBy type, LibraryItem* item, LibraryQuery* q)
case GroupBy_AlbumArtist:
q->AddWhere("albumartist", item->key);
break;
case GroupBy_FileType:
q->AddWhere("filetype", item->metadata.filetype());
break;
case GroupBy_None:
Q_ASSERT(0);
break;
@ -528,6 +539,11 @@ LibraryItem* LibraryModel::ItemFromQuery(GroupBy type,
item->sort_text = SortTextForArtist(item->key);
break;
case GroupBy_FileType:
item->metadata.set_filetype(Song::FileType(q.Value(0).toInt()));
item->key = item->metadata.TextForFiletype();
break;
case GroupBy_None:
item->metadata.InitFromQuery(q);
item->key = item->metadata.title();
@ -576,6 +592,11 @@ LibraryItem* LibraryModel::ItemFromSong(GroupBy type,
item->sort_text = SortTextForArtist(item->key);
break;
case GroupBy_FileType:
item->metadata.set_filetype(s.filetype());
item->key = s.TextForFiletype();
break;
case GroupBy_None:
item->metadata = s;
item->key = s.title();

View File

@ -61,6 +61,7 @@ class LibraryModel : public SimpleTreeModel<LibraryItem> {
GroupBy_Composer = 5,
GroupBy_Genre = 6,
GroupBy_AlbumArtist = 7,
GroupBy_FileType = 8,
};
struct Grouping {

View File

@ -262,25 +262,7 @@ QString FileTypeItemDelegate::displayText(const QVariant &value, const QLocale &
if (!ok)
return tr("Unknown");
switch (type) {
case Song::Type_Asf: return tr("ASF");
case Song::Type_Flac: return tr("FLAC");
case Song::Type_Mp4: return tr("MP4");
case Song::Type_Mpc: return tr("MPC");
case Song::Type_Mpeg: return tr("MP3"); // Not technically correct
case Song::Type_OggFlac: return tr("Ogg FLAC");
case Song::Type_OggSpeex: return tr("Ogg Speex");
case Song::Type_OggVorbis: return tr("Ogg Vorbis");
case Song::Type_Aiff: return tr("AIFF");
case Song::Type_Wav: return tr("WAV");
case Song::Type_TrueAudio: return tr("TrueAudio");
case Song::Type_Stream: return tr("Stream");
case Song::Type_Unknown:
default:
return tr("Unknown");
}
return Song::TextForFiletype(type);
}
QWidget* TextItemDelegate::createEditor(