diff options
Diffstat (limited to 'sowatchui/watchesmodel.cpp')
-rw-r--r-- | sowatchui/watchesmodel.cpp | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/sowatchui/watchesmodel.cpp b/sowatchui/watchesmodel.cpp new file mode 100644 index 0000000..4531544 --- /dev/null +++ b/sowatchui/watchesmodel.cpp @@ -0,0 +1,166 @@ +#include <QtDebug> + +#include "watchesmodel.h" + +using namespace sowatch; + +WatchesModel::WatchesModel(QObject *parent) : + QAbstractListModel(parent), + _config(new GConfKey("/apps/sowatch", this)), + _active_watches(_config->getSubkey("active-watches", this)), + _daemon(new DaemonProxy("com.javispedro.sowatchd", "/com/javispedro/sowatch/daemon", QDBusConnection::sessionBus())) +{ + QHash<int, QByteArray> roles = roleNames(); + roles[Qt::DisplayRole] = QByteArray("title"); + roles[Qt::StatusTipRole] = QByteArray("subtitle"); + roles[ObjectRole] = QByteArray("object"); + setRoleNames(roles); + + connect(_config, SIGNAL(changed()), + this, SLOT(handleConfigChanged())); + connect(_config, SIGNAL(subkeyChanged(QString)), + this, SLOT(handleSubkeyChanged(QString))); + connect(_daemon, SIGNAL(WatchStatusChanged(QString,QString)), + this, SLOT(handleWatchStatusChanged(QString,QString))); + + reload(); +} + +WatchesModel::~WatchesModel() +{ +} + +int WatchesModel::rowCount(const QModelIndex &parent) const +{ + return _list.count(); +} + +QVariant WatchesModel::data(const QModelIndex &index, int role) const +{ + qDebug() << "Asked for data" << index.row() << index.column() << role; + ConfigKey *config = _list[index.row()]; + QString key = config->key(); + QString id = key.mid(key.lastIndexOf('/') + 1); + switch (role) { + case Qt::DisplayRole: + return config->value("name"); + case Qt::StatusTipRole: + if (isWatchIdActive(id)) { + QString status = _status[id]; + if (status == "connected") { + return QVariant(tr("Connected")); + } else if (status == "enabled") { + return QVariant(tr("Searching...")); + } else { + return QVariant(tr("Enabled")); + } + } else { + return QVariant(tr("Disabled")); + } + } + return QVariant(); +} + +bool WatchesModel::removeRows(int row, int count, const QModelIndex &parent) +{ + return false; // TODO +} + +void WatchesModel::addFoundWatch(const QVariantMap &info) +{ + QStringList existing = _config->dirs(); + QString base = "watch%1"; + QString name = base.arg(""); + int num = 1; + + while (existing.contains(name)) { + num++; + name = base.arg(num); + } + + ConfigKey* newkey = _config->getSubkey(name); + foreach (const QString& key, info.keys()) { + newkey->set(key, info[key]); + } + + // Now add to active watches + QStringList active = _active_watches->value().toStringList(); + active << name; + _active_watches->set(active); +} + +void WatchesModel::reload() +{ + QStringList dirs = _config->dirs(); + + beginResetModel(); + foreach (ConfigKey* conf, _list) { + conf->deleteLater(); + } + _list.clear(); + foreach (const QString& s, dirs) { + _list.append(_config->getSubkey(s, this)); + } + endResetModel(); + + qDebug() << "Found" << _list.count() << "configured watches"; +} + +void WatchesModel::handleConfigChanged() +{ + qDebug() << "Key changed"; +} + +void WatchesModel::handleSubkeyChanged(const QString &subkey) +{ + QRegExp nameexp("^([^/]+)/name"); + if (nameexp.exactMatch(subkey)) { + qDebug() << "Name key changed:" << subkey; + QString id = nameexp.cap(1); + int i = findRowByWatchId(id); + if (i != -1) { + if (_config->value(subkey).isNull()) { + beginRemoveRows(QModelIndex(), i, i); + _list[i]->deleteLater(); + _list.removeAt(i); + qDebug() << "Removing" << i; + endRemoveRows(); + } else { + emit dataChanged(createIndex(i, 0), createIndex(i, 0)); + qDebug() << "Changing" << i; + } + } else { + i = _list.size(); + qDebug() << "Inserting" << i; + beginInsertRows(QModelIndex(), i, i); + _list.append(_config->getSubkey(id, this)); + endInsertRows(); + } + } +} + +void WatchesModel::handleWatchStatusChanged(const QString &watch, const QString &status) +{ + _status[watch] = status; + int i = findRowByWatchId(watch); + if (i != -1) { + emit dataChanged(createIndex(i, 0), createIndex(i, 0)); + } +} + +int WatchesModel::findRowByWatchId(const QString &id) +{ + QString pattern(_config->key() + "/" + id); + for (int i = 0; i < _list.size(); i++) { + if (_list[i]->key().endsWith("/" + id)) { + return i; + } + } + return -1; +} + +bool WatchesModel::isWatchIdActive(const QString &id) const +{ + QStringList active = _active_watches->value().toStringList(); + return active.contains(id); +} |