summaryrefslogtreecommitdiff
path: root/sowatchui
diff options
context:
space:
mode:
authorJavier S. Pedro <maemo@javispedro.com>2012-08-10 16:06:14 +0200
committerJavier S. Pedro <maemo@javispedro.com>2012-08-10 16:06:14 +0200
commit39fa663cd08bd2b7d46ed170d49ac794c531c42e (patch)
tree92131388053eadbfca4b8917ab1e1f87ffe30fdd /sowatchui
parentb9082fda48bb026fc4e6148efeba9aabf608373a (diff)
downloadsowatch-39fa663cd08bd2b7d46ed170d49ac794c531c42e.tar.gz
sowatch-39fa663cd08bd2b7d46ed170d49ac794c531c42e.zip
watchlet edit UI
Diffstat (limited to 'sowatchui')
-rw-r--r--sowatchui/main.cpp2
-rw-r--r--sowatchui/providersmodel.cpp (renamed from sowatchui/providersmodel.cc)29
-rw-r--r--sowatchui/providersmodel.h1
-rw-r--r--sowatchui/qml/AddWatchletSheet.qml48
-rw-r--r--sowatchui/qml/WatchPage.qml62
-rw-r--r--sowatchui/sowatchui.pro6
-rw-r--r--sowatchui/watchesmodel.cpp40
-rw-r--r--sowatchui/watchesmodel.h2
-rw-r--r--sowatchui/watchletsmodel.cpp166
-rw-r--r--sowatchui/watchletsmodel.h52
10 files changed, 385 insertions, 23 deletions
diff --git a/sowatchui/main.cpp b/sowatchui/main.cpp
index 5e116ac..80a0f6b 100644
--- a/sowatchui/main.cpp
+++ b/sowatchui/main.cpp
@@ -7,6 +7,7 @@
#include "watchesmodel.h"
#include "watchscannermodel.h"
#include "providersmodel.h"
+#include "watchletsmodel.h"
static sowatch::Registry *registry;
static WatchesModel *watches;
@@ -26,6 +27,7 @@ Q_DECL_EXPORT int main(int argc, char *argv[])
qmlRegisterType<sowatch::ConfigKey>();
qmlRegisterType<sowatch::GConfKey>("com.javispedro.sowatch", 1, 0, "GConfKey");
qmlRegisterType<ProvidersModel>("com.javispedro.sowatch", 1, 0, "ProvidersModel");
+ qmlRegisterType<WatchletsModel>("com.javispedro.sowatch", 1, 0, "WatchletsModel");
viewer->rootContext()->setContextProperty("watches", watches);
viewer->rootContext()->setContextProperty("watchScanner", watchScanner);
diff --git a/sowatchui/providersmodel.cc b/sowatchui/providersmodel.cpp
index 68ce21b..8e93e5c 100644
--- a/sowatchui/providersmodel.cc
+++ b/sowatchui/providersmodel.cpp
@@ -4,6 +4,8 @@
using namespace sowatch;
+static const QString providersSubKey("/providers");
+
ProvidersModel::ProvidersModel(QObject *parent) :
QAbstractListModel(parent),
_config(0)
@@ -18,7 +20,8 @@ ProvidersModel::ProvidersModel(QObject *parent) :
QString ProvidersModel::configKey() const
{
if (_config) {
- return _config->key();
+ QString key = _config->key();
+ return key.left(key.length() - providersSubKey.length());
} else {
return QString();
}
@@ -32,8 +35,8 @@ void ProvidersModel::setConfigKey(const QString &configKey)
_config = 0;
}
if (!configKey.isEmpty()) {
- _config = new GConfKey(configKey, this);
- connect(_config, SIGNAL(changed()), SLOT(reload()));
+ _config = new GConfKey(configKey + providersSubKey, this);
+ connect(_config, SIGNAL(changed()), SLOT(handleConfigChanged()));
}
if (this->configKey() != oldConfigKey) {
reload();
@@ -43,6 +46,7 @@ void ProvidersModel::setConfigKey(const QString &configKey)
int ProvidersModel::rowCount(const QModelIndex &parent) const
{
+ Q_UNUSED(parent);
return _all_list.count();
}
@@ -76,6 +80,9 @@ void ProvidersModel::setProviderEnabled(const QString &id, bool enabled)
} else {
_enabled.remove(id);
}
+
+ qDebug() << "Storing providers" << _enabled;
+
_config->set(QVariant::fromValue(QStringList(_enabled.toList())));
}
@@ -87,8 +94,11 @@ void ProvidersModel::reload()
_info_list.clear();
_enabled.clear();
+ qDebug() << "Reloading providers";
+
_all_list = registry->allNotificationProviders();
_info_list.reserve(_all_list.size());
+ _all_list.sort();
foreach (const QString& s, _all_list) {
NotificationPluginInterface *plugin = registry->getNotificationPlugin(s);
if (plugin) {
@@ -103,3 +113,16 @@ void ProvidersModel::reload()
_enabled = _config->value().toStringList().toSet();
endResetModel();
}
+
+void ProvidersModel::handleConfigChanged()
+{
+ QSet<QString> prevEnabled = _enabled;
+ _enabled = _config->value().toStringList().toSet();
+
+ for (int i = 0; i < _all_list.count(); i++) {
+ const QString& id = _all_list[i];
+ if (_enabled.contains(id) != prevEnabled.contains(id)) {
+ emit dataChanged(createIndex(i, 0), createIndex(i, 0));
+ }
+ }
+}
diff --git a/sowatchui/providersmodel.h b/sowatchui/providersmodel.h
index 9cf6ec6..bcde2d5 100644
--- a/sowatchui/providersmodel.h
+++ b/sowatchui/providersmodel.h
@@ -33,6 +33,7 @@ signals:
private slots:
void reload();
+ void handleConfigChanged();
private:
sowatch::ConfigKey *_config;
diff --git a/sowatchui/qml/AddWatchletSheet.qml b/sowatchui/qml/AddWatchletSheet.qml
new file mode 100644
index 0000000..e052350
--- /dev/null
+++ b/sowatchui/qml/AddWatchletSheet.qml
@@ -0,0 +1,48 @@
+import QtQuick 1.1
+import com.nokia.meego 1.1
+import com.nokia.extras 1.1
+import com.javispedro.sowatch 1.0
+
+Sheet {
+ id: sheet
+ anchors.margins: UiConstants.DefaultMargin
+
+ property string configKey;
+
+ rejectButtonText: qsTr("Cancel")
+
+ content: ListView {
+ id: listView
+ anchors.fill: parent
+ anchors.margins: UiConstants.DefaultMargin
+
+ flickableDirection: Flickable.VerticalFlick
+
+ model: WatchletsModel {
+ id: watchletsModel
+ configKey: sheet.configKey
+ displayUnadded: true
+ }
+
+ header: Column {
+ width: parent.width
+
+ GroupHeader {
+ width: parent.width
+ text: qsTr("Available watchlets")
+ }
+ }
+
+ delegate: ListDelegate {
+ onClicked: {
+ watchletsModel.addWatchlet(model.name);
+ close();
+ accepted();
+ }
+ }
+
+ ScrollDecorator {
+ flickableItem: listView
+ }
+ }
+}
diff --git a/sowatchui/qml/WatchPage.qml b/sowatchui/qml/WatchPage.qml
index 21c4543..4799085 100644
--- a/sowatchui/qml/WatchPage.qml
+++ b/sowatchui/qml/WatchPage.qml
@@ -14,10 +14,55 @@ Page {
tools: ToolBarLayout {
ToolIcon {
+ id: backToolIcon
platformIconId: "toolbar-back"
anchors.left: parent.left
onClicked: pageStack.pop()
}
+ ToolIcon {
+ id: menuToolIcon
+ platformIconId: "toolbar-view-menu"
+ anchors.right: parent.right
+ onClicked: (watchMenu.status === DialogStatus.Closed) ? watchMenu.open() : watchMenu.close();
+ }
+ }
+
+ Menu {
+ id: watchMenu
+ MenuLayout {
+ MenuItem {
+ text: qsTr("Remove watch")
+ onClicked: {
+ watchMenu.close();
+ watches.removeWatch(watchPage.configKey);
+ pageStack.pop();
+ }
+ }
+ }
+ }
+
+ Menu {
+ id: watchletMenu
+ property string watchlet;
+ MenuLayout {
+ MenuItem {
+ text: qsTr("Move up")
+ onClicked: watchletsModel.moveWatchletUp(watchletMenu.watchlet)
+ }
+ MenuItem {
+ text: qsTr("Move down")
+ onClicked: watchletsModel.moveWatchletDown(watchletMenu.watchlet)
+ }
+ MenuItem {
+ text: qsTr("Remove watchlet")
+ onClicked: watchletsModel.removeWatchlet(watchletMenu.watchlet)
+ }
+ }
+ }
+
+ AddWatchletSheet {
+ id: addWatchletSheet
+ configKey: watchPage.configKey
}
GConfKey {
@@ -84,7 +129,7 @@ Page {
height: UiConstants.ListItemHeightDefault * count
model: ProvidersModel {
id: providersModel
- configKey: watchPage.configKey + "/providers"
+ configKey: watchPage.configKey
}
delegate: ListDelegate {
CheckBox {
@@ -107,19 +152,24 @@ Page {
interactive: false
width: parent.width
height: UiConstants.ListItemHeightDefault * count
- model: ListModel {
- ListElement {
- title: "Test"
- }
+ model: WatchletsModel {
+ id: watchletsModel
+ configKey: watchPage.configKey
+ displayUnadded: false
}
- delegate: ListDelegate {
+ delegate: ListDelegate {
+ onClicked: {
+ watchletMenu.watchlet = model.name;
+ watchletMenu.open();
+ }
}
}
Button {
anchors.horizontalCenter: parent.horizontalCenter
text: qsTr("Add new watchlet")
+ onClicked: addWatchletSheet.open()
}
}
}
diff --git a/sowatchui/sowatchui.pro b/sowatchui/sowatchui.pro
index fa965d3..4098228 100644
--- a/sowatchui/sowatchui.pro
+++ b/sowatchui/sowatchui.pro
@@ -38,12 +38,14 @@ DEPENDPATH += $$PWD/../libsowatch
SOURCES += main.cpp \
watchesmodel.cpp daemonproxy.cpp \
watchscannermodel.cpp \
- providersmodel.cc
+ providersmodel.cpp \
+ watchletsmodel.cpp
HEADERS += \
watchesmodel.h daemonproxy.h \
watchscannermodel.h \
- providersmodel.h
+ providersmodel.h \
+ watchletsmodel.h
OTHER_FILES += qml/main.qml \
qml/MainPage.qml \
diff --git a/sowatchui/watchesmodel.cpp b/sowatchui/watchesmodel.cpp
index 302e484..f8afcd4 100644
--- a/sowatchui/watchesmodel.cpp
+++ b/sowatchui/watchesmodel.cpp
@@ -81,14 +81,6 @@ QVariant WatchesModel::data(const QModelIndex &index, int role) const
return QVariant();
}
-bool WatchesModel::removeRows(int row, int count, const QModelIndex &parent)
-{
- Q_UNUSED(row);
- Q_UNUSED(count);
- Q_UNUSED(parent);
- return false; // TODO
-}
-
void WatchesModel::addFoundWatch(const QVariantMap &info)
{
QStringList existing = _config->dirs();
@@ -109,9 +101,8 @@ void WatchesModel::addFoundWatch(const QVariantMap &info)
// Set some defaults
Registry *registry = Registry::registry();
- foreach (const QString& providerId, registry->allNotificationProviders()) {
- qDebug() << "Would add" << providerId;
- }
+ newkey->set("providers", registry->allNotificationProviders());
+ newkey->set("watchlets", registry->allWatchlets());
// Now add to the watches list
QStringList active = _watches_list->value().toStringList();
@@ -120,6 +111,33 @@ void WatchesModel::addFoundWatch(const QVariantMap &info)
// Now enable
newkey->set("enable", true);
+
+ delete newkey;
+}
+
+void WatchesModel::removeWatch(const QString &id)
+{
+ QString name;
+
+ int i = id.lastIndexOf('/');
+ if (i != -1) {
+ // Hack: QML UI might pass /apps/sowatch/id instead of id alone
+ name = id.mid(i + 1);
+ } else {
+ name = id;
+ }
+
+ ConfigKey *subkey = _config->getSubkey(name);
+
+ qDebug() << "Deleting watch" << name;
+
+ // Remove from watches list
+ QStringList active = _watches_list->value().toStringList();
+ active.removeAll(name);
+ _watches_list->set(active);
+
+ subkey->recursiveUnset();
+ delete subkey;
}
void WatchesModel::reload()
diff --git a/sowatchui/watchesmodel.h b/sowatchui/watchesmodel.h
index 6e9b65e..46114e5 100644
--- a/sowatchui/watchesmodel.h
+++ b/sowatchui/watchesmodel.h
@@ -22,10 +22,10 @@ public:
int rowCount(const QModelIndex &parent) const;
QVariant data(const QModelIndex &index, int role) const;
- bool removeRows(int row, int count, const QModelIndex &parent);
public slots:
void addFoundWatch(const QVariantMap& info);
+ void removeWatch(const QString& id);
private slots:
void reload();
diff --git a/sowatchui/watchletsmodel.cpp b/sowatchui/watchletsmodel.cpp
new file mode 100644
index 0000000..d9c8f86
--- /dev/null
+++ b/sowatchui/watchletsmodel.cpp
@@ -0,0 +1,166 @@
+#include "watchletsmodel.h"
+
+using namespace sowatch;
+
+static const QString watchletsSubKey("/watchlets");
+
+WatchletsModel::WatchletsModel(QObject *parent) :
+ QAbstractListModel(parent),
+ _config(0),
+ _unadded(false)
+{
+ QHash<int, QByteArray> roles = roleNames();
+ roles[Qt::DisplayRole] = QByteArray("title");
+ roles[Qt::DecorationRole] = QByteArray("iconSource");
+ roles[NameRole] = QByteArray("name");
+ setRoleNames(roles);
+}
+
+QString WatchletsModel::configKey() const
+{
+ if (_config) {
+ QString key = _config->key();
+ return key.left(key.length() - watchletsSubKey.length());
+ } else {
+ return QString();
+ }
+}
+
+void WatchletsModel::setConfigKey(const QString &configKey)
+{
+ qDebug() << "Set confgKey" << configKey;
+ QString oldConfigKey = this->configKey();
+ if (_config) {
+ delete _config;
+ _config = 0;
+ }
+ if (!configKey.isEmpty()) {
+ _config = new GConfKey(configKey + watchletsSubKey, this);
+ connect(_config, SIGNAL(changed()), SLOT(handleConfigChanged()));
+ }
+ if (this->configKey() != oldConfigKey) {
+ reload();
+ emit configKeyChanged();
+ }
+}
+
+bool WatchletsModel::displayUnadded() const
+{
+ return _unadded;
+}
+
+void WatchletsModel::setDisplayUnadded(bool displayUnadded)
+{
+ qDebug() << "Set dunadded" << displayUnadded;
+ _unadded = displayUnadded;
+ if (_config) reload();
+ emit displayUnaddedChanged();
+}
+
+int WatchletsModel::rowCount(const QModelIndex &parent) const
+{
+ Q_UNUSED(parent);
+ return _list.count();
+}
+
+QVariant WatchletsModel::data(const QModelIndex &index, int role) const
+{
+ const QString id = _list[index.row()];
+ switch (role) {
+ case Qt::DisplayRole:
+ return QVariant::fromValue(_info[id].name);
+ case Qt::DecorationRole:
+ return QVariant::fromValue(_info[id].icon);
+ case NameRole:
+ return QVariant::fromValue(id);
+ }
+ return QVariant();
+}
+
+void WatchletsModel::addWatchlet(const QString &name)
+{
+ if (!_config) return;
+ QStringList enabled = _config->value().toStringList();
+ if (_enabled.contains(name)) return;
+ enabled << name;
+ _config->set(enabled);
+}
+
+void WatchletsModel::removeWatchlet(const QString &name)
+{
+ if (!_config) return;
+ QStringList enabled = _config->value().toStringList();
+ enabled.removeAll(name);
+ _config->set(enabled);
+}
+
+void WatchletsModel::moveWatchletUp(const QString &name)
+{
+ if (!_config) return;
+ QStringList enabled = _config->value().toStringList();
+ int index = enabled.indexOf(name);
+ qDebug() << "move up" << enabled << index << enabled[index];
+ if (index > 0 && index < enabled.size()) {
+ enabled.swap(index - 1, index);
+ }
+ _config->set(enabled);
+}
+
+void WatchletsModel::moveWatchletDown(const QString &name)
+{
+ if (!_config) return;
+ QStringList enabled = _config->value().toStringList();
+ int index = enabled.indexOf(name);
+ qDebug() << "move down" << enabled << index << enabled[index];
+ if (index >= 0 && index < enabled.size() - 1) {
+ enabled.swap(index, index + 1);
+ }
+ _config->set(enabled);
+}
+
+void WatchletsModel::reload()
+{
+ Registry *registry = Registry::registry();
+ Q_ASSERT(_config);
+ beginResetModel();
+ _list.clear();
+ _info.clear();
+ _enabled.clear();
+
+ qDebug() << "Reloading watchlets";
+
+ QStringList all = registry->allWatchlets();
+ foreach (const QString& s, all) {
+ WatchletPluginInterface *plugin = registry->getWatchletPlugin(s);
+ if (plugin) {
+ _info[s] = plugin->describeWatchlet(s);
+ } else {
+ WatchletPluginInterface::WatchletInfo info;
+ info.name = s;
+ _info[s] = info;
+ }
+ }
+
+ QStringList enabled = _config->value().toStringList();
+ _enabled = enabled.toSet();
+
+ if (_unadded) {
+ qDebug() << "Listing unadded watchlets from" << all;
+ foreach (const QString& s, all) {
+ if (!_enabled.contains(s)) {
+ _list.append(s);
+ }
+ }
+ _list.sort();
+ } else {
+ qDebug() << "Listing added watchlets from" << enabled;
+ _list = enabled;
+ }
+ endResetModel();
+}
+
+void WatchletsModel::handleConfigChanged()
+{
+ // TODO
+ reload();
+}
diff --git a/sowatchui/watchletsmodel.h b/sowatchui/watchletsmodel.h
new file mode 100644
index 0000000..e0c2c62
--- /dev/null
+++ b/sowatchui/watchletsmodel.h
@@ -0,0 +1,52 @@
+#ifndef WATCHLETSMODEL_H
+#define WATCHLETSMODEL_H
+
+#include <QAbstractListModel>
+
+#include <sowatch.h>
+
+class WatchletsModel : public QAbstractListModel
+{
+ Q_OBJECT
+ Q_PROPERTY(QString configKey READ configKey WRITE setConfigKey NOTIFY configKeyChanged)
+ Q_PROPERTY(bool displayUnadded READ displayUnadded WRITE setDisplayUnadded NOTIFY displayUnaddedChanged)
+
+public:
+ explicit WatchletsModel(QObject *parent = 0);
+
+ enum DataRoles {
+ NameRole = Qt::UserRole
+ };
+
+ QString configKey() const;
+ void setConfigKey(const QString& configKey);
+
+ bool displayUnadded() const;
+ void setDisplayUnadded(bool displayUnadded);
+
+ int rowCount(const QModelIndex &parent) const;
+ QVariant data(const QModelIndex &index, int role) const;
+
+public slots:
+ void addWatchlet(const QString& name);
+ void removeWatchlet(const QString& name);
+ void moveWatchletUp(const QString& name);
+ void moveWatchletDown(const QString& name);
+
+signals:
+ void configKeyChanged();
+ void displayUnaddedChanged();
+
+private slots:
+ void reload();
+ void handleConfigChanged();
+
+private:
+ sowatch::ConfigKey *_config;
+ bool _unadded;
+ QStringList _list;
+ QMap<QString, sowatch::WatchletPluginInterface::WatchletInfo> _info;
+ QSet<QString> _enabled;
+};
+
+#endif // WATCHLETSMODEL_H