diff options
-rw-r--r-- | sowatchd/daemon.cpp | 84 | ||||
-rw-r--r-- | sowatchd/daemon.h | 4 | ||||
-rw-r--r-- | sowatchui/qml/NewWatchSheet.qml | 13 | ||||
-rw-r--r-- | sowatchui/sowatchui.pro | 9 | ||||
-rw-r--r-- | sowatchui/watchesmodel.cpp | 71 | ||||
-rw-r--r-- | sowatchui/watchesmodel.h | 8 | ||||
-rw-r--r-- | sowatchui/watchscannermodel.cpp | 3 |
7 files changed, 112 insertions, 80 deletions
diff --git a/sowatchd/daemon.cpp b/sowatchd/daemon.cpp index 2a6c84f..c668f59 100644 --- a/sowatchd/daemon.cpp +++ b/sowatchd/daemon.cpp @@ -7,18 +7,16 @@ using namespace sowatch; Daemon::Daemon(QObject *parent) : QObject(parent), _registry(Registry::registry()), - _settings(new GConfKey("/apps/sowatch", this)), - _status_mapper(new QSignalMapper(this)) + _config(new GConfKey("/apps/sowatch", this)), + _watches_list(_config->getSubkey("watches", this)), + _status_mapper(new QSignalMapper(this)) { - connect(_settings, SIGNAL(subkeyChanged(QString)), + connect(_config, SIGNAL(subkeyChanged(QString)), SLOT(handleSettingsChanged(QString))); connect(_status_mapper, SIGNAL(mapped(QString)), SLOT(handleWatchStatusChange(QString))); - QStringList activeWatches = _settings->value("active-watches").toStringList(); - foreach (const QString& s, activeWatches) { - startWatch(s); - } + startEnabledWatches(); } QString Daemon::getWatchStatus(const QString &name) @@ -44,7 +42,7 @@ void Daemon::terminate() void Daemon::startWatch(const QString &name) { qDebug() << "Starting watch" << name; - QScopedPointer<ConfigKey> watchSettings(_settings->getSubkey(name)); + QScopedPointer<ConfigKey> watchSettings(_config->getSubkey(name)); const QString driver = watchSettings->value("driver").toString().toLower(); if (driver.isEmpty()) { @@ -68,6 +66,8 @@ void Daemon::startWatch(const QString &name) WatchServer* server = new WatchServer(watch, this); _servers[name] = server; + handleWatchStatusChange(name); + // Connect watch status signals _status_mapper->setMapping(watch, name); connect(watch, SIGNAL(connected()), @@ -111,32 +111,70 @@ void Daemon::startWatch(const QString &name) void Daemon::stopWatch(const QString &name) { qDebug() << "Stopping watch" << name; + WatchServer* server = _servers[name]; + Watch* watch = server->watch(); + server->deleteLater(); + watch->deleteLater(); + _servers.remove(name); + handleWatchStatusChange(name); } -void Daemon::handleSettingsChanged(const QString &subkey) +void Daemon::startEnabledWatches() { - qDebug() << "Daemon settings changed" << subkey; - if (subkey == "active-watches") { - QSet<QString> confActiveWatches = _settings->value("active-watches").toStringList().toSet(); - QSet<QString> curActiveWatches = _servers.keys().toSet(); - QSet<QString> removed = curActiveWatches - confActiveWatches; - QSet<QString> added = confActiveWatches - curActiveWatches; - foreach (const QString& s, removed) { + QStringList watches = _watches_list->value().toStringList(); + QSet<QString> startedWatches = _servers.keys().toSet(); + + QSet<QString> removed = startedWatches - watches.toSet(); + // Those watches have been entirely removed from the list, not disabled first + foreach (const QString& s, removed) { + stopWatch(s); + } + + foreach (const QString& s, watches) { + bool enabled_in_config = _config->value(s + "/enable").toBool(); + bool currently_started = _servers.contains(s); + + if (enabled_in_config && !currently_started) { + startWatch(s); + } else if (currently_started && !enabled_in_config) { stopWatch(s); } - foreach (const QString& s, added) { - startWatch(s); + } +} + +void Daemon::handleSettingsChanged(const QString &subkey) +{ + qDebug() << "Daemon settings changed" << subkey; + static QRegExp enabled_key_pattern("^([^/])/enable$"); + if (enabled_key_pattern.exactMatch(subkey)) { + QStringList watches = _watches_list->value().toStringList(); + QString watchName = enabled_key_pattern.cap(1); + bool enabled_in_config = _config->value(subkey).toBool(); + bool currently_started = _servers.contains(watchName); + + if (enabled_in_config && !currently_started) { + startWatch(watchName); + } else if (currently_started && !enabled_in_config) { + stopWatch(watchName); } + } else if (subkey == "watches") { + startEnabledWatches(); } } void Daemon::handleWatchStatusChange(const QString &name) { - WatchServer* server = _servers[name]; - Watch* watch = server->watch(); - if (watch->isConnected()) { - emit WatchStatusChanged(name, QLatin1String("connected")); + if (_servers.contains(name)) { + WatchServer* server = _servers[name]; + Watch* watch = server->watch(); + if (watch->isConnected()) { + emit WatchStatusChanged(name, QLatin1String("connected")); + } else { + emit WatchStatusChanged(name, QLatin1String("enabled")); + } + } else if (_watches_list->value().toStringList().contains(name)) { + emit WatchStatusChanged(name, QLatin1String("disabled")); } else { - emit WatchStatusChanged(name, QLatin1String("enabled")); + emit WatchStatusChanged(name, QLatin1String("unconfigured")); } } diff --git a/sowatchd/daemon.h b/sowatchd/daemon.h index 338eb2a..d35b56b 100644 --- a/sowatchd/daemon.h +++ b/sowatchd/daemon.h @@ -26,7 +26,8 @@ signals: private: Registry* _registry; - ConfigKey* _settings; + ConfigKey* _config; + ConfigKey* _watches_list; QMap<QString, WatchServer*> _servers; QSignalMapper *_status_mapper; @@ -34,6 +35,7 @@ private: void stopWatch(const QString& name); private slots: + void startEnabledWatches(); void handleSettingsChanged(const QString& subkey); void handleWatchStatusChange(const QString& watch); }; diff --git a/sowatchui/qml/NewWatchSheet.qml b/sowatchui/qml/NewWatchSheet.qml index 1028bd5..12eecf2 100644 --- a/sowatchui/qml/NewWatchSheet.qml +++ b/sowatchui/qml/NewWatchSheet.qml @@ -28,6 +28,19 @@ Sheet { model: watchScanner + header: Column { + width: parent.width + + Label { + text: qsTr("Pick a watch") + font: UiConstants.HeaderFont + } + GroupHeader { + width: parent.width + text: qsTr("Nearby watches") + } + } + delegate: ListDelegate { onClicked: { watches.addFoundWatch(object); diff --git a/sowatchui/sowatchui.pro b/sowatchui/sowatchui.pro index 93a2438..9caa163 100644 --- a/sowatchui/sowatchui.pro +++ b/sowatchui/sowatchui.pro @@ -7,6 +7,15 @@ qml_folder.source = qml qml_folder.target = . DEPLOYMENTFOLDERS = qml_folder +# Install icon files also to resources directory +res_files.files += sowatch64.png sowatch80.png +!isEmpty(MEEGO_VERSION_MAJOR)|maemo5 { + res_files.path = /opt/sowatch/share/metawatch +} else { + res_files.path = /usr/share/sowatch/metawatch +} +INSTALLS += res_files + # Additional import path used to resolve QML modules in Creator's code model QML_IMPORT_PATH = simulator { diff --git a/sowatchui/watchesmodel.cpp b/sowatchui/watchesmodel.cpp index c2bcd1a..0930715 100644 --- a/sowatchui/watchesmodel.cpp +++ b/sowatchui/watchesmodel.cpp @@ -7,21 +7,19 @@ using namespace sowatch; WatchesModel::WatchesModel(QObject *parent) : QAbstractListModel(parent), _config(new GConfKey("/apps/sowatch", this)), - _active_watches(_config->getSubkey("active-watches", this)), + _watches_list(_config->getSubkey("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"); + roles[EnabledRole] = QByteArray("enabled"); roles[ConfigKeyRole] = QByteArray("configKey"); roles[ConfigQmlUrlRole] = QByteArray("configQmlUrl"); setRoleNames(roles); - connect(_config, SIGNAL(changed()), - this, SLOT(handleConfigChanged())); - connect(_config, SIGNAL(subkeyChanged(QString)), - this, SLOT(handleSubkeyChanged(QString))); + connect(_watches_list, SIGNAL(changed()), + SLOT(handleWatchesListChanged())); connect(_daemon, SIGNAL(WatchStatusChanged(QString,QString)), this, SLOT(handleWatchStatusChanged(QString,QString))); @@ -47,18 +45,20 @@ QVariant WatchesModel::data(const QModelIndex &index, int role) const case Qt::DisplayRole: return config->value("name"); case Qt::StatusTipRole: - if (isWatchIdActive(id)) { + if (config->value("enable").toBool()) { QString status = _status[id]; if (status == "connected") { return QVariant(tr("Connected")); } else if (status == "enabled") { - return QVariant(tr("Searching...")); + return QVariant(tr("Disconnected, Searching...")); } else { - return QVariant(tr("Enabled")); + return QVariant(tr("Disconnected")); } } else { return QVariant(tr("Disabled")); } + case EnabledRole: + return config->value("enable"); case ConfigKeyRole: return QVariant::fromValue(key); case ConfigQmlUrlRole: @@ -106,23 +106,26 @@ void WatchesModel::addFoundWatch(const QVariantMap &info) qDebug() << "Would add" << providerId; } - // Now add to active watches - QStringList active = _active_watches->value().toStringList(); + // Now add to the watches list + QStringList active = _watches_list->value().toStringList(); active << name; - _active_watches->set(active); + _watches_list->set(active); + + // Now enable + newkey->set("enable", true); } void WatchesModel::reload() { - QStringList dirs = _config->dirs(); + QStringList names = _watches_list->value().toStringList(); beginResetModel(); foreach (ConfigKey* conf, _list) { - conf->deleteLater(); + delete conf; } _status.clear(); _list.clear(); - foreach (const QString& s, dirs) { + foreach (const QString& s, names) { _list.append(_config->getSubkey(s, this)); QDBusReply<QString> reply = _daemon->GetWatchStatus(s); if (reply.isValid()) { @@ -134,37 +137,9 @@ void WatchesModel::reload() qDebug() << "Found" << _list.count() << "configured watches"; } -void WatchesModel::handleConfigChanged() -{ - qDebug() << "Key changed"; -} - -void WatchesModel::handleSubkeyChanged(const QString &subkey) +void WatchesModel::handleWatchesListChanged() { - 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(); - } - } + reload(); } void WatchesModel::handleWatchStatusChanged(const QString &watch, const QString &status) @@ -186,9 +161,3 @@ int WatchesModel::findRowByWatchId(const QString &id) } return -1; } - -bool WatchesModel::isWatchIdActive(const QString &id) const -{ - QStringList active = _active_watches->value().toStringList(); - return active.contains(id); -} diff --git a/sowatchui/watchesmodel.h b/sowatchui/watchesmodel.h index 396fc8d..6e9b65e 100644 --- a/sowatchui/watchesmodel.h +++ b/sowatchui/watchesmodel.h @@ -15,7 +15,7 @@ public: ~WatchesModel(); enum DataRoles { - ObjectRole = Qt::UserRole, + EnabledRole = Qt::UserRole, ConfigKeyRole, ConfigQmlUrlRole }; @@ -29,17 +29,15 @@ public slots: private slots: void reload(); - void handleConfigChanged(); - void handleSubkeyChanged(const QString& subkey); + void handleWatchesListChanged(); void handleWatchStatusChanged(const QString& watch, const QString& status); private: int findRowByWatchId(const QString& id); - bool isWatchIdActive(const QString& id) const; private: sowatch::ConfigKey *_config; - sowatch::ConfigKey *_active_watches; + sowatch::ConfigKey *_watches_list; DaemonProxy *_daemon; QList<sowatch::ConfigKey*> _list; QMap<QString, QString> _status; diff --git a/sowatchui/watchscannermodel.cpp b/sowatchui/watchscannermodel.cpp index 8dd8d1e..f2c76f7 100644 --- a/sowatchui/watchscannermodel.cpp +++ b/sowatchui/watchscannermodel.cpp @@ -8,6 +8,7 @@ WatchScannerModel::WatchScannerModel(QObject *parent) : { QHash<int, QByteArray> roles = roleNames(); roles[Qt::DisplayRole] = QByteArray("title"); + roles[Qt::DecorationRole] = QByteArray("iconSource"); roles[Qt::StatusTipRole] = QByteArray("subtitle"); roles[ObjectRole] = QByteArray("object"); setRoleNames(roles); @@ -58,6 +59,8 @@ QVariant WatchScannerModel::data(const QModelIndex &index, int role) const switch (role) { case Qt::DisplayRole: return info["name"]; + case Qt::DecorationRole: + return QVariant(SOWATCH_RESOURCES_DIR "/sowatch64.png"); case Qt::StatusTipRole: return info["address"]; case ObjectRole: |