• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.12
  • kdeedu
  • marble
  • src
  • lib
  • marble
  • routing
SpeakersModel.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2012 Dennis Nienhüser <earthwings@gentoo.org>
9 //
10 
11 #include "SpeakersModel.h"
12 
13 #include "MarbleDirs.h"
14 #include "NewstuffModel.h"
15 
16 namespace Marble
17 {
18 
19 class SpeakersModelItem
20 {
21 public:
22  QFileInfo m_file;
23 
24  int m_newstuffIndex;
25 
26  SpeakersModelItem();
27 
28  static bool lessThan( const SpeakersModelItem& one, const SpeakersModelItem& two );
29 };
30 
31 class SpeakersModelPrivate
32 {
33 public:
34  SpeakersModel* m_parent;
35 
36  QList<SpeakersModelItem> m_speakers;
37 
38  NewstuffModel m_newstuffModel;
39 
40  SpeakersModelPrivate( SpeakersModel* parent );
41 
42  void fillModel();
43 
44  void handleInstallationProgress( int row, qreal progress );
45 
46  void handleInstallation( int );
47 
48 #if QT_VERSION >= 0x050000
49  QHash<int, QByteArray> m_roleNames;
50 #endif
51 };
52 
53 SpeakersModelItem::SpeakersModelItem() : m_newstuffIndex( -1 )
54 {
55  // nothing to do
56 }
57 
58 bool SpeakersModelItem::lessThan( const SpeakersModelItem& one, const SpeakersModelItem& two )
59 {
60  return one.m_file.fileName() < two.m_file.fileName();
61 }
62 
63 SpeakersModelPrivate::SpeakersModelPrivate( SpeakersModel* parent ) :
64  m_parent( parent )
65 {
66  m_newstuffModel.setTargetDirectory( MarbleDirs::localPath() + "/audio/speakers" );
67  m_newstuffModel.setProvider( "http://edu.kde.org/marble/newstuff/speakers.xml" );
68  QObject::connect( &m_newstuffModel, SIGNAL(modelReset()), m_parent, SLOT(fillModel()) );
69  QObject::connect( &m_newstuffModel, SIGNAL(installationProgressed(int,qreal)),
70  m_parent, SLOT(handleInstallationProgress(int,qreal)) );
71  QObject::connect( &m_newstuffModel, SIGNAL(installationFinished(int)), m_parent, SLOT(handleInstallation(int)) );
72 }
73 
74 void SpeakersModelPrivate::fillModel()
75 {
76  m_speakers.clear();
77 
78  QStringList const baseDirs = QStringList() << MarbleDirs::systemPath() << MarbleDirs::localPath();
79  foreach ( const QString &baseDir, baseDirs ) {
80  QString base = baseDir + "/audio/speakers/";
81 
82  QDir::Filters filter = QDir::Readable | QDir::Dirs | QDir::NoDotAndDotDot;
83  QFileInfoList subdirs = QDir( base ).entryInfoList( filter, QDir::Name );
84  foreach( const QFileInfo &file, subdirs ) {
85  SpeakersModelItem item;
86  item.m_file = file;
87  m_speakers << item;
88  }
89  }
90 
91  for ( int i=0; i<m_newstuffModel.rowCount(); ++i ) {
92  QModelIndex const index = m_newstuffModel.index( i );
93  QString const name = m_newstuffModel.data( index ).toString();
94  bool exists = false;
95  for ( int j=0; j<m_speakers.size() && !exists; ++j ) {
96  SpeakersModelItem &item = m_speakers[j];
97  if ( item.m_file.fileName() == name ) {
98  item.m_newstuffIndex = i;
99  exists = true;
100  }
101  }
102 
103  if ( !exists ) {
104  SpeakersModelItem item;
105  QString const path = "%1/audio/speakers/%2";
106  item.m_file = QFileInfo( path.arg( MarbleDirs::localPath() ).arg( name ) );
107  item.m_newstuffIndex = i;
108  m_speakers << item;
109  }
110  }
111 
112  qSort(m_speakers.begin(), m_speakers.end(), SpeakersModelItem::lessThan);
113  m_parent->beginResetModel();
114  m_parent->endResetModel();
115  emit m_parent->countChanged();
116 }
117 
118 void SpeakersModelPrivate::handleInstallation( int row )
119 {
120  for ( int j=0; j<m_speakers.size(); ++j ) {
121  if ( m_speakers[j].m_newstuffIndex == row ) {
122  m_speakers[j].m_file.refresh();
123  QModelIndex const affected = m_parent->index( j );
124  emit m_parent->dataChanged( affected, affected );
125  emit m_parent->installationFinished( j );
126  }
127  }
128 }
129 
130 void SpeakersModelPrivate::handleInstallationProgress( int row, qreal progress )
131 {
132  for ( int j=0; j<m_speakers.size(); ++j ) {
133  if ( m_speakers[j].m_newstuffIndex == row ) {
134  emit m_parent->installationProgressed( j, progress );
135  }
136  }
137 }
138 
139 SpeakersModel::SpeakersModel( QObject *parent ) :
140  QAbstractListModel( parent ), d( new SpeakersModelPrivate( this ) )
141 {
142  QHash<int,QByteArray> roles;
143  roles[Path] = "path";
144  roles[Name] = "name";
145  roles[IsLocal] = "isLocal";
146  roles[IsRemote] = "isRemote";
147 #if QT_VERSION < 0x050000
148  setRoleNames( roles );
149 #else
150  d->m_roleNames = roles;
151 #endif
152 
153  d->fillModel();
154 }
155 
156 SpeakersModel::~SpeakersModel()
157 {
158  // nothing to do
159 }
160 
161 int SpeakersModel::rowCount ( const QModelIndex &parent ) const
162 {
163  if ( !parent.isValid() ) {
164  return d->m_speakers.size();
165  }
166 
167  return 0;
168 }
169 
170 QVariant SpeakersModel::data ( const QModelIndex &index, int role ) const
171 {
172  if ( index.isValid() && index.row() >= 0 && index.row() < d->m_speakers.size() ) {
173  switch ( role ) {
174  case Qt::DisplayRole: return d->m_speakers.at( index.row() ).m_file.fileName();
175  case Path: return d->m_speakers.at( index.row() ).m_file.absoluteFilePath();
176  case Name: return d->m_speakers.at( index.row() ).m_file.fileName();
177  case IsLocal: return d->m_speakers.at( index.row() ).m_file.exists();
178  case IsRemote: return d->m_speakers.at( index.row() ).m_newstuffIndex >= 0;
179  }
180  }
181 
182  return QVariant();
183 }
184 
185 #if QT_VERSION >= 0x050000
186 QHash<int, QByteArray> SpeakersModel::roleNames() const
187 {
188  return d->m_roleNames;
189 }
190 #endif
191 
192 int SpeakersModel::indexOf( const QString &name )
193 {
194  for( int i=0; i<d->m_speakers.size(); ++i ) {
195  if ( d->m_speakers[i].m_file.absoluteFilePath() == name || d->m_speakers[i].m_file.fileName() == name ) {
196  return i;
197  }
198  }
199  return -1;
200 }
201 
202 QString SpeakersModel::path( int index )
203 {
204  if ( index >= 0 && index <= d->m_speakers.size() ) {
205  return d->m_speakers[index].m_file.absoluteFilePath();
206  }
207  return QString();
208 }
209 
210 void SpeakersModel::install( int index )
211 {
212  if ( index >= 0 && index < d->m_speakers.size() ) {
213  if ( d->m_speakers[index].m_newstuffIndex >= 0 ) {
214  d->m_newstuffModel.install( d->m_speakers[index].m_newstuffIndex );
215  }
216  }
217 }
218 
219 bool SpeakersModel::isLocal( int idx ) const
220 {
221  return data( index( idx ), IsLocal ).toBool();
222 }
223 
224 bool SpeakersModel::isRemote( int idx ) const
225 {
226  return data( index( idx ), IsRemote ).toBool();
227 }
228 
229 int SpeakersModel::count()
230 {
231  return rowCount();
232 }
233 
234 }
235 
236 #include "SpeakersModel.moc"
Marble::SpeakersModel::Path
Definition: SpeakersModel.h:33
Marble::SpeakersModel::Name
Definition: SpeakersModel.h:32
Marble::SpeakersModel::isRemote
bool isRemote(int index) const
Definition: SpeakersModel.cpp:224
Marble::SpeakersModel::rowCount
int rowCount(const QModelIndex &parent=QModelIndex()) const
Overload of QAbstractListModel.
Definition: SpeakersModel.cpp:161
Marble::SpeakersModel::install
void install(int index)
Definition: SpeakersModel.cpp:210
NewstuffModel.h
QObject
Marble::SpeakersModel::indexOf
int indexOf(const QString &name)
Definition: SpeakersModel.cpp:192
Marble::SpeakersModel::data
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
Overload of QAbstractListModel.
Definition: SpeakersModel.cpp:170
Marble::SpeakersModel::IsLocal
Definition: SpeakersModel.h:34
MarbleDirs.h
SpeakersModel.h
Marble::SpeakersModel::count
int count()
Marble::SpeakersModel::isLocal
bool isLocal(int index) const
Definition: SpeakersModel.cpp:219
Marble::SpeakersModel::~SpeakersModel
~SpeakersModel()
Destructor.
Definition: SpeakersModel.cpp:156
Marble::SpeakersModel::path
QString path(int index)
Definition: SpeakersModel.cpp:202
Marble::SpeakersModel::roleNames
QHash< int, QByteArray > roleNames() const
Overload of QAbstractListModel.
Marble::SpeakersModel::IsRemote
Definition: SpeakersModel.h:35
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:38:52 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal