ssu
ssufeaturemodel.cpp
Go to the documentation of this file.
1 
8 #include "ssufeaturemodel.h"
9 #include <QList>
10 #include <QSettings>
11 #include <QHash>
12 #include <QDebug>
13 #include <QDirIterator>
14 #include "../constants.h"
15 
16 bool featureLessThan(const QHash<QByteArray, QString> &feature1, const QHash<QByteArray, QString> &feature2)
17 {
18  return feature1.value("name") < feature2.value("name");
19 }
20 
22 {
23 public:
24  SsuFeatureModelPrivate(const QString &p) : path(p)
25  {
26  load();
27  }
28 
30  {}
31 
32  void load()
33  {
34  QDirIterator it(path, QDir::AllEntries | QDir::NoDot | QDir::NoDotDot, QDirIterator::FollowSymlinks);
35  QStringList settingsFiles;
36 
37  while (it.hasNext()) {
38  it.next();
39  settingsFiles.append(it.filePath());
40  }
41  foreach (const QString &settingsFile, settingsFiles) {
42  QSettings settings(settingsFile, QSettings::IniFormat);
43 
44  foreach (const QString &childGroup, settings.childGroups()) {
45  settings.beginGroup(childGroup);
46  QStringList keys = settings.childKeys();
47 
48  if (keys.contains("name")) {
49  QHash<QByteArray, QString> feature;
50  feature.insert("name", settings.value("name").toString());
51  if (keys.contains("version")) {
52  feature.insert("version", settings.value("version").toString());
53  } else {
54  feature.insert("version", QString());
55  }
56  features.append(feature);
57  }
58  settings.endGroup();
59  }
60  }
61  qSort(features.begin(), features.end(), featureLessThan);
62  }
63 
64  QString path;
65  QList<QHash<QByteArray, QString> > features;
66 };
67 
68 SsuFeatureModel::SsuFeatureModel(QObject *parent, const QString &path)
69  : QAbstractListModel(parent),
70  d(new SsuFeatureModelPrivate(path))
71 {
72 }
73 
74 SsuFeatureModel::SsuFeatureModel(QObject *parent)
75  : QAbstractListModel(parent),
77 {
78 }
79 
80 SsuFeatureModel::~SsuFeatureModel()
81 {
82  delete d;
83 }
84 
85 int SsuFeatureModel::count() const
86 {
87  return rowCount();
88 }
89 
90 const QHash<QByteArray, QString> &SsuFeatureModel::featureAt(int index) const
91 {
92  return d->features.at(index);
93 }
94 
95 int SsuFeatureModel::rowCount(const QModelIndex &parent) const
96 {
97  return parent.isValid() ? 0 : d->features.count();
98 }
99 
100 void SsuFeatureModel::reload()
101 {
102  beginResetModel();
103  d->features.clear();
104  d->load();
105  endResetModel();
106 }
107 
108 QVariant SsuFeatureModel::data(const QModelIndex &index, int role) const
109 {
110  int row = index.row();
111  if (!index.isValid() || row < 0 || row >= d->features.count())
112  return QVariant();
113 
114  switch (role) {
115  case Name:
116  return d->features.at(row).value("name");
117  case Version:
118  return d->features.at(row).value("version");
119  }
120  return QVariant();
121 }
122 
123 QHash<int, QByteArray> SsuFeatureModel::roleNames() const
124 {
125  QHash<int, QByteArray> roles;
126  roles.insert(Name, "name");
127  roles.insert(Version, "version");
128  return roles;
129 }
SSU_FEATURE_CONFIGURATION_DIR
#define SSU_FEATURE_CONFIGURATION_DIR
Path to the main ssu configuration file.
Definition: constants.h:34
SsuFeatureModelPrivate
Definition: ssufeaturemodel.cpp:21
ssufeaturemodel.h