6 #include "SpeakersModel.h"
8 #include "MarbleDirs.h"
9 #include "NewstuffModel.h"
14 class SpeakersModelItem
23 static bool lessThan(
const SpeakersModelItem& one,
const SpeakersModelItem& two );
26 class SpeakersModelPrivate
29 SpeakersModel* m_parent;
33 NewstuffModel m_newstuffModel;
35 explicit SpeakersModelPrivate( SpeakersModel* parent );
39 void handleInstallationProgress(
int row, qreal progress );
41 void handleInstallation(
int );
46 SpeakersModelItem::SpeakersModelItem() : m_newstuffIndex( -1 )
51 bool SpeakersModelItem::lessThan(
const SpeakersModelItem& one,
const SpeakersModelItem& two )
53 return one.m_file.fileName() < two.m_file.fileName();
56 SpeakersModelPrivate::SpeakersModelPrivate( SpeakersModel* parent ) :
59 m_newstuffModel.setTargetDirectory(MarbleDirs::localPath() +
QLatin1String(
"/audio/speakers"));
60 m_newstuffModel.setProvider(
"http://edu.kde.org/marble/newstuff/speakers.xml" );
61 QObject::connect( &m_newstuffModel, SIGNAL(modelReset()), m_parent, SLOT(fillModel()) );
62 QObject::connect( &m_newstuffModel, SIGNAL(installationProgressed(
int,qreal)),
63 m_parent, SLOT(handleInstallationProgress(
int,qreal)) );
64 QObject::connect( &m_newstuffModel, SIGNAL(installationFinished(
int)), m_parent, SLOT(handleInstallation(
int)) );
67 void SpeakersModelPrivate::fillModel()
72 for (
const QString &baseDir: baseDirs ) {
78 SpeakersModelItem item;
84 for (
int i=0; i<m_newstuffModel.rowCount(); ++i ) {
85 QModelIndex const index = m_newstuffModel.index( i );
86 QString const name = m_newstuffModel.data( index ).toString();
88 for (
int j=0; j<m_speakers.size() && !exists; ++j ) {
89 SpeakersModelItem &item = m_speakers[j];
90 if ( item.m_file.fileName() == name ) {
91 item.m_newstuffIndex = i;
97 SpeakersModelItem item;
100 item.m_newstuffIndex = i;
105 std::sort(m_speakers.begin(), m_speakers.end(), SpeakersModelItem::lessThan);
106 m_parent->beginResetModel();
107 m_parent->endResetModel();
108 emit m_parent->countChanged();
111 void SpeakersModelPrivate::handleInstallation(
int row )
113 for (
int j=0; j<m_speakers.size(); ++j ) {
114 if ( m_speakers[j].m_newstuffIndex == row ) {
115 m_speakers[j].m_file.refresh();
117 emit m_parent->dataChanged( affected, affected );
118 emit m_parent->installationFinished( j );
123 void SpeakersModelPrivate::handleInstallationProgress(
int row, qreal progress )
125 for (
int j=0; j<m_speakers.size(); ++j ) {
126 if ( m_speakers[j].m_newstuffIndex == row ) {
127 emit m_parent->installationProgressed( j, progress );
132 SpeakersModel::SpeakersModel(
QObject *parent ) :
136 roles[Path] =
"path";
137 roles[Name] =
"name";
138 roles[IsLocal] =
"isLocal";
139 roles[IsRemote] =
"isRemote";
140 d->m_roleNames = roles;
145 SpeakersModel::~SpeakersModel()
150 int SpeakersModel::rowCount (
const QModelIndex &parent )
const
153 return d->m_speakers.size();
161 if ( index.
isValid() && index.
row() >= 0 && index.
row() < d->m_speakers.size() ) {
164 case Path:
return d->m_speakers.at( index.
row() ).m_file.absoluteFilePath();
165 case Name:
return d->m_speakers.at( index.
row() ).m_file.fileName();
166 case IsLocal:
return d->m_speakers.at( index.
row() ).m_file.exists();
167 case IsRemote:
return d->m_speakers.at( index.
row() ).m_newstuffIndex >= 0;
176 return d->m_roleNames;
179 int SpeakersModel::indexOf(
const QString &name )
181 for(
int i=0; i<d->m_speakers.size(); ++i ) {
182 if ( d->m_speakers[i].m_file.absoluteFilePath() == name || d->m_speakers[i].m_file.fileName() == name ) {
189 QString SpeakersModel::path(
int index )
191 if ( index >= 0 && index <= d->m_speakers.size() ) {
192 return d->m_speakers[index].m_file.absoluteFilePath();
197 void SpeakersModel::install(
int index )
199 if ( index >= 0 && index < d->m_speakers.size() ) {
200 if ( d->m_speakers[index].m_newstuffIndex >= 0 ) {
201 d->m_newstuffModel.install( d->m_speakers[index].m_newstuffIndex );
206 bool SpeakersModel::isLocal(
int idx )
const
208 return data( index( idx ), IsLocal ).toBool();
211 bool SpeakersModel::isRemote(
int idx )
const
213 return data( index( idx ), IsRemote ).toBool();
216 int SpeakersModel::count()
const
223 #include "moc_SpeakersModel.cpp"