/* * Cantata * * Copyright (c) 2011-2013 Craig Drummond * * ---- * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "searchmodel.h" #include "icons.h" #include "itemview.h" #include "localize.h" #include "qtplural.h" #include "mpdconnection.h" #include "playqueuemodel.h" #include #include #include #include #include #if QT_VERSION >= 0x050000 #include #endif #if defined ENABLE_MODEL_TEST #include "modeltest.h" #endif SearchModel::SearchModel(QObject *parent) : ActionModel(parent) , currentId(0) { connect(this, SIGNAL(search(QString,QString,int)), MPDConnection::self(), SLOT(search(QString,QString,int))); connect(MPDConnection::self(), SIGNAL(searchResponse(int,QList)), this, SLOT(searchFinished(int,QList))); } SearchModel::~SearchModel() { clear(); } QModelIndex SearchModel::index(int row, int col, const QModelIndex &parent) const { if (!hasIndex(row, col, parent)) { return QModelIndex(); } return rowtype ? Icons::self()->playlistIcon : song->isStream() ? Icons::self()->streamIcon : Icons::self()->audioFileIcon; case Qt::DisplayRole: case Qt::ToolTipRole: { QString text=song->entryName(); if (Qt::ToolTipRole==role) { text=text.replace("\n", "
"); if (!song->title.isEmpty()) { text+=QLatin1String("
")+Song::formattedTime(song->time); text+=QLatin1String("
")+song->file+QLatin1String(""); } } return text; } case ItemView::Role_MainText: return song->title.isEmpty() ? song->file : song->title; case ItemView::Role_SubText: return song->artist+QLatin1String(" - ")+song->album; default: return ActionModel::data(index, role); } return QVariant(); } Qt::ItemFlags SearchModel::flags(const QModelIndex &index) const { if (index.isValid()) { return Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled; } else { return Qt::NoItemFlags; } } QStringList SearchModel::filenames(const QModelIndexList &indexes, bool allowPlaylists) const { QList list=songs(indexes, allowPlaylists); QStringList fnames; foreach (const Song &s, list) { fnames.append(s.file); } return fnames; } QList SearchModel::songs(const QModelIndexList &indexes, bool allowPlaylists) const { QList list; foreach(QModelIndex index, indexes) { Song *song=static_cast(index.internalPointer()); if ((allowPlaylists || Song::Playlist!=song->type) && !list.contains(*song)) { list << *song; } } return list; } QMimeData * SearchModel::mimeData(const QModelIndexList &indexes) const { QMimeData *mimeData = new QMimeData(); PlayQueueModel::encode(*mimeData, PlayQueueModel::constFileNameMimeType, filenames(indexes, true)); return mimeData; } QStringList SearchModel::mimeTypes() const { QStringList types; types << PlayQueueModel::constFileNameMimeType; return types; } void SearchModel::refresh() { QString k=currentKey; QString v=currentValue; clear(); search(k, v); } void SearchModel::clear() { if (!songList.isEmpty()) { beginRemoveRows(QModelIndex(), 0, songList.count()-1); songList.clear(); endRemoveRows(); } currentKey=currentValue=QString(); currentId++; emit statsUpdated(0, 0); } void SearchModel::search(const QString &key, const QString &value) { if (key==currentKey && value==currentValue) { return; } emit searching(); clear(); currentKey=key; currentValue=value; currentId++; emit search(key, value, currentId); } void SearchModel::searchFinished(int id, const QList &result) { if (id!=currentId) { return; } beginResetModel(); songList.clear(); songList=result; endResetModel(); quint32 time=0; foreach (const Song &s, songList) { time+=s.time; } emit statsUpdated(songList.size(), time); emit searched(); }